From 50782f6af99b65544d6af2be1a4ef4aa6eecb1e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gonc=CC=A7alo=20Fonseca?= Date: Tue, 10 Feb 2015 10:48:13 +0000 Subject: [PATCH 1/5] Addresses issue #424. --- dist/css/font-awesome.min.css | 2 +- dist/css/ink-flex.min.css | 2 +- dist/css/ink-ie.min.css | 2 +- dist/css/ink-legacy.min.css | 2 +- dist/css/ink.css | 24 ++++++++++++------------ dist/css/ink.min.css | 2 +- src/sass/modules/_forms.scss | 10 +++++----- 7 files changed, 22 insertions(+), 22 deletions(-) diff --git a/dist/css/font-awesome.min.css b/dist/css/font-awesome.min.css index e470379fd..c484d6e38 100644 --- a/dist/css/font-awesome.min.css +++ b/dist/css/font-awesome.min.css @@ -1 +1 @@ -@font-face{font-family:FontAwesome;src:url(../fonts/fontawesome-webfont.eot?v=4.2.0);src:url(../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0) format("embedded-opentype"),url(../fonts/fontawesome-webfont.woff?v=4.2.0) format("woff"),url(../fonts/fontawesome-webfont.ttf?v=4.2.0) format("truetype"),url(../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"} +@font-face{font-family:FontAwesome;src:url(../fonts/fontawesome-webfont.eot?v=4.2.0);src:url(../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0) format("embedded-opentype"),url(../fonts/fontawesome-webfont.woff?v=4.2.0) format("woff"),url(../fonts/fontawesome-webfont.ttf?v=4.2.0) format("truetype"),url(../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"} \ No newline at end of file diff --git a/dist/css/ink-flex.min.css b/dist/css/ink-flex.min.css index de6dc7629..4a8dee633 100644 --- a/dist/css/ink-flex.min.css +++ b/dist/css/ink-flex.min.css @@ -1 +1 @@ -@charset "UTF-8";.grid-order{flex:100%}.show-all{display:inherit}.hide-all{display:none!important}.no-margin{margin:0!important}.no-padding{padding:0!important}.push-left{float:left;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;justify-content:flex-start}.push-center{float:none!important;margin-left:auto;margin-right:auto;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center}.push-right{float:right;-webkit-justify-content:flex-end;-moz-justify-content:flex-end;justify-content:flex-end}.align-left{text-align:left}.align-center{text-align:center}.align-right{text-align:right}.clearfix{overflow:hidden;*zoom:1;*zoom:1}.clearfix:after{content:"";display:table;clear:both}html{font-family:sans-serif}html *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}figure{margin:0}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.ink-alert.basic,.ink-alert.block{font-size:.938em;margin:1em 0;position:relative;overflow:hidden}.ink-alert.basic{padding:1em 3em 1em 1em}.ink-alert.basic p{margin:0}.ink-alert.basic .ink-close{top:.55em;*top:.2em}.ink-alert.block{font-size:1em}.ink-alert.block>h4{padding:1em 3em 1em 1em;font-size:.938em;line-height:1.5;margin:0}.ink-alert.block p{margin:1.5em 1em}.ink-alert.block ul{list-style:inside}.ink-alert .ink-dismiss{position:absolute;line-height:.56em;font-size:1.8em;padding:5px;border:0;background:0 0;top:.5em;*top:.2em;right:.4em}.ink-badge{padding:.2em .6em;font-size:.813em;margin-left:.6em}.ink-button{-webkit-appearance:menuitem;padding:8px 12px;cursor:pointer;text-decoration:none;text-align:center;display:inline-block;vertical-align:middle;white-space:nowrap;line-height:normal}.ink-button+.ink-button{margin-left:5px}.button-group{*zoom:1}.button-group>.ink-button{float:left;margin:5px 0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;border-left:0}.button-group>.ink-button:active,.button-group>.ink-button:hover{border-left:0}.button-group>.ink-button:first-child{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px;border-left:1px solid #bfbfbf}.button-group>.ink-button:last-child{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.button-group:after{content:"";display:table;clear:both}.button-toolbar{*zoom:1}.button-toolbar>.button-group{margin-right:10px;float:left}.button-toolbar:after{content:"";display:table;clear:both}.ink-form fieldset{border:0;padding:0;margin:0}.ink-form fieldset legend{font-size:1.438em;font-weight:700;width:100%;border-bottom:1px solid #ddd}.ink-form fieldset legend+*{-webkit-margin-top-collapse:separate;margin:2em 0}.ink-form p.tip{font-size:.875em;color:#909090;position:relative;margin:.2em 0 0 .1em}.ink-form p.label{padding:0;margin:0;color:#555;white-space:normal}.ink-form input[type=color],.ink-form input[type=date],.ink-form input[type=datetime-local],.ink-form input[type=datetime],.ink-form input[type=email],.ink-form input[type=month],.ink-form input[type=number],.ink-form input[type=password],.ink-form input[type=search],.ink-form input[type=tel],.ink-form input[type=text],.ink-form input[type=time],.ink-form input[type=url],.ink-form input[type=week],.ink-form select,.ink-form textarea{font-family:Roboto,Arial,Helvetica,sans-serif;font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;padding:8px 6px;border:1px solid #c6c6c6;resize:none;background:#fff;vertical-align:middle}.ink-form input[type=color]:focus,.ink-form input[type=date]:focus,.ink-form input[type=datetime-local]:focus,.ink-form input[type=datetime]:focus,.ink-form input[type=email]:focus,.ink-form input[type=month]:focus,.ink-form input[type=number]:focus,.ink-form input[type=password]:focus,.ink-form input[type=search]:focus,.ink-form input[type=tel]:focus,.ink-form input[type=text]:focus,.ink-form input[type=time]:focus,.ink-form input[type=url]:focus,.ink-form input[type=week]:focus,.ink-form select:focus,.ink-form textarea:focus{border-color:rgba(153,153,153,.9);-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;outline:0 none}.ink-form input[type=color]:disabled,.ink-form input[type=date]:disabled,.ink-form input[type=datetime-local]:disabled,.ink-form input[type=datetime]:disabled,.ink-form input[type=email]:disabled,.ink-form input[type=month]:disabled,.ink-form input[type=number]:disabled,.ink-form input[type=password]:disabled,.ink-form input[type=search]:disabled,.ink-form input[type=tel]:disabled,.ink-form input[type=text]:disabled,.ink-form input[type=time]:disabled,.ink-form input[type=url]:disabled,.ink-form input[type=week]:disabled,.ink-form select:disabled,.ink-form textarea:disabled{background:#f2f2f2;cursor:not-allowed}.ink-form .input-file{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;padding:6px;border:1px solid #c6c6c6;background:#fff;vertical-align:middle;line-height:1.2}.ink-form .input-file input[type=file]{-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;border:0;padding:0;background:0 0;width:100%}.ink-form .ink-button{margin:0 5px}.ink-form label{cursor:pointer}.ink-form select{line-height:2;cursor:pointer}.ink-form textarea{min-height:5em}.ink-form .control-group{line-height:2;margin-bottom:1em;*zoom:1}.ink-form .control-group:after{content:"";display:table;clear:both}.ink-form .control-group .control{position:relative;*zoom:1}.ink-form .control-group .control:after{content:"";display:table;clear:both}.ink-form .control-group .control>li{position:relative;*zoom:1}.ink-form .control-group .control>li:after{content:"";display:table;clear:both}.ink-form .control-group .control>input,.ink-form .control-group .control>select,.ink-form .control-group .control>textarea{width:100%}.ink-form .control-group .control>input+[class*=fa-],.ink-form .control-group .control>input+[class^=fa-],.ink-form .control-group .control>select+[class*=fa-],.ink-form .control-group .control>select+[class^=fa-],.ink-form .control-group .control>textarea+[class*=fa-],.ink-form .control-group .control>textarea+[class^=fa-]{display:none}.ink-form .control-group .control.append-button span,.ink-form .control-group .control.append-symbol span,.ink-form .control-group .control.prepend-button span,.ink-form .control-group .control.prepend-symbol span{width:100%;position:relative}.ink-form .control-group .control.append-button span>input,.ink-form .control-group .control.append-button span>select,.ink-form .control-group .control.append-button span>textarea,.ink-form .control-group .control.append-symbol span>input,.ink-form .control-group .control.append-symbol span>select,.ink-form .control-group .control.append-symbol span>textarea,.ink-form .control-group .control.prepend-button span>input,.ink-form .control-group .control.prepend-button span>select,.ink-form .control-group .control.prepend-button span>textarea,.ink-form .control-group .control.prepend-symbol span>input,.ink-form .control-group .control.prepend-symbol span>select,.ink-form .control-group .control.prepend-symbol span>textarea{width:100%}.ink-form .control-group .control.append-button>input[type=button],.ink-form .control-group .control.append-button>input[type=reset],.ink-form .control-group .control.append-button>input[type=submit],.ink-form .control-group .control.append-symbol>input[type=button],.ink-form .control-group .control.append-symbol>input[type=reset],.ink-form .control-group .control.append-symbol>input[type=submit],.ink-form .control-group .control.prepend-button>input[type=button],.ink-form .control-group .control.prepend-button>input[type=reset],.ink-form .control-group .control.prepend-button>input[type=submit],.ink-form .control-group .control.prepend-symbol>input[type=button],.ink-form .control-group .control.prepend-symbol>input[type=reset],.ink-form .control-group .control.prepend-symbol>input[type=submit]{width:auto}.ink-form .control-group .control.append-button{display:-webkit-flex;display:flex;display:-ms-flexbox}.ink-form .control-group .control.append-button span>input,.ink-form .control-group .control.append-button span>select,.ink-form .control-group .control.append-button span>textarea{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-form .control-group .control.append-button .ink-button{margin:0;-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0;border-left:0}.ink-form .control-group .control.prepend-button{display:-webkit-flex;display:flex;display:-ms-flexbox}.ink-form .control-group .control.prepend-button span>input,.ink-form .control-group .control.prepend-button span>select,.ink-form .control-group .control.prepend-button span>textarea{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-form .control-group .control.prepend-button .ink-button{margin:0;-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px;border-right:0}.ink-form .control-group .control.append-symbol span{display:block}.ink-form .control-group .control.append-symbol span>input,.ink-form .control-group .control.append-symbol span>select,.ink-form .control-group .control.append-symbol span>textarea{padding-right:2.5em}.ink-form .control-group .control.append-symbol span>[class*=" fa-"],.ink-form .control-group .control.append-symbol span>[class^=fa-]{position:absolute;right:1em;top:.86em;pointer-events:none}.ink-form .control-group .control.prepend-symbol span{display:block}.ink-form .control-group .control.prepend-symbol span>input,.ink-form .control-group .control.prepend-symbol span>select,.ink-form .control-group .control.prepend-symbol span>textarea{padding-left:2.5em}.ink-form .control-group .control.prepend-symbol span>[class*=" fa-"],.ink-form .control-group .control.prepend-symbol span>[class^=fa-]{position:absolute;left:1em;top:.86em;pointer-events:none}.ink-form .control-group input[type=checkbox],.ink-form .control-group input[type=radio]{position:absolute;border:0;cursor:pointer}.ink-form .control-group input[type=checkbox]+label,.ink-form .control-group input[type=radio]+label{margin-top:-.28em;padding-left:1.25em;vertical-align:super;display:inline-block}.ink-form .control-group .inline li{padding:0}.ink-form .control-group .inline li label{margin-right:1em}.ink-form .control-group.validation.error input,.ink-form .control-group.validation.error select,.ink-form .control-group.validation.error textarea{outline:0;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;border:1px solid rgba(200,10,16,.5)}.ink-form .control-group.validation.error p.tip{color:rgba(150,7,12,.55)}.ink-form .control-group.validation.warning input,.ink-form .control-group.validation.warning select,.ink-form .control-group.validation.warning textarea{outline:0;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;border:1px solid rgba(255,156,0,.6)}.ink-form .control-group.validation.warning p.tip{color:rgba(204,125,0,.6)}.ink-form .control-group.required label,.ink-form .control-group.required p.label{color:#555}.ink-form .control-group.required label:after,.ink-form .control-group.required p.label:after{content:"\f069";color:#c91111;margin-left:.6em;font-family:FontAwesome;font-size:.75em;width:1.25em}.ink-form .control-group.required ul.control label:after{content:""}.ink-grid{width:auto;max-width:1440px;margin:0 auto}.order-1{order:1;-ms-flex-order:1}.order-2{order:2;-ms-flex-order:2}.order-3{order:3;-ms-flex-order:3}.order-4{order:4;-ms-flex-order:4}.order-5{order:5;-ms-flex-order:5}.order-6{order:6;-ms-flex-order:6}.order-7{order:7;-ms-flex-order:7}.order-8{order:8;-ms-flex-order:8}.order-9{order:9;-ms-flex-order:9}.order-10{order:10;-ms-flex-order:10}.all-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}@media screen and (min-width:1261px){.ink-grid{padding:0 2em}.column-group.gutters{margin-left:-2em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}.column-group.horizontal-gutters{margin-left:-2em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=xlarge-]{padding-left:2em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=xlarge-]{margin-bottom:2em}.column-group.double-gutters{margin-left:-4em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}.column-group.double-horizontal-gutters{margin-left:-4em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}.column-group.half-gutters{margin-left:-1em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}.column-group.half-horizontal-gutters{margin-left:-1em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}.column-group.quarter-gutters{margin-left:-.5em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}.column-group.quarter-horizontal-gutters{margin-left:-.5em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}.column-group.xlarge-gutters{margin-left:-2em}.column-group.xlarge-gutters>.all-auto,.column-group.xlarge-gutters>[class*=all-],.column-group.xlarge-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}.column-group.xlarge-horizontal-gutters{margin-left:-2em}.column-group.xlarge-horizontal-gutters>.all-auto,.column-group.xlarge-horizontal-gutters>[class*=all-],.column-group.xlarge-horizontal-gutters>[class*=xlarge-]{padding-left:2em}.column-group.xlarge-vertical-gutters>.all-auto,.column-group.xlarge-vertical-gutters>[class*=all-],.column-group.xlarge-vertical-gutters>[class*=xlarge-]{margin-bottom:2em}.column-group.xlarge-double-gutters{margin-left:-4em}.column-group.xlarge-double-gutters>.all-auto,.column-group.xlarge-double-gutters>[class*=all-],.column-group.xlarge-double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}.column-group.xlarge-double-horizontal-gutters{margin-left:-4em}.column-group.xlarge-double-horizontal-gutters>.all-auto,.column-group.xlarge-double-horizontal-gutters>[class*=all-],.column-group.xlarge-double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}.column-group.xlarge-double-vertical-gutters>.all-auto,.column-group.xlarge-double-vertical-gutters>[class*=all-],.column-group.xlarge-double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}.column-group.xlarge-half-gutters{margin-left:-1em}.column-group.xlarge-half-gutters>.all-auto,.column-group.xlarge-half-gutters>[class*=all-],.column-group.xlarge-half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}.column-group.xlarge-half-horizontal-gutters{margin-left:-1em}.column-group.xlarge-half-horizontal-gutters>.all-auto,.column-group.xlarge-half-horizontal-gutters>[class*=all-],.column-group.xlarge-half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}.column-group.xlarge-half-vertical-gutters>.all-auto,.column-group.xlarge-half-vertical-gutters>[class*=all-],.column-group.xlarge-half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}.column-group.xlarge-quarter-gutters{margin-left:-.5em}.column-group.xlarge-quarter-gutters>.all-auto,.column-group.xlarge-quarter-gutters>[class*=all-],.column-group.xlarge-quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}.column-group.xlarge-quarter-horizontal-gutters{margin-left:-.5em}.column-group.xlarge-quarter-horizontal-gutters>.all-auto,.column-group.xlarge-quarter-horizontal-gutters>[class*=all-],.column-group.xlarge-quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}.column-group.xlarge-quarter-vertical-gutters>.all-auto,.column-group.xlarge-quarter-vertical-gutters>[class*=all-],.column-group.xlarge-quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}.column-group.xlarge-no-gutters{margin-left:0}.column-group.xlarge-no-gutters>.all-auto,.column-group.xlarge-no-gutters>[class*=all-],.column-group.xlarge-no-gutters>[class*=xlarge-]{padding-left:0;margin-bottom:0}.xlarge-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.reverse,.column-group.xlarge-reverse,.ink-flex.reverse,.ink-flex.xlarge-reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.vertical,.column-group.xlarge-vertical,.ink-flex.vertical,.ink-flex.xlarge-vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.vertical.reverse,.column-group.xlarge-vertical.xlarge-reverse,.ink-flex.vertical.reverse,.ink-flex.xlarge-vertical.xlarge-reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.xlarge-order-1{order:1;-ms-flex-order:1}.xlarge-order-2{order:2;-ms-flex-order:2}.xlarge-order-3{order:3;-ms-flex-order:3}.xlarge-order-4{order:4;-ms-flex-order:4}.xlarge-order-5{order:5;-ms-flex-order:5}.xlarge-order-6{order:6;-ms-flex-order:6}.xlarge-order-7{order:7;-ms-flex-order:7}.xlarge-order-8{order:8;-ms-flex-order:8}.xlarge-order-9{order:9;-ms-flex-order:9}.xlarge-order-10{order:10;-ms-flex-order:10}.column-group .xlarge-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.push-top,.xlarge-push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.push-bottom,.xlarge-push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.push-middle,.xlarge-push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.push-left,.xlarge-push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.push-center,.xlarge-push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.push-right,.xlarge-push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.xlarge-align-left{text-align:left}.xlarge-align-center{text-align:center}.xlarge-align-right{text-align:right}.space,.xlarge-space{margin:2em}.padding,.xlarge-padding{padding:2em}.double-space,.xlarge-double-space{margin:4em}.double-padding,.xlarge-double-padding{padding:4em}.half-space,.xlarge-half-space{margin:1em}.half-padding,.xlarge-half-padding{padding:1em}.quarter-space,.xlarge-quarter-space{margin:.5em}.quarter-padding,.xlarge-quarter-padding{padding:.5em}.vertical-space,.xlarge-vertical-space{margin-top:2em;margin-bottom:2em}.vertical-padding,.xlarge-vertical-padding{padding-top:2em;padding-bottom:2em}.double-vertical-space,.xlarge-double-vertical-space{margin-top:4em;margin-bottom:4em}.double-vertical-padding,.xlarge-double-vertical-padding{padding-top:4em;padding-bottom:4em}.half-vertical-space,.xlarge-half-vertical-space{margin-top:1em;margin-bottom:1em}.half-vertical-padding,.xlarge-half-vertical-padding{padding-top:1em;padding-bottom:1em}.quarter-vertical-space,.xlarge-quarter-vertical-space{margin-top:.5em;margin-bottom:.5em}.quarter-vertical-padding,.xlarge-quarter-vertical-padding{padding-top:.5em;padding-bottom:.5em}.horizontal-space,.xlarge-horizontal-space{margin-left:2em;margin-right:2em}.horizontal-padding,.xlarge-horizontal-padding{padding-left:2em;padding-right:2em}.double-horizontal-space,.xlarge-double-horizontal-space{margin-left:4em;margin-right:4em}.double-horizontal-padding,.xlarge-double-horizontal-padding{padding-left:4em;padding-right:4em}.half-horizontal-space,.xlarge-half-horizontal-space{margin-left:1em;margin-right:1em}.half-horizontal-padding,.xlarge-half-horizontal-padding{padding-left:1em;padding-right:1em}.quarter-horizontal-space,.xlarge-quarter-horizontal-space{margin-left:.5em;margin-right:.5em}.quarter-horizontal-padding,.xlarge-quarter-horizontal-padding{padding-left:.5em;padding-right:.5em}.top-space,.xlarge-top-space{margin-top:2em}.top-padding,.xlarge-top-padding{padding-top:2em}.double-top-space,.xlarge-double-top-space{margin-top:4em}.double-top-padding,.xlarge-double-top-padding{padding-top:4em}.half-top-space,.xlarge-half-top-space{margin-top:1em}.half-top-padding,.xlarge-half-top-padding{padding-top:1em}.quarter-top-space,.xlarge-quarter-top-space{margin-top:.5em}.quarter-top-padding,.xlarge-quarter-top-padding{padding-top:.5em}.right-space,.xlarge-right-space{margin-right:2em}.right-padding,.xlarge-right-padding{padding-right:2em}.double-right-space,.xlarge-double-right-space{margin-right:4em}.double-right-padding,.xlarge-double-right-padding{padding-right:4em}.half-right-space,.xlarge-half-right-space{margin-right:1em}.half-right-padding,.xlarge-half-right-padding{padding-right:1em}.quarter-right-space,.xlarge-quarter-right-space{margin-right:.5em}.quarter-right-padding,.xlarge-quarter-right-padding{padding-right:.5em}.bottom-space,.xlarge-bottom-space{margin-bottom:2em}.bottom-padding,.xlarge-bottom-padding{padding-bottom:2em}.double-bottom-space,.xlarge-double-bottom-space{margin-bottom:4em}.double-bottom-padding,.xlarge-double-bottom-padding{padding-bottom:4em}.half-bottom-space,.xlarge-half-bottom-space{margin-bottom:1em}.half-bottom-padding,.xlarge-half-bottom-padding{padding-bottom:1em}.quarter-bottom-space,.xlarge-quarter-bottom-space{margin-bottom:.5em}.quarter-bottom-padding,.xlarge-quarter-bottom-padding{padding-bottom:.5em}.left-space,.xlarge-left-space{margin-left:2em}.left-padding,.xlarge-left-padding{padding-left:2em}.double-left-space,.xlarge-double-left-space{margin-left:4em}.double-left-padding,.xlarge-double-left-padding{padding-left:4em}.half-left-space,.xlarge-half-left-space{margin-left:1em}.half-left-padding,.xlarge-half-left-padding{padding-left:1em}.quarter-left-space,.xlarge-quarter-left-space{margin-left:.5em}.quarter-left-padding,.xlarge-quarter-left-padding{padding-left:.5em}.hide-xlarge{display:none!important}.show-xlarge{display:inherit!important}table.show-xlarge{display:table}thead.show-xlarge{display:table-header-group}tbody.show-xlarge{display:table-row-group}tfoot.show-xlarge{display:table-footer-group}tr.show-xlarge{display:table-row}td.show-xlarge,th.show-xlarge{display:table-cell}}@media screen and (min-width:961px) and (max-width:1260px){.ink-grid{padding:0 1.75em}.column-group.gutters{margin-left:-1.75em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.horizontal-gutters{margin-left:-1.75em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.double-gutters{margin-left:-3.5em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.double-horizontal-gutters{margin-left:-3.5em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.half-gutters{margin-left:-.875em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.half-horizontal-gutters{margin-left:-.875em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.quarter-gutters{margin-left:-.4375em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.quarter-horizontal-gutters{margin-left:-.4375em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-gutters{margin-left:-1.75em}.column-group.large-gutters>.all-auto,.column-group.large-gutters>[class*=all-],.column-group.large-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.large-horizontal-gutters{margin-left:-1.75em}.column-group.large-horizontal-gutters>.all-auto,.column-group.large-horizontal-gutters>[class*=all-],.column-group.large-horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.large-vertical-gutters>.all-auto,.column-group.large-vertical-gutters>[class*=all-],.column-group.large-vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.large-double-gutters{margin-left:-3.5em}.column-group.large-double-gutters>.all-auto,.column-group.large-double-gutters>[class*=all-],.column-group.large-double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.large-double-horizontal-gutters{margin-left:-3.5em}.column-group.large-double-horizontal-gutters>.all-auto,.column-group.large-double-horizontal-gutters>[class*=all-],.column-group.large-double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.large-double-vertical-gutters>.all-auto,.column-group.large-double-vertical-gutters>[class*=all-],.column-group.large-double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.large-half-gutters{margin-left:-.875em}.column-group.large-half-gutters>.all-auto,.column-group.large-half-gutters>[class*=all-],.column-group.large-half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.large-half-horizontal-gutters{margin-left:-.875em}.column-group.large-half-horizontal-gutters>.all-auto,.column-group.large-half-horizontal-gutters>[class*=all-],.column-group.large-half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.large-half-vertical-gutters>.all-auto,.column-group.large-half-vertical-gutters>[class*=all-],.column-group.large-half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.large-quarter-gutters{margin-left:-.4375em}.column-group.large-quarter-gutters>.all-auto,.column-group.large-quarter-gutters>[class*=all-],.column-group.large-quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.large-quarter-horizontal-gutters{margin-left:-.4375em}.column-group.large-quarter-horizontal-gutters>.all-auto,.column-group.large-quarter-horizontal-gutters>[class*=all-],.column-group.large-quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.large-quarter-vertical-gutters>.all-auto,.column-group.large-quarter-vertical-gutters>[class*=all-],.column-group.large-quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-no-gutters{margin-left:0}.column-group.large-no-gutters>.all-auto,.column-group.large-no-gutters>[class*=all-],.column-group.large-no-gutters>[class*=large-]{padding-left:0;margin-bottom:0}.large-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.large-reverse,.column-group.reverse,.ink-flex.large-reverse,.ink-flex.reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.large-vertical,.column-group.vertical,.ink-flex.large-vertical,.ink-flex.vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.large-vertical.large-reverse,.column-group.vertical.reverse,.ink-flex.large-vertical.large-reverse,.ink-flex.vertical.reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.large-order-1{order:1;-ms-flex-order:1}.large-order-2{order:2;-ms-flex-order:2}.large-order-3{order:3;-ms-flex-order:3}.large-order-4{order:4;-ms-flex-order:4}.large-order-5{order:5;-ms-flex-order:5}.large-order-6{order:6;-ms-flex-order:6}.large-order-7{order:7;-ms-flex-order:7}.large-order-8{order:8;-ms-flex-order:8}.large-order-9{order:9;-ms-flex-order:9}.large-order-10{order:10;-ms-flex-order:10}.column-group .large-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.large-push-top,.push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.large-push-bottom,.push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.large-push-middle,.push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.large-push-left,.push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.large-push-center,.push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.large-push-right,.push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.large-align-left{text-align:left}.large-align-center{text-align:center}.large-align-right{text-align:right}.large-space,.space{margin:1.75em}.large-padding,.padding{padding:1.75em}.double-space,.large-double-space{margin:3.5em}.double-padding,.large-double-padding{padding:3.5em}.half-space,.large-half-space{margin:.875em}.half-padding,.large-half-padding{padding:.875em}.large-quarter-space,.quarter-space{margin:.4375em}.large-quarter-padding,.quarter-padding{padding:.4375em}.large-vertical-space,.vertical-space{margin-top:1.75em;margin-bottom:1.75em}.large-vertical-padding,.vertical-padding{padding-top:1.75em;padding-bottom:1.75em}.double-vertical-space,.large-double-vertical-space{margin-top:3.5em;margin-bottom:3.5em}.double-vertical-padding,.large-double-vertical-padding{padding-top:3.5em;padding-bottom:3.5em}.half-vertical-space,.large-half-vertical-space{margin-top:.875em;margin-bottom:.875em}.half-vertical-padding,.large-half-vertical-padding{padding-top:.875em;padding-bottom:.875em}.large-quarter-vertical-space,.quarter-vertical-space{margin-top:.4375em;margin-bottom:.4375em}.large-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.4375em;padding-bottom:.4375em}.horizontal-space,.large-horizontal-space{margin-left:1.75em;margin-right:1.75em}.horizontal-padding,.large-horizontal-padding{padding-left:1.75em;padding-right:1.75em}.double-horizontal-space,.large-double-horizontal-space{margin-left:3.5em;margin-right:3.5em}.double-horizontal-padding,.large-double-horizontal-padding{padding-left:3.5em;padding-right:3.5em}.half-horizontal-space,.large-half-horizontal-space{margin-left:.875em;margin-right:.875em}.half-horizontal-padding,.large-half-horizontal-padding{padding-left:.875em;padding-right:.875em}.large-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.4375em;margin-right:.4375em}.large-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.4375em;padding-right:.4375em}.large-top-space,.top-space{margin-top:1.75em}.large-top-padding,.top-padding{padding-top:1.75em}.double-top-space,.large-double-top-space{margin-top:3.5em}.double-top-padding,.large-double-top-padding{padding-top:3.5em}.half-top-space,.large-half-top-space{margin-top:.875em}.half-top-padding,.large-half-top-padding{padding-top:.875em}.large-quarter-top-space,.quarter-top-space{margin-top:.4375em}.large-quarter-top-padding,.quarter-top-padding{padding-top:.4375em}.large-right-space,.right-space{margin-right:1.75em}.large-right-padding,.right-padding{padding-right:1.75em}.double-right-space,.large-double-right-space{margin-right:3.5em}.double-right-padding,.large-double-right-padding{padding-right:3.5em}.half-right-space,.large-half-right-space{margin-right:.875em}.half-right-padding,.large-half-right-padding{padding-right:.875em}.large-quarter-right-space,.quarter-right-space{margin-right:.4375em}.large-quarter-right-padding,.quarter-right-padding{padding-right:.4375em}.bottom-space,.large-bottom-space{margin-bottom:1.75em}.bottom-padding,.large-bottom-padding{padding-bottom:1.75em}.double-bottom-space,.large-double-bottom-space{margin-bottom:3.5em}.double-bottom-padding,.large-double-bottom-padding{padding-bottom:3.5em}.half-bottom-space,.large-half-bottom-space{margin-bottom:.875em}.half-bottom-padding,.large-half-bottom-padding{padding-bottom:.875em}.large-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.4375em}.large-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.4375em}.large-left-space,.left-space{margin-left:1.75em}.large-left-padding,.left-padding{padding-left:1.75em}.double-left-space,.large-double-left-space{margin-left:3.5em}.double-left-padding,.large-double-left-padding{padding-left:3.5em}.half-left-space,.large-half-left-space{margin-left:.875em}.half-left-padding,.large-half-left-padding{padding-left:.875em}.large-quarter-left-space,.quarter-left-space{margin-left:.4375em}.large-quarter-left-padding,.quarter-left-padding{padding-left:.4375em}.hide-large{display:none!important}.show-large{display:inherit!important}table.show-large{display:table}thead.show-large{display:table-header-group}tbody.show-large{display:table-row-group}tfoot.show-large{display:table-footer-group}tr.show-large{display:table-row}td.show-large,th.show-large{display:table-cell}}@media screen and (min-width:641px) and (max-width:960px){.ink-grid{padding:0 1.5em}.column-group.gutters{margin-left:-1.5em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}.column-group.horizontal-gutters{margin-left:-1.5em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=medium-]{padding-left:1.5em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=medium-]{margin-bottom:1.5em}.column-group.double-gutters{margin-left:-3em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}.column-group.double-horizontal-gutters{margin-left:-3em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=medium-]{padding-left:3em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=medium-]{margin-bottom:3em}.column-group.half-gutters{margin-left:-.75em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}.column-group.half-horizontal-gutters{margin-left:-.75em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=medium-]{padding-left:.75em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}.column-group.quarter-gutters{margin-left:-.375em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}.column-group.quarter-horizontal-gutters{margin-left:-.375em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}.column-group.medium-gutters{margin-left:-1.5em}.column-group.medium-gutters>.all-auto,.column-group.medium-gutters>[class*=all-],.column-group.medium-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}.column-group.medium-horizontal-gutters{margin-left:-1.5em}.column-group.medium-horizontal-gutters>.all-auto,.column-group.medium-horizontal-gutters>[class*=all-],.column-group.medium-horizontal-gutters>[class*=medium-]{padding-left:1.5em}.column-group.medium-vertical-gutters>.all-auto,.column-group.medium-vertical-gutters>[class*=all-],.column-group.medium-vertical-gutters>[class*=medium-]{margin-bottom:1.5em}.column-group.medium-double-gutters{margin-left:-3em}.column-group.medium-double-gutters>.all-auto,.column-group.medium-double-gutters>[class*=all-],.column-group.medium-double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}.column-group.medium-double-horizontal-gutters{margin-left:-3em}.column-group.medium-double-horizontal-gutters>.all-auto,.column-group.medium-double-horizontal-gutters>[class*=all-],.column-group.medium-double-horizontal-gutters>[class*=medium-]{padding-left:3em}.column-group.medium-double-vertical-gutters>.all-auto,.column-group.medium-double-vertical-gutters>[class*=all-],.column-group.medium-double-vertical-gutters>[class*=medium-]{margin-bottom:3em}.column-group.medium-half-gutters{margin-left:-.75em}.column-group.medium-half-gutters>.all-auto,.column-group.medium-half-gutters>[class*=all-],.column-group.medium-half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}.column-group.medium-half-horizontal-gutters{margin-left:-.75em}.column-group.medium-half-horizontal-gutters>.all-auto,.column-group.medium-half-horizontal-gutters>[class*=all-],.column-group.medium-half-horizontal-gutters>[class*=medium-]{padding-left:.75em}.column-group.medium-half-vertical-gutters>.all-auto,.column-group.medium-half-vertical-gutters>[class*=all-],.column-group.medium-half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}.column-group.medium-quarter-gutters{margin-left:-.375em}.column-group.medium-quarter-gutters>.all-auto,.column-group.medium-quarter-gutters>[class*=all-],.column-group.medium-quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}.column-group.medium-quarter-horizontal-gutters{margin-left:-.375em}.column-group.medium-quarter-horizontal-gutters>.all-auto,.column-group.medium-quarter-horizontal-gutters>[class*=all-],.column-group.medium-quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}.column-group.medium-quarter-vertical-gutters>.all-auto,.column-group.medium-quarter-vertical-gutters>[class*=all-],.column-group.medium-quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}.column-group.medium-no-gutters{margin-left:0}.column-group.medium-no-gutters>.all-auto,.column-group.medium-no-gutters>[class*=all-],.column-group.medium-no-gutters>[class*=medium-]{padding-left:0;margin-bottom:0}.medium-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.medium-reverse,.column-group.reverse,.ink-flex.medium-reverse,.ink-flex.reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.medium-vertical,.column-group.vertical,.ink-flex.medium-vertical,.ink-flex.vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.medium-vertical.medium-reverse,.column-group.vertical.reverse,.ink-flex.medium-vertical.medium-reverse,.ink-flex.vertical.reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.medium-order-1{order:1;-ms-flex-order:1}.medium-order-2{order:2;-ms-flex-order:2}.medium-order-3{order:3;-ms-flex-order:3}.medium-order-4{order:4;-ms-flex-order:4}.medium-order-5{order:5;-ms-flex-order:5}.medium-order-6{order:6;-ms-flex-order:6}.medium-order-7{order:7;-ms-flex-order:7}.medium-order-8{order:8;-ms-flex-order:8}.medium-order-9{order:9;-ms-flex-order:9}.medium-order-10{order:10;-ms-flex-order:10}.column-group .medium-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.medium-push-top,.push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.medium-push-bottom,.push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.medium-push-middle,.push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.medium-push-left,.push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.medium-push-center,.push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.medium-push-right,.push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.medium-align-left{text-align:left}.medium-align-center{text-align:center}.medium-align-right{text-align:right}.medium-space,.space{margin:1.5em}.medium-padding,.padding{padding:1.5em}.double-space,.medium-double-space{margin:3em}.double-padding,.medium-double-padding{padding:3em}.half-space,.medium-half-space{margin:.75em}.half-padding,.medium-half-padding{padding:.75em}.medium-quarter-space,.quarter-space{margin:.375em}.medium-quarter-padding,.quarter-padding{padding:.375em}.medium-vertical-space,.vertical-space{margin-top:1.5em;margin-bottom:1.5em}.medium-vertical-padding,.vertical-padding{padding-top:1.5em;padding-bottom:1.5em}.double-vertical-space,.medium-double-vertical-space{margin-top:3em;margin-bottom:3em}.double-vertical-padding,.medium-double-vertical-padding{padding-top:3em;padding-bottom:3em}.half-vertical-space,.medium-half-vertical-space{margin-top:.75em;margin-bottom:.75em}.half-vertical-padding,.medium-half-vertical-padding{padding-top:.75em;padding-bottom:.75em}.medium-quarter-vertical-space,.quarter-vertical-space{margin-top:.375em;margin-bottom:.375em}.medium-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.375em;padding-bottom:.375em}.horizontal-space,.medium-horizontal-space{margin-left:1.5em;margin-right:1.5em}.horizontal-padding,.medium-horizontal-padding{padding-left:1.5em;padding-right:1.5em}.double-horizontal-space,.medium-double-horizontal-space{margin-left:3em;margin-right:3em}.double-horizontal-padding,.medium-double-horizontal-padding{padding-left:3em;padding-right:3em}.half-horizontal-space,.medium-half-horizontal-space{margin-left:.75em;margin-right:.75em}.half-horizontal-padding,.medium-half-horizontal-padding{padding-left:.75em;padding-right:.75em}.medium-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.375em;margin-right:.375em}.medium-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.375em;padding-right:.375em}.medium-top-space,.top-space{margin-top:1.5em}.medium-top-padding,.top-padding{padding-top:1.5em}.double-top-space,.medium-double-top-space{margin-top:3em}.double-top-padding,.medium-double-top-padding{padding-top:3em}.half-top-space,.medium-half-top-space{margin-top:.75em}.half-top-padding,.medium-half-top-padding{padding-top:.75em}.medium-quarter-top-space,.quarter-top-space{margin-top:.375em}.medium-quarter-top-padding,.quarter-top-padding{padding-top:.375em}.medium-right-space,.right-space{margin-right:1.5em}.medium-right-padding,.right-padding{padding-right:1.5em}.double-right-space,.medium-double-right-space{margin-right:3em}.double-right-padding,.medium-double-right-padding{padding-right:3em}.half-right-space,.medium-half-right-space{margin-right:.75em}.half-right-padding,.medium-half-right-padding{padding-right:.75em}.medium-quarter-right-space,.quarter-right-space{margin-right:.375em}.medium-quarter-right-padding,.quarter-right-padding{padding-right:.375em}.bottom-space,.medium-bottom-space{margin-bottom:1.5em}.bottom-padding,.medium-bottom-padding{padding-bottom:1.5em}.double-bottom-space,.medium-double-bottom-space{margin-bottom:3em}.double-bottom-padding,.medium-double-bottom-padding{padding-bottom:3em}.half-bottom-space,.medium-half-bottom-space{margin-bottom:.75em}.half-bottom-padding,.medium-half-bottom-padding{padding-bottom:.75em}.medium-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.375em}.medium-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.375em}.left-space,.medium-left-space{margin-left:1.5em}.left-padding,.medium-left-padding{padding-left:1.5em}.double-left-space,.medium-double-left-space{margin-left:3em}.double-left-padding,.medium-double-left-padding{padding-left:3em}.half-left-space,.medium-half-left-space{margin-left:.75em}.half-left-padding,.medium-half-left-padding{padding-left:.75em}.medium-quarter-left-space,.quarter-left-space{margin-left:.375em}.medium-quarter-left-padding,.quarter-left-padding{padding-left:.375em}.hide-medium{display:none!important}.show-medium{display:inherit!important}table.show-medium{display:table}thead.show-medium{display:table-header-group}tbody.show-medium{display:table-row-group}tfoot.show-medium{display:table-footer-group}tr.show-medium{display:table-row}td.show-medium,th.show-medium{display:table-cell}}@media screen and (min-width:321px) and (max-width:640px){.ink-grid{padding:0 1.25em}.column-group.gutters{margin-left:-1.25em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}.column-group.horizontal-gutters{margin-left:-1.25em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=small-]{padding-left:1.25em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=small-]{margin-bottom:1.25em}.column-group.double-gutters{margin-left:-2.5em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}.column-group.double-horizontal-gutters{margin-left:-2.5em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=small-]{padding-left:2.5em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}.column-group.half-gutters{margin-left:-.625em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}.column-group.half-horizontal-gutters{margin-left:-.625em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=small-]{padding-left:.625em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=small-]{margin-bottom:.625em}.column-group.quarter-gutters{margin-left:-.3125em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}.column-group.quarter-horizontal-gutters{margin-left:-.3125em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}.column-group.small-gutters{margin-left:-1.25em}.column-group.small-gutters>.all-auto,.column-group.small-gutters>[class*=all-],.column-group.small-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}.column-group.small-horizontal-gutters{margin-left:-1.25em}.column-group.small-horizontal-gutters>.all-auto,.column-group.small-horizontal-gutters>[class*=all-],.column-group.small-horizontal-gutters>[class*=small-]{padding-left:1.25em}.column-group.small-vertical-gutters>.all-auto,.column-group.small-vertical-gutters>[class*=all-],.column-group.small-vertical-gutters>[class*=small-]{margin-bottom:1.25em}.column-group.small-double-gutters{margin-left:-2.5em}.column-group.small-double-gutters>.all-auto,.column-group.small-double-gutters>[class*=all-],.column-group.small-double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}.column-group.small-double-horizontal-gutters{margin-left:-2.5em}.column-group.small-double-horizontal-gutters>.all-auto,.column-group.small-double-horizontal-gutters>[class*=all-],.column-group.small-double-horizontal-gutters>[class*=small-]{padding-left:2.5em}.column-group.small-double-vertical-gutters>.all-auto,.column-group.small-double-vertical-gutters>[class*=all-],.column-group.small-double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}.column-group.small-half-gutters{margin-left:-.625em}.column-group.small-half-gutters>.all-auto,.column-group.small-half-gutters>[class*=all-],.column-group.small-half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}.column-group.small-half-horizontal-gutters{margin-left:-.625em}.column-group.small-half-horizontal-gutters>.all-auto,.column-group.small-half-horizontal-gutters>[class*=all-],.column-group.small-half-horizontal-gutters>[class*=small-]{padding-left:.625em}.column-group.small-half-vertical-gutters>.all-auto,.column-group.small-half-vertical-gutters>[class*=all-],.column-group.small-half-vertical-gutters>[class*=small-]{margin-bottom:.625em}.column-group.small-quarter-gutters{margin-left:-.3125em}.column-group.small-quarter-gutters>.all-auto,.column-group.small-quarter-gutters>[class*=all-],.column-group.small-quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}.column-group.small-quarter-horizontal-gutters{margin-left:-.3125em}.column-group.small-quarter-horizontal-gutters>.all-auto,.column-group.small-quarter-horizontal-gutters>[class*=all-],.column-group.small-quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}.column-group.small-quarter-vertical-gutters>.all-auto,.column-group.small-quarter-vertical-gutters>[class*=all-],.column-group.small-quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}.column-group.small-no-gutters{margin-left:0}.column-group.small-no-gutters>.all-auto,.column-group.small-no-gutters>[class*=all-],.column-group.small-no-gutters>[class*=small-]{padding-left:0;margin-bottom:0}.small-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.reverse,.column-group.small-reverse,.ink-flex.reverse,.ink-flex.small-reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.small-vertical,.column-group.vertical,.ink-flex.small-vertical,.ink-flex.vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.small-vertical.small-reverse,.column-group.vertical.reverse,.ink-flex.small-vertical.small-reverse,.ink-flex.vertical.reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.small-order-1{order:1;-ms-flex-order:1}.small-order-2{order:2;-ms-flex-order:2}.small-order-3{order:3;-ms-flex-order:3}.small-order-4{order:4;-ms-flex-order:4}.small-order-5{order:5;-ms-flex-order:5}.small-order-6{order:6;-ms-flex-order:6}.small-order-7{order:7;-ms-flex-order:7}.small-order-8{order:8;-ms-flex-order:8}.small-order-9{order:9;-ms-flex-order:9}.small-order-10{order:10;-ms-flex-order:10}.column-group .small-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.push-top,.small-push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.push-bottom,.small-push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.push-middle,.small-push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.push-left,.small-push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.push-center,.small-push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.push-right,.small-push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.small-align-left{text-align:left}.small-align-center{text-align:center}.small-align-right{text-align:right}.small-space,.space{margin:1.25em}.padding,.small-padding{padding:1.25em}.double-space,.small-double-space{margin:2.5em}.double-padding,.small-double-padding{padding:2.5em}.half-space,.small-half-space{margin:.625em}.half-padding,.small-half-padding{padding:.625em}.quarter-space,.small-quarter-space{margin:.3125em}.quarter-padding,.small-quarter-padding{padding:.3125em}.small-vertical-space,.vertical-space{margin-top:1.25em;margin-bottom:1.25em}.small-vertical-padding,.vertical-padding{padding-top:1.25em;padding-bottom:1.25em}.double-vertical-space,.small-double-vertical-space{margin-top:2.5em;margin-bottom:2.5em}.double-vertical-padding,.small-double-vertical-padding{padding-top:2.5em;padding-bottom:2.5em}.half-vertical-space,.small-half-vertical-space{margin-top:.625em;margin-bottom:.625em}.half-vertical-padding,.small-half-vertical-padding{padding-top:.625em;padding-bottom:.625em}.quarter-vertical-space,.small-quarter-vertical-space{margin-top:.3125em;margin-bottom:.3125em}.quarter-vertical-padding,.small-quarter-vertical-padding{padding-top:.3125em;padding-bottom:.3125em}.horizontal-space,.small-horizontal-space{margin-left:1.25em;margin-right:1.25em}.horizontal-padding,.small-horizontal-padding{padding-left:1.25em;padding-right:1.25em}.double-horizontal-space,.small-double-horizontal-space{margin-left:2.5em;margin-right:2.5em}.double-horizontal-padding,.small-double-horizontal-padding{padding-left:2.5em;padding-right:2.5em}.half-horizontal-space,.small-half-horizontal-space{margin-left:.625em;margin-right:.625em}.half-horizontal-padding,.small-half-horizontal-padding{padding-left:.625em;padding-right:.625em}.quarter-horizontal-space,.small-quarter-horizontal-space{margin-left:.3125em;margin-right:.3125em}.quarter-horizontal-padding,.small-quarter-horizontal-padding{padding-left:.3125em;padding-right:.3125em}.small-top-space,.top-space{margin-top:1.25em}.small-top-padding,.top-padding{padding-top:1.25em}.double-top-space,.small-double-top-space{margin-top:2.5em}.double-top-padding,.small-double-top-padding{padding-top:2.5em}.half-top-space,.small-half-top-space{margin-top:.625em}.half-top-padding,.small-half-top-padding{padding-top:.625em}.quarter-top-space,.small-quarter-top-space{margin-top:.3125em}.quarter-top-padding,.small-quarter-top-padding{padding-top:.3125em}.right-space,.small-right-space{margin-right:1.25em}.right-padding,.small-right-padding{padding-right:1.25em}.double-right-space,.small-double-right-space{margin-right:2.5em}.double-right-padding,.small-double-right-padding{padding-right:2.5em}.half-right-space,.small-half-right-space{margin-right:.625em}.half-right-padding,.small-half-right-padding{padding-right:.625em}.quarter-right-space,.small-quarter-right-space{margin-right:.3125em}.quarter-right-padding,.small-quarter-right-padding{padding-right:.3125em}.bottom-space,.small-bottom-space{margin-bottom:1.25em}.bottom-padding,.small-bottom-padding{padding-bottom:1.25em}.double-bottom-space,.small-double-bottom-space{margin-bottom:2.5em}.double-bottom-padding,.small-double-bottom-padding{padding-bottom:2.5em}.half-bottom-space,.small-half-bottom-space{margin-bottom:.625em}.half-bottom-padding,.small-half-bottom-padding{padding-bottom:.625em}.quarter-bottom-space,.small-quarter-bottom-space{margin-bottom:.3125em}.quarter-bottom-padding,.small-quarter-bottom-padding{padding-bottom:.3125em}.left-space,.small-left-space{margin-left:1.25em}.left-padding,.small-left-padding{padding-left:1.25em}.double-left-space,.small-double-left-space{margin-left:2.5em}.double-left-padding,.small-double-left-padding{padding-left:2.5em}.half-left-space,.small-half-left-space{margin-left:.625em}.half-left-padding,.small-half-left-padding{padding-left:.625em}.quarter-left-space,.small-quarter-left-space{margin-left:.3125em}.quarter-left-padding,.small-quarter-left-padding{padding-left:.3125em}.hide-small{display:none!important}.show-small{display:inherit!important}table.show-small{display:table}thead.show-small{display:table-header-group}tbody.show-small{display:table-row-group}tfoot.show-small{display:table-footer-group}tr.show-small{display:table-row}td.show-small,th.show-small{display:table-cell}}@media screen and (max-width:320px){.ink-grid{padding:0 1em}.column-group.gutters{margin-left:-1em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}.column-group.horizontal-gutters{margin-left:-1em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=tiny-]{padding-left:1em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=tiny-]{margin-bottom:1em}.column-group.double-gutters{margin-left:-2em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}.column-group.double-horizontal-gutters{margin-left:-2em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=tiny-]{padding-left:2em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}.column-group.half-gutters{margin-left:-.5em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}.column-group.half-horizontal-gutters{margin-left:-.5em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}.column-group.quarter-gutters{margin-left:-.25em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}.column-group.quarter-horizontal-gutters{margin-left:-.25em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}.column-group.tiny-gutters{margin-left:-1em}.column-group.tiny-gutters>.all-auto,.column-group.tiny-gutters>[class*=all-],.column-group.tiny-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}.column-group.tiny-horizontal-gutters{margin-left:-1em}.column-group.tiny-horizontal-gutters>.all-auto,.column-group.tiny-horizontal-gutters>[class*=all-],.column-group.tiny-horizontal-gutters>[class*=tiny-]{padding-left:1em}.column-group.tiny-vertical-gutters>.all-auto,.column-group.tiny-vertical-gutters>[class*=all-],.column-group.tiny-vertical-gutters>[class*=tiny-]{margin-bottom:1em}.column-group.tiny-double-gutters{margin-left:-2em}.column-group.tiny-double-gutters>.all-auto,.column-group.tiny-double-gutters>[class*=all-],.column-group.tiny-double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}.column-group.tiny-double-horizontal-gutters{margin-left:-2em}.column-group.tiny-double-horizontal-gutters>.all-auto,.column-group.tiny-double-horizontal-gutters>[class*=all-],.column-group.tiny-double-horizontal-gutters>[class*=tiny-]{padding-left:2em}.column-group.tiny-double-vertical-gutters>.all-auto,.column-group.tiny-double-vertical-gutters>[class*=all-],.column-group.tiny-double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}.column-group.tiny-half-gutters{margin-left:-.5em}.column-group.tiny-half-gutters>.all-auto,.column-group.tiny-half-gutters>[class*=all-],.column-group.tiny-half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}.column-group.tiny-half-horizontal-gutters{margin-left:-.5em}.column-group.tiny-half-horizontal-gutters>.all-auto,.column-group.tiny-half-horizontal-gutters>[class*=all-],.column-group.tiny-half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}.column-group.tiny-half-vertical-gutters>.all-auto,.column-group.tiny-half-vertical-gutters>[class*=all-],.column-group.tiny-half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}.column-group.tiny-quarter-gutters{margin-left:-.25em}.column-group.tiny-quarter-gutters>.all-auto,.column-group.tiny-quarter-gutters>[class*=all-],.column-group.tiny-quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}.column-group.tiny-quarter-horizontal-gutters{margin-left:-.25em}.column-group.tiny-quarter-horizontal-gutters>.all-auto,.column-group.tiny-quarter-horizontal-gutters>[class*=all-],.column-group.tiny-quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}.column-group.tiny-quarter-vertical-gutters>.all-auto,.column-group.tiny-quarter-vertical-gutters>[class*=all-],.column-group.tiny-quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}.column-group.tiny-no-gutters{margin-left:0}.column-group.tiny-no-gutters>.all-auto,.column-group.tiny-no-gutters>[class*=all-],.column-group.tiny-no-gutters>[class*=tiny-]{padding-left:0;margin-bottom:0}.tiny-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.reverse,.column-group.tiny-reverse,.ink-flex.reverse,.ink-flex.tiny-reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.tiny-vertical,.column-group.vertical,.ink-flex.tiny-vertical,.ink-flex.vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.tiny-vertical.tiny-reverse,.column-group.vertical.reverse,.ink-flex.tiny-vertical.tiny-reverse,.ink-flex.vertical.reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.tiny-order-1{order:1;-ms-flex-order:1}.tiny-order-2{order:2;-ms-flex-order:2}.tiny-order-3{order:3;-ms-flex-order:3}.tiny-order-4{order:4;-ms-flex-order:4}.tiny-order-5{order:5;-ms-flex-order:5}.tiny-order-6{order:6;-ms-flex-order:6}.tiny-order-7{order:7;-ms-flex-order:7}.tiny-order-8{order:8;-ms-flex-order:8}.tiny-order-9{order:9;-ms-flex-order:9}.tiny-order-10{order:10;-ms-flex-order:10}.column-group .tiny-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.push-top,.tiny-push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.push-bottom,.tiny-push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.push-middle,.tiny-push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.push-left,.tiny-push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.push-center,.tiny-push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.push-right,.tiny-push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.tiny-align-left{text-align:left}.tiny-align-center{text-align:center}.tiny-align-right{text-align:right}.space,.tiny-space{margin:1em}.padding,.tiny-padding{padding:1em}.double-space,.tiny-double-space{margin:2em}.double-padding,.tiny-double-padding{padding:2em}.half-space,.tiny-half-space{margin:.5em}.half-padding,.tiny-half-padding{padding:.5em}.quarter-space,.tiny-quarter-space{margin:.25em}.quarter-padding,.tiny-quarter-padding{padding:.25em}.tiny-vertical-space,.vertical-space{margin-top:1em;margin-bottom:1em}.tiny-vertical-padding,.vertical-padding{padding-top:1em;padding-bottom:1em}.double-vertical-space,.tiny-double-vertical-space{margin-top:2em;margin-bottom:2em}.double-vertical-padding,.tiny-double-vertical-padding{padding-top:2em;padding-bottom:2em}.half-vertical-space,.tiny-half-vertical-space{margin-top:.5em;margin-bottom:.5em}.half-vertical-padding,.tiny-half-vertical-padding{padding-top:.5em;padding-bottom:.5em}.quarter-vertical-space,.tiny-quarter-vertical-space{margin-top:.25em;margin-bottom:.25em}.quarter-vertical-padding,.tiny-quarter-vertical-padding{padding-top:.25em;padding-bottom:.25em}.horizontal-space,.tiny-horizontal-space{margin-left:1em;margin-right:1em}.horizontal-padding,.tiny-horizontal-padding{padding-left:1em;padding-right:1em}.double-horizontal-space,.tiny-double-horizontal-space{margin-left:2em;margin-right:2em}.double-horizontal-padding,.tiny-double-horizontal-padding{padding-left:2em;padding-right:2em}.half-horizontal-space,.tiny-half-horizontal-space{margin-left:.5em;margin-right:.5em}.half-horizontal-padding,.tiny-half-horizontal-padding{padding-left:.5em;padding-right:.5em}.quarter-horizontal-space,.tiny-quarter-horizontal-space{margin-left:.25em;margin-right:.25em}.quarter-horizontal-padding,.tiny-quarter-horizontal-padding{padding-left:.25em;padding-right:.25em}.tiny-top-space,.top-space{margin-top:1em}.tiny-top-padding,.top-padding{padding-top:1em}.double-top-space,.tiny-double-top-space{margin-top:2em}.double-top-padding,.tiny-double-top-padding{padding-top:2em}.half-top-space,.tiny-half-top-space{margin-top:.5em}.half-top-padding,.tiny-half-top-padding{padding-top:.5em}.quarter-top-space,.tiny-quarter-top-space{margin-top:.25em}.quarter-top-padding,.tiny-quarter-top-padding{padding-top:.25em}.right-space,.tiny-right-space{margin-right:1em}.right-padding,.tiny-right-padding{padding-right:1em}.double-right-space,.tiny-double-right-space{margin-right:2em}.double-right-padding,.tiny-double-right-padding{padding-right:2em}.half-right-space,.tiny-half-right-space{margin-right:.5em}.half-right-padding,.tiny-half-right-padding{padding-right:.5em}.quarter-right-space,.tiny-quarter-right-space{margin-right:.25em}.quarter-right-padding,.tiny-quarter-right-padding{padding-right:.25em}.bottom-space,.tiny-bottom-space{margin-bottom:1em}.bottom-padding,.tiny-bottom-padding{padding-bottom:1em}.double-bottom-space,.tiny-double-bottom-space{margin-bottom:2em}.double-bottom-padding,.tiny-double-bottom-padding{padding-bottom:2em}.half-bottom-space,.tiny-half-bottom-space{margin-bottom:.5em}.half-bottom-padding,.tiny-half-bottom-padding{padding-bottom:.5em}.quarter-bottom-space,.tiny-quarter-bottom-space{margin-bottom:.25em}.quarter-bottom-padding,.tiny-quarter-bottom-padding{padding-bottom:.25em}.left-space,.tiny-left-space{margin-left:1em}.left-padding,.tiny-left-padding{padding-left:1em}.double-left-space,.tiny-double-left-space{margin-left:2em}.double-left-padding,.tiny-double-left-padding{padding-left:2em}.half-left-space,.tiny-half-left-space{margin-left:.5em}.half-left-padding,.tiny-half-left-padding{padding-left:.5em}.quarter-left-space,.tiny-quarter-left-space{margin-left:.25em}.quarter-left-padding,.tiny-quarter-left-padding{padding-left:.25em}.hide-tiny{display:none!important}.show-tiny{display:inherit!important}table.show-tiny{display:table}thead.show-tiny{display:table-header-group}tbody.show-tiny{display:table-row-group}tfoot.show-tiny{display:table-footer-group}tr.show-tiny{display:table-row}td.show-tiny,th.show-tiny{display:table-cell}}@media screen and (min-width:1261px){html{font-size:1.08em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:961px) and (max-width:1260px){html{font-size:1.05em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:641px) and (max-width:960px){html{font-size:1em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:321px) and (max-width:640px){html{font-size:.98em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (max-width:320px){html{font-size:.97em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-thin-webfont.eot);src:url(../fonts/Roboto/roboto-thin-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-thin-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-thin-webfont.ttf) format('truetype');font-weight:100;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-thinitalic-webfont.eot);src:url(../fonts/Roboto/roboto-thinitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-thinitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-thinitalic-webfont.ttf) format('truetype');font-weight:100;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-light-webfont.eot);src:url(../fonts/Roboto/roboto-light-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-light-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-light-webfont.ttf) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-lightitalic-webfont.eot);src:url(../fonts/Roboto/roboto-lightitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-lightitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-lightitalic-webfont.ttf) format('truetype');font-weight:300;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-regular-webfont.eot);src:url(../fonts/Roboto/roboto-regular-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-regular-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-regular-webfont.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-italic-webfont.eot);src:url(../fonts/Roboto/roboto-italic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-italic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-italic-webfont.ttf) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-medium-webfont.eot);src:url(../fonts/Roboto/roboto-medium-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-medium-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-medium-webfont.ttf) format('truetype');font-weight:500;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-mediumitalic-webfont.eot);src:url(../fonts/Roboto/roboto-mediumitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-mediumitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-mediumitalic-webfont.ttf) format('truetype');font-weight:500;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-bold-webfont.eot);src:url(../fonts/Roboto/roboto-bold-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-bold-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-bold-webfont.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-bolditalic-webfont.eot);src:url(../fonts/Roboto/roboto-bolditalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-bolditalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-bolditalic-webfont.ttf) format('truetype');font-weight:700;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-black-webfont.eot);src:url(../fonts/Roboto/roboto-black-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-black-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-black-webfont.ttf) format('truetype');font-weight:900;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-blackitalic-webfont.eot);src:url(../fonts/Roboto/roboto-blackitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-blackitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-blackitalic-webfont.ttf) format('truetype');font-weight:900;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-light-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-light-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-light-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-light-webfont.ttf) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.ttf) format('truetype');font-weight:300;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.ttf) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.ttf) format('truetype');font-weight:700;font-style:italic}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-thin-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-thin-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-thin-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-thin-webfont.ttf) format('truetype');font-weight:100;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-light-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-light-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-light-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-light-webfont.ttf) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-regular-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-regular-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-regular-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-regular-webfont.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-bold-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-bold-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-bold-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-bold-webfont.ttf) format('truetype');font-weight:700;font-style:normal}.ink-label{padding:0 .35em;white-space:nowrap}.ink-navigation{overflow:visible}.ink-navigation ul{list-style-type:none;padding:0;margin:0}.ink-navigation ul li{margin:0}.ink-navigation .breadcrumbs li{line-height:2.7em;display:inline}.ink-navigation .breadcrumbs li a{display:inline;padding:0}.ink-navigation .breadcrumbs li a:hover{background:0 0}.ink-navigation .breadcrumbs li.active a{cursor:default;text-decoration:none}.ink-navigation .breadcrumbs li:first-child a{padding-left:1.2em}.ink-navigation .breadcrumbs li:after{content:'/';display:inline;margin:0 .7em}.ink-navigation .breadcrumbs li:last-child:after{content:'';display:none}.ink-dropdown,.ink-navigation{position:relative}.ink-dropdown ul.dropdown,.ink-dropdown ul.dropdown-menu,.ink-navigation ul.dropdown,.ink-navigation ul.dropdown-menu{position:absolute;top:110%;background:#fff;z-index:30;border:1px solid #d9d9d9;height:auto;width:auto;min-width:10em;max-width:12em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:rgba(100,100,100,.3) 0 0 1px 0;-moz-box-shadow:rgba(100,100,100,.3) 0 0 1px 0;box-shadow:rgba(100,100,100,.3) 0 0 1px 0;margin-left:0;padding:.35em 0;font-size:.85em}.ink-dropdown ul.dropdown li,.ink-dropdown ul.dropdown-menu li,.ink-navigation ul.dropdown li,.ink-navigation ul.dropdown-menu li{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-border-radius:none;-moz-border-radius:none;-ms-border-radius:none;-o-border-radius:none;border-radius:none;width:auto;height:auto;min-height:auto;display:list-item;float:none;margin:0;text-align:left;text-transform:none;padding:0;position:relative;list-style-type:none}.ink-dropdown ul.dropdown li.separator-above,.ink-dropdown ul.dropdown-menu li.separator-above,.ink-navigation ul.dropdown li.separator-above,.ink-navigation ul.dropdown-menu li.separator-above{padding-top:.35em;margin-top:.35em;border-top:1px solid #d9d9d9}.ink-dropdown ul.dropdown li.separator-below,.ink-dropdown ul.dropdown-menu li.separator-below,.ink-navigation ul.dropdown li.separator-below,.ink-navigation ul.dropdown-menu li.separator-below{padding-bottom:.35em;margin-bottom:.35em;border-bottom:1px solid #d9d9d9}.ink-dropdown ul.dropdown li.heading,.ink-dropdown ul.dropdown-menu li.heading,.ink-navigation ul.dropdown li.heading,.ink-navigation ul.dropdown-menu li.heading{font-weight:700;margin-bottom:.35em;padding:.5em .8em;color:#333}.ink-dropdown ul.dropdown li a,.ink-dropdown ul.dropdown-menu li a,.ink-navigation ul.dropdown li a,.ink-navigation ul.dropdown-menu li a{color:#444;padding:.5em .8em;display:block;clear:both}.ink-dropdown ul.dropdown li a:hover,.ink-dropdown ul.dropdown-menu li a:hover,.ink-navigation ul.dropdown li a:hover,.ink-navigation ul.dropdown-menu li a:hover{background:#f2f2f2;text-decoration:none}.ink-dropdown ul.dropdown li.active a,.ink-dropdown ul.dropdown-menu li.active a,.ink-navigation ul.dropdown li.active a,.ink-navigation ul.dropdown-menu li.active a{background:#999;color:#fff}.ink-dropdown ul.dropdown li.disabled a,.ink-dropdown ul.dropdown-menu li.disabled a,.ink-navigation ul.dropdown li.disabled a,.ink-navigation ul.dropdown-menu li.disabled a{color:#b3b3b3}.ink-dropdown ul.dropdown li.disabled a:hover,.ink-dropdown ul.dropdown-menu li.disabled a:hover,.ink-navigation ul.dropdown li.disabled a:hover,.ink-navigation ul.dropdown-menu li.disabled a:hover{background:0 0;cursor:default}.ink-dropdown ul.dropdown li.submenu,.ink-dropdown ul.dropdown-menu li.submenu,.ink-navigation ul.dropdown li.submenu,.ink-navigation ul.dropdown-menu li.submenu{overflow:visible}.ink-dropdown ul.dropdown li.submenu>a,.ink-dropdown ul.dropdown-menu li.submenu>a,.ink-navigation ul.dropdown li.submenu>a,.ink-navigation ul.dropdown-menu li.submenu>a{white-space:nowrap}.ink-dropdown ul.dropdown li.submenu>a:after,.ink-dropdown ul.dropdown-menu li.submenu>a:after,.ink-navigation ul.dropdown li.submenu>a:after,.ink-navigation ul.dropdown-menu li.submenu>a:after{content:"\f0da";width:auto;margin-left:.8em;font-family:FontAwesome;color:#b3b3b3}.ink-dropdown ul.dropdown li.submenu:hover>a,.ink-dropdown ul.dropdown-menu li.submenu:hover>a,.ink-navigation ul.dropdown li.submenu:hover>a,.ink-navigation ul.dropdown-menu li.submenu:hover>a{background:#f2f2f2;text-decoration:none}.ink-dropdown ul.dropdown li.submenu:hover:hover>ul.dropdown,.ink-dropdown ul.dropdown li.submenu:hover:hover>ul.dropdown-menu,.ink-dropdown ul.dropdown-menu li.submenu:hover:hover>ul.dropdown,.ink-dropdown ul.dropdown-menu li.submenu:hover:hover>ul.dropdown-menu,.ink-navigation ul.dropdown li.submenu:hover:hover>ul.dropdown,.ink-navigation ul.dropdown li.submenu:hover:hover>ul.dropdown-menu,.ink-navigation ul.dropdown-menu li.submenu:hover:hover>ul.dropdown,.ink-navigation ul.dropdown-menu li.submenu:hover:hover>ul.dropdown-menu{display:block}.ink-dropdown ul.dropdown li.submenu>ul.dropdown,.ink-dropdown ul.dropdown li.submenu>ul.dropdown-menu,.ink-dropdown ul.dropdown-menu li.submenu>ul.dropdown,.ink-dropdown ul.dropdown-menu li.submenu>ul.dropdown-menu,.ink-navigation ul.dropdown li.submenu>ul.dropdown,.ink-navigation ul.dropdown li.submenu>ul.dropdown-menu,.ink-navigation ul.dropdown-menu li.submenu>ul.dropdown,.ink-navigation ul.dropdown-menu li.submenu>ul.dropdown-menu{font-size:inherit;position:absolute;top:-.36em;left:100%;display:none}.ink-navigation ul.pagination{overflow:hidden;*zoom:1}.ink-navigation ul.pagination li{line-height:1.7;float:left}.ink-navigation ul.pagination li a{padding:.5em 1em;display:block;float:left}.ink-navigation ul.pagination.dotted li a{display:block;height:1em;width:1em;margin-right:.6em;padding:0;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%;text-indent:99999px}.ink-navigation ul.pagination.dotted li a:first-child,.ink-navigation ul.pagination.dotted li a:last-child{-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%}.ink-navigation ul.pagination.chevron li{display:none}.ink-navigation ul.pagination.chevron li.next,.ink-navigation ul.pagination.chevron li.previous{display:block}.ink-navigation ul.pagination.chevron li.next a,.ink-navigation ul.pagination.chevron li.previous a{display:block;position:absolute;top:35%;padding:0 .5em;margin:0;font-family:FontAwesome;font-size:4em}.ink-navigation ul.pagination.chevron li.next a span,.ink-navigation ul.pagination.chevron li.previous a span{text-indent:-99999px;display:inline-block}.ink-navigation ul.pagination.chevron li.previous a{left:0}.ink-navigation ul.pagination.chevron li.previous a:after{content:"\f137"}.ink-navigation ul.pagination.chevron li.next a{right:0}.ink-navigation ul.pagination.chevron li.next a:after{content:"\f138"}.ink-navigation .pills{overflow:hidden;*zoom:1}.ink-navigation .pills li{overflow:hidden;display:block;float:left;margin:0 .5em .5em 0;line-height:1.7}.ink-navigation .pills li a{display:block;padding:.5em 1em}.ink-navigation .pills li a:hover{text-decoration:none}.ink-navigation .pills li.active a,.ink-navigation .pills li.disabled a{cursor:default}.ink-navigation ul{*height:100%}.ink-navigation ul.menu{*zoom:1}.ink-navigation ul.menu:after{content:"";display:table;clear:both}.ink-navigation ul.menu li{*height:100%}.ink-navigation ul.menu li:hover>ul.submenu{display:block}.ink-navigation ul.menu li ul.submenu{display:none;position:absolute;z-index:10}.ink-navigation ul.menu li ul.submenu li a{padding:.5em 1em;display:block;float:none}.ink-navigation ul.menu.horizontal.scrollable{font-size:0;white-space:nowrap;overflow-x:scroll;overflow-y:hidden;-webkit-overflow-scrolling:touch;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}.ink-navigation ul.menu.horizontal.scrollable li{display:inline-block;float:none}.ink-navigation ul.menu.horizontal.scrollable li a{border-right:rgba(10,10,10,.3) 1px solid;font-size:initial}.ink-navigation ul.menu.horizontal.scrollable li:last-child a{border-right:0}.ink-navigation ul.menu.horizontal li{float:left;position:relative}.ink-navigation ul.menu.horizontal li a{padding:.5em 1em;display:block;line-height:1.7}.ink-navigation ul.menu.horizontal li .control{margin-top:.3em}.ink-navigation ul.menu.horizontal li ul.submenu{min-width:100%;z-index:50;top:auto;left:auto}.ink-navigation ul.menu.horizontal li ul.submenu li{float:none}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout{position:absolute;top:0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout.left{right:100%}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout.right{left:100%}.ink-navigation ul.menu.vertical li{line-height:1.7;position:relative}.ink-navigation ul.menu.vertical li a{padding:.5em 1em;display:block}.ink-navigation ul.menu.vertical li ul.submenu{position:relative;top:auto;left:auto}.ink-navigation ul.menu.vertical li ul.submenu.flyout{position:absolute;min-width:8em;top:0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.vertical li ul.submenu.flyout.left{right:100%}.ink-navigation ul.menu.vertical li ul.submenu.flyout.right{left:100%}@media print{*{background:transparent!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.ink-navigation{display:none}.ink-table{border-collapse:collapse}.ink-label{border:1px solid #000}}table.ink-table{width:100%;border-collapse:collapse;border-spacing:0}table.ink-table tr th{padding:5px 10px;line-height:1.3}table.ink-table tr th[data-sortable=true]:hover{cursor:pointer;text-decoration:underline}table.ink-table tr th[data-sortable=true]:hover i{text-decoration:none}table.ink-table tr th[data-sortable=true] i{padding-left:.5em}table.ink-table tr td{padding:5px 10px;line-height:1.3}table.ink-table.hover tbody tr:hover{cursor:pointer}table.ink-table.bordered{border-collapse:separate}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{color:#555;font-family:Roboto,Arial,Helvetica,sans-serif;line-height:1.45}.fw-100,.fw-light{font-weight:100}.fw-300,.fw-thin{font-weight:300}.fw-400,.fw-regular{font-weight:400}.fw-500,.fw-medium{font-weight:500}.fw-700,.fw-bold{font-weight:700}.fw-900,.fw-black{font-weight:900}.condensed-300,.condensed-thin{font-weight:200;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.condensed-400,.condensed-regular{font-weight:400;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.condensed-700,.condensed-bold{font-weight:700;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.slab-100,.slab-light{font-weight:100;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-300,.slab-thin{font-weight:300;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-400,.slab-regular{font-weight:400;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-700,.slab-bold{font-weight:700;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.sans{font-family:Roboto,Arial,Helvetica,sans-serif}.serif{font-family:Times,"Times New Roman",serif}.monospace{font-family:Monaco,"Andale Mono","Courier New",monospace}.condensed{font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.slab{font-family:Roboto_slab,Arial,Helvetica,sans-serif}.italic{font-style:italic}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalizer{text-transform:capitalize}.fa{font-size:14px}a{color:#6998c9;text-decoration:none;cursor:pointer}a:hover{color:#007ed5;text-decoration:underline}h1{font-size:2.2em;margin-top:0;margin-bottom:.57539em}h2{font-size:1.75em;margin-top:0;margin-bottom:.72334em}h3{font-size:1.5em;margin-top:0;margin-bottom:.8439em}h4{font-size:1.25em;margin-top:0;margin-bottom:1.01268em}h5,h6{font-size:1.1em;margin-top:0;margin-bottom:1.15077em}p,table{font-size:1em;margin-top:0;margin-bottom:1.26585em}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,h6:first-child,p:first-child{margin-top:0}h1,h2,h3,h4,h5,h6{color:#404040;font-weight:700;line-height:1.16}small{color:#888}input,textarea{color:#666}h1 small,h2 small,h3 small,h4 small{color:#bbb;font-size:.6em;font-weight:100;line-height:1}mark{background:#dae5f2}address{color:#777;font-size:1em;line-height:1.4}address p{margin-top:0}address h6{color:#555}abbr:hover{cursor:help}blockquote{border-left:4px solid #ddd;padding-left:25px;margin:1em 0;font-weight:200;font-size:1.1em}blockquote small{font-size:.9em}blockquote small::after,blockquote small::before{content:' — '}.note{font-size:.9em;color:#777}.note strong{color:#555}.small{font-size:.75em}.medium{font-size:.85em}.large{font-size:1.2em}.extralarge{font-size:1.45em!important}hr{border:0;border-top:1px solid #ddd;margin:1em 0}.lead{font-size:1.1em;font-weight:700}ol,ul{line-height:1.4;padding:0 0 0 1.45em;margin:1em 0}ol li,ul li{margin:.5em 0}ul.unstyled{list-style:none;padding-left:0}ul.unstyled ul{list-style:disc outside}ul.unstyled ul.unstyled{list-style:none;padding-left:0}ul.inline{list-style:none}ul.inline li{display:inline-block;padding:0 .5em}ul.inline li:first-child{padding:0 .5em 0 0}dl{margin:1em 0}dl dt{font-weight:700;margin:.5em 0}dl dd{margin:.5em 0 .5em 25px}dl.inline dt{float:left;clear:left;text-align:right;width:180px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;margin:0}dl.inline dd{margin:.5em 0 .5em 200px}figure.ink-image{position:relative;border:1px solid #555}figure.ink-image>img{width:100%}figure.ink-image>figcaption{padding:1em;background:#fff;line-height:1.3}figure.ink-image>figcaption.over-bottom,figure.ink-image>figcaption.over-top{position:absolute;width:100%;left:0;border:0}figure.ink-image>figcaption.over-bottom.dark,figure.ink-image>figcaption.over-top.dark{color:#fff;background:rgba(0,0,0,.6)}figure.ink-image>figcaption.over-top{top:0;background:rgba(255,255,255,.7)}figure.ink-image>figcaption.over-bottom{bottom:0;background:rgba(255,255,255,.7)}figure.ink-image>figcaption.dark{color:#fff;background:#222}img{border:0;width:auto;max-width:100%;vertical-align:top}.ink-alert.basic,.ink-alert.block{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-alert.basic{background:rgba(255,156,0,.25);color:#b87814;border:1px solid #b87814}.ink-alert.basic .ink-dismiss{color:#b87814}.ink-alert.basic.success{background:rgba(74,155,23,.25);color:#38621d;border:1px solid #38621d}.ink-alert.basic.success .ink-dismiss{color:#38621d}.ink-alert.basic.error{background:rgba(201,17,17,.25);color:#891e1e;border:1px solid #891e1e}.ink-alert.basic.error .ink-dismiss{color:#891e1e}.ink-alert.basic.info{background:rgba(15,117,218,.25);color:#1e5b98;border:1px solid #1e5b98}.ink-alert.basic.info .ink-dismiss{color:#1e5b98}.ink-alert.block{border:1px solid #b87814;background:#fff}.ink-alert.block>h4{background:rgba(255,156,0,.3);color:#b87814}.ink-alert.block .ink-dismiss{color:#b87814}.ink-alert.block.success{border:1px solid #38621d;background:#fff}.ink-alert.block.success>h4{background:rgba(74,155,23,.3);color:#38621d}.ink-alert.block.success .ink-dismiss{color:#38621d}.ink-alert.block.error{border:1px solid #891e1e;background:#fff}.ink-alert.block.error>h4{background:rgba(201,17,17,.3);color:#891e1e}.ink-alert.block.error .ink-dismiss{color:#891e1e}.ink-alert.block.info{border:1px solid #1e5b98;background:#fff}.ink-alert.block.info>h4{background:rgba(15,117,218,.3);color:#1e5b98}.ink-alert.block.info .ink-dismiss{color:#1e5b98}.ink-alert .ink-dismiss{font-family:Arial,sans-serif;font-weight:700;text-shadow:#fff 0 1px 0;filter:alpha(Opacity=25);opacity:.25}.ink-alert .ink-dismiss:hover{filter:alpha(Opacity=60);opacity:.6}.ink-badge{-webkit-border-radius:8em;-moz-border-radius:8em;-ms-border-radius:8em;-o-border-radius:8em;border-radius:8em;color:#fff}.ink-badge.white{background:#fff;color:#555}.ink-badge.black{background:#000}.ink-badge.orange{background:#ff9c00}.ink-badge.red{background:#c91111}.ink-badge.green{background:#4a9b17}.ink-badge.blue{background:#0f75da}.ink-badge.yellow{background:#ffd500;color:#555}.ink-badge.grey{background:gray}.ink-badge+.ink-badge{margin-left:.2em}.ink-button{background:#d9d9d9;color:#000;border:1px solid #bfbfbf;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;font-weight:300}.ink-button:active,.ink-button:hover{text-decoration:none;color:#000;background:#ccc;border:1px solid #b3b3b3;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px;box-shadow:rgba(0,0,0,.2) 0 1px 1px}.ink-button:focus{outline:0;background:#ccc;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset}.ink-button[disabled]{background:#e6e6e6;border:1px solid #e6e6e6;color:#999}.ink-button[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.blue{color:#fff;background:#0f75da;border:1px solid #0c63b9}.ink-button.blue:active,.ink-button.blue:hover{background:#0d68c2;border:1px solid #0a56a1;color:#fff;text-decoration:none}.ink-button.blue:focus{background:#0d68c2}.ink-button.blue[disabled]{background:rgba(15,117,218,.6);border:1px solid rgba(15,117,218,0);color:#0c5baa}.ink-button.blue[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.green{color:#fff;background:#4a9b17;border:1px solid #3e8313}.ink-button.green:active,.ink-button.green:hover{background:#3f8514;border:1px solid #336d10;color:#fff;text-decoration:none}.ink-button.green:focus{background:#3f8514}.ink-button.green[disabled]{background:rgba(74,155,23,.6);border:1px solid rgba(74,155,23,0);color:#356f10}.ink-button.green[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.orange{color:#fff;background:#ff9c00;border:1px solid #d88400}.ink-button.orange:active,.ink-button.orange:hover{background:#e68c00;border:1px solid #bf7400;color:#fff;text-decoration:none}.ink-button.orange:focus{background:#e68c00}.ink-button.orange[disabled]{background:rgba(255,156,0,.6);border:1px solid rgba(255,156,0,0);color:#cc7d00}.ink-button.orange[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.red{color:#fff;background:#c91111;border:1px solid #aa0e0e}.ink-button.red:active,.ink-button.red:hover{background:#b10f0f;border:1px solid #920c0c;color:#fff;text-decoration:none}.ink-button.red:focus{background:#b10f0f}.ink-button.red[disabled]{background:rgba(201,17,17,.6);border:1px solid rgba(201,17,17,0);color:#9a0d0d}.ink-button.red[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.black{color:#fff;background:#1a1a1a;border:1px solid #161616}.ink-button.black:active,.ink-button.black:hover{background:#0d0d0d;border:1px solid #090909;color:#fff;text-decoration:none}.ink-button.black:focus{background:#0d0d0d}.ink-button.black[disabled]{background:rgba(26,26,26,.6);border:1px solid rgba(26,26,26,0);color:#000}.ink-button.black[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.white{color:#555;background:#fff;border:1px solid #d8d8d8}.ink-button.white:active,.ink-button.white:hover{background:#f2f2f2;border:1px solid #cbcbcb;color:#555;text-decoration:none}.ink-button.white:focus{background:#f2f2f2}.ink-button.white[disabled]{background:rgba(255,255,255,.6);border:1px solid rgba(255,255,255,0);color:#e6e6e6}.ink-button.white[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.button-group>.ink-button[disabled]{background:#e6e6e6;border:1px solid rgba(217,217,217,.6)}.button-group>.ink-button[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.button-group>.ink-button.blue:first-child{border-left:#0c63b9}.button-group>.ink-button.blue[disabled]{background:rgba(15,117,218,.6);border:1px solid rgba(15,117,218,.3)}.button-group>.ink-button.green:first-child{border-left:#3e8313}.button-group>.ink-button.green[disabled]{background:rgba(74,155,23,.6);border:1px solid rgba(74,155,23,.3)}.button-group>.ink-button.orange:first-child{border-left:#d88400}.button-group>.ink-button.orange[disabled]{background:rgba(255,156,0,.6);border:1px solid rgba(255,156,0,.3)}.button-group>.ink-button.red:first-child{border-left:#aa0e0e}.button-group>.ink-button.red[disabled]{background:rgba(201,17,17,.6);border:1px solid rgba(201,17,17,.3)}.button-group>.ink-button.black:first-child{border-left:#161616}.button-group>.ink-button.black[disabled]{background:rgba(26,26,26,.6);border:1px solid rgba(26,26,26,.3)}.button-group>.ink-button.white:first-child{border-left:#d8d8d8}.button-group>.ink-button.white[disabled]{background:rgba(255,255,255,.6);border:1px solid rgba(255,255,255,.3)}.ink-label{color:#fff;font-weight:300;font-size:.938em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-label.white{background:#fff;color:#555}.ink-label.black{background:#000}.ink-label.orange{background:#ff9c00}.ink-label.red{background:#c91111}.ink-label.green{background:#4a9b17}.ink-label.blue{background:#0f75da}.ink-label.yellow{background:#ffd500;color:#555}.ink-label.grey{background:gray}.ink-label+.ink-label{margin-left:.2em}.ink-navigation ul.breadcrumbs{font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.breadcrumbs li.active a{background:0 0;color:#999}.ink-navigation ul.breadcrumbs li.active a:hover{cursor:default;text-decoration:none}.ink-navigation ul.breadcrumbs li a:hover{background:0 0;text-decoration:underline}.ink-navigation ul.breadcrumbs.white{background:#fff}.ink-navigation ul.breadcrumbs.white li a,.ink-navigation ul.breadcrumbs.white li:after{color:#555}.ink-navigation ul.breadcrumbs.white li.active a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.breadcrumbs.grey{background:#d9d9d9}.ink-navigation ul.breadcrumbs.grey li a,.ink-navigation ul.breadcrumbs.grey li:after{color:#555}.ink-navigation ul.breadcrumbs.grey li.active a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.breadcrumbs.black{background:#1a1a1a}.ink-navigation ul.breadcrumbs.black li a,.ink-navigation ul.breadcrumbs.black li:after{color:#fff}.ink-navigation ul.breadcrumbs.black li.active a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.breadcrumbs.blue{background:#1b75ce}.ink-navigation ul.breadcrumbs.blue li a,.ink-navigation ul.breadcrumbs.blue li:after{color:#fff}.ink-navigation ul.breadcrumbs.blue li.active a{color:#08427b;text-shadow:#1884ef 0 1px 0}.ink-navigation ul.breadcrumbs.orange{background:#f2990d}.ink-navigation ul.breadcrumbs.orange li a,.ink-navigation ul.breadcrumbs.orange li:after{color:#fff}.ink-navigation ul.breadcrumbs.orange li.active a{color:#995e00;text-shadow:#ffa81f 0 1px 0}.ink-navigation ul.breadcrumbs.green{background:#4c9220}.ink-navigation ul.breadcrumbs.green li a,.ink-navigation ul.breadcrumbs.green li:after{color:#fff}.ink-navigation ul.breadcrumbs.green li.active a{color:#20420a;text-shadow:#57b61b 0 1px 0}.ink-navigation ul.breadcrumbs.red{background:#be1c1c}.ink-navigation ul.breadcrumbs.red li a,.ink-navigation ul.breadcrumbs.red li:after{color:#fff}.ink-navigation ul.breadcrumbs.red li.active a{color:#6b0909;text-shadow:#e51313 0 1px 0}.ink-dropdown.green ul.dropdown-menu li.active a{background:#4a9b17;color:#fff}.ink-dropdown.orange ul.dropdown-menu li.active a{background:#ff9c00;color:#fff}.ink-dropdown.red ul.dropdown-menu li.active a{background:#c91111;color:#fff}.ink-dropdown.black ul.dropdown-menu li.active a{background:#1a1a1a;color:#fff}.ink-dropdown.blue ul.dropdown-menu li.active a{background:#0f75da;color:#fff}.ink-navigation ul.menu{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu>li{font-weight:300}.ink-navigation ul.menu>li.active a{text-decoration:underline}.ink-navigation ul.menu>li.heading{font-weight:500}.ink-navigation ul.menu>li.disabled a{color:#b3b3b3;text-shadow:#fff 0 1px 0}.ink-navigation ul.menu>li.disabled a:hover{cursor:default;background:0 0;text-decoration:none}.ink-navigation ul.menu>li ul.submenu li{font-size:.875em}.ink-navigation ul.menu>li ul.submenu li a{border-bottom:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.vertical li a{border-bottom:1px solid rgba(0,0,0,.15)}.ink-navigation ul.menu.vertical li:first-child,.ink-navigation ul.menu.vertical li:first-child>a{-webkit-border-radius:2px 2px 0 0;-moz-border-radius:2px 2px 0 0;-ms-border-radius:2px 2px 0 0;-o-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0}.ink-navigation ul.menu.vertical li:last-child{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child>a{border-bottom:0;-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child .submenu{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child .submenu.flyout{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.vertical li:last-child .submenu li:last-child,.ink-navigation ul.menu.vertical li:last-child .submenu li:last-child a{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.horizontal>li:first-child,.ink-navigation ul.menu.horizontal>li:first-child a{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-navigation ul.menu.horizontal>li:last-child,.ink-navigation ul.menu.horizontal>li:last-child a{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-navigation ul.menu.horizontal>li ul.submenu{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#fff}.ink-navigation ul.menu.horizontal>li ul.submenu li:last-child{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.horizontal>li ul.submenu li:last-child a{border-bottom:0}.ink-navigation ul.menu.white{background:#fff}.ink-navigation ul.menu.white li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.white li ul.submenu li a{color:#555}.ink-navigation ul.menu.white li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.white li.disabled a:hover{background:0 0}.ink-navigation ul.menu.white li.active{background:#e6e6e6}.ink-navigation ul.menu.white li.disabled a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.menu.white li a{color:#555;text-decoration:none}.ink-navigation ul.menu.white li a:hover{background:#f2f2f2}.ink-navigation ul.menu.grey{background:#d9d9d9}.ink-navigation ul.menu.grey li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.grey li ul.submenu li a{color:#555}.ink-navigation ul.menu.grey li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.grey li.disabled a:hover{background:0 0}.ink-navigation ul.menu.grey li.active{background:#bfbfbf}.ink-navigation ul.menu.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.menu.grey li a{color:#555;text-decoration:none}.ink-navigation ul.menu.grey li a:hover{background:#ccc}.ink-navigation ul.menu.black{background:#1a1a1a}.ink-navigation ul.menu.black li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.black li ul.submenu li a{color:#555}.ink-navigation ul.menu.black li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.black li.disabled a:hover{background:0 0}.ink-navigation ul.menu.black li.active{background:#333}.ink-navigation ul.menu.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.menu.black li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.black li a:hover{background:#404040}.ink-navigation ul.menu.blue{background:#1b75ce}.ink-navigation ul.menu.blue li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.blue li ul.submenu li a{color:#555}.ink-navigation ul.menu.blue li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.blue li.disabled a:hover{background:0 0}.ink-navigation ul.menu.blue li.active{background:#0c5baa}.ink-navigation ul.menu.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.menu.blue li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.blue li a:hover{background:#0d68c2}.ink-navigation ul.menu.green{background:#4c9220}.ink-navigation ul.menu.green li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.green li ul.submenu li a{color:#555}.ink-navigation ul.menu.green li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.green li.disabled a:hover{background:0 0}.ink-navigation ul.menu.green li.active{background:#356f10}.ink-navigation ul.menu.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.menu.green li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.green li a:hover{background:#3f8514}.ink-navigation ul.menu.orange{background:#f2990d}.ink-navigation ul.menu.orange li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.orange li ul.submenu li a{color:#555}.ink-navigation ul.menu.orange li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.orange li.disabled a:hover{background:0 0}.ink-navigation ul.menu.orange li.active{background:#cc7d00}.ink-navigation ul.menu.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.menu.orange li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.orange li a:hover{background:#e68c00}.ink-navigation ul.menu.red{background:#be1c1c}.ink-navigation ul.menu.red li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.red li ul.submenu li a{color:#555}.ink-navigation ul.menu.red li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.red li.disabled a:hover{background:0 0}.ink-navigation ul.menu.red li.active{background:#9a0d0d}.ink-navigation ul.menu.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.menu.red li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.red li a:hover{background:#b10f0f}.ink-navigation ul.pagination{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.pagination li{font-weight:300}.ink-navigation ul.pagination li.active a{text-decoration:underline}.ink-navigation ul.pagination li.disabled a{color:#b3b3b3;text-shadow:#fff 0 1px 0}.ink-navigation ul.pagination li.disabled a:hover{cursor:default;background:0 0;text-decoration:none}.ink-navigation ul.pagination li:first-child,.ink-navigation ul.pagination li:first-child a{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-navigation ul.pagination li:last-child,.ink-navigation ul.pagination li:last-child a{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-navigation ul.pagination.white li{background:#fff}.ink-navigation ul.pagination.white li.active a{background:#e6e6e6}.ink-navigation ul.pagination.white li.disabled a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.pagination.white li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.white li a{color:#555;text-decoration:none}.ink-navigation ul.pagination.white li a:hover{background:#f2f2f2}.ink-navigation ul.pagination.grey li{background:#d9d9d9}.ink-navigation ul.pagination.grey li.active a{background:#bfbfbf}.ink-navigation ul.pagination.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.pagination.grey li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.grey li a{color:#555;text-decoration:none}.ink-navigation ul.pagination.grey li a:hover{background:#ccc}.ink-navigation ul.pagination.black li{background:#1a1a1a}.ink-navigation ul.pagination.black li.active a{background:#333}.ink-navigation ul.pagination.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.pagination.black li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.black li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.black li a:hover{background:#292929}.ink-navigation ul.pagination.orange li{background:#f2990d}.ink-navigation ul.pagination.orange li.active a{background:#cc7d00}.ink-navigation ul.pagination.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.pagination.orange li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.orange li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.orange li a:hover{background:#e68c00}.ink-navigation ul.pagination.blue li{background:#1b75ce}.ink-navigation ul.pagination.blue li.active a{background:#0c5baa}.ink-navigation ul.pagination.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.pagination.blue li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.blue li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.blue li a:hover{background:#0d68c2}.ink-navigation ul.pagination.green li{background:#4c9220}.ink-navigation ul.pagination.green li.active a{background:#356f10}.ink-navigation ul.pagination.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.pagination.green li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.green li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.green li a:hover{background:#3f8514}.ink-navigation ul.pagination.red li{background:#be1c1c}.ink-navigation ul.pagination.red li.active a{background:#9a0d0d}.ink-navigation ul.pagination.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.pagination.red li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.red li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.red li a:hover{background:#b10f0f}.ink-navigation ul.pagination.dotted li{background:0 0}.ink-navigation ul.pagination.dotted li a{background:#999;filter:alpha(Opacity=50);opacity:.5}.ink-navigation ul.pagination.dotted li.active a,.ink-navigation ul.pagination.dotted li:hover a{filter:alpha(Opacity=100);opacity:1}.ink-navigation ul.pagination.dotted.black li a{background:#1a1a1a}.ink-navigation ul.pagination.dotted.white li a{background:#fff}.ink-navigation ul.pagination.dotted.blue li a{background:#1b75ce}.ink-navigation ul.pagination.dotted.green li a{background:#4c9220}.ink-navigation ul.pagination.dotted.orange li a{background:#f2990d}.ink-navigation ul.pagination.dotted.red li a{background:#be1c1c}.ink-navigation ul.pagination.chevron li.next a,.ink-navigation ul.pagination.chevron li.previous a{color:#fff;filter:alpha(Opacity=60);opacity:.6}.ink-navigation ul.pagination.chevron li.next a.active,.ink-navigation ul.pagination.chevron li.next a:focus,.ink-navigation ul.pagination.chevron li.next a:hover,.ink-navigation ul.pagination.chevron li.previous a.active,.ink-navigation ul.pagination.chevron li.previous a:focus,.ink-navigation ul.pagination.chevron li.previous a:hover{filter:alpha(Opacity=70);opacity:.7;text-decoration:none;background:0 0}.ink-navigation ul.pagination.chevron li.disabled a{color:#fff;filter:alpha(Opacity=40);opacity:.4;text-shadow:none}.ink-navigation ul.pagination.chevron li.disabled a:focus,.ink-navigation ul.pagination.chevron li.disabled a:hover{color:#fff;filter:alpha(Opacity=40);opacity:.4}.ink-navigation ul.pagination.chevron.black li.disabled a,.ink-navigation ul.pagination.chevron.black li.next a,.ink-navigation ul.pagination.chevron.black li.previous a{color:#1a1a1a}.ink-navigation ul.pagination.chevron.grey li.disabled a,.ink-navigation ul.pagination.chevron.grey li.next a,.ink-navigation ul.pagination.chevron.grey li.previous a{color:#d9d9d9}.ink-navigation ul.pagination.chevron.blue li.disabled a,.ink-navigation ul.pagination.chevron.blue li.next a,.ink-navigation ul.pagination.chevron.blue li.previous a{color:#1b75ce}.ink-navigation ul.pagination.chevron.green li.disabled a,.ink-navigation ul.pagination.chevron.green li.next a,.ink-navigation ul.pagination.chevron.green li.previous a{color:#4c9220}.ink-navigation ul.pagination.chevron.orange li.disabled a,.ink-navigation ul.pagination.chevron.orange li.next a,.ink-navigation ul.pagination.chevron.orange li.previous a{color:#f2990d}.ink-navigation ul.pagination.chevron.red li.disabled a,.ink-navigation ul.pagination.chevron.red li.next a,.ink-navigation ul.pagination.chevron.red li.previous a{color:#be1c1c}.ink-navigation ul.pills li{background:#fff;font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.pills li a{color:#555;background:0 0}.ink-navigation ul.pills li a:hover,.ink-navigation ul.pills li.active a{background:#e6e6e6}.ink-navigation ul.pills li.disabled a{color:#999;text-shadow:#fff 0 1px 0}.ink-navigation ul.pills li.disabled a:hover{background:0 0}.ink-navigation ul.pills.grey li{background:#d9d9d9}.ink-navigation ul.pills.grey li.active a{background:#bfbfbf}.ink-navigation ul.pills.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.pills.grey li.disabled a:hover{background:0 0}.ink-navigation ul.pills.grey li a{color:#555}.ink-navigation ul.pills.grey li a:hover{background:#ccc}.ink-navigation ul.pills.black li{background:#1a1a1a}.ink-navigation ul.pills.black li.active a{background:#333}.ink-navigation ul.pills.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.pills.black li.disabled a:hover{background:0 0}.ink-navigation ul.pills.black li a{color:#fff}.ink-navigation ul.pills.black li a:hover{background:#292929}.ink-navigation ul.pills.blue li{background:#1b75ce}.ink-navigation ul.pills.blue li.active a{background:#0c5baa}.ink-navigation ul.pills.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.pills.blue li.disabled a:hover{background:0 0}.ink-navigation ul.pills.blue li a{color:#fff}.ink-navigation ul.pills.blue li a:hover{background:#0d68c2}.ink-navigation ul.pills.green li{background:#4c9220}.ink-navigation ul.pills.green li.active a{background:#356f10}.ink-navigation ul.pills.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.pills.green li.disabled a:hover{background:0 0}.ink-navigation ul.pills.green li a{color:#fff}.ink-navigation ul.pills.green li a:hover{background:#3f8514}.ink-navigation ul.pills.orange li{background:#f2990d}.ink-navigation ul.pills.orange li.active a{background:#cc7d00}.ink-navigation ul.pills.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.pills.orange li.disabled a:hover{background:0 0}.ink-navigation ul.pills.orange li a{color:#fff}.ink-navigation ul.pills.orange li a:hover{background:#e68c00}.ink-navigation ul.pills.red li{background:#be1c1c}.ink-navigation ul.pills.red li.active a{background:#9a0d0d}.ink-navigation ul.pills.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.pills.red li.disabled a:hover{background:0 0}.ink-navigation ul.pills.red li a{color:#fff}.ink-navigation ul.pills.red li a:hover{background:#b10f0f}table.ink-table{background:#fff}table.ink-table tr td,table.ink-table tr th{border-bottom:#bbb 1px solid;background:0 0}table.ink-table tr:last-child td{border-bottom:0}table.ink-table tfoot tr td,table.ink-table tfoot tr th{border-top:#bbb 1px solid}table.ink-table.alternating tbody tr:nth-child(odd){background-color:#f5f5f5}table.ink-table.hover tbody tr:hover{background:#fefbd6;color:#555}table.ink-table.bordered{border:#bbb 1px solid;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}table.ink-table.bordered tr th{border-left:#bbb 1px solid}table.ink-table.bordered tr th:first-child{border-left:0}table.ink-table.bordered tr:last-child td{border-bottom:0}table.ink-table.bordered tr td{border-left:#bbb 1px solid}table.ink-table.bordered tr td:first-child{border-left:0}table.ink-table tbody>tr.red td{background:#c91111;color:#fff}table.ink-table tbody>tr.green td{background:#4a9b17;color:#fff}table.ink-table tbody>tr.blue td{background:#0f75da;color:#fff}table.ink-table tbody>tr.orange td{background:#ff9c00;color:#fff}table.ink-table tbody>tr.black td{background:#000;color:#ccc}table.ink-table tbody>tr.yellow td{background:#ffd500;color:#000}.animated.slow{animation-duration:1s}.animated.medium{animation-duration:.5s}.animated.fast{animation-duration:.2s}.ink-carousel .stage{width:100%}.ink-carousel .ink-navigation{position:static}.ink-carousel{width:100%;position:relative;overflow:hidden;display:block}.ink-carousel .stage{left:0;height:auto!important;margin-top:0;margin-bottom:0;padding-left:0;list-style-type:none;white-space:nowrap;position:relative;overflow:visible;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}.ink-carousel .stage.column-group{display:-webkit-block;display:-moz-block;display:block;-webkit-flex-flow:none;-moz-flex-flow:none;flex-flow:none}.ink-carousel .stage .slide{position:relative;display:inline-block;vertical-align:top;white-space:normal;margin:0;float:none;zoom:1;*display:inline}.ink-datepicker-wrapper{position:relative}.ink-datepicker-calendar{margin-top:0;position:absolute}.ink-datepicker-calendar.right{left:100%;top:0}.ink-datepicker-calendar.left{right:100%;top:0}.ink-datepicker-calendar.bottom{top:100%;left:0}.ink-datepicker-calendar.top{bottom:100%;left:0}.ink-datepicker-calendar,.ink-datepicker-wrapper{display:inline;display:inline-block}.ink-calendar{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;text-align:center;padding:.3em;min-width:17.4em;font-size:13px;-webkit-box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;-moz-box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;background:#fff;z-index:10}.ink-calendar a{text-decoration:none}.ink-calendar li{list-style:none inside}html.ink-modal-is-open .ink-calendar{z-index:101}.ink-calendar-top-options{padding:5px;font-size:.813em;cursor:pointer}.ink-calendar-top-options .clean{float:left}.ink-calendar-top-options .close{float:right}.ink-calendar-top{line-height:2em;background:#e6e6e6;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-calendar-top div{float:left}.ink-calendar-top .ink-calendar-next,.ink-calendar-top .ink-calendar-prev{width:10%}.ink-calendar-top .ink-calendar-next a,.ink-calendar-top .ink-calendar-prev a{display:block}.ink-calendar-top .ink-calendar-month_desc{width:80%}.ink-calendar-month,.ink-calendar-month-selector,.ink-calendar-year-selector{margin-top:.5em;padding-left:0}.ink-calendar-month li a,.ink-calendar-month-selector li a,.ink-calendar-year-selector li a{margin:0;line-height:2em;vertical-align:middle;display:block;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;color:#444}.ink-calendar-month li a:hover,.ink-calendar-month-selector li a:hover,.ink-calendar-year-selector li a:hover{background:#e6e6e6}.ink-calendar-month li a.ink-calendar-on,.ink-calendar-month li a.ink-calendar-on:hover,.ink-calendar-month-selector li a.ink-calendar-on,.ink-calendar-month-selector li a.ink-calendar-on:hover,.ink-calendar-year-selector li a.ink-calendar-on,.ink-calendar-year-selector li a.ink-calendar-on:hover{background:#0069d6;color:#fff}.ink-calendar-month li a.ink-calendar-off,.ink-calendar-month li a.ink-calendar-off:hover,.ink-calendar-month-selector li a.ink-calendar-off,.ink-calendar-month-selector li a.ink-calendar-off:hover,.ink-calendar-year-selector li a.ink-calendar-off,.ink-calendar-year-selector li a.ink-calendar-off:hover{background:#fff;color:#aaa;cursor:default}.ink-calendar-month ul,.ink-calendar-month-selector ul,.ink-calendar-year-selector ul{clear:both;padding-left:0}.ink-calendar-month ul li,.ink-calendar-month-selector ul li,.ink-calendar-year-selector ul li{width:2.4em;float:left;text-align:center;padding:0;margin:0}.ink-calendar-month-selector ul li,.ink-calendar-year-selector ul li{width:25%}.ink-calendar-month-selector,.ink-calendar-year-selector{display:none}.action_inactive,.ink-calendar-off{color:#ddd!important}.ink-calendar-month .ink-calendar-header{border-bottom:1px solid rgba(0,0,0,.1);padding-bottom:.5em;margin-bottom:.5em;color:#aaa}.ink-calendar-middle,.ink-calendar-month .ink-calendar-header,.ink-calendar-month .ink-calendar-middle ul,.ink-calendar-top,.ink-calendar-top-options{*zoom:1}.ink-calendar-middle:after,.ink-calendar-month .ink-calendar-header:after,.ink-calendar-month .ink-calendar-middle ul:after,.ink-calendar-top-options:after,.ink-calendar-top:after{content:"";display:table;clear:both}body.ink-drawer{max-width:100%}body.ink-drawer .content-drawer,body.ink-drawer .left-drawer,body.ink-drawer .right-drawer{-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;transition-property:transform;-webkit-transition-duration:300ms;-moz-transition-duration:300ms;-o-transition-duration:300ms;transition-duration:300ms;-webkit-transition-timing-function:cubic-bezier(0.86,0,.07,1);-moz-transition-timing-function:cubic-bezier(0.86,0,.07,1);-o-transition-timing-function:cubic-bezier(0.86,0,.07,1);transition-timing-function:cubic-bezier(0.86,0,.07,1)}body.ink-drawer .left-drawer{left:-220px}body.ink-drawer .right-drawer{right:-220px}body.ink-drawer .content-drawer{width:100%}body.ink-drawer .left-drawer,body.ink-drawer .right-drawer{position:absolute;top:0;z-index:0;display:none;overflow-x:hidden;overflow-y:auto;width:220px;height:100%;-webkit-overflow-scrolling:touch}body.ink-drawer .left-drawer.show,body.ink-drawer .right-drawer.show{display:block;position:fixed}body.ink-drawer.push{overflow:hidden;width:100%;height:100%}body.ink-drawer.push .content-drawer{overflow:hidden}body.ink-drawer.push.left .content-drawer,body.ink-drawer.push.left .left-drawer{-webkit-transform:translate(220px,0);-moz-transform:translate(220px,0);-ms-transform:translate(220px,0);-o-transform:translate(220px,0);transform:translate(220px,0)}body.ink-drawer.push.right .content-drawer,body.ink-drawer.push.right .right-drawer{-webkit-transform:translate(-220px,0);-moz-transform:translate(-220px,0);-ms-transform:translate(-220px,0);-o-transform:translate(-220px,0);transform:translate(-220px,0)}body.ink-drawer.over{overflow:hidden;-webkit-user-drag:none}body.ink-drawer.over.left .left-drawer{-webkit-transform:translate(220px,0);-moz-transform:translate(220px,0);-ms-transform:translate(220px,0);-o-transform:translate(220px,0);transform:translate(220px,0)}body.ink-drawer.over.right .right-drawer{-webkit-transform:translate(-220px,0);-moz-transform:translate(-220px,0);-ms-transform:translate(-220px,0);-o-transform:translate(-220px,0);transform:translate(-220px,0)}.ink-shade{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgOAMAAM8AzbfAeUUAAAAASUVORK5CYII=);background:rgba(0,0,0,.8);width:100%;height:100%;top:0;right:0;bottom:0;left:0;margin-top:0;position:fixed;z-index:100;display:none;filter:alpha(Opacity=0);opacity:0}.ink-shade.fade{-webkit-transition:opacity 300ms;-moz-transition:opacity 300ms;-o-transition:opacity 300ms;transition:opacity 300ms}.ink-shade.visible{filter:alpha(Opacity=100);opacity:1}.ink-modal{top:50%;left:50%;width:90%;height:90%;background:#fff;z-index:100;position:absolute;overflow:hidden;filter:alpha(Opacity=100);opacity:1;-webkit-box-shadow:rgba(0,0,0,.8) 0 0 15px 0;-moz-box-shadow:rgba(0,0,0,.8) 0 0 15px 0;box-shadow:rgba(0,0,0,.8) 0 0 15px 0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;*zoom:1}.ink-modal:after{content:"";display:table;clear:both}.ink-modal>.modal-body{padding:1em;overflow-y:auto;overflow-x:hidden;height:auto}.ink-modal>.modal-body .ink-grid{padding-left:0;padding-right:0;width:100%;min-width:100%}.ink-modal>.modal-header,.ink-modal>header{border-bottom:1px #e6e6e6 solid;overflow:hidden;-webkit-box-shadow:rgba(175,175,175,.2) 0 1px 2px 0;-moz-box-shadow:rgba(175,175,175,.2) 0 1px 2px 0;box-shadow:rgba(175,175,175,.2) 0 1px 2px 0}.ink-modal>.modal-header>.modal-close,.ink-modal>header>.modal-close{padding-top:2px;text-align:center;color:#fff;width:26px;height:26px;line-height:1.2em;border:0;background:#bfbfbf;font-size:0;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%;text-shadow:rgba(0,0,0,.6) 0 -1px 0;filter:alpha(Opacity=60);opacity:.6;float:right}.ink-modal>.modal-header>.modal-close:after,.ink-modal>header>.modal-close:after{content:"\f00d";font-family:FontAwesome;font-size:medium;line-height:22px}.ink-modal>.modal-header>.modal-close:hover,.ink-modal>header>.modal-close:hover{filter:alpha(Opacity=100);opacity:1}.ink-modal>.modal-footer,.ink-modal>footer{background:#e6e6e6;margin-bottom:0;zoom:1;-webkit-box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0;-moz-box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0;box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0}.ink-modal>.modal-footer,.ink-modal>.modal-header,.ink-modal>footer,.ink-modal>header{padding:.8em 1em .65em}.ink-modal>.modal-footer:after,.ink-modal>.modal-footer:before,.ink-modal>.modal-header:after,.ink-modal>.modal-header:before,.ink-modal>footer:after,.ink-modal>footer:before,.ink-modal>header:after,.ink-modal>header:before{content:".";display:block;height:0;clear:both;visibility:hidden}.ink-modal-open{overflow:hidden}.ink-progress-bar{margin-bottom:1em;overflow:hidden;background:#f2f2f2;position:relative;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset;-moz-box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset;box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset}.ink-progress-bar .caption{position:absolute;top:0;left:0;width:100%;height:100%;line-height:1.7;text-align:center;color:#000;font-size:.813em;z-index:10}.ink-progress-bar .bar{height:1.3em;text-shadow:rgba(0,0,0,.25),0,1px,0;-webkit-box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;-moz-box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;-webkit-transition-property:width;-moz-transition-property:width;-o-transition-property:width;transition-property:width;-webkit-transition-duration:.6s;-moz-transition-duration:.6s;-o-transition-duration:.6s;transition-duration:.6s;-webkit-transition-timing-function:ease;-moz-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.ink-progress-bar .bar.grey{background:#ccc;color:#555}.ink-progress-bar .bar.green{background:#4a9b17;color:#fff}.ink-progress-bar .bar.blue{background:#0f75da;color:#fff}.ink-progress-bar .bar.red{background:#c91111;color:#fff}.ink-progress-bar .bar.orange{background:#ff9c00;color:#555}.ink-progress-bar .bar.black{background:#000;color:#fff}.dragging,.ink-sortable-list li{cursor:move;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;-ms-user-select:none;user-select:none;-ms-user-drag:none;-moz-user-drag:none;-khtml-user-drag:none;-webkit-user-drag:none;-o-user-drag:none;user-drag:none}.drag,.ink-sortable-list li.placeholder{-webkit-box-shadow:0,0,10px,0,rgba(0,0,0,.3);-moz-box-shadow:0,0,10px,0,rgba(0,0,0,.3);box-shadow:0,0,10px,0,rgba(0,0,0,.3)}.ink-sortable-list li{margin:0;border-bottom:1px solid #ccc;line-height:40px}.ink-sortable-list li.placeholder,.ink-sortable-list li:hover{background:#ccc;background:rgba(204,204,204,.2)}.ink-sortable-list li .ink-label{margin:0 .8em}.ink-sticky-stuck{position:fixed}.ink-tabs .tabs-nav{list-style:none;padding:0;*zoom:1}.ink-tabs .tabs-nav li{line-height:1.7;position:relative;margin:0}.ink-tabs .tabs-nav li a{padding:.5em 1em;display:block;border:1px solid transparent}.ink-tabs .tabs-nav li a:hover{background:#f0f0f0}.ink-tabs .tabs-nav li.active a{color:#555;cursor:default;text-decoration:none;background:#fff;border:1px solid #ccc}.ink-tabs .tabs-nav:after{content:"";display:table;clear:both}.ink-tabs .tabs-content{margin-top:1.5em;overflow:auto}.ink-tabs.top>.tabs-nav{border-bottom:1px solid #ccc}.ink-tabs.top>.tabs-nav li{float:left}.ink-tabs.top>.tabs-nav li a{margin-right:.4em;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;-ms-border-radius:4px 4px 0 0;-o-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.ink-tabs.top>.tabs-nav li.active{margin:0 0 -2px 0}.ink-tabs.top>.tabs-nav li.active a{border-bottom-color:transparent}.ink-tabs.bottom>.tabs-nav{border-top:1px solid #ccc}.ink-tabs.bottom>.tabs-nav li{float:left}.ink-tabs.bottom>.tabs-nav li a{margin-right:.4em;-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;-ms-border-radius:0 0 4px 4px;-o-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.ink-tabs.bottom>.tabs-nav li.active{margin:-2px 0 0 0}.ink-tabs.bottom>.tabs-nav li.active a{border-top-color:transparent}.ink-tabs.left>.tabs-nav{border-right:1px solid #ccc;float:left;margin-right:2em}.ink-tabs.left>.tabs-nav li{float:none;text-align:right}.ink-tabs.left>.tabs-nav li a{margin-bottom:.4em;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;-ms-border-radius:4px 0 0 4px;-o-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.ink-tabs.left>.tabs-nav li.active{margin:0 -2px 0 0}.ink-tabs.left>.tabs-nav li.active a{border-right-color:transparent}.ink-tabs.right>.tabs-nav{border-left:1px solid #ccc;float:right;margin-left:2em}.ink-tabs.right>.tabs-nav li{float:none}.ink-tabs.right>.tabs-nav li a{margin-bottom:.4em;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;-ms-border-radius:0 4px 4px 0;-o-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.ink-tabs.right>.tabs-nav li.active{margin:0 0 0 -2px}.ink-tabs.right>.tabs-nav li.active a{border-left-color:transparent}.ink-tagfield input[type=text].new-tag-input{background-color:#fff;border:1px solid #ccc;line-height:1em;margin:0;padding:5px;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-tagfield input[type=text].new-tag-input:focus{-webkit-box-shadow:0,0,0,3px,#eaeaea;-moz-box-shadow:0,0,0,3px,#eaeaea;box-shadow:0,0,0,3px,#eaeaea;border:1px solid #c3c3c3}.ink-tagfield span.ink-tag{background-color:#1b1b1b;color:#eaeaea;text-shadow:none;font-size:.9em;font-weight:400;border:1px solid #000;padding:4px 6px}.ink-tagfield span.ink-tag i.icon-remove{color:#ccc;font-size:.9em;font-weight:400;margin-left:4px}.ink-tagfield span.ink-tag i.icon-remove:hover{cursor:pointer;color:red}.ink-tooltip{display:inline-block;position:relative}.ink-tooltip>.content{background:#f0f0f0;padding:.5em .6em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;font-size:.8em;color:#8c8c8c}.ink-tooltip>.arrow{position:absolute}.ink-tooltip>.arrow.down,.ink-tooltip>.arrow.left,.ink-tooltip>.arrow.right,.ink-tooltip>.arrow.up{width:0;height:0}.ink-tooltip>.arrow.up{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #f0f0f0;top:-6px;left:50%;margin-left:-3px}.ink-tooltip>.arrow.down{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #f0f0f0;bottom:-5.45455px;left:50%;margin-left:-3px}.ink-tooltip>.arrow.right{border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:6px solid #f0f0f0;top:50%;right:-5.45455px;margin-top:-6px}.ink-tooltip>.arrow.left{border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:6px solid #f0f0f0;top:50%;left:-5.45455px;margin-top:-6px}.ink-tooltip.blue>.content{background:#0f75da;color:#fff}.ink-tooltip.blue>.arrow.up{border-bottom-color:#0f75da}.ink-tooltip.blue>.arrow.down{border-top-color:#0f75da}.ink-tooltip.blue>.arrow.left{border-right-color:#0f75da}.ink-tooltip.blue>.arrow.right{border-left-color:#0f75da}.ink-tooltip.red>.content{background:#c91111;color:#fff}.ink-tooltip.red>.arrow.up{border-bottom-color:#c91111}.ink-tooltip.red>.arrow.down{border-top-color:#c91111}.ink-tooltip.red>.arrow.left{border-right-color:#c91111}.ink-tooltip.red>.arrow.right{border-left-color:#c91111}.ink-tooltip.orange>.content{background:#ff9c00;color:#fff}.ink-tooltip.orange>.arrow.up{border-bottom-color:#ff9c00}.ink-tooltip.orange>.arrow.down{border-top-color:#ff9c00}.ink-tooltip.orange>.arrow.left{border-right-color:#ff9c00}.ink-tooltip.orange>.arrow.right{border-left-color:#ff9c00}.ink-tooltip.green>.content{background:#4a9b17;color:#fff}.ink-tooltip.green>.arrow.up{border-bottom-color:#4a9b17}.ink-tooltip.green>.arrow.down{border-top-color:#4a9b17}.ink-tooltip.green>.arrow.left{border-right-color:#4a9b17}.ink-tooltip.green>.arrow.right{border-left-color:#4a9b17}.ink-tooltip.black>.content{background:#000;color:#fff}.ink-tooltip.black>.arrow.up{border-bottom-color:#000}.ink-tooltip.black>.arrow.down{border-top-color:#000}.ink-tooltip.black>.arrow.left{border-right-color:#000}.ink-tooltip.black>.arrow.right{border-left-color:#000}.ink-tooltip.grey>.content{background:#ccc;color:#333}.ink-tooltip.grey>.arrow.up{border-bottom-color:#ccc}.ink-tooltip.grey>.arrow.down{border-top-color:#ccc}.ink-tooltip.grey>.arrow.left{border-right-color:#ccc}.ink-tooltip.grey>.arrow.right{border-left-color:#ccc}.ink-tree-view li{list-style-type:none}.ink-tree-view [data-open]>:before{margin-left:-1.3em;margin-right:.4em;text-decoration:none} +@charset "UTF-8";.grid-order{flex:100%}.show-all{display:inherit}.hide-all{display:none!important}.no-margin{margin:0!important}.no-padding{padding:0!important}.push-left{float:left;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;justify-content:flex-start}.push-center{float:none!important;margin-left:auto;margin-right:auto;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center}.push-right{float:right;-webkit-justify-content:flex-end;-moz-justify-content:flex-end;justify-content:flex-end}.align-left{text-align:left}.align-center{text-align:center}.align-right{text-align:right}.clearfix{overflow:hidden;*zoom:1;*zoom:1}.clearfix:after{content:"";display:table;clear:both}html{font-family:sans-serif}html *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}figure{margin:0}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.ink-alert.basic,.ink-alert.block{font-size:.938em;margin:1em 0;position:relative;overflow:hidden}.ink-alert.basic{padding:1em 3em 1em 1em}.ink-alert.basic p{margin:0}.ink-alert.basic .ink-close{top:.55em;*top:.2em}.ink-alert.block{font-size:1em}.ink-alert.block>h4{padding:1em 3em 1em 1em;font-size:.938em;line-height:1.5;margin:0}.ink-alert.block p{margin:1.5em 1em}.ink-alert.block ul{list-style:inside}.ink-alert .ink-dismiss{position:absolute;line-height:.56em;font-size:1.8em;padding:5px;border:0;background:0 0;top:.5em;*top:.2em;right:.4em}.ink-badge{padding:.2em .6em;font-size:.813em;margin-left:.6em}.ink-button{-webkit-appearance:menuitem;padding:8px 12px;cursor:pointer;text-decoration:none;text-align:center;display:inline-block;vertical-align:middle;white-space:nowrap;line-height:normal}.ink-button+.ink-button{margin-left:5px}.button-group{*zoom:1}.button-group>.ink-button{float:left;margin:5px 0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;border-left:0}.button-group>.ink-button:active,.button-group>.ink-button:hover{border-left:0}.button-group>.ink-button:first-child{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px;border-left:1px solid #bfbfbf}.button-group>.ink-button:last-child{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.button-group:after{content:"";display:table;clear:both}.button-toolbar{*zoom:1}.button-toolbar>.button-group{margin-right:10px;float:left}.button-toolbar:after{content:"";display:table;clear:both}.ink-form fieldset{border:0;padding:0;margin:0}.ink-form fieldset legend{font-size:1.438em;font-weight:700;width:100%;border-bottom:1px solid #ddd}.ink-form fieldset legend+*{-webkit-margin-top-collapse:separate;margin:2em 0}.ink-form p.tip{font-size:.875em;color:#909090;position:relative;margin:.2em 0 0 .1em}.ink-form p.label{padding:0;margin:0;color:#555;white-space:normal}.ink-form input[type=color],.ink-form input[type=date],.ink-form input[type=datetime-local],.ink-form input[type=datetime],.ink-form input[type=email],.ink-form input[type=month],.ink-form input[type=number],.ink-form input[type=password],.ink-form input[type=search],.ink-form input[type=tel],.ink-form input[type=text],.ink-form input[type=time],.ink-form input[type=url],.ink-form input[type=week],.ink-form select,.ink-form textarea{font-family:Roboto,Arial,Helvetica,sans-serif;font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;padding:8px 6px;border:1px solid #c6c6c6;resize:none;background:#fff;vertical-align:middle}.ink-form input[type=color]:focus,.ink-form input[type=date]:focus,.ink-form input[type=datetime-local]:focus,.ink-form input[type=datetime]:focus,.ink-form input[type=email]:focus,.ink-form input[type=month]:focus,.ink-form input[type=number]:focus,.ink-form input[type=password]:focus,.ink-form input[type=search]:focus,.ink-form input[type=tel]:focus,.ink-form input[type=text]:focus,.ink-form input[type=time]:focus,.ink-form input[type=url]:focus,.ink-form input[type=week]:focus,.ink-form select:focus,.ink-form textarea:focus{border-color:rgba(153,153,153,.9);-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;outline:0 none}.ink-form input[type=color]:disabled,.ink-form input[type=date]:disabled,.ink-form input[type=datetime-local]:disabled,.ink-form input[type=datetime]:disabled,.ink-form input[type=email]:disabled,.ink-form input[type=month]:disabled,.ink-form input[type=number]:disabled,.ink-form input[type=password]:disabled,.ink-form input[type=search]:disabled,.ink-form input[type=tel]:disabled,.ink-form input[type=text]:disabled,.ink-form input[type=time]:disabled,.ink-form input[type=url]:disabled,.ink-form input[type=week]:disabled,.ink-form select:disabled,.ink-form textarea:disabled{background:#f2f2f2;cursor:not-allowed}.ink-form .input-file{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;padding:6px;border:1px solid #c6c6c6;background:#fff;vertical-align:middle;line-height:1.2}.ink-form .input-file input[type=file]{-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;border:0;padding:0;background:0 0;width:100%}.ink-form .ink-button{margin:0 5px}.ink-form label{cursor:pointer}.ink-form select{line-height:2;cursor:pointer}.ink-form textarea{min-height:5em}.ink-form .control-group{line-height:2;margin-bottom:1em;*zoom:1}.ink-form .control-group:after{content:"";display:table;clear:both}.ink-form .control-group .control{position:relative;*zoom:1}.ink-form .control-group .control:after{content:"";display:table;clear:both}.ink-form .control-group .control>li{position:relative;*zoom:1}.ink-form .control-group .control>li:after{content:"";display:table;clear:both}.ink-form .control-group .control>input,.ink-form .control-group .control>select,.ink-form .control-group .control>textarea{width:100%}.ink-form .control-group .control>input+[class*=fa-],.ink-form .control-group .control>input+[class^=fa-],.ink-form .control-group .control>select+[class*=fa-],.ink-form .control-group .control>select+[class^=fa-],.ink-form .control-group .control>textarea+[class*=fa-],.ink-form .control-group .control>textarea+[class^=fa-]{display:none}.ink-form .control-group .control.append-button span,.ink-form .control-group .control.append-symbol span,.ink-form .control-group .control.prepend-button span,.ink-form .control-group .control.prepend-symbol span{width:100%;position:relative}.ink-form .control-group .control.append-button span>input,.ink-form .control-group .control.append-button span>select,.ink-form .control-group .control.append-button span>textarea,.ink-form .control-group .control.append-symbol span>input,.ink-form .control-group .control.append-symbol span>select,.ink-form .control-group .control.append-symbol span>textarea,.ink-form .control-group .control.prepend-button span>input,.ink-form .control-group .control.prepend-button span>select,.ink-form .control-group .control.prepend-button span>textarea,.ink-form .control-group .control.prepend-symbol span>input,.ink-form .control-group .control.prepend-symbol span>select,.ink-form .control-group .control.prepend-symbol span>textarea{width:100%}.ink-form .control-group .control.append-button>input[type=button],.ink-form .control-group .control.append-button>input[type=reset],.ink-form .control-group .control.append-button>input[type=submit],.ink-form .control-group .control.append-symbol>input[type=button],.ink-form .control-group .control.append-symbol>input[type=reset],.ink-form .control-group .control.append-symbol>input[type=submit],.ink-form .control-group .control.prepend-button>input[type=button],.ink-form .control-group .control.prepend-button>input[type=reset],.ink-form .control-group .control.prepend-button>input[type=submit],.ink-form .control-group .control.prepend-symbol>input[type=button],.ink-form .control-group .control.prepend-symbol>input[type=reset],.ink-form .control-group .control.prepend-symbol>input[type=submit]{width:auto}.ink-form .control-group .control.append-button{display:-webkit-flex;display:flex;display:-ms-flexbox}.ink-form .control-group .control.append-button span>input,.ink-form .control-group .control.append-button span>select,.ink-form .control-group .control.append-button span>textarea{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-form .control-group .control.append-button .ink-button{margin:0;-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0;border-left:0}.ink-form .control-group .control.prepend-button{display:-webkit-flex;display:flex;display:-ms-flexbox}.ink-form .control-group .control.prepend-button span>input,.ink-form .control-group .control.prepend-button span>select,.ink-form .control-group .control.prepend-button span>textarea{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-form .control-group .control.prepend-button .ink-button{margin:0;-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px;border-right:0}.ink-form .control-group .control.append-symbol span{display:block}.ink-form .control-group .control.append-symbol span>input,.ink-form .control-group .control.append-symbol span>select,.ink-form .control-group .control.append-symbol span>textarea{padding-right:2.5em}.ink-form .control-group .control.append-symbol span>[class*=" fa-"],.ink-form .control-group .control.append-symbol span>[class^=fa-]{position:absolute;right:1em;top:.86em;pointer-events:none}.ink-form .control-group .control.prepend-symbol span{display:block}.ink-form .control-group .control.prepend-symbol span>input,.ink-form .control-group .control.prepend-symbol span>select,.ink-form .control-group .control.prepend-symbol span>textarea{padding-left:2.5em}.ink-form .control-group .control.prepend-symbol span>[class*=" fa-"],.ink-form .control-group .control.prepend-symbol span>[class^=fa-]{position:absolute;left:1em;top:.86em;pointer-events:none}.ink-form .control-group input[type=checkbox],.ink-form .control-group input[type=radio]{position:absolute;border:0;cursor:pointer}.ink-form .control-group input[type=checkbox]+label,.ink-form .control-group input[type=radio]+label{margin-top:-.28em;padding-left:1.25em;vertical-align:super;display:inline-block}.ink-form .control-group .inline li{padding:0}.ink-form .control-group .inline li label{margin-right:1em}.ink-form .control-group.validation.error input,.ink-form .control-group.validation.error select,.ink-form .control-group.validation.error textarea{outline:0;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;border:1px solid rgba(200,10,16,.5)}.ink-form .control-group.validation.error p.tip{color:rgba(150,7,12,.55)}.ink-form .control-group.validation.warning input,.ink-form .control-group.validation.warning select,.ink-form .control-group.validation.warning textarea{outline:0;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;border:1px solid rgba(255,156,0,.6)}.ink-form .control-group.validation.warning p.tip{color:rgba(204,125,0,.6)}.ink-form .control-group.required label,.ink-form .control-group.required p.label{color:#555}.ink-form .control-group.required label:after,.ink-form .control-group.required p.label:after{content:"\f069";color:#c91111;margin-left:.6em;font-family:FontAwesome;font-size:.75em;width:1.25em}.ink-form .control-group.required ul.control label:after{content:""}.ink-grid{width:auto;max-width:1440px;margin:0 auto}.order-1{order:1;-ms-flex-order:1}.order-2{order:2;-ms-flex-order:2}.order-3{order:3;-ms-flex-order:3}.order-4{order:4;-ms-flex-order:4}.order-5{order:5;-ms-flex-order:5}.order-6{order:6;-ms-flex-order:6}.order-7{order:7;-ms-flex-order:7}.order-8{order:8;-ms-flex-order:8}.order-9{order:9;-ms-flex-order:9}.order-10{order:10;-ms-flex-order:10}.all-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}@media screen and (min-width:1261px){.ink-grid{padding:0 2em}.column-group.gutters{margin-left:-2em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}.column-group.horizontal-gutters{margin-left:-2em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=xlarge-]{padding-left:2em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=xlarge-]{margin-bottom:2em}.column-group.double-gutters{margin-left:-4em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}.column-group.double-horizontal-gutters{margin-left:-4em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}.column-group.half-gutters{margin-left:-1em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}.column-group.half-horizontal-gutters{margin-left:-1em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}.column-group.quarter-gutters{margin-left:-.5em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}.column-group.quarter-horizontal-gutters{margin-left:-.5em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}.column-group.xlarge-gutters{margin-left:-2em}.column-group.xlarge-gutters>.all-auto,.column-group.xlarge-gutters>[class*=all-],.column-group.xlarge-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}.column-group.xlarge-horizontal-gutters{margin-left:-2em}.column-group.xlarge-horizontal-gutters>.all-auto,.column-group.xlarge-horizontal-gutters>[class*=all-],.column-group.xlarge-horizontal-gutters>[class*=xlarge-]{padding-left:2em}.column-group.xlarge-vertical-gutters>.all-auto,.column-group.xlarge-vertical-gutters>[class*=all-],.column-group.xlarge-vertical-gutters>[class*=xlarge-]{margin-bottom:2em}.column-group.xlarge-double-gutters{margin-left:-4em}.column-group.xlarge-double-gutters>.all-auto,.column-group.xlarge-double-gutters>[class*=all-],.column-group.xlarge-double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}.column-group.xlarge-double-horizontal-gutters{margin-left:-4em}.column-group.xlarge-double-horizontal-gutters>.all-auto,.column-group.xlarge-double-horizontal-gutters>[class*=all-],.column-group.xlarge-double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}.column-group.xlarge-double-vertical-gutters>.all-auto,.column-group.xlarge-double-vertical-gutters>[class*=all-],.column-group.xlarge-double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}.column-group.xlarge-half-gutters{margin-left:-1em}.column-group.xlarge-half-gutters>.all-auto,.column-group.xlarge-half-gutters>[class*=all-],.column-group.xlarge-half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}.column-group.xlarge-half-horizontal-gutters{margin-left:-1em}.column-group.xlarge-half-horizontal-gutters>.all-auto,.column-group.xlarge-half-horizontal-gutters>[class*=all-],.column-group.xlarge-half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}.column-group.xlarge-half-vertical-gutters>.all-auto,.column-group.xlarge-half-vertical-gutters>[class*=all-],.column-group.xlarge-half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}.column-group.xlarge-quarter-gutters{margin-left:-.5em}.column-group.xlarge-quarter-gutters>.all-auto,.column-group.xlarge-quarter-gutters>[class*=all-],.column-group.xlarge-quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}.column-group.xlarge-quarter-horizontal-gutters{margin-left:-.5em}.column-group.xlarge-quarter-horizontal-gutters>.all-auto,.column-group.xlarge-quarter-horizontal-gutters>[class*=all-],.column-group.xlarge-quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}.column-group.xlarge-quarter-vertical-gutters>.all-auto,.column-group.xlarge-quarter-vertical-gutters>[class*=all-],.column-group.xlarge-quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}.column-group.xlarge-no-gutters{margin-left:0}.column-group.xlarge-no-gutters>.all-auto,.column-group.xlarge-no-gutters>[class*=all-],.column-group.xlarge-no-gutters>[class*=xlarge-]{padding-left:0;margin-bottom:0}.xlarge-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.reverse,.column-group.xlarge-reverse,.ink-flex.reverse,.ink-flex.xlarge-reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.vertical,.column-group.xlarge-vertical,.ink-flex.vertical,.ink-flex.xlarge-vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.vertical.reverse,.column-group.xlarge-vertical.xlarge-reverse,.ink-flex.vertical.reverse,.ink-flex.xlarge-vertical.xlarge-reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.xlarge-order-1{order:1;-ms-flex-order:1}.xlarge-order-2{order:2;-ms-flex-order:2}.xlarge-order-3{order:3;-ms-flex-order:3}.xlarge-order-4{order:4;-ms-flex-order:4}.xlarge-order-5{order:5;-ms-flex-order:5}.xlarge-order-6{order:6;-ms-flex-order:6}.xlarge-order-7{order:7;-ms-flex-order:7}.xlarge-order-8{order:8;-ms-flex-order:8}.xlarge-order-9{order:9;-ms-flex-order:9}.xlarge-order-10{order:10;-ms-flex-order:10}.column-group .xlarge-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.push-top,.xlarge-push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.push-bottom,.xlarge-push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.push-middle,.xlarge-push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.push-left,.xlarge-push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.push-center,.xlarge-push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.push-right,.xlarge-push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.xlarge-align-left{text-align:left}.xlarge-align-center{text-align:center}.xlarge-align-right{text-align:right}.space,.xlarge-space{margin:2em}.padding,.xlarge-padding{padding:2em}.double-space,.xlarge-double-space{margin:4em}.double-padding,.xlarge-double-padding{padding:4em}.half-space,.xlarge-half-space{margin:1em}.half-padding,.xlarge-half-padding{padding:1em}.quarter-space,.xlarge-quarter-space{margin:.5em}.quarter-padding,.xlarge-quarter-padding{padding:.5em}.vertical-space,.xlarge-vertical-space{margin-top:2em;margin-bottom:2em}.vertical-padding,.xlarge-vertical-padding{padding-top:2em;padding-bottom:2em}.double-vertical-space,.xlarge-double-vertical-space{margin-top:4em;margin-bottom:4em}.double-vertical-padding,.xlarge-double-vertical-padding{padding-top:4em;padding-bottom:4em}.half-vertical-space,.xlarge-half-vertical-space{margin-top:1em;margin-bottom:1em}.half-vertical-padding,.xlarge-half-vertical-padding{padding-top:1em;padding-bottom:1em}.quarter-vertical-space,.xlarge-quarter-vertical-space{margin-top:.5em;margin-bottom:.5em}.quarter-vertical-padding,.xlarge-quarter-vertical-padding{padding-top:.5em;padding-bottom:.5em}.horizontal-space,.xlarge-horizontal-space{margin-left:2em;margin-right:2em}.horizontal-padding,.xlarge-horizontal-padding{padding-left:2em;padding-right:2em}.double-horizontal-space,.xlarge-double-horizontal-space{margin-left:4em;margin-right:4em}.double-horizontal-padding,.xlarge-double-horizontal-padding{padding-left:4em;padding-right:4em}.half-horizontal-space,.xlarge-half-horizontal-space{margin-left:1em;margin-right:1em}.half-horizontal-padding,.xlarge-half-horizontal-padding{padding-left:1em;padding-right:1em}.quarter-horizontal-space,.xlarge-quarter-horizontal-space{margin-left:.5em;margin-right:.5em}.quarter-horizontal-padding,.xlarge-quarter-horizontal-padding{padding-left:.5em;padding-right:.5em}.top-space,.xlarge-top-space{margin-top:2em}.top-padding,.xlarge-top-padding{padding-top:2em}.double-top-space,.xlarge-double-top-space{margin-top:4em}.double-top-padding,.xlarge-double-top-padding{padding-top:4em}.half-top-space,.xlarge-half-top-space{margin-top:1em}.half-top-padding,.xlarge-half-top-padding{padding-top:1em}.quarter-top-space,.xlarge-quarter-top-space{margin-top:.5em}.quarter-top-padding,.xlarge-quarter-top-padding{padding-top:.5em}.right-space,.xlarge-right-space{margin-right:2em}.right-padding,.xlarge-right-padding{padding-right:2em}.double-right-space,.xlarge-double-right-space{margin-right:4em}.double-right-padding,.xlarge-double-right-padding{padding-right:4em}.half-right-space,.xlarge-half-right-space{margin-right:1em}.half-right-padding,.xlarge-half-right-padding{padding-right:1em}.quarter-right-space,.xlarge-quarter-right-space{margin-right:.5em}.quarter-right-padding,.xlarge-quarter-right-padding{padding-right:.5em}.bottom-space,.xlarge-bottom-space{margin-bottom:2em}.bottom-padding,.xlarge-bottom-padding{padding-bottom:2em}.double-bottom-space,.xlarge-double-bottom-space{margin-bottom:4em}.double-bottom-padding,.xlarge-double-bottom-padding{padding-bottom:4em}.half-bottom-space,.xlarge-half-bottom-space{margin-bottom:1em}.half-bottom-padding,.xlarge-half-bottom-padding{padding-bottom:1em}.quarter-bottom-space,.xlarge-quarter-bottom-space{margin-bottom:.5em}.quarter-bottom-padding,.xlarge-quarter-bottom-padding{padding-bottom:.5em}.left-space,.xlarge-left-space{margin-left:2em}.left-padding,.xlarge-left-padding{padding-left:2em}.double-left-space,.xlarge-double-left-space{margin-left:4em}.double-left-padding,.xlarge-double-left-padding{padding-left:4em}.half-left-space,.xlarge-half-left-space{margin-left:1em}.half-left-padding,.xlarge-half-left-padding{padding-left:1em}.quarter-left-space,.xlarge-quarter-left-space{margin-left:.5em}.quarter-left-padding,.xlarge-quarter-left-padding{padding-left:.5em}.hide-xlarge{display:none!important}.show-xlarge{display:inherit!important}table.show-xlarge{display:table}thead.show-xlarge{display:table-header-group}tbody.show-xlarge{display:table-row-group}tfoot.show-xlarge{display:table-footer-group}tr.show-xlarge{display:table-row}td.show-xlarge,th.show-xlarge{display:table-cell}}@media screen and (min-width:961px) and (max-width:1260px){.ink-grid{padding:0 1.75em}.column-group.gutters{margin-left:-1.75em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.horizontal-gutters{margin-left:-1.75em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.double-gutters{margin-left:-3.5em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.double-horizontal-gutters{margin-left:-3.5em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.half-gutters{margin-left:-.875em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.half-horizontal-gutters{margin-left:-.875em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.quarter-gutters{margin-left:-.4375em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.quarter-horizontal-gutters{margin-left:-.4375em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-gutters{margin-left:-1.75em}.column-group.large-gutters>.all-auto,.column-group.large-gutters>[class*=all-],.column-group.large-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.large-horizontal-gutters{margin-left:-1.75em}.column-group.large-horizontal-gutters>.all-auto,.column-group.large-horizontal-gutters>[class*=all-],.column-group.large-horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.large-vertical-gutters>.all-auto,.column-group.large-vertical-gutters>[class*=all-],.column-group.large-vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.large-double-gutters{margin-left:-3.5em}.column-group.large-double-gutters>.all-auto,.column-group.large-double-gutters>[class*=all-],.column-group.large-double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.large-double-horizontal-gutters{margin-left:-3.5em}.column-group.large-double-horizontal-gutters>.all-auto,.column-group.large-double-horizontal-gutters>[class*=all-],.column-group.large-double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.large-double-vertical-gutters>.all-auto,.column-group.large-double-vertical-gutters>[class*=all-],.column-group.large-double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.large-half-gutters{margin-left:-.875em}.column-group.large-half-gutters>.all-auto,.column-group.large-half-gutters>[class*=all-],.column-group.large-half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.large-half-horizontal-gutters{margin-left:-.875em}.column-group.large-half-horizontal-gutters>.all-auto,.column-group.large-half-horizontal-gutters>[class*=all-],.column-group.large-half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.large-half-vertical-gutters>.all-auto,.column-group.large-half-vertical-gutters>[class*=all-],.column-group.large-half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.large-quarter-gutters{margin-left:-.4375em}.column-group.large-quarter-gutters>.all-auto,.column-group.large-quarter-gutters>[class*=all-],.column-group.large-quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.large-quarter-horizontal-gutters{margin-left:-.4375em}.column-group.large-quarter-horizontal-gutters>.all-auto,.column-group.large-quarter-horizontal-gutters>[class*=all-],.column-group.large-quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.large-quarter-vertical-gutters>.all-auto,.column-group.large-quarter-vertical-gutters>[class*=all-],.column-group.large-quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-no-gutters{margin-left:0}.column-group.large-no-gutters>.all-auto,.column-group.large-no-gutters>[class*=all-],.column-group.large-no-gutters>[class*=large-]{padding-left:0;margin-bottom:0}.large-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.large-reverse,.column-group.reverse,.ink-flex.large-reverse,.ink-flex.reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.large-vertical,.column-group.vertical,.ink-flex.large-vertical,.ink-flex.vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.large-vertical.large-reverse,.column-group.vertical.reverse,.ink-flex.large-vertical.large-reverse,.ink-flex.vertical.reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.large-order-1{order:1;-ms-flex-order:1}.large-order-2{order:2;-ms-flex-order:2}.large-order-3{order:3;-ms-flex-order:3}.large-order-4{order:4;-ms-flex-order:4}.large-order-5{order:5;-ms-flex-order:5}.large-order-6{order:6;-ms-flex-order:6}.large-order-7{order:7;-ms-flex-order:7}.large-order-8{order:8;-ms-flex-order:8}.large-order-9{order:9;-ms-flex-order:9}.large-order-10{order:10;-ms-flex-order:10}.column-group .large-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.large-push-top,.push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.large-push-bottom,.push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.large-push-middle,.push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.large-push-left,.push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.large-push-center,.push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.large-push-right,.push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.large-align-left{text-align:left}.large-align-center{text-align:center}.large-align-right{text-align:right}.large-space,.space{margin:1.75em}.large-padding,.padding{padding:1.75em}.double-space,.large-double-space{margin:3.5em}.double-padding,.large-double-padding{padding:3.5em}.half-space,.large-half-space{margin:.875em}.half-padding,.large-half-padding{padding:.875em}.large-quarter-space,.quarter-space{margin:.4375em}.large-quarter-padding,.quarter-padding{padding:.4375em}.large-vertical-space,.vertical-space{margin-top:1.75em;margin-bottom:1.75em}.large-vertical-padding,.vertical-padding{padding-top:1.75em;padding-bottom:1.75em}.double-vertical-space,.large-double-vertical-space{margin-top:3.5em;margin-bottom:3.5em}.double-vertical-padding,.large-double-vertical-padding{padding-top:3.5em;padding-bottom:3.5em}.half-vertical-space,.large-half-vertical-space{margin-top:.875em;margin-bottom:.875em}.half-vertical-padding,.large-half-vertical-padding{padding-top:.875em;padding-bottom:.875em}.large-quarter-vertical-space,.quarter-vertical-space{margin-top:.4375em;margin-bottom:.4375em}.large-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.4375em;padding-bottom:.4375em}.horizontal-space,.large-horizontal-space{margin-left:1.75em;margin-right:1.75em}.horizontal-padding,.large-horizontal-padding{padding-left:1.75em;padding-right:1.75em}.double-horizontal-space,.large-double-horizontal-space{margin-left:3.5em;margin-right:3.5em}.double-horizontal-padding,.large-double-horizontal-padding{padding-left:3.5em;padding-right:3.5em}.half-horizontal-space,.large-half-horizontal-space{margin-left:.875em;margin-right:.875em}.half-horizontal-padding,.large-half-horizontal-padding{padding-left:.875em;padding-right:.875em}.large-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.4375em;margin-right:.4375em}.large-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.4375em;padding-right:.4375em}.large-top-space,.top-space{margin-top:1.75em}.large-top-padding,.top-padding{padding-top:1.75em}.double-top-space,.large-double-top-space{margin-top:3.5em}.double-top-padding,.large-double-top-padding{padding-top:3.5em}.half-top-space,.large-half-top-space{margin-top:.875em}.half-top-padding,.large-half-top-padding{padding-top:.875em}.large-quarter-top-space,.quarter-top-space{margin-top:.4375em}.large-quarter-top-padding,.quarter-top-padding{padding-top:.4375em}.large-right-space,.right-space{margin-right:1.75em}.large-right-padding,.right-padding{padding-right:1.75em}.double-right-space,.large-double-right-space{margin-right:3.5em}.double-right-padding,.large-double-right-padding{padding-right:3.5em}.half-right-space,.large-half-right-space{margin-right:.875em}.half-right-padding,.large-half-right-padding{padding-right:.875em}.large-quarter-right-space,.quarter-right-space{margin-right:.4375em}.large-quarter-right-padding,.quarter-right-padding{padding-right:.4375em}.bottom-space,.large-bottom-space{margin-bottom:1.75em}.bottom-padding,.large-bottom-padding{padding-bottom:1.75em}.double-bottom-space,.large-double-bottom-space{margin-bottom:3.5em}.double-bottom-padding,.large-double-bottom-padding{padding-bottom:3.5em}.half-bottom-space,.large-half-bottom-space{margin-bottom:.875em}.half-bottom-padding,.large-half-bottom-padding{padding-bottom:.875em}.large-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.4375em}.large-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.4375em}.large-left-space,.left-space{margin-left:1.75em}.large-left-padding,.left-padding{padding-left:1.75em}.double-left-space,.large-double-left-space{margin-left:3.5em}.double-left-padding,.large-double-left-padding{padding-left:3.5em}.half-left-space,.large-half-left-space{margin-left:.875em}.half-left-padding,.large-half-left-padding{padding-left:.875em}.large-quarter-left-space,.quarter-left-space{margin-left:.4375em}.large-quarter-left-padding,.quarter-left-padding{padding-left:.4375em}.hide-large{display:none!important}.show-large{display:inherit!important}table.show-large{display:table}thead.show-large{display:table-header-group}tbody.show-large{display:table-row-group}tfoot.show-large{display:table-footer-group}tr.show-large{display:table-row}td.show-large,th.show-large{display:table-cell}}@media screen and (min-width:641px) and (max-width:960px){.ink-grid{padding:0 1.5em}.column-group.gutters{margin-left:-1.5em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}.column-group.horizontal-gutters{margin-left:-1.5em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=medium-]{padding-left:1.5em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=medium-]{margin-bottom:1.5em}.column-group.double-gutters{margin-left:-3em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}.column-group.double-horizontal-gutters{margin-left:-3em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=medium-]{padding-left:3em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=medium-]{margin-bottom:3em}.column-group.half-gutters{margin-left:-.75em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}.column-group.half-horizontal-gutters{margin-left:-.75em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=medium-]{padding-left:.75em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}.column-group.quarter-gutters{margin-left:-.375em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}.column-group.quarter-horizontal-gutters{margin-left:-.375em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}.column-group.medium-gutters{margin-left:-1.5em}.column-group.medium-gutters>.all-auto,.column-group.medium-gutters>[class*=all-],.column-group.medium-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}.column-group.medium-horizontal-gutters{margin-left:-1.5em}.column-group.medium-horizontal-gutters>.all-auto,.column-group.medium-horizontal-gutters>[class*=all-],.column-group.medium-horizontal-gutters>[class*=medium-]{padding-left:1.5em}.column-group.medium-vertical-gutters>.all-auto,.column-group.medium-vertical-gutters>[class*=all-],.column-group.medium-vertical-gutters>[class*=medium-]{margin-bottom:1.5em}.column-group.medium-double-gutters{margin-left:-3em}.column-group.medium-double-gutters>.all-auto,.column-group.medium-double-gutters>[class*=all-],.column-group.medium-double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}.column-group.medium-double-horizontal-gutters{margin-left:-3em}.column-group.medium-double-horizontal-gutters>.all-auto,.column-group.medium-double-horizontal-gutters>[class*=all-],.column-group.medium-double-horizontal-gutters>[class*=medium-]{padding-left:3em}.column-group.medium-double-vertical-gutters>.all-auto,.column-group.medium-double-vertical-gutters>[class*=all-],.column-group.medium-double-vertical-gutters>[class*=medium-]{margin-bottom:3em}.column-group.medium-half-gutters{margin-left:-.75em}.column-group.medium-half-gutters>.all-auto,.column-group.medium-half-gutters>[class*=all-],.column-group.medium-half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}.column-group.medium-half-horizontal-gutters{margin-left:-.75em}.column-group.medium-half-horizontal-gutters>.all-auto,.column-group.medium-half-horizontal-gutters>[class*=all-],.column-group.medium-half-horizontal-gutters>[class*=medium-]{padding-left:.75em}.column-group.medium-half-vertical-gutters>.all-auto,.column-group.medium-half-vertical-gutters>[class*=all-],.column-group.medium-half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}.column-group.medium-quarter-gutters{margin-left:-.375em}.column-group.medium-quarter-gutters>.all-auto,.column-group.medium-quarter-gutters>[class*=all-],.column-group.medium-quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}.column-group.medium-quarter-horizontal-gutters{margin-left:-.375em}.column-group.medium-quarter-horizontal-gutters>.all-auto,.column-group.medium-quarter-horizontal-gutters>[class*=all-],.column-group.medium-quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}.column-group.medium-quarter-vertical-gutters>.all-auto,.column-group.medium-quarter-vertical-gutters>[class*=all-],.column-group.medium-quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}.column-group.medium-no-gutters{margin-left:0}.column-group.medium-no-gutters>.all-auto,.column-group.medium-no-gutters>[class*=all-],.column-group.medium-no-gutters>[class*=medium-]{padding-left:0;margin-bottom:0}.medium-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.medium-reverse,.column-group.reverse,.ink-flex.medium-reverse,.ink-flex.reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.medium-vertical,.column-group.vertical,.ink-flex.medium-vertical,.ink-flex.vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.medium-vertical.medium-reverse,.column-group.vertical.reverse,.ink-flex.medium-vertical.medium-reverse,.ink-flex.vertical.reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.medium-order-1{order:1;-ms-flex-order:1}.medium-order-2{order:2;-ms-flex-order:2}.medium-order-3{order:3;-ms-flex-order:3}.medium-order-4{order:4;-ms-flex-order:4}.medium-order-5{order:5;-ms-flex-order:5}.medium-order-6{order:6;-ms-flex-order:6}.medium-order-7{order:7;-ms-flex-order:7}.medium-order-8{order:8;-ms-flex-order:8}.medium-order-9{order:9;-ms-flex-order:9}.medium-order-10{order:10;-ms-flex-order:10}.column-group .medium-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.medium-push-top,.push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.medium-push-bottom,.push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.medium-push-middle,.push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.medium-push-left,.push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.medium-push-center,.push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.medium-push-right,.push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.medium-align-left{text-align:left}.medium-align-center{text-align:center}.medium-align-right{text-align:right}.medium-space,.space{margin:1.5em}.medium-padding,.padding{padding:1.5em}.double-space,.medium-double-space{margin:3em}.double-padding,.medium-double-padding{padding:3em}.half-space,.medium-half-space{margin:.75em}.half-padding,.medium-half-padding{padding:.75em}.medium-quarter-space,.quarter-space{margin:.375em}.medium-quarter-padding,.quarter-padding{padding:.375em}.medium-vertical-space,.vertical-space{margin-top:1.5em;margin-bottom:1.5em}.medium-vertical-padding,.vertical-padding{padding-top:1.5em;padding-bottom:1.5em}.double-vertical-space,.medium-double-vertical-space{margin-top:3em;margin-bottom:3em}.double-vertical-padding,.medium-double-vertical-padding{padding-top:3em;padding-bottom:3em}.half-vertical-space,.medium-half-vertical-space{margin-top:.75em;margin-bottom:.75em}.half-vertical-padding,.medium-half-vertical-padding{padding-top:.75em;padding-bottom:.75em}.medium-quarter-vertical-space,.quarter-vertical-space{margin-top:.375em;margin-bottom:.375em}.medium-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.375em;padding-bottom:.375em}.horizontal-space,.medium-horizontal-space{margin-left:1.5em;margin-right:1.5em}.horizontal-padding,.medium-horizontal-padding{padding-left:1.5em;padding-right:1.5em}.double-horizontal-space,.medium-double-horizontal-space{margin-left:3em;margin-right:3em}.double-horizontal-padding,.medium-double-horizontal-padding{padding-left:3em;padding-right:3em}.half-horizontal-space,.medium-half-horizontal-space{margin-left:.75em;margin-right:.75em}.half-horizontal-padding,.medium-half-horizontal-padding{padding-left:.75em;padding-right:.75em}.medium-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.375em;margin-right:.375em}.medium-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.375em;padding-right:.375em}.medium-top-space,.top-space{margin-top:1.5em}.medium-top-padding,.top-padding{padding-top:1.5em}.double-top-space,.medium-double-top-space{margin-top:3em}.double-top-padding,.medium-double-top-padding{padding-top:3em}.half-top-space,.medium-half-top-space{margin-top:.75em}.half-top-padding,.medium-half-top-padding{padding-top:.75em}.medium-quarter-top-space,.quarter-top-space{margin-top:.375em}.medium-quarter-top-padding,.quarter-top-padding{padding-top:.375em}.medium-right-space,.right-space{margin-right:1.5em}.medium-right-padding,.right-padding{padding-right:1.5em}.double-right-space,.medium-double-right-space{margin-right:3em}.double-right-padding,.medium-double-right-padding{padding-right:3em}.half-right-space,.medium-half-right-space{margin-right:.75em}.half-right-padding,.medium-half-right-padding{padding-right:.75em}.medium-quarter-right-space,.quarter-right-space{margin-right:.375em}.medium-quarter-right-padding,.quarter-right-padding{padding-right:.375em}.bottom-space,.medium-bottom-space{margin-bottom:1.5em}.bottom-padding,.medium-bottom-padding{padding-bottom:1.5em}.double-bottom-space,.medium-double-bottom-space{margin-bottom:3em}.double-bottom-padding,.medium-double-bottom-padding{padding-bottom:3em}.half-bottom-space,.medium-half-bottom-space{margin-bottom:.75em}.half-bottom-padding,.medium-half-bottom-padding{padding-bottom:.75em}.medium-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.375em}.medium-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.375em}.left-space,.medium-left-space{margin-left:1.5em}.left-padding,.medium-left-padding{padding-left:1.5em}.double-left-space,.medium-double-left-space{margin-left:3em}.double-left-padding,.medium-double-left-padding{padding-left:3em}.half-left-space,.medium-half-left-space{margin-left:.75em}.half-left-padding,.medium-half-left-padding{padding-left:.75em}.medium-quarter-left-space,.quarter-left-space{margin-left:.375em}.medium-quarter-left-padding,.quarter-left-padding{padding-left:.375em}.hide-medium{display:none!important}.show-medium{display:inherit!important}table.show-medium{display:table}thead.show-medium{display:table-header-group}tbody.show-medium{display:table-row-group}tfoot.show-medium{display:table-footer-group}tr.show-medium{display:table-row}td.show-medium,th.show-medium{display:table-cell}}@media screen and (min-width:321px) and (max-width:640px){.ink-grid{padding:0 1.25em}.column-group.gutters{margin-left:-1.25em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}.column-group.horizontal-gutters{margin-left:-1.25em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=small-]{padding-left:1.25em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=small-]{margin-bottom:1.25em}.column-group.double-gutters{margin-left:-2.5em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}.column-group.double-horizontal-gutters{margin-left:-2.5em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=small-]{padding-left:2.5em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}.column-group.half-gutters{margin-left:-.625em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}.column-group.half-horizontal-gutters{margin-left:-.625em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=small-]{padding-left:.625em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=small-]{margin-bottom:.625em}.column-group.quarter-gutters{margin-left:-.3125em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}.column-group.quarter-horizontal-gutters{margin-left:-.3125em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}.column-group.small-gutters{margin-left:-1.25em}.column-group.small-gutters>.all-auto,.column-group.small-gutters>[class*=all-],.column-group.small-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}.column-group.small-horizontal-gutters{margin-left:-1.25em}.column-group.small-horizontal-gutters>.all-auto,.column-group.small-horizontal-gutters>[class*=all-],.column-group.small-horizontal-gutters>[class*=small-]{padding-left:1.25em}.column-group.small-vertical-gutters>.all-auto,.column-group.small-vertical-gutters>[class*=all-],.column-group.small-vertical-gutters>[class*=small-]{margin-bottom:1.25em}.column-group.small-double-gutters{margin-left:-2.5em}.column-group.small-double-gutters>.all-auto,.column-group.small-double-gutters>[class*=all-],.column-group.small-double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}.column-group.small-double-horizontal-gutters{margin-left:-2.5em}.column-group.small-double-horizontal-gutters>.all-auto,.column-group.small-double-horizontal-gutters>[class*=all-],.column-group.small-double-horizontal-gutters>[class*=small-]{padding-left:2.5em}.column-group.small-double-vertical-gutters>.all-auto,.column-group.small-double-vertical-gutters>[class*=all-],.column-group.small-double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}.column-group.small-half-gutters{margin-left:-.625em}.column-group.small-half-gutters>.all-auto,.column-group.small-half-gutters>[class*=all-],.column-group.small-half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}.column-group.small-half-horizontal-gutters{margin-left:-.625em}.column-group.small-half-horizontal-gutters>.all-auto,.column-group.small-half-horizontal-gutters>[class*=all-],.column-group.small-half-horizontal-gutters>[class*=small-]{padding-left:.625em}.column-group.small-half-vertical-gutters>.all-auto,.column-group.small-half-vertical-gutters>[class*=all-],.column-group.small-half-vertical-gutters>[class*=small-]{margin-bottom:.625em}.column-group.small-quarter-gutters{margin-left:-.3125em}.column-group.small-quarter-gutters>.all-auto,.column-group.small-quarter-gutters>[class*=all-],.column-group.small-quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}.column-group.small-quarter-horizontal-gutters{margin-left:-.3125em}.column-group.small-quarter-horizontal-gutters>.all-auto,.column-group.small-quarter-horizontal-gutters>[class*=all-],.column-group.small-quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}.column-group.small-quarter-vertical-gutters>.all-auto,.column-group.small-quarter-vertical-gutters>[class*=all-],.column-group.small-quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}.column-group.small-no-gutters{margin-left:0}.column-group.small-no-gutters>.all-auto,.column-group.small-no-gutters>[class*=all-],.column-group.small-no-gutters>[class*=small-]{padding-left:0;margin-bottom:0}.small-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.reverse,.column-group.small-reverse,.ink-flex.reverse,.ink-flex.small-reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.small-vertical,.column-group.vertical,.ink-flex.small-vertical,.ink-flex.vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.small-vertical.small-reverse,.column-group.vertical.reverse,.ink-flex.small-vertical.small-reverse,.ink-flex.vertical.reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.small-order-1{order:1;-ms-flex-order:1}.small-order-2{order:2;-ms-flex-order:2}.small-order-3{order:3;-ms-flex-order:3}.small-order-4{order:4;-ms-flex-order:4}.small-order-5{order:5;-ms-flex-order:5}.small-order-6{order:6;-ms-flex-order:6}.small-order-7{order:7;-ms-flex-order:7}.small-order-8{order:8;-ms-flex-order:8}.small-order-9{order:9;-ms-flex-order:9}.small-order-10{order:10;-ms-flex-order:10}.column-group .small-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.push-top,.small-push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.push-bottom,.small-push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.push-middle,.small-push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.push-left,.small-push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.push-center,.small-push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.push-right,.small-push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.small-align-left{text-align:left}.small-align-center{text-align:center}.small-align-right{text-align:right}.small-space,.space{margin:1.25em}.padding,.small-padding{padding:1.25em}.double-space,.small-double-space{margin:2.5em}.double-padding,.small-double-padding{padding:2.5em}.half-space,.small-half-space{margin:.625em}.half-padding,.small-half-padding{padding:.625em}.quarter-space,.small-quarter-space{margin:.3125em}.quarter-padding,.small-quarter-padding{padding:.3125em}.small-vertical-space,.vertical-space{margin-top:1.25em;margin-bottom:1.25em}.small-vertical-padding,.vertical-padding{padding-top:1.25em;padding-bottom:1.25em}.double-vertical-space,.small-double-vertical-space{margin-top:2.5em;margin-bottom:2.5em}.double-vertical-padding,.small-double-vertical-padding{padding-top:2.5em;padding-bottom:2.5em}.half-vertical-space,.small-half-vertical-space{margin-top:.625em;margin-bottom:.625em}.half-vertical-padding,.small-half-vertical-padding{padding-top:.625em;padding-bottom:.625em}.quarter-vertical-space,.small-quarter-vertical-space{margin-top:.3125em;margin-bottom:.3125em}.quarter-vertical-padding,.small-quarter-vertical-padding{padding-top:.3125em;padding-bottom:.3125em}.horizontal-space,.small-horizontal-space{margin-left:1.25em;margin-right:1.25em}.horizontal-padding,.small-horizontal-padding{padding-left:1.25em;padding-right:1.25em}.double-horizontal-space,.small-double-horizontal-space{margin-left:2.5em;margin-right:2.5em}.double-horizontal-padding,.small-double-horizontal-padding{padding-left:2.5em;padding-right:2.5em}.half-horizontal-space,.small-half-horizontal-space{margin-left:.625em;margin-right:.625em}.half-horizontal-padding,.small-half-horizontal-padding{padding-left:.625em;padding-right:.625em}.quarter-horizontal-space,.small-quarter-horizontal-space{margin-left:.3125em;margin-right:.3125em}.quarter-horizontal-padding,.small-quarter-horizontal-padding{padding-left:.3125em;padding-right:.3125em}.small-top-space,.top-space{margin-top:1.25em}.small-top-padding,.top-padding{padding-top:1.25em}.double-top-space,.small-double-top-space{margin-top:2.5em}.double-top-padding,.small-double-top-padding{padding-top:2.5em}.half-top-space,.small-half-top-space{margin-top:.625em}.half-top-padding,.small-half-top-padding{padding-top:.625em}.quarter-top-space,.small-quarter-top-space{margin-top:.3125em}.quarter-top-padding,.small-quarter-top-padding{padding-top:.3125em}.right-space,.small-right-space{margin-right:1.25em}.right-padding,.small-right-padding{padding-right:1.25em}.double-right-space,.small-double-right-space{margin-right:2.5em}.double-right-padding,.small-double-right-padding{padding-right:2.5em}.half-right-space,.small-half-right-space{margin-right:.625em}.half-right-padding,.small-half-right-padding{padding-right:.625em}.quarter-right-space,.small-quarter-right-space{margin-right:.3125em}.quarter-right-padding,.small-quarter-right-padding{padding-right:.3125em}.bottom-space,.small-bottom-space{margin-bottom:1.25em}.bottom-padding,.small-bottom-padding{padding-bottom:1.25em}.double-bottom-space,.small-double-bottom-space{margin-bottom:2.5em}.double-bottom-padding,.small-double-bottom-padding{padding-bottom:2.5em}.half-bottom-space,.small-half-bottom-space{margin-bottom:.625em}.half-bottom-padding,.small-half-bottom-padding{padding-bottom:.625em}.quarter-bottom-space,.small-quarter-bottom-space{margin-bottom:.3125em}.quarter-bottom-padding,.small-quarter-bottom-padding{padding-bottom:.3125em}.left-space,.small-left-space{margin-left:1.25em}.left-padding,.small-left-padding{padding-left:1.25em}.double-left-space,.small-double-left-space{margin-left:2.5em}.double-left-padding,.small-double-left-padding{padding-left:2.5em}.half-left-space,.small-half-left-space{margin-left:.625em}.half-left-padding,.small-half-left-padding{padding-left:.625em}.quarter-left-space,.small-quarter-left-space{margin-left:.3125em}.quarter-left-padding,.small-quarter-left-padding{padding-left:.3125em}.hide-small{display:none!important}.show-small{display:inherit!important}table.show-small{display:table}thead.show-small{display:table-header-group}tbody.show-small{display:table-row-group}tfoot.show-small{display:table-footer-group}tr.show-small{display:table-row}td.show-small,th.show-small{display:table-cell}}@media screen and (max-width:320px){.ink-grid{padding:0 1em}.column-group.gutters{margin-left:-1em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}.column-group.horizontal-gutters{margin-left:-1em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=tiny-]{padding-left:1em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=tiny-]{margin-bottom:1em}.column-group.double-gutters{margin-left:-2em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}.column-group.double-horizontal-gutters{margin-left:-2em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=tiny-]{padding-left:2em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}.column-group.half-gutters{margin-left:-.5em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}.column-group.half-horizontal-gutters{margin-left:-.5em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}.column-group.quarter-gutters{margin-left:-.25em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}.column-group.quarter-horizontal-gutters{margin-left:-.25em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}.column-group.tiny-gutters{margin-left:-1em}.column-group.tiny-gutters>.all-auto,.column-group.tiny-gutters>[class*=all-],.column-group.tiny-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}.column-group.tiny-horizontal-gutters{margin-left:-1em}.column-group.tiny-horizontal-gutters>.all-auto,.column-group.tiny-horizontal-gutters>[class*=all-],.column-group.tiny-horizontal-gutters>[class*=tiny-]{padding-left:1em}.column-group.tiny-vertical-gutters>.all-auto,.column-group.tiny-vertical-gutters>[class*=all-],.column-group.tiny-vertical-gutters>[class*=tiny-]{margin-bottom:1em}.column-group.tiny-double-gutters{margin-left:-2em}.column-group.tiny-double-gutters>.all-auto,.column-group.tiny-double-gutters>[class*=all-],.column-group.tiny-double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}.column-group.tiny-double-horizontal-gutters{margin-left:-2em}.column-group.tiny-double-horizontal-gutters>.all-auto,.column-group.tiny-double-horizontal-gutters>[class*=all-],.column-group.tiny-double-horizontal-gutters>[class*=tiny-]{padding-left:2em}.column-group.tiny-double-vertical-gutters>.all-auto,.column-group.tiny-double-vertical-gutters>[class*=all-],.column-group.tiny-double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}.column-group.tiny-half-gutters{margin-left:-.5em}.column-group.tiny-half-gutters>.all-auto,.column-group.tiny-half-gutters>[class*=all-],.column-group.tiny-half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}.column-group.tiny-half-horizontal-gutters{margin-left:-.5em}.column-group.tiny-half-horizontal-gutters>.all-auto,.column-group.tiny-half-horizontal-gutters>[class*=all-],.column-group.tiny-half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}.column-group.tiny-half-vertical-gutters>.all-auto,.column-group.tiny-half-vertical-gutters>[class*=all-],.column-group.tiny-half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}.column-group.tiny-quarter-gutters{margin-left:-.25em}.column-group.tiny-quarter-gutters>.all-auto,.column-group.tiny-quarter-gutters>[class*=all-],.column-group.tiny-quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}.column-group.tiny-quarter-horizontal-gutters{margin-left:-.25em}.column-group.tiny-quarter-horizontal-gutters>.all-auto,.column-group.tiny-quarter-horizontal-gutters>[class*=all-],.column-group.tiny-quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}.column-group.tiny-quarter-vertical-gutters>.all-auto,.column-group.tiny-quarter-vertical-gutters>[class*=all-],.column-group.tiny-quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}.column-group.tiny-no-gutters{margin-left:0}.column-group.tiny-no-gutters>.all-auto,.column-group.tiny-no-gutters>[class*=all-],.column-group.tiny-no-gutters>[class*=tiny-]{padding-left:0;margin-bottom:0}.tiny-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.reverse,.column-group.tiny-reverse,.ink-flex.reverse,.ink-flex.tiny-reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.tiny-vertical,.column-group.vertical,.ink-flex.tiny-vertical,.ink-flex.vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.tiny-vertical.tiny-reverse,.column-group.vertical.reverse,.ink-flex.tiny-vertical.tiny-reverse,.ink-flex.vertical.reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.tiny-order-1{order:1;-ms-flex-order:1}.tiny-order-2{order:2;-ms-flex-order:2}.tiny-order-3{order:3;-ms-flex-order:3}.tiny-order-4{order:4;-ms-flex-order:4}.tiny-order-5{order:5;-ms-flex-order:5}.tiny-order-6{order:6;-ms-flex-order:6}.tiny-order-7{order:7;-ms-flex-order:7}.tiny-order-8{order:8;-ms-flex-order:8}.tiny-order-9{order:9;-ms-flex-order:9}.tiny-order-10{order:10;-ms-flex-order:10}.column-group .tiny-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.push-top,.tiny-push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.push-bottom,.tiny-push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.push-middle,.tiny-push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.push-left,.tiny-push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.push-center,.tiny-push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.push-right,.tiny-push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.tiny-align-left{text-align:left}.tiny-align-center{text-align:center}.tiny-align-right{text-align:right}.space,.tiny-space{margin:1em}.padding,.tiny-padding{padding:1em}.double-space,.tiny-double-space{margin:2em}.double-padding,.tiny-double-padding{padding:2em}.half-space,.tiny-half-space{margin:.5em}.half-padding,.tiny-half-padding{padding:.5em}.quarter-space,.tiny-quarter-space{margin:.25em}.quarter-padding,.tiny-quarter-padding{padding:.25em}.tiny-vertical-space,.vertical-space{margin-top:1em;margin-bottom:1em}.tiny-vertical-padding,.vertical-padding{padding-top:1em;padding-bottom:1em}.double-vertical-space,.tiny-double-vertical-space{margin-top:2em;margin-bottom:2em}.double-vertical-padding,.tiny-double-vertical-padding{padding-top:2em;padding-bottom:2em}.half-vertical-space,.tiny-half-vertical-space{margin-top:.5em;margin-bottom:.5em}.half-vertical-padding,.tiny-half-vertical-padding{padding-top:.5em;padding-bottom:.5em}.quarter-vertical-space,.tiny-quarter-vertical-space{margin-top:.25em;margin-bottom:.25em}.quarter-vertical-padding,.tiny-quarter-vertical-padding{padding-top:.25em;padding-bottom:.25em}.horizontal-space,.tiny-horizontal-space{margin-left:1em;margin-right:1em}.horizontal-padding,.tiny-horizontal-padding{padding-left:1em;padding-right:1em}.double-horizontal-space,.tiny-double-horizontal-space{margin-left:2em;margin-right:2em}.double-horizontal-padding,.tiny-double-horizontal-padding{padding-left:2em;padding-right:2em}.half-horizontal-space,.tiny-half-horizontal-space{margin-left:.5em;margin-right:.5em}.half-horizontal-padding,.tiny-half-horizontal-padding{padding-left:.5em;padding-right:.5em}.quarter-horizontal-space,.tiny-quarter-horizontal-space{margin-left:.25em;margin-right:.25em}.quarter-horizontal-padding,.tiny-quarter-horizontal-padding{padding-left:.25em;padding-right:.25em}.tiny-top-space,.top-space{margin-top:1em}.tiny-top-padding,.top-padding{padding-top:1em}.double-top-space,.tiny-double-top-space{margin-top:2em}.double-top-padding,.tiny-double-top-padding{padding-top:2em}.half-top-space,.tiny-half-top-space{margin-top:.5em}.half-top-padding,.tiny-half-top-padding{padding-top:.5em}.quarter-top-space,.tiny-quarter-top-space{margin-top:.25em}.quarter-top-padding,.tiny-quarter-top-padding{padding-top:.25em}.right-space,.tiny-right-space{margin-right:1em}.right-padding,.tiny-right-padding{padding-right:1em}.double-right-space,.tiny-double-right-space{margin-right:2em}.double-right-padding,.tiny-double-right-padding{padding-right:2em}.half-right-space,.tiny-half-right-space{margin-right:.5em}.half-right-padding,.tiny-half-right-padding{padding-right:.5em}.quarter-right-space,.tiny-quarter-right-space{margin-right:.25em}.quarter-right-padding,.tiny-quarter-right-padding{padding-right:.25em}.bottom-space,.tiny-bottom-space{margin-bottom:1em}.bottom-padding,.tiny-bottom-padding{padding-bottom:1em}.double-bottom-space,.tiny-double-bottom-space{margin-bottom:2em}.double-bottom-padding,.tiny-double-bottom-padding{padding-bottom:2em}.half-bottom-space,.tiny-half-bottom-space{margin-bottom:.5em}.half-bottom-padding,.tiny-half-bottom-padding{padding-bottom:.5em}.quarter-bottom-space,.tiny-quarter-bottom-space{margin-bottom:.25em}.quarter-bottom-padding,.tiny-quarter-bottom-padding{padding-bottom:.25em}.left-space,.tiny-left-space{margin-left:1em}.left-padding,.tiny-left-padding{padding-left:1em}.double-left-space,.tiny-double-left-space{margin-left:2em}.double-left-padding,.tiny-double-left-padding{padding-left:2em}.half-left-space,.tiny-half-left-space{margin-left:.5em}.half-left-padding,.tiny-half-left-padding{padding-left:.5em}.quarter-left-space,.tiny-quarter-left-space{margin-left:.25em}.quarter-left-padding,.tiny-quarter-left-padding{padding-left:.25em}.hide-tiny{display:none!important}.show-tiny{display:inherit!important}table.show-tiny{display:table}thead.show-tiny{display:table-header-group}tbody.show-tiny{display:table-row-group}tfoot.show-tiny{display:table-footer-group}tr.show-tiny{display:table-row}td.show-tiny,th.show-tiny{display:table-cell}}@media screen and (min-width:1261px){html{font-size:1.08em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:961px) and (max-width:1260px){html{font-size:1.05em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:641px) and (max-width:960px){html{font-size:1em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:321px) and (max-width:640px){html{font-size:.98em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (max-width:320px){html{font-size:.97em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-thin-webfont.eot);src:url(../fonts/Roboto/roboto-thin-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-thin-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-thin-webfont.ttf) format('truetype');font-weight:100;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-thinitalic-webfont.eot);src:url(../fonts/Roboto/roboto-thinitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-thinitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-thinitalic-webfont.ttf) format('truetype');font-weight:100;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-light-webfont.eot);src:url(../fonts/Roboto/roboto-light-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-light-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-light-webfont.ttf) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-lightitalic-webfont.eot);src:url(../fonts/Roboto/roboto-lightitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-lightitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-lightitalic-webfont.ttf) format('truetype');font-weight:300;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-regular-webfont.eot);src:url(../fonts/Roboto/roboto-regular-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-regular-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-regular-webfont.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-italic-webfont.eot);src:url(../fonts/Roboto/roboto-italic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-italic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-italic-webfont.ttf) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-medium-webfont.eot);src:url(../fonts/Roboto/roboto-medium-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-medium-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-medium-webfont.ttf) format('truetype');font-weight:500;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-mediumitalic-webfont.eot);src:url(../fonts/Roboto/roboto-mediumitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-mediumitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-mediumitalic-webfont.ttf) format('truetype');font-weight:500;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-bold-webfont.eot);src:url(../fonts/Roboto/roboto-bold-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-bold-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-bold-webfont.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-bolditalic-webfont.eot);src:url(../fonts/Roboto/roboto-bolditalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-bolditalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-bolditalic-webfont.ttf) format('truetype');font-weight:700;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-black-webfont.eot);src:url(../fonts/Roboto/roboto-black-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-black-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-black-webfont.ttf) format('truetype');font-weight:900;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-blackitalic-webfont.eot);src:url(../fonts/Roboto/roboto-blackitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-blackitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-blackitalic-webfont.ttf) format('truetype');font-weight:900;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-light-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-light-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-light-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-light-webfont.ttf) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.ttf) format('truetype');font-weight:300;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.ttf) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.ttf) format('truetype');font-weight:700;font-style:italic}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-thin-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-thin-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-thin-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-thin-webfont.ttf) format('truetype');font-weight:100;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-light-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-light-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-light-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-light-webfont.ttf) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-regular-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-regular-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-regular-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-regular-webfont.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-bold-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-bold-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-bold-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-bold-webfont.ttf) format('truetype');font-weight:700;font-style:normal}.ink-label{padding:0 .35em;white-space:nowrap}.ink-navigation{overflow:visible}.ink-navigation ul{list-style-type:none;padding:0;margin:0}.ink-navigation ul li{margin:0}.ink-navigation .breadcrumbs li{line-height:2.7em;display:inline}.ink-navigation .breadcrumbs li a{display:inline;padding:0}.ink-navigation .breadcrumbs li a:hover{background:0 0}.ink-navigation .breadcrumbs li.active a{cursor:default;text-decoration:none}.ink-navigation .breadcrumbs li:first-child a{padding-left:1.2em}.ink-navigation .breadcrumbs li:after{content:'/';display:inline;margin:0 .7em}.ink-navigation .breadcrumbs li:last-child:after{content:'';display:none}.ink-dropdown,.ink-navigation{position:relative}.ink-dropdown ul.dropdown,.ink-dropdown ul.dropdown-menu,.ink-navigation ul.dropdown,.ink-navigation ul.dropdown-menu{position:absolute;top:110%;background:#fff;z-index:30;border:1px solid #d9d9d9;height:auto;width:auto;min-width:10em;max-width:12em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:rgba(100,100,100,.3) 0 0 1px 0;-moz-box-shadow:rgba(100,100,100,.3) 0 0 1px 0;box-shadow:rgba(100,100,100,.3) 0 0 1px 0;margin-left:0;padding:.35em 0;font-size:.85em}.ink-dropdown ul.dropdown li,.ink-dropdown ul.dropdown-menu li,.ink-navigation ul.dropdown li,.ink-navigation ul.dropdown-menu li{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-border-radius:none;-moz-border-radius:none;-ms-border-radius:none;-o-border-radius:none;border-radius:none;width:auto;height:auto;min-height:auto;display:list-item;float:none;margin:0;text-align:left;text-transform:none;padding:0;position:relative;list-style-type:none}.ink-dropdown ul.dropdown li.separator-above,.ink-dropdown ul.dropdown-menu li.separator-above,.ink-navigation ul.dropdown li.separator-above,.ink-navigation ul.dropdown-menu li.separator-above{padding-top:.35em;margin-top:.35em;border-top:1px solid #d9d9d9}.ink-dropdown ul.dropdown li.separator-below,.ink-dropdown ul.dropdown-menu li.separator-below,.ink-navigation ul.dropdown li.separator-below,.ink-navigation ul.dropdown-menu li.separator-below{padding-bottom:.35em;margin-bottom:.35em;border-bottom:1px solid #d9d9d9}.ink-dropdown ul.dropdown li.heading,.ink-dropdown ul.dropdown-menu li.heading,.ink-navigation ul.dropdown li.heading,.ink-navigation ul.dropdown-menu li.heading{font-weight:700;margin-bottom:.35em;padding:.5em .8em;color:#333}.ink-dropdown ul.dropdown li a,.ink-dropdown ul.dropdown-menu li a,.ink-navigation ul.dropdown li a,.ink-navigation ul.dropdown-menu li a{color:#444;padding:.5em .8em;display:block;clear:both}.ink-dropdown ul.dropdown li a:hover,.ink-dropdown ul.dropdown-menu li a:hover,.ink-navigation ul.dropdown li a:hover,.ink-navigation ul.dropdown-menu li a:hover{background:#f2f2f2;text-decoration:none}.ink-dropdown ul.dropdown li.active a,.ink-dropdown ul.dropdown-menu li.active a,.ink-navigation ul.dropdown li.active a,.ink-navigation ul.dropdown-menu li.active a{background:#999;color:#fff}.ink-dropdown ul.dropdown li.disabled a,.ink-dropdown ul.dropdown-menu li.disabled a,.ink-navigation ul.dropdown li.disabled a,.ink-navigation ul.dropdown-menu li.disabled a{color:#b3b3b3}.ink-dropdown ul.dropdown li.disabled a:hover,.ink-dropdown ul.dropdown-menu li.disabled a:hover,.ink-navigation ul.dropdown li.disabled a:hover,.ink-navigation ul.dropdown-menu li.disabled a:hover{background:0 0;cursor:default}.ink-dropdown ul.dropdown li.submenu,.ink-dropdown ul.dropdown-menu li.submenu,.ink-navigation ul.dropdown li.submenu,.ink-navigation ul.dropdown-menu li.submenu{overflow:visible}.ink-dropdown ul.dropdown li.submenu>a,.ink-dropdown ul.dropdown-menu li.submenu>a,.ink-navigation ul.dropdown li.submenu>a,.ink-navigation ul.dropdown-menu li.submenu>a{white-space:nowrap}.ink-dropdown ul.dropdown li.submenu>a:after,.ink-dropdown ul.dropdown-menu li.submenu>a:after,.ink-navigation ul.dropdown li.submenu>a:after,.ink-navigation ul.dropdown-menu li.submenu>a:after{content:"\f0da";width:auto;margin-left:.8em;font-family:FontAwesome;color:#b3b3b3}.ink-dropdown ul.dropdown li.submenu:hover>a,.ink-dropdown ul.dropdown-menu li.submenu:hover>a,.ink-navigation ul.dropdown li.submenu:hover>a,.ink-navigation ul.dropdown-menu li.submenu:hover>a{background:#f2f2f2;text-decoration:none}.ink-dropdown ul.dropdown li.submenu:hover:hover>ul.dropdown,.ink-dropdown ul.dropdown li.submenu:hover:hover>ul.dropdown-menu,.ink-dropdown ul.dropdown-menu li.submenu:hover:hover>ul.dropdown,.ink-dropdown ul.dropdown-menu li.submenu:hover:hover>ul.dropdown-menu,.ink-navigation ul.dropdown li.submenu:hover:hover>ul.dropdown,.ink-navigation ul.dropdown li.submenu:hover:hover>ul.dropdown-menu,.ink-navigation ul.dropdown-menu li.submenu:hover:hover>ul.dropdown,.ink-navigation ul.dropdown-menu li.submenu:hover:hover>ul.dropdown-menu{display:block}.ink-dropdown ul.dropdown li.submenu>ul.dropdown,.ink-dropdown ul.dropdown li.submenu>ul.dropdown-menu,.ink-dropdown ul.dropdown-menu li.submenu>ul.dropdown,.ink-dropdown ul.dropdown-menu li.submenu>ul.dropdown-menu,.ink-navigation ul.dropdown li.submenu>ul.dropdown,.ink-navigation ul.dropdown li.submenu>ul.dropdown-menu,.ink-navigation ul.dropdown-menu li.submenu>ul.dropdown,.ink-navigation ul.dropdown-menu li.submenu>ul.dropdown-menu{font-size:inherit;position:absolute;top:-.36em;left:100%;display:none}.ink-navigation ul.pagination{overflow:hidden;*zoom:1}.ink-navigation ul.pagination li{line-height:1.7;float:left}.ink-navigation ul.pagination li a{padding:.5em 1em;display:block;float:left}.ink-navigation ul.pagination.dotted li a{display:block;height:1em;width:1em;margin-right:.6em;padding:0;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%;text-indent:99999px}.ink-navigation ul.pagination.dotted li a:first-child,.ink-navigation ul.pagination.dotted li a:last-child{-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%}.ink-navigation ul.pagination.chevron li{display:none}.ink-navigation ul.pagination.chevron li.next,.ink-navigation ul.pagination.chevron li.previous{display:block}.ink-navigation ul.pagination.chevron li.next a,.ink-navigation ul.pagination.chevron li.previous a{display:block;position:absolute;top:35%;padding:0 .5em;margin:0;font-family:FontAwesome;font-size:4em}.ink-navigation ul.pagination.chevron li.next a span,.ink-navigation ul.pagination.chevron li.previous a span{text-indent:-99999px;display:inline-block}.ink-navigation ul.pagination.chevron li.previous a{left:0}.ink-navigation ul.pagination.chevron li.previous a:after{content:"\f137"}.ink-navigation ul.pagination.chevron li.next a{right:0}.ink-navigation ul.pagination.chevron li.next a:after{content:"\f138"}.ink-navigation .pills{overflow:hidden;*zoom:1}.ink-navigation .pills li{overflow:hidden;display:block;float:left;margin:0 .5em .5em 0;line-height:1.7}.ink-navigation .pills li a{display:block;padding:.5em 1em}.ink-navigation .pills li a:hover{text-decoration:none}.ink-navigation .pills li.active a,.ink-navigation .pills li.disabled a{cursor:default}.ink-navigation ul{*height:100%}.ink-navigation ul.menu{*zoom:1}.ink-navigation ul.menu:after{content:"";display:table;clear:both}.ink-navigation ul.menu li{*height:100%}.ink-navigation ul.menu li:hover>ul.submenu{display:block}.ink-navigation ul.menu li ul.submenu{display:none;position:absolute;z-index:10}.ink-navigation ul.menu li ul.submenu li a{padding:.5em 1em;display:block;float:none}.ink-navigation ul.menu.horizontal.scrollable{font-size:0;white-space:nowrap;overflow-x:scroll;overflow-y:hidden;-webkit-overflow-scrolling:touch;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}.ink-navigation ul.menu.horizontal.scrollable li{display:inline-block;float:none}.ink-navigation ul.menu.horizontal.scrollable li a{border-right:rgba(10,10,10,.3) 1px solid;font-size:initial}.ink-navigation ul.menu.horizontal.scrollable li:last-child a{border-right:0}.ink-navigation ul.menu.horizontal li{float:left;position:relative}.ink-navigation ul.menu.horizontal li a{padding:.5em 1em;display:block;line-height:1.7}.ink-navigation ul.menu.horizontal li .control{margin-top:.3em}.ink-navigation ul.menu.horizontal li ul.submenu{min-width:100%;z-index:50;top:auto;left:auto}.ink-navigation ul.menu.horizontal li ul.submenu li{float:none}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout{position:absolute;top:0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout.left{right:100%}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout.right{left:100%}.ink-navigation ul.menu.vertical li{line-height:1.7;position:relative}.ink-navigation ul.menu.vertical li a{padding:.5em 1em;display:block}.ink-navigation ul.menu.vertical li ul.submenu{position:relative;top:auto;left:auto}.ink-navigation ul.menu.vertical li ul.submenu.flyout{position:absolute;min-width:8em;top:0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.vertical li ul.submenu.flyout.left{right:100%}.ink-navigation ul.menu.vertical li ul.submenu.flyout.right{left:100%}@media print{*{background:transparent!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.ink-navigation{display:none}.ink-table{border-collapse:collapse}.ink-label{border:1px solid #000}}table.ink-table{width:100%;border-collapse:collapse;border-spacing:0}table.ink-table tr th{padding:5px 10px;line-height:1.3}table.ink-table tr th[data-sortable=true]:hover{cursor:pointer;text-decoration:underline}table.ink-table tr th[data-sortable=true]:hover i{text-decoration:none}table.ink-table tr th[data-sortable=true] i{padding-left:.5em}table.ink-table tr td{padding:5px 10px;line-height:1.3}table.ink-table.hover tbody tr:hover{cursor:pointer}table.ink-table.bordered{border-collapse:separate}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{color:#555;font-family:Roboto,Arial,Helvetica,sans-serif;line-height:1.45}.fw-100,.fw-light{font-weight:100}.fw-300,.fw-thin{font-weight:300}.fw-400,.fw-regular{font-weight:400}.fw-500,.fw-medium{font-weight:500}.fw-700,.fw-bold{font-weight:700}.fw-900,.fw-black{font-weight:900}.condensed-300,.condensed-thin{font-weight:200;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.condensed-400,.condensed-regular{font-weight:400;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.condensed-700,.condensed-bold{font-weight:700;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.slab-100,.slab-light{font-weight:100;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-300,.slab-thin{font-weight:300;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-400,.slab-regular{font-weight:400;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-700,.slab-bold{font-weight:700;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.sans{font-family:Roboto,Arial,Helvetica,sans-serif}.serif{font-family:Times,"Times New Roman",serif}.monospace{font-family:Monaco,"Andale Mono","Courier New",monospace}.condensed{font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.slab{font-family:Roboto_slab,Arial,Helvetica,sans-serif}.italic{font-style:italic}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalizer{text-transform:capitalize}.fa{font-size:14px}a{color:#6998c9;text-decoration:none;cursor:pointer}a:hover{color:#007ed5;text-decoration:underline}h1{font-size:2.2em;margin-top:0;margin-bottom:.57539em}h2{font-size:1.75em;margin-top:0;margin-bottom:.72334em}h3{font-size:1.5em;margin-top:0;margin-bottom:.8439em}h4{font-size:1.25em;margin-top:0;margin-bottom:1.01268em}h5,h6{font-size:1.1em;margin-top:0;margin-bottom:1.15077em}p,table{font-size:1em;margin-top:0;margin-bottom:1.26585em}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,h6:first-child,p:first-child{margin-top:0}h1,h2,h3,h4,h5,h6{color:#404040;font-weight:700;line-height:1.16}small{color:#888}input,textarea{color:#666}h1 small,h2 small,h3 small,h4 small{color:#bbb;font-size:.6em;font-weight:100;line-height:1}mark{background:#dae5f2}address{color:#777;font-size:1em;line-height:1.4}address p{margin-top:0}address h6{color:#555}abbr:hover{cursor:help}blockquote{border-left:4px solid #ddd;padding-left:25px;margin:1em 0;font-weight:200;font-size:1.1em}blockquote small{font-size:.9em}blockquote small::after,blockquote small::before{content:' — '}.note{font-size:.9em;color:#777}.note strong{color:#555}.small{font-size:.75em}.medium{font-size:.85em}.large{font-size:1.2em}.extralarge{font-size:1.45em!important}hr{border:0;border-top:1px solid #ddd;margin:1em 0}.lead{font-size:1.1em;font-weight:700}ol,ul{line-height:1.4;padding:0 0 0 1.45em;margin:1em 0}ol li,ul li{margin:.5em 0}ul.unstyled{list-style:none;padding-left:0}ul.unstyled ul{list-style:disc outside}ul.unstyled ul.unstyled{list-style:none;padding-left:0}ul.inline{list-style:none}ul.inline li{display:inline-block;padding:0 .5em}ul.inline li:first-child{padding:0 .5em 0 0}dl{margin:1em 0}dl dt{font-weight:700;margin:.5em 0}dl dd{margin:.5em 0 .5em 25px}dl.inline dt{float:left;clear:left;text-align:right;width:180px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;margin:0}dl.inline dd{margin:.5em 0 .5em 200px}figure.ink-image{position:relative;border:1px solid #555}figure.ink-image>img{width:100%}figure.ink-image>figcaption{padding:1em;background:#fff;line-height:1.3}figure.ink-image>figcaption.over-bottom,figure.ink-image>figcaption.over-top{position:absolute;width:100%;left:0;border:0}figure.ink-image>figcaption.over-bottom.dark,figure.ink-image>figcaption.over-top.dark{color:#fff;background:rgba(0,0,0,.6)}figure.ink-image>figcaption.over-top{top:0;background:rgba(255,255,255,.7)}figure.ink-image>figcaption.over-bottom{bottom:0;background:rgba(255,255,255,.7)}figure.ink-image>figcaption.dark{color:#fff;background:#222}img{border:0;width:auto;max-width:100%;vertical-align:top}.ink-alert.basic,.ink-alert.block{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-alert.basic{background:rgba(255,156,0,.25);color:#b87814;border:1px solid #b87814}.ink-alert.basic .ink-dismiss{color:#b87814}.ink-alert.basic.success{background:rgba(74,155,23,.25);color:#38621d;border:1px solid #38621d}.ink-alert.basic.success .ink-dismiss{color:#38621d}.ink-alert.basic.error{background:rgba(201,17,17,.25);color:#891e1e;border:1px solid #891e1e}.ink-alert.basic.error .ink-dismiss{color:#891e1e}.ink-alert.basic.info{background:rgba(15,117,218,.25);color:#1e5b98;border:1px solid #1e5b98}.ink-alert.basic.info .ink-dismiss{color:#1e5b98}.ink-alert.block{border:1px solid #b87814;background:#fff}.ink-alert.block>h4{background:rgba(255,156,0,.3);color:#b87814}.ink-alert.block .ink-dismiss{color:#b87814}.ink-alert.block.success{border:1px solid #38621d;background:#fff}.ink-alert.block.success>h4{background:rgba(74,155,23,.3);color:#38621d}.ink-alert.block.success .ink-dismiss{color:#38621d}.ink-alert.block.error{border:1px solid #891e1e;background:#fff}.ink-alert.block.error>h4{background:rgba(201,17,17,.3);color:#891e1e}.ink-alert.block.error .ink-dismiss{color:#891e1e}.ink-alert.block.info{border:1px solid #1e5b98;background:#fff}.ink-alert.block.info>h4{background:rgba(15,117,218,.3);color:#1e5b98}.ink-alert.block.info .ink-dismiss{color:#1e5b98}.ink-alert .ink-dismiss{font-family:Arial,sans-serif;font-weight:700;text-shadow:#fff 0 1px 0;filter:alpha(Opacity=25);opacity:.25}.ink-alert .ink-dismiss:hover{filter:alpha(Opacity=60);opacity:.6}.ink-badge{-webkit-border-radius:8em;-moz-border-radius:8em;-ms-border-radius:8em;-o-border-radius:8em;border-radius:8em;color:#fff}.ink-badge.white{background:#fff;color:#555}.ink-badge.black{background:#000}.ink-badge.orange{background:#ff9c00}.ink-badge.red{background:#c91111}.ink-badge.green{background:#4a9b17}.ink-badge.blue{background:#0f75da}.ink-badge.yellow{background:#ffd500;color:#555}.ink-badge.grey{background:gray}.ink-badge+.ink-badge{margin-left:.2em}.ink-button{background:#d9d9d9;color:#000;border:1px solid #bfbfbf;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;font-weight:300}.ink-button:active,.ink-button:hover{text-decoration:none;color:#000;background:#ccc;border:1px solid #b3b3b3;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px;box-shadow:rgba(0,0,0,.2) 0 1px 1px}.ink-button:focus{outline:0;background:#ccc;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset}.ink-button[disabled]{background:#e6e6e6;border:1px solid #e6e6e6;color:#999}.ink-button[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.blue{color:#fff;background:#0f75da;border:1px solid #0c63b9}.ink-button.blue:active,.ink-button.blue:hover{background:#0d68c2;border:1px solid #0a56a1;color:#fff;text-decoration:none}.ink-button.blue:focus{background:#0d68c2}.ink-button.blue[disabled]{background:rgba(15,117,218,.6);border:1px solid rgba(15,117,218,0);color:#0c5baa}.ink-button.blue[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.green{color:#fff;background:#4a9b17;border:1px solid #3e8313}.ink-button.green:active,.ink-button.green:hover{background:#3f8514;border:1px solid #336d10;color:#fff;text-decoration:none}.ink-button.green:focus{background:#3f8514}.ink-button.green[disabled]{background:rgba(74,155,23,.6);border:1px solid rgba(74,155,23,0);color:#356f10}.ink-button.green[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.orange{color:#fff;background:#ff9c00;border:1px solid #d88400}.ink-button.orange:active,.ink-button.orange:hover{background:#e68c00;border:1px solid #bf7400;color:#fff;text-decoration:none}.ink-button.orange:focus{background:#e68c00}.ink-button.orange[disabled]{background:rgba(255,156,0,.6);border:1px solid rgba(255,156,0,0);color:#cc7d00}.ink-button.orange[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.red{color:#fff;background:#c91111;border:1px solid #aa0e0e}.ink-button.red:active,.ink-button.red:hover{background:#b10f0f;border:1px solid #920c0c;color:#fff;text-decoration:none}.ink-button.red:focus{background:#b10f0f}.ink-button.red[disabled]{background:rgba(201,17,17,.6);border:1px solid rgba(201,17,17,0);color:#9a0d0d}.ink-button.red[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.black{color:#fff;background:#1a1a1a;border:1px solid #161616}.ink-button.black:active,.ink-button.black:hover{background:#0d0d0d;border:1px solid #090909;color:#fff;text-decoration:none}.ink-button.black:focus{background:#0d0d0d}.ink-button.black[disabled]{background:rgba(26,26,26,.6);border:1px solid rgba(26,26,26,0);color:#000}.ink-button.black[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.white{color:#555;background:#fff;border:1px solid #d8d8d8}.ink-button.white:active,.ink-button.white:hover{background:#f2f2f2;border:1px solid #cbcbcb;color:#555;text-decoration:none}.ink-button.white:focus{background:#f2f2f2}.ink-button.white[disabled]{background:rgba(255,255,255,.6);border:1px solid rgba(255,255,255,0);color:#e6e6e6}.ink-button.white[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.button-group>.ink-button[disabled]{background:#e6e6e6;border:1px solid rgba(217,217,217,.6)}.button-group>.ink-button[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.button-group>.ink-button.blue:first-child{border-left:#0c63b9}.button-group>.ink-button.blue[disabled]{background:rgba(15,117,218,.6);border:1px solid rgba(15,117,218,.3)}.button-group>.ink-button.green:first-child{border-left:#3e8313}.button-group>.ink-button.green[disabled]{background:rgba(74,155,23,.6);border:1px solid rgba(74,155,23,.3)}.button-group>.ink-button.orange:first-child{border-left:#d88400}.button-group>.ink-button.orange[disabled]{background:rgba(255,156,0,.6);border:1px solid rgba(255,156,0,.3)}.button-group>.ink-button.red:first-child{border-left:#aa0e0e}.button-group>.ink-button.red[disabled]{background:rgba(201,17,17,.6);border:1px solid rgba(201,17,17,.3)}.button-group>.ink-button.black:first-child{border-left:#161616}.button-group>.ink-button.black[disabled]{background:rgba(26,26,26,.6);border:1px solid rgba(26,26,26,.3)}.button-group>.ink-button.white:first-child{border-left:#d8d8d8}.button-group>.ink-button.white[disabled]{background:rgba(255,255,255,.6);border:1px solid rgba(255,255,255,.3)}.ink-label{color:#fff;font-weight:300;font-size:.938em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-label.white{background:#fff;color:#555}.ink-label.black{background:#000}.ink-label.orange{background:#ff9c00}.ink-label.red{background:#c91111}.ink-label.green{background:#4a9b17}.ink-label.blue{background:#0f75da}.ink-label.yellow{background:#ffd500;color:#555}.ink-label.grey{background:gray}.ink-label+.ink-label{margin-left:.2em}.ink-navigation ul.breadcrumbs{font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.breadcrumbs li.active a{background:0 0;color:#999}.ink-navigation ul.breadcrumbs li.active a:hover{cursor:default;text-decoration:none}.ink-navigation ul.breadcrumbs li a:hover{background:0 0;text-decoration:underline}.ink-navigation ul.breadcrumbs.white{background:#fff}.ink-navigation ul.breadcrumbs.white li a,.ink-navigation ul.breadcrumbs.white li:after{color:#555}.ink-navigation ul.breadcrumbs.white li.active a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.breadcrumbs.grey{background:#d9d9d9}.ink-navigation ul.breadcrumbs.grey li a,.ink-navigation ul.breadcrumbs.grey li:after{color:#555}.ink-navigation ul.breadcrumbs.grey li.active a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.breadcrumbs.black{background:#1a1a1a}.ink-navigation ul.breadcrumbs.black li a,.ink-navigation ul.breadcrumbs.black li:after{color:#fff}.ink-navigation ul.breadcrumbs.black li.active a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.breadcrumbs.blue{background:#1b75ce}.ink-navigation ul.breadcrumbs.blue li a,.ink-navigation ul.breadcrumbs.blue li:after{color:#fff}.ink-navigation ul.breadcrumbs.blue li.active a{color:#08427b;text-shadow:#1884ef 0 1px 0}.ink-navigation ul.breadcrumbs.orange{background:#f2990d}.ink-navigation ul.breadcrumbs.orange li a,.ink-navigation ul.breadcrumbs.orange li:after{color:#fff}.ink-navigation ul.breadcrumbs.orange li.active a{color:#995e00;text-shadow:#ffa81f 0 1px 0}.ink-navigation ul.breadcrumbs.green{background:#4c9220}.ink-navigation ul.breadcrumbs.green li a,.ink-navigation ul.breadcrumbs.green li:after{color:#fff}.ink-navigation ul.breadcrumbs.green li.active a{color:#20420a;text-shadow:#57b61b 0 1px 0}.ink-navigation ul.breadcrumbs.red{background:#be1c1c}.ink-navigation ul.breadcrumbs.red li a,.ink-navigation ul.breadcrumbs.red li:after{color:#fff}.ink-navigation ul.breadcrumbs.red li.active a{color:#6b0909;text-shadow:#e51313 0 1px 0}.ink-dropdown.green ul.dropdown-menu li.active a{background:#4a9b17;color:#fff}.ink-dropdown.orange ul.dropdown-menu li.active a{background:#ff9c00;color:#fff}.ink-dropdown.red ul.dropdown-menu li.active a{background:#c91111;color:#fff}.ink-dropdown.black ul.dropdown-menu li.active a{background:#1a1a1a;color:#fff}.ink-dropdown.blue ul.dropdown-menu li.active a{background:#0f75da;color:#fff}.ink-navigation ul.menu{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu>li{font-weight:300}.ink-navigation ul.menu>li.active a{text-decoration:underline}.ink-navigation ul.menu>li.heading{font-weight:500}.ink-navigation ul.menu>li.disabled a{color:#b3b3b3;text-shadow:#fff 0 1px 0}.ink-navigation ul.menu>li.disabled a:hover{cursor:default;background:0 0;text-decoration:none}.ink-navigation ul.menu>li ul.submenu li{font-size:.875em}.ink-navigation ul.menu>li ul.submenu li a{border-bottom:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.vertical li a{border-bottom:1px solid rgba(0,0,0,.15)}.ink-navigation ul.menu.vertical li:first-child,.ink-navigation ul.menu.vertical li:first-child>a{-webkit-border-radius:2px 2px 0 0;-moz-border-radius:2px 2px 0 0;-ms-border-radius:2px 2px 0 0;-o-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0}.ink-navigation ul.menu.vertical li:last-child{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child>a{border-bottom:0;-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child .submenu{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child .submenu.flyout{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.vertical li:last-child .submenu li:last-child,.ink-navigation ul.menu.vertical li:last-child .submenu li:last-child a{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.horizontal>li:first-child,.ink-navigation ul.menu.horizontal>li:first-child a{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-navigation ul.menu.horizontal>li:last-child,.ink-navigation ul.menu.horizontal>li:last-child a{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-navigation ul.menu.horizontal>li ul.submenu{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#fff}.ink-navigation ul.menu.horizontal>li ul.submenu li:last-child{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.horizontal>li ul.submenu li:last-child a{border-bottom:0}.ink-navigation ul.menu.white{background:#fff}.ink-navigation ul.menu.white li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.white li ul.submenu li a{color:#555}.ink-navigation ul.menu.white li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.white li.disabled a:hover{background:0 0}.ink-navigation ul.menu.white li.active{background:#e6e6e6}.ink-navigation ul.menu.white li.disabled a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.menu.white li a{color:#555;text-decoration:none}.ink-navigation ul.menu.white li a:hover{background:#f2f2f2}.ink-navigation ul.menu.grey{background:#d9d9d9}.ink-navigation ul.menu.grey li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.grey li ul.submenu li a{color:#555}.ink-navigation ul.menu.grey li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.grey li.disabled a:hover{background:0 0}.ink-navigation ul.menu.grey li.active{background:#bfbfbf}.ink-navigation ul.menu.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.menu.grey li a{color:#555;text-decoration:none}.ink-navigation ul.menu.grey li a:hover{background:#ccc}.ink-navigation ul.menu.black{background:#1a1a1a}.ink-navigation ul.menu.black li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.black li ul.submenu li a{color:#555}.ink-navigation ul.menu.black li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.black li.disabled a:hover{background:0 0}.ink-navigation ul.menu.black li.active{background:#333}.ink-navigation ul.menu.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.menu.black li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.black li a:hover{background:#404040}.ink-navigation ul.menu.blue{background:#1b75ce}.ink-navigation ul.menu.blue li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.blue li ul.submenu li a{color:#555}.ink-navigation ul.menu.blue li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.blue li.disabled a:hover{background:0 0}.ink-navigation ul.menu.blue li.active{background:#0c5baa}.ink-navigation ul.menu.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.menu.blue li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.blue li a:hover{background:#0d68c2}.ink-navigation ul.menu.green{background:#4c9220}.ink-navigation ul.menu.green li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.green li ul.submenu li a{color:#555}.ink-navigation ul.menu.green li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.green li.disabled a:hover{background:0 0}.ink-navigation ul.menu.green li.active{background:#356f10}.ink-navigation ul.menu.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.menu.green li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.green li a:hover{background:#3f8514}.ink-navigation ul.menu.orange{background:#f2990d}.ink-navigation ul.menu.orange li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.orange li ul.submenu li a{color:#555}.ink-navigation ul.menu.orange li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.orange li.disabled a:hover{background:0 0}.ink-navigation ul.menu.orange li.active{background:#cc7d00}.ink-navigation ul.menu.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.menu.orange li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.orange li a:hover{background:#e68c00}.ink-navigation ul.menu.red{background:#be1c1c}.ink-navigation ul.menu.red li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.red li ul.submenu li a{color:#555}.ink-navigation ul.menu.red li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.red li.disabled a:hover{background:0 0}.ink-navigation ul.menu.red li.active{background:#9a0d0d}.ink-navigation ul.menu.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.menu.red li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.red li a:hover{background:#b10f0f}.ink-navigation ul.pagination{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.pagination li{font-weight:300}.ink-navigation ul.pagination li.active a{text-decoration:underline}.ink-navigation ul.pagination li.disabled a{color:#b3b3b3;text-shadow:#fff 0 1px 0}.ink-navigation ul.pagination li.disabled a:hover{cursor:default;background:0 0;text-decoration:none}.ink-navigation ul.pagination li:first-child,.ink-navigation ul.pagination li:first-child a{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-navigation ul.pagination li:last-child,.ink-navigation ul.pagination li:last-child a{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-navigation ul.pagination.white li{background:#fff}.ink-navigation ul.pagination.white li.active a{background:#e6e6e6}.ink-navigation ul.pagination.white li.disabled a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.pagination.white li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.white li a{color:#555;text-decoration:none}.ink-navigation ul.pagination.white li a:hover{background:#f2f2f2}.ink-navigation ul.pagination.grey li{background:#d9d9d9}.ink-navigation ul.pagination.grey li.active a{background:#bfbfbf}.ink-navigation ul.pagination.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.pagination.grey li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.grey li a{color:#555;text-decoration:none}.ink-navigation ul.pagination.grey li a:hover{background:#ccc}.ink-navigation ul.pagination.black li{background:#1a1a1a}.ink-navigation ul.pagination.black li.active a{background:#333}.ink-navigation ul.pagination.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.pagination.black li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.black li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.black li a:hover{background:#292929}.ink-navigation ul.pagination.orange li{background:#f2990d}.ink-navigation ul.pagination.orange li.active a{background:#cc7d00}.ink-navigation ul.pagination.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.pagination.orange li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.orange li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.orange li a:hover{background:#e68c00}.ink-navigation ul.pagination.blue li{background:#1b75ce}.ink-navigation ul.pagination.blue li.active a{background:#0c5baa}.ink-navigation ul.pagination.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.pagination.blue li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.blue li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.blue li a:hover{background:#0d68c2}.ink-navigation ul.pagination.green li{background:#4c9220}.ink-navigation ul.pagination.green li.active a{background:#356f10}.ink-navigation ul.pagination.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.pagination.green li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.green li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.green li a:hover{background:#3f8514}.ink-navigation ul.pagination.red li{background:#be1c1c}.ink-navigation ul.pagination.red li.active a{background:#9a0d0d}.ink-navigation ul.pagination.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.pagination.red li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.red li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.red li a:hover{background:#b10f0f}.ink-navigation ul.pagination.dotted li{background:0 0}.ink-navigation ul.pagination.dotted li a{background:#999;filter:alpha(Opacity=50);opacity:.5}.ink-navigation ul.pagination.dotted li.active a,.ink-navigation ul.pagination.dotted li:hover a{filter:alpha(Opacity=100);opacity:1}.ink-navigation ul.pagination.dotted.black li a{background:#1a1a1a}.ink-navigation ul.pagination.dotted.white li a{background:#fff}.ink-navigation ul.pagination.dotted.blue li a{background:#1b75ce}.ink-navigation ul.pagination.dotted.green li a{background:#4c9220}.ink-navigation ul.pagination.dotted.orange li a{background:#f2990d}.ink-navigation ul.pagination.dotted.red li a{background:#be1c1c}.ink-navigation ul.pagination.chevron li.next a,.ink-navigation ul.pagination.chevron li.previous a{color:#fff;filter:alpha(Opacity=60);opacity:.6}.ink-navigation ul.pagination.chevron li.next a.active,.ink-navigation ul.pagination.chevron li.next a:focus,.ink-navigation ul.pagination.chevron li.next a:hover,.ink-navigation ul.pagination.chevron li.previous a.active,.ink-navigation ul.pagination.chevron li.previous a:focus,.ink-navigation ul.pagination.chevron li.previous a:hover{filter:alpha(Opacity=70);opacity:.7;text-decoration:none;background:0 0}.ink-navigation ul.pagination.chevron li.disabled a{color:#fff;filter:alpha(Opacity=40);opacity:.4;text-shadow:none}.ink-navigation ul.pagination.chevron li.disabled a:focus,.ink-navigation ul.pagination.chevron li.disabled a:hover{color:#fff;filter:alpha(Opacity=40);opacity:.4}.ink-navigation ul.pagination.chevron.black li.disabled a,.ink-navigation ul.pagination.chevron.black li.next a,.ink-navigation ul.pagination.chevron.black li.previous a{color:#1a1a1a}.ink-navigation ul.pagination.chevron.grey li.disabled a,.ink-navigation ul.pagination.chevron.grey li.next a,.ink-navigation ul.pagination.chevron.grey li.previous a{color:#d9d9d9}.ink-navigation ul.pagination.chevron.blue li.disabled a,.ink-navigation ul.pagination.chevron.blue li.next a,.ink-navigation ul.pagination.chevron.blue li.previous a{color:#1b75ce}.ink-navigation ul.pagination.chevron.green li.disabled a,.ink-navigation ul.pagination.chevron.green li.next a,.ink-navigation ul.pagination.chevron.green li.previous a{color:#4c9220}.ink-navigation ul.pagination.chevron.orange li.disabled a,.ink-navigation ul.pagination.chevron.orange li.next a,.ink-navigation ul.pagination.chevron.orange li.previous a{color:#f2990d}.ink-navigation ul.pagination.chevron.red li.disabled a,.ink-navigation ul.pagination.chevron.red li.next a,.ink-navigation ul.pagination.chevron.red li.previous a{color:#be1c1c}.ink-navigation ul.pills li{background:#fff;font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.pills li a{color:#555;background:0 0}.ink-navigation ul.pills li a:hover,.ink-navigation ul.pills li.active a{background:#e6e6e6}.ink-navigation ul.pills li.disabled a{color:#999;text-shadow:#fff 0 1px 0}.ink-navigation ul.pills li.disabled a:hover{background:0 0}.ink-navigation ul.pills.grey li{background:#d9d9d9}.ink-navigation ul.pills.grey li.active a{background:#bfbfbf}.ink-navigation ul.pills.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.pills.grey li.disabled a:hover{background:0 0}.ink-navigation ul.pills.grey li a{color:#555}.ink-navigation ul.pills.grey li a:hover{background:#ccc}.ink-navigation ul.pills.black li{background:#1a1a1a}.ink-navigation ul.pills.black li.active a{background:#333}.ink-navigation ul.pills.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.pills.black li.disabled a:hover{background:0 0}.ink-navigation ul.pills.black li a{color:#fff}.ink-navigation ul.pills.black li a:hover{background:#292929}.ink-navigation ul.pills.blue li{background:#1b75ce}.ink-navigation ul.pills.blue li.active a{background:#0c5baa}.ink-navigation ul.pills.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.pills.blue li.disabled a:hover{background:0 0}.ink-navigation ul.pills.blue li a{color:#fff}.ink-navigation ul.pills.blue li a:hover{background:#0d68c2}.ink-navigation ul.pills.green li{background:#4c9220}.ink-navigation ul.pills.green li.active a{background:#356f10}.ink-navigation ul.pills.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.pills.green li.disabled a:hover{background:0 0}.ink-navigation ul.pills.green li a{color:#fff}.ink-navigation ul.pills.green li a:hover{background:#3f8514}.ink-navigation ul.pills.orange li{background:#f2990d}.ink-navigation ul.pills.orange li.active a{background:#cc7d00}.ink-navigation ul.pills.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.pills.orange li.disabled a:hover{background:0 0}.ink-navigation ul.pills.orange li a{color:#fff}.ink-navigation ul.pills.orange li a:hover{background:#e68c00}.ink-navigation ul.pills.red li{background:#be1c1c}.ink-navigation ul.pills.red li.active a{background:#9a0d0d}.ink-navigation ul.pills.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.pills.red li.disabled a:hover{background:0 0}.ink-navigation ul.pills.red li a{color:#fff}.ink-navigation ul.pills.red li a:hover{background:#b10f0f}table.ink-table{background:#fff}table.ink-table tr td,table.ink-table tr th{border-bottom:#bbb 1px solid;background:0 0}table.ink-table tr:last-child td{border-bottom:0}table.ink-table tfoot tr td,table.ink-table tfoot tr th{border-top:#bbb 1px solid}table.ink-table.alternating tbody tr:nth-child(odd){background-color:#f5f5f5}table.ink-table.hover tbody tr:hover{background:#fefbd6;color:#555}table.ink-table.bordered{border:#bbb 1px solid;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}table.ink-table.bordered tr th{border-left:#bbb 1px solid}table.ink-table.bordered tr th:first-child{border-left:0}table.ink-table.bordered tr:last-child td{border-bottom:0}table.ink-table.bordered tr td{border-left:#bbb 1px solid}table.ink-table.bordered tr td:first-child{border-left:0}table.ink-table tbody>tr.red td{background:#c91111;color:#fff}table.ink-table tbody>tr.green td{background:#4a9b17;color:#fff}table.ink-table tbody>tr.blue td{background:#0f75da;color:#fff}table.ink-table tbody>tr.orange td{background:#ff9c00;color:#fff}table.ink-table tbody>tr.black td{background:#000;color:#ccc}table.ink-table tbody>tr.yellow td{background:#ffd500;color:#000}.animated.slow{animation-duration:1s}.animated.medium{animation-duration:.5s}.animated.fast{animation-duration:.2s}.ink-carousel .stage{width:100%}.ink-carousel .ink-navigation{position:static}.ink-carousel{width:100%;position:relative;overflow:hidden;display:block}.ink-carousel .stage{left:0;height:auto!important;margin-top:0;margin-bottom:0;padding-left:0;list-style-type:none;white-space:nowrap;position:relative;overflow:visible;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}.ink-carousel .stage.column-group{display:-webkit-block;display:-moz-block;display:block;-webkit-flex-flow:none;-moz-flex-flow:none;flex-flow:none}.ink-carousel .stage .slide{position:relative;display:inline-block;vertical-align:top;white-space:normal;margin:0;float:none;zoom:1;*display:inline}.ink-datepicker-wrapper{position:relative}.ink-datepicker-calendar{margin-top:0;position:absolute}.ink-datepicker-calendar.right{left:100%;top:0}.ink-datepicker-calendar.left{right:100%;top:0}.ink-datepicker-calendar.bottom{top:100%;left:0}.ink-datepicker-calendar.top{bottom:100%;left:0}.ink-datepicker-calendar,.ink-datepicker-wrapper{display:inline;display:inline-block}.ink-calendar{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;text-align:center;padding:.3em;min-width:17.4em;font-size:13px;-webkit-box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;-moz-box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;background:#fff;z-index:10}.ink-calendar a{text-decoration:none}.ink-calendar li{list-style:none inside}html.ink-modal-is-open .ink-calendar{z-index:101}.ink-calendar-top-options{padding:5px;font-size:.813em;cursor:pointer}.ink-calendar-top-options .clean{float:left}.ink-calendar-top-options .close{float:right}.ink-calendar-top{line-height:2em;background:#e6e6e6;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-calendar-top div{float:left}.ink-calendar-top .ink-calendar-next,.ink-calendar-top .ink-calendar-prev{width:10%}.ink-calendar-top .ink-calendar-next a,.ink-calendar-top .ink-calendar-prev a{display:block}.ink-calendar-top .ink-calendar-month_desc{width:80%}.ink-calendar-month,.ink-calendar-month-selector,.ink-calendar-year-selector{margin-top:.5em;padding-left:0}.ink-calendar-month li a,.ink-calendar-month-selector li a,.ink-calendar-year-selector li a{margin:0;line-height:2em;vertical-align:middle;display:block;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;color:#444}.ink-calendar-month li a:hover,.ink-calendar-month-selector li a:hover,.ink-calendar-year-selector li a:hover{background:#e6e6e6}.ink-calendar-month li a.ink-calendar-on,.ink-calendar-month li a.ink-calendar-on:hover,.ink-calendar-month-selector li a.ink-calendar-on,.ink-calendar-month-selector li a.ink-calendar-on:hover,.ink-calendar-year-selector li a.ink-calendar-on,.ink-calendar-year-selector li a.ink-calendar-on:hover{background:#0069d6;color:#fff}.ink-calendar-month li a.ink-calendar-off,.ink-calendar-month li a.ink-calendar-off:hover,.ink-calendar-month-selector li a.ink-calendar-off,.ink-calendar-month-selector li a.ink-calendar-off:hover,.ink-calendar-year-selector li a.ink-calendar-off,.ink-calendar-year-selector li a.ink-calendar-off:hover{background:#fff;color:#aaa;cursor:default}.ink-calendar-month ul,.ink-calendar-month-selector ul,.ink-calendar-year-selector ul{clear:both;padding-left:0}.ink-calendar-month ul li,.ink-calendar-month-selector ul li,.ink-calendar-year-selector ul li{width:2.4em;float:left;text-align:center;padding:0;margin:0}.ink-calendar-month-selector ul li,.ink-calendar-year-selector ul li{width:25%}.ink-calendar-month-selector,.ink-calendar-year-selector{display:none}.action_inactive,.ink-calendar-off{color:#ddd!important}.ink-calendar-month .ink-calendar-header{border-bottom:1px solid rgba(0,0,0,.1);padding-bottom:.5em;margin-bottom:.5em;color:#aaa}.ink-calendar-middle,.ink-calendar-month .ink-calendar-header,.ink-calendar-month .ink-calendar-middle ul,.ink-calendar-top,.ink-calendar-top-options{*zoom:1}.ink-calendar-middle:after,.ink-calendar-month .ink-calendar-header:after,.ink-calendar-month .ink-calendar-middle ul:after,.ink-calendar-top-options:after,.ink-calendar-top:after{content:"";display:table;clear:both}body.ink-drawer{max-width:100%}body.ink-drawer .content-drawer,body.ink-drawer .left-drawer,body.ink-drawer .right-drawer{-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;transition-property:transform;-webkit-transition-duration:300ms;-moz-transition-duration:300ms;-o-transition-duration:300ms;transition-duration:300ms;-webkit-transition-timing-function:cubic-bezier(0.86,0,.07,1);-moz-transition-timing-function:cubic-bezier(0.86,0,.07,1);-o-transition-timing-function:cubic-bezier(0.86,0,.07,1);transition-timing-function:cubic-bezier(0.86,0,.07,1)}body.ink-drawer .left-drawer{left:-220px}body.ink-drawer .right-drawer{right:-220px}body.ink-drawer .content-drawer{width:100%}body.ink-drawer .left-drawer,body.ink-drawer .right-drawer{position:absolute;top:0;z-index:0;display:none;overflow-x:hidden;overflow-y:auto;width:220px;height:100%;-webkit-overflow-scrolling:touch}body.ink-drawer .left-drawer.show,body.ink-drawer .right-drawer.show{display:block;position:fixed}body.ink-drawer.push{overflow:hidden;width:100%;height:100%}body.ink-drawer.push .content-drawer{overflow:hidden}body.ink-drawer.push.left .content-drawer,body.ink-drawer.push.left .left-drawer{-webkit-transform:translate(220px,0);-moz-transform:translate(220px,0);-ms-transform:translate(220px,0);-o-transform:translate(220px,0);transform:translate(220px,0)}body.ink-drawer.push.right .content-drawer,body.ink-drawer.push.right .right-drawer{-webkit-transform:translate(-220px,0);-moz-transform:translate(-220px,0);-ms-transform:translate(-220px,0);-o-transform:translate(-220px,0);transform:translate(-220px,0)}body.ink-drawer.over{overflow:hidden;-webkit-user-drag:none}body.ink-drawer.over.left .left-drawer{-webkit-transform:translate(220px,0);-moz-transform:translate(220px,0);-ms-transform:translate(220px,0);-o-transform:translate(220px,0);transform:translate(220px,0)}body.ink-drawer.over.right .right-drawer{-webkit-transform:translate(-220px,0);-moz-transform:translate(-220px,0);-ms-transform:translate(-220px,0);-o-transform:translate(-220px,0);transform:translate(-220px,0)}.ink-shade{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgOAMAAM8AzbfAeUUAAAAASUVORK5CYII=);background:rgba(0,0,0,.8);width:100%;height:100%;top:0;right:0;bottom:0;left:0;margin-top:0;position:fixed;z-index:100;display:none;filter:alpha(Opacity=0);opacity:0}.ink-shade.fade{-webkit-transition:opacity 300ms;-moz-transition:opacity 300ms;-o-transition:opacity 300ms;transition:opacity 300ms}.ink-shade.visible{filter:alpha(Opacity=100);opacity:1}.ink-modal{top:50%;left:50%;width:90%;height:90%;background:#fff;z-index:100;position:absolute;overflow:hidden;filter:alpha(Opacity=100);opacity:1;-webkit-box-shadow:rgba(0,0,0,.8) 0 0 15px 0;-moz-box-shadow:rgba(0,0,0,.8) 0 0 15px 0;box-shadow:rgba(0,0,0,.8) 0 0 15px 0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;*zoom:1}.ink-modal:after{content:"";display:table;clear:both}.ink-modal>.modal-body{padding:1em;overflow-y:auto;overflow-x:hidden;height:auto}.ink-modal>.modal-body .ink-grid{padding-left:0;padding-right:0;width:100%;min-width:100%}.ink-modal>.modal-header,.ink-modal>header{border-bottom:1px #e6e6e6 solid;overflow:hidden;-webkit-box-shadow:rgba(175,175,175,.2) 0 1px 2px 0;-moz-box-shadow:rgba(175,175,175,.2) 0 1px 2px 0;box-shadow:rgba(175,175,175,.2) 0 1px 2px 0}.ink-modal>.modal-header>.modal-close,.ink-modal>header>.modal-close{padding-top:2px;text-align:center;color:#fff;width:26px;height:26px;line-height:1.2em;border:0;background:#bfbfbf;font-size:0;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%;text-shadow:rgba(0,0,0,.6) 0 -1px 0;filter:alpha(Opacity=60);opacity:.6;float:right}.ink-modal>.modal-header>.modal-close:after,.ink-modal>header>.modal-close:after{content:"\f00d";font-family:FontAwesome;font-size:medium;line-height:22px}.ink-modal>.modal-header>.modal-close:hover,.ink-modal>header>.modal-close:hover{filter:alpha(Opacity=100);opacity:1}.ink-modal>.modal-footer,.ink-modal>footer{background:#e6e6e6;margin-bottom:0;zoom:1;-webkit-box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0;-moz-box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0;box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0}.ink-modal>.modal-footer,.ink-modal>.modal-header,.ink-modal>footer,.ink-modal>header{padding:.8em 1em .65em}.ink-modal>.modal-footer:after,.ink-modal>.modal-footer:before,.ink-modal>.modal-header:after,.ink-modal>.modal-header:before,.ink-modal>footer:after,.ink-modal>footer:before,.ink-modal>header:after,.ink-modal>header:before{content:".";display:block;height:0;clear:both;visibility:hidden}.ink-modal-open{overflow:hidden}.ink-progress-bar{margin-bottom:1em;overflow:hidden;background:#f2f2f2;position:relative;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset;-moz-box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset;box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset}.ink-progress-bar .caption{position:absolute;top:0;left:0;width:100%;height:100%;line-height:1.7;text-align:center;color:#000;font-size:.813em;z-index:10}.ink-progress-bar .bar{height:1.3em;text-shadow:rgba(0,0,0,.25),0,1px,0;-webkit-box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;-moz-box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;-webkit-transition-property:width;-moz-transition-property:width;-o-transition-property:width;transition-property:width;-webkit-transition-duration:.6s;-moz-transition-duration:.6s;-o-transition-duration:.6s;transition-duration:.6s;-webkit-transition-timing-function:ease;-moz-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.ink-progress-bar .bar.grey{background:#ccc;color:#555}.ink-progress-bar .bar.green{background:#4a9b17;color:#fff}.ink-progress-bar .bar.blue{background:#0f75da;color:#fff}.ink-progress-bar .bar.red{background:#c91111;color:#fff}.ink-progress-bar .bar.orange{background:#ff9c00;color:#555}.ink-progress-bar .bar.black{background:#000;color:#fff}.dragging,.ink-sortable-list li{cursor:move;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;-ms-user-select:none;user-select:none;-ms-user-drag:none;-moz-user-drag:none;-khtml-user-drag:none;-webkit-user-drag:none;-o-user-drag:none;user-drag:none}.drag,.ink-sortable-list li.placeholder{-webkit-box-shadow:0,0,10px,0,rgba(0,0,0,.3);-moz-box-shadow:0,0,10px,0,rgba(0,0,0,.3);box-shadow:0,0,10px,0,rgba(0,0,0,.3)}.ink-sortable-list li{margin:0;border-bottom:1px solid #ccc;line-height:40px}.ink-sortable-list li.placeholder,.ink-sortable-list li:hover{background:#ccc;background:rgba(204,204,204,.2)}.ink-sortable-list li .ink-label{margin:0 .8em}.ink-sticky-stuck{position:fixed}.ink-tabs .tabs-nav{list-style:none;padding:0;*zoom:1}.ink-tabs .tabs-nav li{line-height:1.7;position:relative;margin:0}.ink-tabs .tabs-nav li a{padding:.5em 1em;display:block;border:1px solid transparent}.ink-tabs .tabs-nav li a:hover{background:#f0f0f0}.ink-tabs .tabs-nav li.active a{color:#555;cursor:default;text-decoration:none;background:#fff;border:1px solid #ccc}.ink-tabs .tabs-nav:after{content:"";display:table;clear:both}.ink-tabs .tabs-content{margin-top:1.5em;overflow:auto}.ink-tabs.top>.tabs-nav{border-bottom:1px solid #ccc}.ink-tabs.top>.tabs-nav li{float:left}.ink-tabs.top>.tabs-nav li a{margin-right:.4em;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;-ms-border-radius:4px 4px 0 0;-o-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.ink-tabs.top>.tabs-nav li.active{margin:0 0 -2px 0}.ink-tabs.top>.tabs-nav li.active a{border-bottom-color:transparent}.ink-tabs.bottom>.tabs-nav{border-top:1px solid #ccc}.ink-tabs.bottom>.tabs-nav li{float:left}.ink-tabs.bottom>.tabs-nav li a{margin-right:.4em;-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;-ms-border-radius:0 0 4px 4px;-o-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.ink-tabs.bottom>.tabs-nav li.active{margin:-2px 0 0 0}.ink-tabs.bottom>.tabs-nav li.active a{border-top-color:transparent}.ink-tabs.left>.tabs-nav{border-right:1px solid #ccc;float:left;margin-right:2em}.ink-tabs.left>.tabs-nav li{float:none;text-align:right}.ink-tabs.left>.tabs-nav li a{margin-bottom:.4em;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;-ms-border-radius:4px 0 0 4px;-o-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.ink-tabs.left>.tabs-nav li.active{margin:0 -2px 0 0}.ink-tabs.left>.tabs-nav li.active a{border-right-color:transparent}.ink-tabs.right>.tabs-nav{border-left:1px solid #ccc;float:right;margin-left:2em}.ink-tabs.right>.tabs-nav li{float:none}.ink-tabs.right>.tabs-nav li a{margin-bottom:.4em;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;-ms-border-radius:0 4px 4px 0;-o-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.ink-tabs.right>.tabs-nav li.active{margin:0 0 0 -2px}.ink-tabs.right>.tabs-nav li.active a{border-left-color:transparent}.ink-tagfield input[type=text].new-tag-input{background-color:#fff;border:1px solid #ccc;line-height:1em;margin:0;padding:5px;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-tagfield input[type=text].new-tag-input:focus{-webkit-box-shadow:0,0,0,3px,#eaeaea;-moz-box-shadow:0,0,0,3px,#eaeaea;box-shadow:0,0,0,3px,#eaeaea;border:1px solid #c3c3c3}.ink-tagfield span.ink-tag{background-color:#1b1b1b;color:#eaeaea;text-shadow:none;font-size:.9em;font-weight:400;border:1px solid #000;padding:4px 6px}.ink-tagfield span.ink-tag i.icon-remove{color:#ccc;font-size:.9em;font-weight:400;margin-left:4px}.ink-tagfield span.ink-tag i.icon-remove:hover{cursor:pointer;color:red}.ink-tooltip{display:inline-block;position:relative}.ink-tooltip>.content{background:#f0f0f0;padding:.5em .6em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;font-size:.8em;color:#8c8c8c}.ink-tooltip>.arrow{position:absolute}.ink-tooltip>.arrow.down,.ink-tooltip>.arrow.left,.ink-tooltip>.arrow.right,.ink-tooltip>.arrow.up{width:0;height:0}.ink-tooltip>.arrow.up{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #f0f0f0;top:-6px;left:50%;margin-left:-3px}.ink-tooltip>.arrow.down{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #f0f0f0;bottom:-5.45455px;left:50%;margin-left:-3px}.ink-tooltip>.arrow.right{border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:6px solid #f0f0f0;top:50%;right:-5.45455px;margin-top:-6px}.ink-tooltip>.arrow.left{border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:6px solid #f0f0f0;top:50%;left:-5.45455px;margin-top:-6px}.ink-tooltip.blue>.content{background:#0f75da;color:#fff}.ink-tooltip.blue>.arrow.up{border-bottom-color:#0f75da}.ink-tooltip.blue>.arrow.down{border-top-color:#0f75da}.ink-tooltip.blue>.arrow.left{border-right-color:#0f75da}.ink-tooltip.blue>.arrow.right{border-left-color:#0f75da}.ink-tooltip.red>.content{background:#c91111;color:#fff}.ink-tooltip.red>.arrow.up{border-bottom-color:#c91111}.ink-tooltip.red>.arrow.down{border-top-color:#c91111}.ink-tooltip.red>.arrow.left{border-right-color:#c91111}.ink-tooltip.red>.arrow.right{border-left-color:#c91111}.ink-tooltip.orange>.content{background:#ff9c00;color:#fff}.ink-tooltip.orange>.arrow.up{border-bottom-color:#ff9c00}.ink-tooltip.orange>.arrow.down{border-top-color:#ff9c00}.ink-tooltip.orange>.arrow.left{border-right-color:#ff9c00}.ink-tooltip.orange>.arrow.right{border-left-color:#ff9c00}.ink-tooltip.green>.content{background:#4a9b17;color:#fff}.ink-tooltip.green>.arrow.up{border-bottom-color:#4a9b17}.ink-tooltip.green>.arrow.down{border-top-color:#4a9b17}.ink-tooltip.green>.arrow.left{border-right-color:#4a9b17}.ink-tooltip.green>.arrow.right{border-left-color:#4a9b17}.ink-tooltip.black>.content{background:#000;color:#fff}.ink-tooltip.black>.arrow.up{border-bottom-color:#000}.ink-tooltip.black>.arrow.down{border-top-color:#000}.ink-tooltip.black>.arrow.left{border-right-color:#000}.ink-tooltip.black>.arrow.right{border-left-color:#000}.ink-tooltip.grey>.content{background:#ccc;color:#333}.ink-tooltip.grey>.arrow.up{border-bottom-color:#ccc}.ink-tooltip.grey>.arrow.down{border-top-color:#ccc}.ink-tooltip.grey>.arrow.left{border-right-color:#ccc}.ink-tooltip.grey>.arrow.right{border-left-color:#ccc}.ink-tree-view li{list-style-type:none}.ink-tree-view [data-open]>:before{margin-left:-1.3em;margin-right:.4em;text-decoration:none} \ No newline at end of file diff --git a/dist/css/ink-ie.min.css b/dist/css/ink-ie.min.css index 51275b29a..35f757d3a 100644 --- a/dist/css/ink-ie.min.css +++ b/dist/css/ink-ie.min.css @@ -1 +1 @@ -.ink-grid{width:auto;max-width:1440px;margin:0 auto;padding:0 1.75em}.column-group>[class*=large-]{float:left;clear:none}.large-5{width:5%}.large-10{width:10%}.large-15{width:15%}.large-16{width:16.66%}.large-20{width:20%}.large-25{width:25%}.large-30{width:30%}.large-33{width:33.33%}.large-35{width:35%}.large-40{width:40%}.large-45{width:45%}.large-50{width:50%}.large-55{width:55%}.large-60{width:60%}.large-65{width:65%}.large-66{width:66.66%}.large-70{width:70%}.large-75{width:75%}.large-80{width:80%}.large-85{width:85%}.large-90{width:90%}.large-95{width:95%}.large-100{width:100%}[class*=large-100]{float:none;clear:both}.column-group{*zoom:1}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1.75em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.horizontal-gutters{margin-left:-1.75em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.double-gutters{margin-left:-3.5em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.double-horizontal-gutters{margin-left:-3.5em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.half-gutters{margin-left:-.875em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.half-horizontal-gutters{margin-left:-.875em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.quarter-gutters{margin-left:-.4375em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.quarter-horizontal-gutters{margin-left:-.4375em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-gutters{margin-left:-1.75em}.column-group.large-gutters>[class*=all-],.column-group.large-gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.large-horizontal-gutters{margin-left:-1.75em}.column-group.large-horizontal-gutters>[class*=all-],.column-group.large-horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.large-vertical-gutters>[class*=all-],.column-group.large-vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.large-double-gutters{margin-left:-3.5em}.column-group.large-double-gutters>[class*=all-],.column-group.large-double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.large-double-horizontal-gutters{margin-left:-3.5em}.column-group.large-double-horizontal-gutters>[class*=all-],.column-group.large-double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.large-double-vertical-gutters>[class*=all-],.column-group.large-double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.large-half-gutters{margin-left:-.875em}.column-group.large-half-gutters>[class*=all-],.column-group.large-half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.large-half-horizontal-gutters{margin-left:-.875em}.column-group.large-half-horizontal-gutters>[class*=all-],.column-group.large-half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.large-half-vertical-gutters>[class*=all-],.column-group.large-half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.large-quarter-gutters{margin-left:-.4375em}.column-group.large-quarter-gutters>[class*=all-],.column-group.large-quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.large-quarter-horizontal-gutters{margin-left:-.4375em}.column-group.large-quarter-horizontal-gutters>[class*=all-],.column-group.large-quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.large-quarter-vertical-gutters>[class*=all-],.column-group.large-quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-no-gutters{margin-left:0}.column-group.large-no-gutters>[class*=all-],.column-group.large-no-gutters>[class*=large-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=large-],.ink-table td[class*=large-],.ink-table tfoot[class*=large-],.ink-table th[class*=large-],.ink-table thead[class*=large-],.ink-table tr[class*=large-]{float:none}.large-push-left{float:left}.large-push-center{float:none;margin-left:auto;margin-right:auto}.large-push-right{float:right}.large-align-left{text-align:left}.large-align-center{text-align:center}.large-align-right{text-align:right}.large-no-margin{margin:0!important}.large-space,.space{margin:1.75em}.large-padding,.padding{padding:1.75em}.double-space,.large-double-space{margin:3.5em}.double-padding,.large-double-padding{padding:3.5em}.half-space,.large-half-space{margin:.875em}.half-padding,.large-half-padding{padding:.875em}.large-quarter-space,.quarter-space{margin:.4375em}.large-quarter-padding,.quarter-padding{padding:.4375em}.large-vertical-space,.vertical-space{margin-top:1.75em;margin-bottom:1.75em}.large-vertical-padding,.vertical-padding{padding-top:1.75em;padding-bottom:1.75em}.double-vertical-space,.large-double-vertical-space{margin-top:3.5em;margin-bottom:3.5em}.double-vertical-padding,.large-double-vertical-padding{padding-top:3.5em;padding-bottom:3.5em}.half-vertical-space,.large-half-vertical-space{margin-top:.875em;margin-bottom:.875em}.half-vertical-padding,.large-half-vertical-padding{padding-top:.875em;padding-bottom:.875em}.large-quarter-vertical-space,.quarter-vertical-space{margin-top:.4375em;margin-bottom:.4375em}.large-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.4375em;padding-bottom:.4375em}.horizontal-space,.large-horizontal-space{margin-left:1.75em;margin-right:1.75em}.horizontal-padding,.large-horizontal-padding{padding-left:1.75em;padding-right:1.75em}.double-horizontal-space,.large-double-horizontal-space{margin-left:3.5em;margin-right:3.5em}.double-horizontal-padding,.large-double-horizontal-padding{padding-left:3.5em;padding-right:3.5em}.half-horizontal-space,.large-half-horizontal-space{margin-left:.875em;margin-right:.875em}.half-horizontal-padding,.large-half-horizontal-padding{padding-left:.875em;padding-right:.875em}.large-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.4375em;margin-right:.4375em}.large-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.4375em;padding-right:.4375em}.large-top-space,.top-space{margin-top:1.75em}.large-top-padding,.top-padding{padding-top:1.75em}.double-top-space,.large-double-top-space{margin-top:3.5em}.double-top-padding,.large-double-top-padding{padding-top:3.5em}.half-top-space,.large-half-top-space{margin-top:.875em}.half-top-padding,.large-half-top-padding{padding-top:.875em}.large-quarter-top-space,.quarter-top-space{margin-top:.4375em}.large-quarter-top-padding,.quarter-top-padding{padding-top:.4375em}.large-right-space,.right-space{margin-right:1.75em}.large-right-padding,.right-padding{padding-right:1.75em}.double-right-space,.large-double-right-space{margin-right:3.5em}.double-right-padding,.large-double-right-padding{padding-right:3.5em}.half-right-space,.large-half-right-space{margin-right:.875em}.half-right-padding,.large-half-right-padding{padding-right:.875em}.large-quarter-right-space,.quarter-right-space{margin-right:.4375em}.large-quarter-right-padding,.quarter-right-padding{padding-right:.4375em}.bottom-space,.large-bottom-space{margin-bottom:1.75em}.bottom-padding,.large-bottom-padding{padding-bottom:1.75em}.double-bottom-space,.large-double-bottom-space{margin-bottom:3.5em}.double-bottom-padding,.large-double-bottom-padding{padding-bottom:3.5em}.half-bottom-space,.large-half-bottom-space{margin-bottom:.875em}.half-bottom-padding,.large-half-bottom-padding{padding-bottom:.875em}.large-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.4375em}.large-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.4375em}.large-left-space,.left-space{margin-left:1.75em}.large-left-padding,.left-padding{padding-left:1.75em}.double-left-space,.large-double-left-space{margin-left:3.5em}.double-left-padding,.large-double-left-padding{padding-left:3.5em}.half-left-space,.large-half-left-space{margin-left:.875em}.half-left-padding,.large-half-left-padding{padding-left:.875em}.large-quarter-left-space,.quarter-left-space{margin-left:.4375em}.large-quarter-left-padding,.quarter-left-padding{padding-left:.4375em}.hide-large{display:none!important}.show-large{display:inherit!important}table.show-large{display:table}thead.show-large{display:table-header-group}tbody.show-large{display:table-row-group}tfoot.show-large{display:table-footer-group}tr.show-large{display:table-row}td.show-large,th.show-large{display:table-cell}@media print{*{background:transparent!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.ink-navigation{display:none}.ink-table{border-collapse:collapse}.ink-label{border:1px solid #000}} +.ink-grid{width:auto;max-width:1440px;margin:0 auto;padding:0 1.75em}.column-group>[class*=large-]{float:left;clear:none}.large-5{width:5%}.large-10{width:10%}.large-15{width:15%}.large-16{width:16.66%}.large-20{width:20%}.large-25{width:25%}.large-30{width:30%}.large-33{width:33.33%}.large-35{width:35%}.large-40{width:40%}.large-45{width:45%}.large-50{width:50%}.large-55{width:55%}.large-60{width:60%}.large-65{width:65%}.large-66{width:66.66%}.large-70{width:70%}.large-75{width:75%}.large-80{width:80%}.large-85{width:85%}.large-90{width:90%}.large-95{width:95%}.large-100{width:100%}[class*=large-100]{float:none;clear:both}.column-group{*zoom:1}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1.75em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.horizontal-gutters{margin-left:-1.75em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.double-gutters{margin-left:-3.5em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.double-horizontal-gutters{margin-left:-3.5em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.half-gutters{margin-left:-.875em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.half-horizontal-gutters{margin-left:-.875em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.quarter-gutters{margin-left:-.4375em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.quarter-horizontal-gutters{margin-left:-.4375em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-gutters{margin-left:-1.75em}.column-group.large-gutters>[class*=all-],.column-group.large-gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.large-horizontal-gutters{margin-left:-1.75em}.column-group.large-horizontal-gutters>[class*=all-],.column-group.large-horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.large-vertical-gutters>[class*=all-],.column-group.large-vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.large-double-gutters{margin-left:-3.5em}.column-group.large-double-gutters>[class*=all-],.column-group.large-double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.large-double-horizontal-gutters{margin-left:-3.5em}.column-group.large-double-horizontal-gutters>[class*=all-],.column-group.large-double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.large-double-vertical-gutters>[class*=all-],.column-group.large-double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.large-half-gutters{margin-left:-.875em}.column-group.large-half-gutters>[class*=all-],.column-group.large-half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.large-half-horizontal-gutters{margin-left:-.875em}.column-group.large-half-horizontal-gutters>[class*=all-],.column-group.large-half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.large-half-vertical-gutters>[class*=all-],.column-group.large-half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.large-quarter-gutters{margin-left:-.4375em}.column-group.large-quarter-gutters>[class*=all-],.column-group.large-quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.large-quarter-horizontal-gutters{margin-left:-.4375em}.column-group.large-quarter-horizontal-gutters>[class*=all-],.column-group.large-quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.large-quarter-vertical-gutters>[class*=all-],.column-group.large-quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-no-gutters{margin-left:0}.column-group.large-no-gutters>[class*=all-],.column-group.large-no-gutters>[class*=large-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=large-],.ink-table td[class*=large-],.ink-table tfoot[class*=large-],.ink-table th[class*=large-],.ink-table thead[class*=large-],.ink-table tr[class*=large-]{float:none}.large-push-left{float:left}.large-push-center{float:none;margin-left:auto;margin-right:auto}.large-push-right{float:right}.large-align-left{text-align:left}.large-align-center{text-align:center}.large-align-right{text-align:right}.large-no-margin{margin:0!important}.large-space,.space{margin:1.75em}.large-padding,.padding{padding:1.75em}.double-space,.large-double-space{margin:3.5em}.double-padding,.large-double-padding{padding:3.5em}.half-space,.large-half-space{margin:.875em}.half-padding,.large-half-padding{padding:.875em}.large-quarter-space,.quarter-space{margin:.4375em}.large-quarter-padding,.quarter-padding{padding:.4375em}.large-vertical-space,.vertical-space{margin-top:1.75em;margin-bottom:1.75em}.large-vertical-padding,.vertical-padding{padding-top:1.75em;padding-bottom:1.75em}.double-vertical-space,.large-double-vertical-space{margin-top:3.5em;margin-bottom:3.5em}.double-vertical-padding,.large-double-vertical-padding{padding-top:3.5em;padding-bottom:3.5em}.half-vertical-space,.large-half-vertical-space{margin-top:.875em;margin-bottom:.875em}.half-vertical-padding,.large-half-vertical-padding{padding-top:.875em;padding-bottom:.875em}.large-quarter-vertical-space,.quarter-vertical-space{margin-top:.4375em;margin-bottom:.4375em}.large-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.4375em;padding-bottom:.4375em}.horizontal-space,.large-horizontal-space{margin-left:1.75em;margin-right:1.75em}.horizontal-padding,.large-horizontal-padding{padding-left:1.75em;padding-right:1.75em}.double-horizontal-space,.large-double-horizontal-space{margin-left:3.5em;margin-right:3.5em}.double-horizontal-padding,.large-double-horizontal-padding{padding-left:3.5em;padding-right:3.5em}.half-horizontal-space,.large-half-horizontal-space{margin-left:.875em;margin-right:.875em}.half-horizontal-padding,.large-half-horizontal-padding{padding-left:.875em;padding-right:.875em}.large-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.4375em;margin-right:.4375em}.large-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.4375em;padding-right:.4375em}.large-top-space,.top-space{margin-top:1.75em}.large-top-padding,.top-padding{padding-top:1.75em}.double-top-space,.large-double-top-space{margin-top:3.5em}.double-top-padding,.large-double-top-padding{padding-top:3.5em}.half-top-space,.large-half-top-space{margin-top:.875em}.half-top-padding,.large-half-top-padding{padding-top:.875em}.large-quarter-top-space,.quarter-top-space{margin-top:.4375em}.large-quarter-top-padding,.quarter-top-padding{padding-top:.4375em}.large-right-space,.right-space{margin-right:1.75em}.large-right-padding,.right-padding{padding-right:1.75em}.double-right-space,.large-double-right-space{margin-right:3.5em}.double-right-padding,.large-double-right-padding{padding-right:3.5em}.half-right-space,.large-half-right-space{margin-right:.875em}.half-right-padding,.large-half-right-padding{padding-right:.875em}.large-quarter-right-space,.quarter-right-space{margin-right:.4375em}.large-quarter-right-padding,.quarter-right-padding{padding-right:.4375em}.bottom-space,.large-bottom-space{margin-bottom:1.75em}.bottom-padding,.large-bottom-padding{padding-bottom:1.75em}.double-bottom-space,.large-double-bottom-space{margin-bottom:3.5em}.double-bottom-padding,.large-double-bottom-padding{padding-bottom:3.5em}.half-bottom-space,.large-half-bottom-space{margin-bottom:.875em}.half-bottom-padding,.large-half-bottom-padding{padding-bottom:.875em}.large-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.4375em}.large-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.4375em}.large-left-space,.left-space{margin-left:1.75em}.large-left-padding,.left-padding{padding-left:1.75em}.double-left-space,.large-double-left-space{margin-left:3.5em}.double-left-padding,.large-double-left-padding{padding-left:3.5em}.half-left-space,.large-half-left-space{margin-left:.875em}.half-left-padding,.large-half-left-padding{padding-left:.875em}.large-quarter-left-space,.quarter-left-space{margin-left:.4375em}.large-quarter-left-padding,.quarter-left-padding{padding-left:.4375em}.hide-large{display:none!important}.show-large{display:inherit!important}table.show-large{display:table}thead.show-large{display:table-header-group}tbody.show-large{display:table-row-group}tfoot.show-large{display:table-footer-group}tr.show-large{display:table-row}td.show-large,th.show-large{display:table-cell}@media print{*{background:transparent!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.ink-navigation{display:none}.ink-table{border-collapse:collapse}.ink-label{border:1px solid #000}} \ No newline at end of file diff --git a/dist/css/ink-legacy.min.css b/dist/css/ink-legacy.min.css index 2d25da441..3ce514f7b 100644 --- a/dist/css/ink-legacy.min.css +++ b/dist/css/ink-legacy.min.css @@ -1 +1 @@ -.show-all{display:inherit}.hide-all{display:none!important}.no-margin{margin:0!important}.no-margin-top{margin-top:0!important}.no-margin-bottom{margin-bottom:0!important}.no-padding{padding:0!important}.push-left{float:left}.push-center{float:none!important;margin-left:auto;margin-right:auto}.push-right{float:right;-webkit-justify-content:flex-end;-moz-justify-content:flex-end;justify-content:flex-end}.align-left{text-align:left}.align-center{text-align:center}.align-right{text-align:right}.clearfix{overflow:hidden;*zoom:1}.clearfix:after{content:"";display:table;clear:both}html.no-flexbox,html.no-flexboxlegacy{font-size:.97em}html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{width:auto;max-width:1440px;margin:0 auto}html.no-flexbox .all-5,html.no-flexboxlegacy .all-5{width:5%;float:left;clear:none}html.no-flexbox .all-10,html.no-flexboxlegacy .all-10{width:10%;float:left;clear:none}html.no-flexbox .all-15,html.no-flexboxlegacy .all-15{width:15%;float:left;clear:none}html.no-flexbox .all-16,html.no-flexboxlegacy .all-16{width:16.66%;float:left;clear:none}html.no-flexbox .all-20,html.no-flexboxlegacy .all-20{width:20%;float:left;clear:none}html.no-flexbox .all-25,html.no-flexboxlegacy .all-25{width:25%;float:left;clear:none}html.no-flexbox .all-30,html.no-flexboxlegacy .all-30{width:30%;float:left;clear:none}html.no-flexbox .all-33,html.no-flexboxlegacy .all-33{width:33.33%;float:left;clear:none}html.no-flexbox .all-35,html.no-flexboxlegacy .all-35{width:35%;float:left;clear:none}html.no-flexbox .all-40,html.no-flexboxlegacy .all-40{width:40%;float:left;clear:none}html.no-flexbox .all-45,html.no-flexboxlegacy .all-45{width:45%;float:left;clear:none}html.no-flexbox .all-50,html.no-flexboxlegacy .all-50{width:50%;float:left;clear:none}html.no-flexbox .all-55,html.no-flexboxlegacy .all-55{width:55%;float:left;clear:none}html.no-flexbox .all-60,html.no-flexboxlegacy .all-60{width:60%;float:left;clear:none}html.no-flexbox .all-65,html.no-flexboxlegacy .all-65{width:65%;float:left;clear:none}html.no-flexbox .all-66,html.no-flexboxlegacy .all-66{width:66.66%;float:left;clear:none}html.no-flexbox .all-70,html.no-flexboxlegacy .all-70{width:70%;float:left;clear:none}html.no-flexbox .all-75,html.no-flexboxlegacy .all-75{width:75%;float:left;clear:none}html.no-flexbox .all-80,html.no-flexboxlegacy .all-80{width:80%;float:left;clear:none}html.no-flexbox .all-85,html.no-flexboxlegacy .all-85{width:85%;float:left;clear:none}html.no-flexbox .all-90,html.no-flexboxlegacy .all-90{width:90%;float:left;clear:none}html.no-flexbox .all-95,html.no-flexboxlegacy .all-95{width:95%;float:left;clear:none}html.no-flexbox .all-100,html.no-flexboxlegacy .all-100{width:100%;float:left;clear:none}html.no-flexbox [class~=all-100],html.no-flexboxlegacy [class~=all-100]{float:none;clear:both}@media screen and (min-width:1261px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 2em}html.no-flexbox .column-group>[class*=xlarge-],html.no-flexboxlegacy .column-group>[class*=xlarge-]{float:left;clear:none}html.no-flexbox .xlarge-5,html.no-flexboxlegacy .xlarge-5{width:5%}html.no-flexbox .xlarge-10,html.no-flexboxlegacy .xlarge-10{width:10%}html.no-flexbox .xlarge-15,html.no-flexboxlegacy .xlarge-15{width:15%}html.no-flexbox .xlarge-16,html.no-flexboxlegacy .xlarge-16{width:16.66%}html.no-flexbox .xlarge-20,html.no-flexboxlegacy .xlarge-20{width:20%}html.no-flexbox .xlarge-25,html.no-flexboxlegacy .xlarge-25{width:25%}html.no-flexbox .xlarge-30,html.no-flexboxlegacy .xlarge-30{width:30%}html.no-flexbox .xlarge-33,html.no-flexboxlegacy .xlarge-33{width:33.33%}html.no-flexbox .xlarge-35,html.no-flexboxlegacy .xlarge-35{width:35%}html.no-flexbox .xlarge-40,html.no-flexboxlegacy .xlarge-40{width:40%}html.no-flexbox .xlarge-45,html.no-flexboxlegacy .xlarge-45{width:45%}html.no-flexbox .xlarge-50,html.no-flexboxlegacy .xlarge-50{width:50%}html.no-flexbox .xlarge-55,html.no-flexboxlegacy .xlarge-55{width:55%}html.no-flexbox .xlarge-60,html.no-flexboxlegacy .xlarge-60{width:60%}html.no-flexbox .xlarge-65,html.no-flexboxlegacy .xlarge-65{width:65%}html.no-flexbox .xlarge-66,html.no-flexboxlegacy .xlarge-66{width:66.66%}html.no-flexbox .xlarge-70,html.no-flexboxlegacy .xlarge-70{width:70%}html.no-flexbox .xlarge-75,html.no-flexboxlegacy .xlarge-75{width:75%}html.no-flexbox .xlarge-80,html.no-flexboxlegacy .xlarge-80{width:80%}html.no-flexbox .xlarge-85,html.no-flexboxlegacy .xlarge-85{width:85%}html.no-flexbox .xlarge-90,html.no-flexboxlegacy .xlarge-90{width:90%}html.no-flexbox .xlarge-95,html.no-flexboxlegacy .xlarge-95{width:95%}html.no-flexbox .xlarge-100,html.no-flexboxlegacy .xlarge-100{width:100%}html.no-flexbox [class*=xlarge-100],html.no-flexboxlegacy [class*=xlarge-100]{float:none;clear:both}html.no-flexbox .column-group,html.no-flexboxlegacy .column-group{*zoom:1}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-2em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-2em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=xlarge-]{padding-left:2em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=xlarge-]{margin-bottom:2em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-4em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-4em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-1em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-1em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.5em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.5em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}html.no-flexbox .column-group.xlarge-gutters,html.no-flexboxlegacy .column-group.xlarge-gutters{margin-left:-2em}html.no-flexbox .column-group.xlarge-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}html.no-flexbox .column-group.xlarge-horizontal-gutters,html.no-flexboxlegacy .column-group.xlarge-horizontal-gutters{margin-left:-2em}html.no-flexbox .column-group.xlarge-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-horizontal-gutters>[class*=xlarge-]{padding-left:2em}html.no-flexbox .column-group.xlarge-vertical-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-vertical-gutters>[class*=xlarge-]{margin-bottom:2em}html.no-flexbox .column-group.xlarge-double-gutters,html.no-flexboxlegacy .column-group.xlarge-double-gutters{margin-left:-4em}html.no-flexbox .column-group.xlarge-double-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-double-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}html.no-flexbox .column-group.xlarge-double-horizontal-gutters,html.no-flexboxlegacy .column-group.xlarge-double-horizontal-gutters{margin-left:-4em}html.no-flexbox .column-group.xlarge-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-double-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}html.no-flexbox .column-group.xlarge-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-double-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}html.no-flexbox .column-group.xlarge-half-gutters,html.no-flexboxlegacy .column-group.xlarge-half-gutters{margin-left:-1em}html.no-flexbox .column-group.xlarge-half-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-half-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}html.no-flexbox .column-group.xlarge-half-horizontal-gutters,html.no-flexboxlegacy .column-group.xlarge-half-horizontal-gutters{margin-left:-1em}html.no-flexbox .column-group.xlarge-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-half-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}html.no-flexbox .column-group.xlarge-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-half-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}html.no-flexbox .column-group.xlarge-quarter-gutters,html.no-flexboxlegacy .column-group.xlarge-quarter-gutters{margin-left:-.5em}html.no-flexbox .column-group.xlarge-quarter-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-quarter-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}html.no-flexbox .column-group.xlarge-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.xlarge-quarter-horizontal-gutters{margin-left:-.5em}html.no-flexbox .column-group.xlarge-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-quarter-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}html.no-flexbox .column-group.xlarge-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-quarter-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}html.no-flexbox .column-group.xlarge-no-gutters,html.no-flexboxlegacy .column-group.xlarge-no-gutters{margin-left:0}html.no-flexbox .column-group.xlarge-no-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-no-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-no-gutters>[class*=xlarge-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=xlarge-],html.no-flexbox .ink-table td[class*=xlarge-],html.no-flexbox .ink-table tfoot[class*=xlarge-],html.no-flexbox .ink-table th[class*=xlarge-],html.no-flexbox .ink-table thead[class*=xlarge-],html.no-flexbox .ink-table tr[class*=xlarge-],html.no-flexboxlegacy .ink-table tbody[class*=xlarge-],html.no-flexboxlegacy .ink-table td[class*=xlarge-],html.no-flexboxlegacy .ink-table tfoot[class*=xlarge-],html.no-flexboxlegacy .ink-table th[class*=xlarge-],html.no-flexboxlegacy .ink-table thead[class*=xlarge-],html.no-flexboxlegacy .ink-table tr[class*=xlarge-]{float:none}html.no-flexbox .xlarge-push-left,html.no-flexboxlegacy .xlarge-push-left{float:left}html.no-flexbox .xlarge-push-center,html.no-flexboxlegacy .xlarge-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .xlarge-push-right,html.no-flexboxlegacy .xlarge-push-right{float:right}html.no-flexbox .xlarge-align-left,html.no-flexboxlegacy .xlarge-align-left{text-align:left}html.no-flexbox .xlarge-align-center,html.no-flexboxlegacy .xlarge-align-center{text-align:center}html.no-flexbox .xlarge-align-right,html.no-flexboxlegacy .xlarge-align-right{text-align:right}html.no-flexbox .xlarge-no-margin,html.no-flexboxlegacy .xlarge-no-margin{margin:0!important}html.no-flexbox .space,html.no-flexbox .xlarge-space,html.no-flexboxlegacy .space,html.no-flexboxlegacy .xlarge-space{margin:2em}html.no-flexbox .padding,html.no-flexbox .xlarge-padding,html.no-flexboxlegacy .padding,html.no-flexboxlegacy .xlarge-padding{padding:2em}html.no-flexbox .double-space,html.no-flexbox .xlarge-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .xlarge-double-space{margin:4em}html.no-flexbox .double-padding,html.no-flexbox .xlarge-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .xlarge-double-padding{padding:4em}html.no-flexbox .half-space,html.no-flexbox .xlarge-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .xlarge-half-space{margin:1em}html.no-flexbox .half-padding,html.no-flexbox .xlarge-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .xlarge-half-padding{padding:1em}html.no-flexbox .quarter-space,html.no-flexbox .xlarge-quarter-space,html.no-flexboxlegacy .quarter-space,html.no-flexboxlegacy .xlarge-quarter-space{margin:.5em}html.no-flexbox .quarter-padding,html.no-flexbox .xlarge-quarter-padding,html.no-flexboxlegacy .quarter-padding,html.no-flexboxlegacy .xlarge-quarter-padding{padding:.5em}html.no-flexbox .vertical-space,html.no-flexbox .xlarge-vertical-space,html.no-flexboxlegacy .vertical-space,html.no-flexboxlegacy .xlarge-vertical-space{margin-top:2em;margin-bottom:2em}html.no-flexbox .vertical-padding,html.no-flexbox .xlarge-vertical-padding,html.no-flexboxlegacy .vertical-padding,html.no-flexboxlegacy .xlarge-vertical-padding{padding-top:2em;padding-bottom:2em}html.no-flexbox .double-vertical-space,html.no-flexbox .xlarge-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .xlarge-double-vertical-space{margin-top:4em;margin-bottom:4em}html.no-flexbox .double-vertical-padding,html.no-flexbox .xlarge-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .xlarge-double-vertical-padding{padding-top:4em;padding-bottom:4em}html.no-flexbox .half-vertical-space,html.no-flexbox .xlarge-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .xlarge-half-vertical-space{margin-top:1em;margin-bottom:1em}html.no-flexbox .half-vertical-padding,html.no-flexbox .xlarge-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .xlarge-half-vertical-padding{padding-top:1em;padding-bottom:1em}html.no-flexbox .quarter-vertical-space,html.no-flexbox .xlarge-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space,html.no-flexboxlegacy .xlarge-quarter-vertical-space{margin-top:.5em;margin-bottom:.5em}html.no-flexbox .quarter-vertical-padding,html.no-flexbox .xlarge-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding,html.no-flexboxlegacy .xlarge-quarter-vertical-padding{padding-top:.5em;padding-bottom:.5em}html.no-flexbox .horizontal-space,html.no-flexbox .xlarge-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .xlarge-horizontal-space{margin-left:2em;margin-right:2em}html.no-flexbox .horizontal-padding,html.no-flexbox .xlarge-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .xlarge-horizontal-padding{padding-left:2em;padding-right:2em}html.no-flexbox .double-horizontal-space,html.no-flexbox .xlarge-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .xlarge-double-horizontal-space{margin-left:4em;margin-right:4em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .xlarge-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .xlarge-double-horizontal-padding{padding-left:4em;padding-right:4em}html.no-flexbox .half-horizontal-space,html.no-flexbox .xlarge-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .xlarge-half-horizontal-space{margin-left:1em;margin-right:1em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .xlarge-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .xlarge-half-horizontal-padding{padding-left:1em;padding-right:1em}html.no-flexbox .quarter-horizontal-space,html.no-flexbox .xlarge-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space,html.no-flexboxlegacy .xlarge-quarter-horizontal-space{margin-left:.5em;margin-right:.5em}html.no-flexbox .quarter-horizontal-padding,html.no-flexbox .xlarge-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding,html.no-flexboxlegacy .xlarge-quarter-horizontal-padding{padding-left:.5em;padding-right:.5em}html.no-flexbox .top-space,html.no-flexbox .xlarge-top-space,html.no-flexboxlegacy .top-space,html.no-flexboxlegacy .xlarge-top-space{margin-top:2em}html.no-flexbox .top-padding,html.no-flexbox .xlarge-top-padding,html.no-flexboxlegacy .top-padding,html.no-flexboxlegacy .xlarge-top-padding{padding-top:2em}html.no-flexbox .double-top-space,html.no-flexbox .xlarge-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .xlarge-double-top-space{margin-top:4em}html.no-flexbox .double-top-padding,html.no-flexbox .xlarge-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .xlarge-double-top-padding{padding-top:4em}html.no-flexbox .half-top-space,html.no-flexbox .xlarge-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .xlarge-half-top-space{margin-top:1em}html.no-flexbox .half-top-padding,html.no-flexbox .xlarge-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .xlarge-half-top-padding{padding-top:1em}html.no-flexbox .quarter-top-space,html.no-flexbox .xlarge-quarter-top-space,html.no-flexboxlegacy .quarter-top-space,html.no-flexboxlegacy .xlarge-quarter-top-space{margin-top:.5em}html.no-flexbox .quarter-top-padding,html.no-flexbox .xlarge-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding,html.no-flexboxlegacy .xlarge-quarter-top-padding{padding-top:.5em}html.no-flexbox .right-space,html.no-flexbox .xlarge-right-space,html.no-flexboxlegacy .right-space,html.no-flexboxlegacy .xlarge-right-space{margin-right:2em}html.no-flexbox .right-padding,html.no-flexbox .xlarge-right-padding,html.no-flexboxlegacy .right-padding,html.no-flexboxlegacy .xlarge-right-padding{padding-right:2em}html.no-flexbox .double-right-space,html.no-flexbox .xlarge-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .xlarge-double-right-space{margin-right:4em}html.no-flexbox .double-right-padding,html.no-flexbox .xlarge-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .xlarge-double-right-padding{padding-right:4em}html.no-flexbox .half-right-space,html.no-flexbox .xlarge-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .xlarge-half-right-space{margin-right:1em}html.no-flexbox .half-right-padding,html.no-flexbox .xlarge-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .xlarge-half-right-padding{padding-right:1em}html.no-flexbox .quarter-right-space,html.no-flexbox .xlarge-quarter-right-space,html.no-flexboxlegacy .quarter-right-space,html.no-flexboxlegacy .xlarge-quarter-right-space{margin-right:.5em}html.no-flexbox .quarter-right-padding,html.no-flexbox .xlarge-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding,html.no-flexboxlegacy .xlarge-quarter-right-padding{padding-right:.5em}html.no-flexbox .bottom-space,html.no-flexbox .xlarge-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .xlarge-bottom-space{margin-bottom:2em}html.no-flexbox .bottom-padding,html.no-flexbox .xlarge-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .xlarge-bottom-padding{padding-bottom:2em}html.no-flexbox .double-bottom-space,html.no-flexbox .xlarge-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .xlarge-double-bottom-space{margin-bottom:4em}html.no-flexbox .double-bottom-padding,html.no-flexbox .xlarge-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .xlarge-double-bottom-padding{padding-bottom:4em}html.no-flexbox .half-bottom-space,html.no-flexbox .xlarge-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .xlarge-half-bottom-space{margin-bottom:1em}html.no-flexbox .half-bottom-padding,html.no-flexbox .xlarge-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .xlarge-half-bottom-padding{padding-bottom:1em}html.no-flexbox .quarter-bottom-space,html.no-flexbox .xlarge-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space,html.no-flexboxlegacy .xlarge-quarter-bottom-space{margin-bottom:.5em}html.no-flexbox .quarter-bottom-padding,html.no-flexbox .xlarge-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding,html.no-flexboxlegacy .xlarge-quarter-bottom-padding{padding-bottom:.5em}html.no-flexbox .left-space,html.no-flexbox .xlarge-left-space,html.no-flexboxlegacy .left-space,html.no-flexboxlegacy .xlarge-left-space{margin-left:2em}html.no-flexbox .left-padding,html.no-flexbox .xlarge-left-padding,html.no-flexboxlegacy .left-padding,html.no-flexboxlegacy .xlarge-left-padding{padding-left:2em}html.no-flexbox .double-left-space,html.no-flexbox .xlarge-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .xlarge-double-left-space{margin-left:4em}html.no-flexbox .double-left-padding,html.no-flexbox .xlarge-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .xlarge-double-left-padding{padding-left:4em}html.no-flexbox .half-left-space,html.no-flexbox .xlarge-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .xlarge-half-left-space{margin-left:1em}html.no-flexbox .half-left-padding,html.no-flexbox .xlarge-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .xlarge-half-left-padding{padding-left:1em}html.no-flexbox .quarter-left-space,html.no-flexbox .xlarge-quarter-left-space,html.no-flexboxlegacy .quarter-left-space,html.no-flexboxlegacy .xlarge-quarter-left-space{margin-left:.5em}html.no-flexbox .quarter-left-padding,html.no-flexbox .xlarge-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding,html.no-flexboxlegacy .xlarge-quarter-left-padding{padding-left:.5em}html.no-flexbox .hide-xlarge,html.no-flexboxlegacy .hide-xlarge{display:none!important}html.no-flexbox .show-xlarge,html.no-flexboxlegacy .show-xlarge{display:inherit!important}html.no-flexbox table.show-xlarge,html.no-flexboxlegacy table.show-xlarge{display:table}html.no-flexbox thead.show-xlarge,html.no-flexboxlegacy thead.show-xlarge{display:table-header-group}html.no-flexbox tbody.show-xlarge,html.no-flexboxlegacy tbody.show-xlarge{display:table-row-group}html.no-flexbox tfoot.show-xlarge,html.no-flexboxlegacy tfoot.show-xlarge{display:table-footer-group}html.no-flexbox tr.show-xlarge,html.no-flexboxlegacy tr.show-xlarge{display:table-row}html.no-flexbox td.show-xlarge,html.no-flexbox th.show-xlarge,html.no-flexboxlegacy td.show-xlarge,html.no-flexboxlegacy th.show-xlarge{display:table-cell}}@media screen and (min-width:961px) and (max-width:1260px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 1.75em}html.no-flexbox .column-group>[class*=large-],html.no-flexboxlegacy .column-group>[class*=large-]{float:left;clear:none}html.no-flexbox .large-5,html.no-flexboxlegacy .large-5{width:5%}html.no-flexbox .large-10,html.no-flexboxlegacy .large-10{width:10%}html.no-flexbox .large-15,html.no-flexboxlegacy .large-15{width:15%}html.no-flexbox .large-16,html.no-flexboxlegacy .large-16{width:16.66%}html.no-flexbox .large-20,html.no-flexboxlegacy .large-20{width:20%}html.no-flexbox .large-25,html.no-flexboxlegacy .large-25{width:25%}html.no-flexbox .large-30,html.no-flexboxlegacy .large-30{width:30%}html.no-flexbox .large-33,html.no-flexboxlegacy .large-33{width:33.33%}html.no-flexbox .large-35,html.no-flexboxlegacy .large-35{width:35%}html.no-flexbox .large-40,html.no-flexboxlegacy .large-40{width:40%}html.no-flexbox .large-45,html.no-flexboxlegacy .large-45{width:45%}html.no-flexbox .large-50,html.no-flexboxlegacy .large-50{width:50%}html.no-flexbox .large-55,html.no-flexboxlegacy .large-55{width:55%}html.no-flexbox .large-60,html.no-flexboxlegacy .large-60{width:60%}html.no-flexbox .large-65,html.no-flexboxlegacy .large-65{width:65%}html.no-flexbox .large-66,html.no-flexboxlegacy .large-66{width:66.66%}html.no-flexbox .large-70,html.no-flexboxlegacy .large-70{width:70%}html.no-flexbox .large-75,html.no-flexboxlegacy .large-75{width:75%}html.no-flexbox .large-80,html.no-flexboxlegacy .large-80{width:80%}html.no-flexbox .large-85,html.no-flexboxlegacy .large-85{width:85%}html.no-flexbox .large-90,html.no-flexboxlegacy .large-90{width:90%}html.no-flexbox .large-95,html.no-flexboxlegacy .large-95{width:95%}html.no-flexbox .large-100,html.no-flexboxlegacy .large-100{width:100%}html.no-flexbox [class*=large-100],html.no-flexboxlegacy [class*=large-100]{float:none;clear:both}html.no-flexbox .column-group,html.no-flexboxlegacy .column-group{*zoom:1}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-1.75em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=large-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-1.75em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=large-]{padding-left:1.75em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=large-]{margin-bottom:1.75em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-3.5em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=large-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-3.5em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=large-]{padding-left:3.5em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-.875em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=large-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-.875em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=large-]{padding-left:.875em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=large-]{margin-bottom:.875em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.4375em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=large-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.4375em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}html.no-flexbox .column-group.large-gutters,html.no-flexboxlegacy .column-group.large-gutters{margin-left:-1.75em}html.no-flexbox .column-group.large-gutters>[class*=all-],html.no-flexbox .column-group.large-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}html.no-flexbox .column-group.large-horizontal-gutters,html.no-flexboxlegacy .column-group.large-horizontal-gutters{margin-left:-1.75em}html.no-flexbox .column-group.large-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.large-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-horizontal-gutters>[class*=large-]{padding-left:1.75em}html.no-flexbox .column-group.large-vertical-gutters>[class*=all-],html.no-flexbox .column-group.large-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-vertical-gutters>[class*=large-]{margin-bottom:1.75em}html.no-flexbox .column-group.large-double-gutters,html.no-flexboxlegacy .column-group.large-double-gutters{margin-left:-3.5em}html.no-flexbox .column-group.large-double-gutters>[class*=all-],html.no-flexbox .column-group.large-double-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}html.no-flexbox .column-group.large-double-horizontal-gutters,html.no-flexboxlegacy .column-group.large-double-horizontal-gutters{margin-left:-3.5em}html.no-flexbox .column-group.large-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.large-double-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-double-horizontal-gutters>[class*=large-]{padding-left:3.5em}html.no-flexbox .column-group.large-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.large-double-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}html.no-flexbox .column-group.large-half-gutters,html.no-flexboxlegacy .column-group.large-half-gutters{margin-left:-.875em}html.no-flexbox .column-group.large-half-gutters>[class*=all-],html.no-flexbox .column-group.large-half-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}html.no-flexbox .column-group.large-half-horizontal-gutters,html.no-flexboxlegacy .column-group.large-half-horizontal-gutters{margin-left:-.875em}html.no-flexbox .column-group.large-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.large-half-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-half-horizontal-gutters>[class*=large-]{padding-left:.875em}html.no-flexbox .column-group.large-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.large-half-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-half-vertical-gutters>[class*=large-]{margin-bottom:.875em}html.no-flexbox .column-group.large-quarter-gutters,html.no-flexboxlegacy .column-group.large-quarter-gutters{margin-left:-.4375em}html.no-flexbox .column-group.large-quarter-gutters>[class*=all-],html.no-flexbox .column-group.large-quarter-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}html.no-flexbox .column-group.large-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.large-quarter-horizontal-gutters{margin-left:-.4375em}html.no-flexbox .column-group.large-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.large-quarter-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}html.no-flexbox .column-group.large-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.large-quarter-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}html.no-flexbox .column-group.large-no-gutters,html.no-flexboxlegacy .column-group.large-no-gutters{margin-left:0}html.no-flexbox .column-group.large-no-gutters>[class*=all-],html.no-flexbox .column-group.large-no-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-no-gutters>[class*=large-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=large-],html.no-flexbox .ink-table td[class*=large-],html.no-flexbox .ink-table tfoot[class*=large-],html.no-flexbox .ink-table th[class*=large-],html.no-flexbox .ink-table thead[class*=large-],html.no-flexbox .ink-table tr[class*=large-],html.no-flexboxlegacy .ink-table tbody[class*=large-],html.no-flexboxlegacy .ink-table td[class*=large-],html.no-flexboxlegacy .ink-table tfoot[class*=large-],html.no-flexboxlegacy .ink-table th[class*=large-],html.no-flexboxlegacy .ink-table thead[class*=large-],html.no-flexboxlegacy .ink-table tr[class*=large-]{float:none}html.no-flexbox .large-push-left,html.no-flexboxlegacy .large-push-left{float:left}html.no-flexbox .large-push-center,html.no-flexboxlegacy .large-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .large-push-right,html.no-flexboxlegacy .large-push-right{float:right}html.no-flexbox .large-align-left,html.no-flexboxlegacy .large-align-left{text-align:left}html.no-flexbox .large-align-center,html.no-flexboxlegacy .large-align-center{text-align:center}html.no-flexbox .large-align-right,html.no-flexboxlegacy .large-align-right{text-align:right}html.no-flexbox .large-no-margin,html.no-flexboxlegacy .large-no-margin{margin:0!important}html.no-flexbox .large-space,html.no-flexbox .space,html.no-flexboxlegacy .large-space,html.no-flexboxlegacy .space{margin:1.75em}html.no-flexbox .large-padding,html.no-flexbox .padding,html.no-flexboxlegacy .large-padding,html.no-flexboxlegacy .padding{padding:1.75em}html.no-flexbox .double-space,html.no-flexbox .large-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .large-double-space{margin:3.5em}html.no-flexbox .double-padding,html.no-flexbox .large-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .large-double-padding{padding:3.5em}html.no-flexbox .half-space,html.no-flexbox .large-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .large-half-space{margin:.875em}html.no-flexbox .half-padding,html.no-flexbox .large-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .large-half-padding{padding:.875em}html.no-flexbox .large-quarter-space,html.no-flexbox .quarter-space,html.no-flexboxlegacy .large-quarter-space,html.no-flexboxlegacy .quarter-space{margin:.4375em}html.no-flexbox .large-quarter-padding,html.no-flexbox .quarter-padding,html.no-flexboxlegacy .large-quarter-padding,html.no-flexboxlegacy .quarter-padding{padding:.4375em}html.no-flexbox .large-vertical-space,html.no-flexbox .vertical-space,html.no-flexboxlegacy .large-vertical-space,html.no-flexboxlegacy .vertical-space{margin-top:1.75em;margin-bottom:1.75em}html.no-flexbox .large-vertical-padding,html.no-flexbox .vertical-padding,html.no-flexboxlegacy .large-vertical-padding,html.no-flexboxlegacy .vertical-padding{padding-top:1.75em;padding-bottom:1.75em}html.no-flexbox .double-vertical-space,html.no-flexbox .large-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .large-double-vertical-space{margin-top:3.5em;margin-bottom:3.5em}html.no-flexbox .double-vertical-padding,html.no-flexbox .large-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .large-double-vertical-padding{padding-top:3.5em;padding-bottom:3.5em}html.no-flexbox .half-vertical-space,html.no-flexbox .large-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .large-half-vertical-space{margin-top:.875em;margin-bottom:.875em}html.no-flexbox .half-vertical-padding,html.no-flexbox .large-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .large-half-vertical-padding{padding-top:.875em;padding-bottom:.875em}html.no-flexbox .large-quarter-vertical-space,html.no-flexbox .quarter-vertical-space,html.no-flexboxlegacy .large-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space{margin-top:.4375em;margin-bottom:.4375em}html.no-flexbox .large-quarter-vertical-padding,html.no-flexbox .quarter-vertical-padding,html.no-flexboxlegacy .large-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding{padding-top:.4375em;padding-bottom:.4375em}html.no-flexbox .horizontal-space,html.no-flexbox .large-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .large-horizontal-space{margin-left:1.75em;margin-right:1.75em}html.no-flexbox .horizontal-padding,html.no-flexbox .large-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .large-horizontal-padding{padding-left:1.75em;padding-right:1.75em}html.no-flexbox .double-horizontal-space,html.no-flexbox .large-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .large-double-horizontal-space{margin-left:3.5em;margin-right:3.5em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .large-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .large-double-horizontal-padding{padding-left:3.5em;padding-right:3.5em}html.no-flexbox .half-horizontal-space,html.no-flexbox .large-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .large-half-horizontal-space{margin-left:.875em;margin-right:.875em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .large-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .large-half-horizontal-padding{padding-left:.875em;padding-right:.875em}html.no-flexbox .large-quarter-horizontal-space,html.no-flexbox .quarter-horizontal-space,html.no-flexboxlegacy .large-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space{margin-left:.4375em;margin-right:.4375em}html.no-flexbox .large-quarter-horizontal-padding,html.no-flexbox .quarter-horizontal-padding,html.no-flexboxlegacy .large-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding{padding-left:.4375em;padding-right:.4375em}html.no-flexbox .large-top-space,html.no-flexbox .top-space,html.no-flexboxlegacy .large-top-space,html.no-flexboxlegacy .top-space{margin-top:1.75em}html.no-flexbox .large-top-padding,html.no-flexbox .top-padding,html.no-flexboxlegacy .large-top-padding,html.no-flexboxlegacy .top-padding{padding-top:1.75em}html.no-flexbox .double-top-space,html.no-flexbox .large-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .large-double-top-space{margin-top:3.5em}html.no-flexbox .double-top-padding,html.no-flexbox .large-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .large-double-top-padding{padding-top:3.5em}html.no-flexbox .half-top-space,html.no-flexbox .large-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .large-half-top-space{margin-top:.875em}html.no-flexbox .half-top-padding,html.no-flexbox .large-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .large-half-top-padding{padding-top:.875em}html.no-flexbox .large-quarter-top-space,html.no-flexbox .quarter-top-space,html.no-flexboxlegacy .large-quarter-top-space,html.no-flexboxlegacy .quarter-top-space{margin-top:.4375em}html.no-flexbox .large-quarter-top-padding,html.no-flexbox .quarter-top-padding,html.no-flexboxlegacy .large-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding{padding-top:.4375em}html.no-flexbox .large-right-space,html.no-flexbox .right-space,html.no-flexboxlegacy .large-right-space,html.no-flexboxlegacy .right-space{margin-right:1.75em}html.no-flexbox .large-right-padding,html.no-flexbox .right-padding,html.no-flexboxlegacy .large-right-padding,html.no-flexboxlegacy .right-padding{padding-right:1.75em}html.no-flexbox .double-right-space,html.no-flexbox .large-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .large-double-right-space{margin-right:3.5em}html.no-flexbox .double-right-padding,html.no-flexbox .large-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .large-double-right-padding{padding-right:3.5em}html.no-flexbox .half-right-space,html.no-flexbox .large-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .large-half-right-space{margin-right:.875em}html.no-flexbox .half-right-padding,html.no-flexbox .large-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .large-half-right-padding{padding-right:.875em}html.no-flexbox .large-quarter-right-space,html.no-flexbox .quarter-right-space,html.no-flexboxlegacy .large-quarter-right-space,html.no-flexboxlegacy .quarter-right-space{margin-right:.4375em}html.no-flexbox .large-quarter-right-padding,html.no-flexbox .quarter-right-padding,html.no-flexboxlegacy .large-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding{padding-right:.4375em}html.no-flexbox .bottom-space,html.no-flexbox .large-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .large-bottom-space{margin-bottom:1.75em}html.no-flexbox .bottom-padding,html.no-flexbox .large-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .large-bottom-padding{padding-bottom:1.75em}html.no-flexbox .double-bottom-space,html.no-flexbox .large-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .large-double-bottom-space{margin-bottom:3.5em}html.no-flexbox .double-bottom-padding,html.no-flexbox .large-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .large-double-bottom-padding{padding-bottom:3.5em}html.no-flexbox .half-bottom-space,html.no-flexbox .large-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .large-half-bottom-space{margin-bottom:.875em}html.no-flexbox .half-bottom-padding,html.no-flexbox .large-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .large-half-bottom-padding{padding-bottom:.875em}html.no-flexbox .large-quarter-bottom-space,html.no-flexbox .quarter-bottom-space,html.no-flexboxlegacy .large-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space{margin-bottom:.4375em}html.no-flexbox .large-quarter-bottom-padding,html.no-flexbox .quarter-bottom-padding,html.no-flexboxlegacy .large-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding{padding-bottom:.4375em}html.no-flexbox .large-left-space,html.no-flexbox .left-space,html.no-flexboxlegacy .large-left-space,html.no-flexboxlegacy .left-space{margin-left:1.75em}html.no-flexbox .large-left-padding,html.no-flexbox .left-padding,html.no-flexboxlegacy .large-left-padding,html.no-flexboxlegacy .left-padding{padding-left:1.75em}html.no-flexbox .double-left-space,html.no-flexbox .large-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .large-double-left-space{margin-left:3.5em}html.no-flexbox .double-left-padding,html.no-flexbox .large-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .large-double-left-padding{padding-left:3.5em}html.no-flexbox .half-left-space,html.no-flexbox .large-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .large-half-left-space{margin-left:.875em}html.no-flexbox .half-left-padding,html.no-flexbox .large-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .large-half-left-padding{padding-left:.875em}html.no-flexbox .large-quarter-left-space,html.no-flexbox .quarter-left-space,html.no-flexboxlegacy .large-quarter-left-space,html.no-flexboxlegacy .quarter-left-space{margin-left:.4375em}html.no-flexbox .large-quarter-left-padding,html.no-flexbox .quarter-left-padding,html.no-flexboxlegacy .large-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding{padding-left:.4375em}html.no-flexbox .hide-large,html.no-flexboxlegacy .hide-large{display:none!important}html.no-flexbox .show-large,html.no-flexboxlegacy .show-large{display:inherit!important}html.no-flexbox table.show-large,html.no-flexboxlegacy table.show-large{display:table}html.no-flexbox thead.show-large,html.no-flexboxlegacy thead.show-large{display:table-header-group}html.no-flexbox tbody.show-large,html.no-flexboxlegacy tbody.show-large{display:table-row-group}html.no-flexbox tfoot.show-large,html.no-flexboxlegacy tfoot.show-large{display:table-footer-group}html.no-flexbox tr.show-large,html.no-flexboxlegacy tr.show-large{display:table-row}html.no-flexbox td.show-large,html.no-flexbox th.show-large,html.no-flexboxlegacy td.show-large,html.no-flexboxlegacy th.show-large{display:table-cell}}@media screen and (min-width:641px) and (max-width:960px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 1.5em}html.no-flexbox .column-group>[class*=medium-],html.no-flexboxlegacy .column-group>[class*=medium-]{float:left;clear:none}html.no-flexbox .medium-5,html.no-flexboxlegacy .medium-5{width:5%}html.no-flexbox .medium-10,html.no-flexboxlegacy .medium-10{width:10%}html.no-flexbox .medium-15,html.no-flexboxlegacy .medium-15{width:15%}html.no-flexbox .medium-16,html.no-flexboxlegacy .medium-16{width:16.66%}html.no-flexbox .medium-20,html.no-flexboxlegacy .medium-20{width:20%}html.no-flexbox .medium-25,html.no-flexboxlegacy .medium-25{width:25%}html.no-flexbox .medium-30,html.no-flexboxlegacy .medium-30{width:30%}html.no-flexbox .medium-33,html.no-flexboxlegacy .medium-33{width:33.33%}html.no-flexbox .medium-35,html.no-flexboxlegacy .medium-35{width:35%}html.no-flexbox .medium-40,html.no-flexboxlegacy .medium-40{width:40%}html.no-flexbox .medium-45,html.no-flexboxlegacy .medium-45{width:45%}html.no-flexbox .medium-50,html.no-flexboxlegacy .medium-50{width:50%}html.no-flexbox .medium-55,html.no-flexboxlegacy .medium-55{width:55%}html.no-flexbox .medium-60,html.no-flexboxlegacy .medium-60{width:60%}html.no-flexbox .medium-65,html.no-flexboxlegacy .medium-65{width:65%}html.no-flexbox .medium-66,html.no-flexboxlegacy .medium-66{width:66.66%}html.no-flexbox .medium-70,html.no-flexboxlegacy .medium-70{width:70%}html.no-flexbox .medium-75,html.no-flexboxlegacy .medium-75{width:75%}html.no-flexbox .medium-80,html.no-flexboxlegacy .medium-80{width:80%}html.no-flexbox .medium-85,html.no-flexboxlegacy .medium-85{width:85%}html.no-flexbox .medium-90,html.no-flexboxlegacy .medium-90{width:90%}html.no-flexbox .medium-95,html.no-flexboxlegacy .medium-95{width:95%}html.no-flexbox .medium-100,html.no-flexboxlegacy .medium-100{width:100%}html.no-flexbox [class*=medium-100],html.no-flexboxlegacy [class*=medium-100]{float:none;clear:both}html.no-flexbox .column-group,html.no-flexboxlegacy .column-group{*zoom:1}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-1.5em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=medium-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-1.5em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=medium-]{padding-left:1.5em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=medium-]{margin-bottom:1.5em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-3em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-3em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=medium-]{padding-left:3em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=medium-]{margin-bottom:3em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-.75em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-.75em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=medium-]{padding-left:.75em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.375em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.375em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}html.no-flexbox .column-group.medium-gutters,html.no-flexboxlegacy .column-group.medium-gutters{margin-left:-1.5em}html.no-flexbox .column-group.medium-gutters>[class*=all-],html.no-flexbox .column-group.medium-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}html.no-flexbox .column-group.medium-horizontal-gutters,html.no-flexboxlegacy .column-group.medium-horizontal-gutters{margin-left:-1.5em}html.no-flexbox .column-group.medium-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.medium-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-horizontal-gutters>[class*=medium-]{padding-left:1.5em}html.no-flexbox .column-group.medium-vertical-gutters>[class*=all-],html.no-flexbox .column-group.medium-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-vertical-gutters>[class*=medium-]{margin-bottom:1.5em}html.no-flexbox .column-group.medium-double-gutters,html.no-flexboxlegacy .column-group.medium-double-gutters{margin-left:-3em}html.no-flexbox .column-group.medium-double-gutters>[class*=all-],html.no-flexbox .column-group.medium-double-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}html.no-flexbox .column-group.medium-double-horizontal-gutters,html.no-flexboxlegacy .column-group.medium-double-horizontal-gutters{margin-left:-3em}html.no-flexbox .column-group.medium-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.medium-double-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-double-horizontal-gutters>[class*=medium-]{padding-left:3em}html.no-flexbox .column-group.medium-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.medium-double-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-double-vertical-gutters>[class*=medium-]{margin-bottom:3em}html.no-flexbox .column-group.medium-half-gutters,html.no-flexboxlegacy .column-group.medium-half-gutters{margin-left:-.75em}html.no-flexbox .column-group.medium-half-gutters>[class*=all-],html.no-flexbox .column-group.medium-half-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}html.no-flexbox .column-group.medium-half-horizontal-gutters,html.no-flexboxlegacy .column-group.medium-half-horizontal-gutters{margin-left:-.75em}html.no-flexbox .column-group.medium-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.medium-half-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-half-horizontal-gutters>[class*=medium-]{padding-left:.75em}html.no-flexbox .column-group.medium-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.medium-half-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}html.no-flexbox .column-group.medium-quarter-gutters,html.no-flexboxlegacy .column-group.medium-quarter-gutters{margin-left:-.375em}html.no-flexbox .column-group.medium-quarter-gutters>[class*=all-],html.no-flexbox .column-group.medium-quarter-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}html.no-flexbox .column-group.medium-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.medium-quarter-horizontal-gutters{margin-left:-.375em}html.no-flexbox .column-group.medium-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.medium-quarter-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}html.no-flexbox .column-group.medium-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.medium-quarter-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}html.no-flexbox .column-group.medium-no-gutters,html.no-flexboxlegacy .column-group.medium-no-gutters{margin-left:0}html.no-flexbox .column-group.medium-no-gutters>[class*=all-],html.no-flexbox .column-group.medium-no-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-no-gutters>[class*=medium-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=medium-],html.no-flexbox .ink-table td[class*=medium-],html.no-flexbox .ink-table tfoot[class*=medium-],html.no-flexbox .ink-table th[class*=medium-],html.no-flexbox .ink-table thead[class*=medium-],html.no-flexbox .ink-table tr[class*=medium-],html.no-flexboxlegacy .ink-table tbody[class*=medium-],html.no-flexboxlegacy .ink-table td[class*=medium-],html.no-flexboxlegacy .ink-table tfoot[class*=medium-],html.no-flexboxlegacy .ink-table th[class*=medium-],html.no-flexboxlegacy .ink-table thead[class*=medium-],html.no-flexboxlegacy .ink-table tr[class*=medium-]{float:none}html.no-flexbox .medium-push-left,html.no-flexboxlegacy .medium-push-left{float:left}html.no-flexbox .medium-push-center,html.no-flexboxlegacy .medium-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .medium-push-right,html.no-flexboxlegacy .medium-push-right{float:right}html.no-flexbox .medium-align-left,html.no-flexboxlegacy .medium-align-left{text-align:left}html.no-flexbox .medium-align-center,html.no-flexboxlegacy .medium-align-center{text-align:center}html.no-flexbox .medium-align-right,html.no-flexboxlegacy .medium-align-right{text-align:right}html.no-flexbox .medium-no-margin,html.no-flexboxlegacy .medium-no-margin{margin:0!important}html.no-flexbox .medium-space,html.no-flexbox .space,html.no-flexboxlegacy .medium-space,html.no-flexboxlegacy .space{margin:1.5em}html.no-flexbox .medium-padding,html.no-flexbox .padding,html.no-flexboxlegacy .medium-padding,html.no-flexboxlegacy .padding{padding:1.5em}html.no-flexbox .double-space,html.no-flexbox .medium-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .medium-double-space{margin:3em}html.no-flexbox .double-padding,html.no-flexbox .medium-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .medium-double-padding{padding:3em}html.no-flexbox .half-space,html.no-flexbox .medium-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .medium-half-space{margin:.75em}html.no-flexbox .half-padding,html.no-flexbox .medium-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .medium-half-padding{padding:.75em}html.no-flexbox .medium-quarter-space,html.no-flexbox .quarter-space,html.no-flexboxlegacy .medium-quarter-space,html.no-flexboxlegacy .quarter-space{margin:.375em}html.no-flexbox .medium-quarter-padding,html.no-flexbox .quarter-padding,html.no-flexboxlegacy .medium-quarter-padding,html.no-flexboxlegacy .quarter-padding{padding:.375em}html.no-flexbox .medium-vertical-space,html.no-flexbox .vertical-space,html.no-flexboxlegacy .medium-vertical-space,html.no-flexboxlegacy .vertical-space{margin-top:1.5em;margin-bottom:1.5em}html.no-flexbox .medium-vertical-padding,html.no-flexbox .vertical-padding,html.no-flexboxlegacy .medium-vertical-padding,html.no-flexboxlegacy .vertical-padding{padding-top:1.5em;padding-bottom:1.5em}html.no-flexbox .double-vertical-space,html.no-flexbox .medium-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .medium-double-vertical-space{margin-top:3em;margin-bottom:3em}html.no-flexbox .double-vertical-padding,html.no-flexbox .medium-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .medium-double-vertical-padding{padding-top:3em;padding-bottom:3em}html.no-flexbox .half-vertical-space,html.no-flexbox .medium-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .medium-half-vertical-space{margin-top:.75em;margin-bottom:.75em}html.no-flexbox .half-vertical-padding,html.no-flexbox .medium-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .medium-half-vertical-padding{padding-top:.75em;padding-bottom:.75em}html.no-flexbox .medium-quarter-vertical-space,html.no-flexbox .quarter-vertical-space,html.no-flexboxlegacy .medium-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space{margin-top:.375em;margin-bottom:.375em}html.no-flexbox .medium-quarter-vertical-padding,html.no-flexbox .quarter-vertical-padding,html.no-flexboxlegacy .medium-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding{padding-top:.375em;padding-bottom:.375em}html.no-flexbox .horizontal-space,html.no-flexbox .medium-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .medium-horizontal-space{margin-left:1.5em;margin-right:1.5em}html.no-flexbox .horizontal-padding,html.no-flexbox .medium-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .medium-horizontal-padding{padding-left:1.5em;padding-right:1.5em}html.no-flexbox .double-horizontal-space,html.no-flexbox .medium-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .medium-double-horizontal-space{margin-left:3em;margin-right:3em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .medium-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .medium-double-horizontal-padding{padding-left:3em;padding-right:3em}html.no-flexbox .half-horizontal-space,html.no-flexbox .medium-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .medium-half-horizontal-space{margin-left:.75em;margin-right:.75em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .medium-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .medium-half-horizontal-padding{padding-left:.75em;padding-right:.75em}html.no-flexbox .medium-quarter-horizontal-space,html.no-flexbox .quarter-horizontal-space,html.no-flexboxlegacy .medium-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space{margin-left:.375em;margin-right:.375em}html.no-flexbox .medium-quarter-horizontal-padding,html.no-flexbox .quarter-horizontal-padding,html.no-flexboxlegacy .medium-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding{padding-left:.375em;padding-right:.375em}html.no-flexbox .medium-top-space,html.no-flexbox .top-space,html.no-flexboxlegacy .medium-top-space,html.no-flexboxlegacy .top-space{margin-top:1.5em}html.no-flexbox .medium-top-padding,html.no-flexbox .top-padding,html.no-flexboxlegacy .medium-top-padding,html.no-flexboxlegacy .top-padding{padding-top:1.5em}html.no-flexbox .double-top-space,html.no-flexbox .medium-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .medium-double-top-space{margin-top:3em}html.no-flexbox .double-top-padding,html.no-flexbox .medium-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .medium-double-top-padding{padding-top:3em}html.no-flexbox .half-top-space,html.no-flexbox .medium-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .medium-half-top-space{margin-top:.75em}html.no-flexbox .half-top-padding,html.no-flexbox .medium-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .medium-half-top-padding{padding-top:.75em}html.no-flexbox .medium-quarter-top-space,html.no-flexbox .quarter-top-space,html.no-flexboxlegacy .medium-quarter-top-space,html.no-flexboxlegacy .quarter-top-space{margin-top:.375em}html.no-flexbox .medium-quarter-top-padding,html.no-flexbox .quarter-top-padding,html.no-flexboxlegacy .medium-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding{padding-top:.375em}html.no-flexbox .medium-right-space,html.no-flexbox .right-space,html.no-flexboxlegacy .medium-right-space,html.no-flexboxlegacy .right-space{margin-right:1.5em}html.no-flexbox .medium-right-padding,html.no-flexbox .right-padding,html.no-flexboxlegacy .medium-right-padding,html.no-flexboxlegacy .right-padding{padding-right:1.5em}html.no-flexbox .double-right-space,html.no-flexbox .medium-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .medium-double-right-space{margin-right:3em}html.no-flexbox .double-right-padding,html.no-flexbox .medium-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .medium-double-right-padding{padding-right:3em}html.no-flexbox .half-right-space,html.no-flexbox .medium-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .medium-half-right-space{margin-right:.75em}html.no-flexbox .half-right-padding,html.no-flexbox .medium-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .medium-half-right-padding{padding-right:.75em}html.no-flexbox .medium-quarter-right-space,html.no-flexbox .quarter-right-space,html.no-flexboxlegacy .medium-quarter-right-space,html.no-flexboxlegacy .quarter-right-space{margin-right:.375em}html.no-flexbox .medium-quarter-right-padding,html.no-flexbox .quarter-right-padding,html.no-flexboxlegacy .medium-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding{padding-right:.375em}html.no-flexbox .bottom-space,html.no-flexbox .medium-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .medium-bottom-space{margin-bottom:1.5em}html.no-flexbox .bottom-padding,html.no-flexbox .medium-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .medium-bottom-padding{padding-bottom:1.5em}html.no-flexbox .double-bottom-space,html.no-flexbox .medium-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .medium-double-bottom-space{margin-bottom:3em}html.no-flexbox .double-bottom-padding,html.no-flexbox .medium-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .medium-double-bottom-padding{padding-bottom:3em}html.no-flexbox .half-bottom-space,html.no-flexbox .medium-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .medium-half-bottom-space{margin-bottom:.75em}html.no-flexbox .half-bottom-padding,html.no-flexbox .medium-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .medium-half-bottom-padding{padding-bottom:.75em}html.no-flexbox .medium-quarter-bottom-space,html.no-flexbox .quarter-bottom-space,html.no-flexboxlegacy .medium-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space{margin-bottom:.375em}html.no-flexbox .medium-quarter-bottom-padding,html.no-flexbox .quarter-bottom-padding,html.no-flexboxlegacy .medium-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding{padding-bottom:.375em}html.no-flexbox .left-space,html.no-flexbox .medium-left-space,html.no-flexboxlegacy .left-space,html.no-flexboxlegacy .medium-left-space{margin-left:1.5em}html.no-flexbox .left-padding,html.no-flexbox .medium-left-padding,html.no-flexboxlegacy .left-padding,html.no-flexboxlegacy .medium-left-padding{padding-left:1.5em}html.no-flexbox .double-left-space,html.no-flexbox .medium-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .medium-double-left-space{margin-left:3em}html.no-flexbox .double-left-padding,html.no-flexbox .medium-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .medium-double-left-padding{padding-left:3em}html.no-flexbox .half-left-space,html.no-flexbox .medium-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .medium-half-left-space{margin-left:.75em}html.no-flexbox .half-left-padding,html.no-flexbox .medium-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .medium-half-left-padding{padding-left:.75em}html.no-flexbox .medium-quarter-left-space,html.no-flexbox .quarter-left-space,html.no-flexboxlegacy .medium-quarter-left-space,html.no-flexboxlegacy .quarter-left-space{margin-left:.375em}html.no-flexbox .medium-quarter-left-padding,html.no-flexbox .quarter-left-padding,html.no-flexboxlegacy .medium-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding{padding-left:.375em}html.no-flexbox .hide-medium,html.no-flexboxlegacy .hide-medium{display:none!important}html.no-flexbox .show-medium,html.no-flexboxlegacy .show-medium{display:inherit!important}html.no-flexbox table.show-medium,html.no-flexboxlegacy table.show-medium{display:table}html.no-flexbox thead.show-medium,html.no-flexboxlegacy thead.show-medium{display:table-header-group}html.no-flexbox tbody.show-medium,html.no-flexboxlegacy tbody.show-medium{display:table-row-group}html.no-flexbox tfoot.show-medium,html.no-flexboxlegacy tfoot.show-medium{display:table-footer-group}html.no-flexbox tr.show-medium,html.no-flexboxlegacy tr.show-medium{display:table-row}html.no-flexbox td.show-medium,html.no-flexbox th.show-medium,html.no-flexboxlegacy td.show-medium,html.no-flexboxlegacy th.show-medium{display:table-cell}}@media screen and (min-width:321px) and (max-width:640px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 1.25em}html.no-flexbox .column-group>[class*=small-],html.no-flexboxlegacy .column-group>[class*=small-]{float:left;clear:none}html.no-flexbox .small-5,html.no-flexboxlegacy .small-5{width:5%}html.no-flexbox .small-10,html.no-flexboxlegacy .small-10{width:10%}html.no-flexbox .small-15,html.no-flexboxlegacy .small-15{width:15%}html.no-flexbox .small-16,html.no-flexboxlegacy .small-16{width:16.66%}html.no-flexbox .small-20,html.no-flexboxlegacy .small-20{width:20%}html.no-flexbox .small-25,html.no-flexboxlegacy .small-25{width:25%}html.no-flexbox .small-30,html.no-flexboxlegacy .small-30{width:30%}html.no-flexbox .small-33,html.no-flexboxlegacy .small-33{width:33.33%}html.no-flexbox .small-35,html.no-flexboxlegacy .small-35{width:35%}html.no-flexbox .small-40,html.no-flexboxlegacy .small-40{width:40%}html.no-flexbox .small-45,html.no-flexboxlegacy .small-45{width:45%}html.no-flexbox .small-50,html.no-flexboxlegacy .small-50{width:50%}html.no-flexbox .small-55,html.no-flexboxlegacy .small-55{width:55%}html.no-flexbox .small-60,html.no-flexboxlegacy .small-60{width:60%}html.no-flexbox .small-65,html.no-flexboxlegacy .small-65{width:65%}html.no-flexbox .small-66,html.no-flexboxlegacy .small-66{width:66.66%}html.no-flexbox .small-70,html.no-flexboxlegacy .small-70{width:70%}html.no-flexbox .small-75,html.no-flexboxlegacy .small-75{width:75%}html.no-flexbox .small-80,html.no-flexboxlegacy .small-80{width:80%}html.no-flexbox .small-85,html.no-flexboxlegacy .small-85{width:85%}html.no-flexbox .small-90,html.no-flexboxlegacy .small-90{width:90%}html.no-flexbox .small-95,html.no-flexboxlegacy .small-95{width:95%}html.no-flexbox .small-100,html.no-flexboxlegacy .small-100{width:100%}html.no-flexbox [class*=small-100],html.no-flexboxlegacy [class*=small-100]{float:none;clear:both}html.no-flexbox .column-group,html.no-flexboxlegacy .column-group{*zoom:1}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-1.25em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=small-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-1.25em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=small-]{padding-left:1.25em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=small-]{margin-bottom:1.25em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-2.5em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=small-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-2.5em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=small-]{padding-left:2.5em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-.625em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=small-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-.625em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=small-]{padding-left:.625em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=small-]{margin-bottom:.625em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.3125em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=small-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.3125em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}html.no-flexbox .column-group.small-gutters,html.no-flexboxlegacy .column-group.small-gutters{margin-left:-1.25em}html.no-flexbox .column-group.small-gutters>[class*=all-],html.no-flexbox .column-group.small-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}html.no-flexbox .column-group.small-horizontal-gutters,html.no-flexboxlegacy .column-group.small-horizontal-gutters{margin-left:-1.25em}html.no-flexbox .column-group.small-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.small-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-horizontal-gutters>[class*=small-]{padding-left:1.25em}html.no-flexbox .column-group.small-vertical-gutters>[class*=all-],html.no-flexbox .column-group.small-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-vertical-gutters>[class*=small-]{margin-bottom:1.25em}html.no-flexbox .column-group.small-double-gutters,html.no-flexboxlegacy .column-group.small-double-gutters{margin-left:-2.5em}html.no-flexbox .column-group.small-double-gutters>[class*=all-],html.no-flexbox .column-group.small-double-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}html.no-flexbox .column-group.small-double-horizontal-gutters,html.no-flexboxlegacy .column-group.small-double-horizontal-gutters{margin-left:-2.5em}html.no-flexbox .column-group.small-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.small-double-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-double-horizontal-gutters>[class*=small-]{padding-left:2.5em}html.no-flexbox .column-group.small-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.small-double-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}html.no-flexbox .column-group.small-half-gutters,html.no-flexboxlegacy .column-group.small-half-gutters{margin-left:-.625em}html.no-flexbox .column-group.small-half-gutters>[class*=all-],html.no-flexbox .column-group.small-half-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}html.no-flexbox .column-group.small-half-horizontal-gutters,html.no-flexboxlegacy .column-group.small-half-horizontal-gutters{margin-left:-.625em}html.no-flexbox .column-group.small-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.small-half-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-half-horizontal-gutters>[class*=small-]{padding-left:.625em}html.no-flexbox .column-group.small-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.small-half-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-half-vertical-gutters>[class*=small-]{margin-bottom:.625em}html.no-flexbox .column-group.small-quarter-gutters,html.no-flexboxlegacy .column-group.small-quarter-gutters{margin-left:-.3125em}html.no-flexbox .column-group.small-quarter-gutters>[class*=all-],html.no-flexbox .column-group.small-quarter-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}html.no-flexbox .column-group.small-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.small-quarter-horizontal-gutters{margin-left:-.3125em}html.no-flexbox .column-group.small-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.small-quarter-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}html.no-flexbox .column-group.small-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.small-quarter-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}html.no-flexbox .column-group.small-no-gutters,html.no-flexboxlegacy .column-group.small-no-gutters{margin-left:0}html.no-flexbox .column-group.small-no-gutters>[class*=all-],html.no-flexbox .column-group.small-no-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-no-gutters>[class*=small-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=small-],html.no-flexbox .ink-table td[class*=small-],html.no-flexbox .ink-table tfoot[class*=small-],html.no-flexbox .ink-table th[class*=small-],html.no-flexbox .ink-table thead[class*=small-],html.no-flexbox .ink-table tr[class*=small-],html.no-flexboxlegacy .ink-table tbody[class*=small-],html.no-flexboxlegacy .ink-table td[class*=small-],html.no-flexboxlegacy .ink-table tfoot[class*=small-],html.no-flexboxlegacy .ink-table th[class*=small-],html.no-flexboxlegacy .ink-table thead[class*=small-],html.no-flexboxlegacy .ink-table tr[class*=small-]{float:none}html.no-flexbox .small-push-left,html.no-flexboxlegacy .small-push-left{float:left}html.no-flexbox .small-push-center,html.no-flexboxlegacy .small-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .small-push-right,html.no-flexboxlegacy .small-push-right{float:right}html.no-flexbox .small-align-left,html.no-flexboxlegacy .small-align-left{text-align:left}html.no-flexbox .small-align-center,html.no-flexboxlegacy .small-align-center{text-align:center}html.no-flexbox .small-align-right,html.no-flexboxlegacy .small-align-right{text-align:right}html.no-flexbox .small-no-margin,html.no-flexboxlegacy .small-no-margin{margin:0!important}html.no-flexbox .small-space,html.no-flexbox .space,html.no-flexboxlegacy .small-space,html.no-flexboxlegacy .space{margin:1.25em}html.no-flexbox .padding,html.no-flexbox .small-padding,html.no-flexboxlegacy .padding,html.no-flexboxlegacy .small-padding{padding:1.25em}html.no-flexbox .double-space,html.no-flexbox .small-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .small-double-space{margin:2.5em}html.no-flexbox .double-padding,html.no-flexbox .small-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .small-double-padding{padding:2.5em}html.no-flexbox .half-space,html.no-flexbox .small-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .small-half-space{margin:.625em}html.no-flexbox .half-padding,html.no-flexbox .small-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .small-half-padding{padding:.625em}html.no-flexbox .quarter-space,html.no-flexbox .small-quarter-space,html.no-flexboxlegacy .quarter-space,html.no-flexboxlegacy .small-quarter-space{margin:.3125em}html.no-flexbox .quarter-padding,html.no-flexbox .small-quarter-padding,html.no-flexboxlegacy .quarter-padding,html.no-flexboxlegacy .small-quarter-padding{padding:.3125em}html.no-flexbox .small-vertical-space,html.no-flexbox .vertical-space,html.no-flexboxlegacy .small-vertical-space,html.no-flexboxlegacy .vertical-space{margin-top:1.25em;margin-bottom:1.25em}html.no-flexbox .small-vertical-padding,html.no-flexbox .vertical-padding,html.no-flexboxlegacy .small-vertical-padding,html.no-flexboxlegacy .vertical-padding{padding-top:1.25em;padding-bottom:1.25em}html.no-flexbox .double-vertical-space,html.no-flexbox .small-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .small-double-vertical-space{margin-top:2.5em;margin-bottom:2.5em}html.no-flexbox .double-vertical-padding,html.no-flexbox .small-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .small-double-vertical-padding{padding-top:2.5em;padding-bottom:2.5em}html.no-flexbox .half-vertical-space,html.no-flexbox .small-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .small-half-vertical-space{margin-top:.625em;margin-bottom:.625em}html.no-flexbox .half-vertical-padding,html.no-flexbox .small-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .small-half-vertical-padding{padding-top:.625em;padding-bottom:.625em}html.no-flexbox .quarter-vertical-space,html.no-flexbox .small-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space,html.no-flexboxlegacy .small-quarter-vertical-space{margin-top:.3125em;margin-bottom:.3125em}html.no-flexbox .quarter-vertical-padding,html.no-flexbox .small-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding,html.no-flexboxlegacy .small-quarter-vertical-padding{padding-top:.3125em;padding-bottom:.3125em}html.no-flexbox .horizontal-space,html.no-flexbox .small-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .small-horizontal-space{margin-left:1.25em;margin-right:1.25em}html.no-flexbox .horizontal-padding,html.no-flexbox .small-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .small-horizontal-padding{padding-left:1.25em;padding-right:1.25em}html.no-flexbox .double-horizontal-space,html.no-flexbox .small-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .small-double-horizontal-space{margin-left:2.5em;margin-right:2.5em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .small-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .small-double-horizontal-padding{padding-left:2.5em;padding-right:2.5em}html.no-flexbox .half-horizontal-space,html.no-flexbox .small-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .small-half-horizontal-space{margin-left:.625em;margin-right:.625em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .small-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .small-half-horizontal-padding{padding-left:.625em;padding-right:.625em}html.no-flexbox .quarter-horizontal-space,html.no-flexbox .small-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space,html.no-flexboxlegacy .small-quarter-horizontal-space{margin-left:.3125em;margin-right:.3125em}html.no-flexbox .quarter-horizontal-padding,html.no-flexbox .small-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding,html.no-flexboxlegacy .small-quarter-horizontal-padding{padding-left:.3125em;padding-right:.3125em}html.no-flexbox .small-top-space,html.no-flexbox .top-space,html.no-flexboxlegacy .small-top-space,html.no-flexboxlegacy .top-space{margin-top:1.25em}html.no-flexbox .small-top-padding,html.no-flexbox .top-padding,html.no-flexboxlegacy .small-top-padding,html.no-flexboxlegacy .top-padding{padding-top:1.25em}html.no-flexbox .double-top-space,html.no-flexbox .small-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .small-double-top-space{margin-top:2.5em}html.no-flexbox .double-top-padding,html.no-flexbox .small-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .small-double-top-padding{padding-top:2.5em}html.no-flexbox .half-top-space,html.no-flexbox .small-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .small-half-top-space{margin-top:.625em}html.no-flexbox .half-top-padding,html.no-flexbox .small-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .small-half-top-padding{padding-top:.625em}html.no-flexbox .quarter-top-space,html.no-flexbox .small-quarter-top-space,html.no-flexboxlegacy .quarter-top-space,html.no-flexboxlegacy .small-quarter-top-space{margin-top:.3125em}html.no-flexbox .quarter-top-padding,html.no-flexbox .small-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding,html.no-flexboxlegacy .small-quarter-top-padding{padding-top:.3125em}html.no-flexbox .right-space,html.no-flexbox .small-right-space,html.no-flexboxlegacy .right-space,html.no-flexboxlegacy .small-right-space{margin-right:1.25em}html.no-flexbox .right-padding,html.no-flexbox .small-right-padding,html.no-flexboxlegacy .right-padding,html.no-flexboxlegacy .small-right-padding{padding-right:1.25em}html.no-flexbox .double-right-space,html.no-flexbox .small-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .small-double-right-space{margin-right:2.5em}html.no-flexbox .double-right-padding,html.no-flexbox .small-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .small-double-right-padding{padding-right:2.5em}html.no-flexbox .half-right-space,html.no-flexbox .small-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .small-half-right-space{margin-right:.625em}html.no-flexbox .half-right-padding,html.no-flexbox .small-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .small-half-right-padding{padding-right:.625em}html.no-flexbox .quarter-right-space,html.no-flexbox .small-quarter-right-space,html.no-flexboxlegacy .quarter-right-space,html.no-flexboxlegacy .small-quarter-right-space{margin-right:.3125em}html.no-flexbox .quarter-right-padding,html.no-flexbox .small-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding,html.no-flexboxlegacy .small-quarter-right-padding{padding-right:.3125em}html.no-flexbox .bottom-space,html.no-flexbox .small-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .small-bottom-space{margin-bottom:1.25em}html.no-flexbox .bottom-padding,html.no-flexbox .small-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .small-bottom-padding{padding-bottom:1.25em}html.no-flexbox .double-bottom-space,html.no-flexbox .small-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .small-double-bottom-space{margin-bottom:2.5em}html.no-flexbox .double-bottom-padding,html.no-flexbox .small-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .small-double-bottom-padding{padding-bottom:2.5em}html.no-flexbox .half-bottom-space,html.no-flexbox .small-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .small-half-bottom-space{margin-bottom:.625em}html.no-flexbox .half-bottom-padding,html.no-flexbox .small-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .small-half-bottom-padding{padding-bottom:.625em}html.no-flexbox .quarter-bottom-space,html.no-flexbox .small-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space,html.no-flexboxlegacy .small-quarter-bottom-space{margin-bottom:.3125em}html.no-flexbox .quarter-bottom-padding,html.no-flexbox .small-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding,html.no-flexboxlegacy .small-quarter-bottom-padding{padding-bottom:.3125em}html.no-flexbox .left-space,html.no-flexbox .small-left-space,html.no-flexboxlegacy .left-space,html.no-flexboxlegacy .small-left-space{margin-left:1.25em}html.no-flexbox .left-padding,html.no-flexbox .small-left-padding,html.no-flexboxlegacy .left-padding,html.no-flexboxlegacy .small-left-padding{padding-left:1.25em}html.no-flexbox .double-left-space,html.no-flexbox .small-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .small-double-left-space{margin-left:2.5em}html.no-flexbox .double-left-padding,html.no-flexbox .small-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .small-double-left-padding{padding-left:2.5em}html.no-flexbox .half-left-space,html.no-flexbox .small-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .small-half-left-space{margin-left:.625em}html.no-flexbox .half-left-padding,html.no-flexbox .small-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .small-half-left-padding{padding-left:.625em}html.no-flexbox .quarter-left-space,html.no-flexbox .small-quarter-left-space,html.no-flexboxlegacy .quarter-left-space,html.no-flexboxlegacy .small-quarter-left-space{margin-left:.3125em}html.no-flexbox .quarter-left-padding,html.no-flexbox .small-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding,html.no-flexboxlegacy .small-quarter-left-padding{padding-left:.3125em}html.no-flexbox .hide-small,html.no-flexboxlegacy .hide-small{display:none!important}html.no-flexbox .show-small,html.no-flexboxlegacy .show-small{display:inherit!important}html.no-flexbox table.show-small,html.no-flexboxlegacy table.show-small{display:table}html.no-flexbox thead.show-small,html.no-flexboxlegacy thead.show-small{display:table-header-group}html.no-flexbox tbody.show-small,html.no-flexboxlegacy tbody.show-small{display:table-row-group}html.no-flexbox tfoot.show-small,html.no-flexboxlegacy tfoot.show-small{display:table-footer-group}html.no-flexbox tr.show-small,html.no-flexboxlegacy tr.show-small{display:table-row}html.no-flexbox td.show-small,html.no-flexbox th.show-small,html.no-flexboxlegacy td.show-small,html.no-flexboxlegacy th.show-small{display:table-cell}}@media screen and (max-width:320px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 1em}html.no-flexbox .column-group>[class*=tiny-],html.no-flexboxlegacy .column-group>[class*=tiny-]{float:left;clear:none}html.no-flexbox .tiny-5,html.no-flexboxlegacy .tiny-5{width:5%}html.no-flexbox .tiny-10,html.no-flexboxlegacy .tiny-10{width:10%}html.no-flexbox .tiny-15,html.no-flexboxlegacy .tiny-15{width:15%}html.no-flexbox .tiny-16,html.no-flexboxlegacy .tiny-16{width:16.66%}html.no-flexbox .tiny-20,html.no-flexboxlegacy .tiny-20{width:20%}html.no-flexbox .tiny-25,html.no-flexboxlegacy .tiny-25{width:25%}html.no-flexbox .tiny-30,html.no-flexboxlegacy .tiny-30{width:30%}html.no-flexbox .tiny-33,html.no-flexboxlegacy .tiny-33{width:33.33%}html.no-flexbox .tiny-35,html.no-flexboxlegacy .tiny-35{width:35%}html.no-flexbox .tiny-40,html.no-flexboxlegacy .tiny-40{width:40%}html.no-flexbox .tiny-45,html.no-flexboxlegacy .tiny-45{width:45%}html.no-flexbox .tiny-50,html.no-flexboxlegacy .tiny-50{width:50%}html.no-flexbox .tiny-55,html.no-flexboxlegacy .tiny-55{width:55%}html.no-flexbox .tiny-60,html.no-flexboxlegacy .tiny-60{width:60%}html.no-flexbox .tiny-65,html.no-flexboxlegacy .tiny-65{width:65%}html.no-flexbox .tiny-66,html.no-flexboxlegacy .tiny-66{width:66.66%}html.no-flexbox .tiny-70,html.no-flexboxlegacy .tiny-70{width:70%}html.no-flexbox .tiny-75,html.no-flexboxlegacy .tiny-75{width:75%}html.no-flexbox .tiny-80,html.no-flexboxlegacy .tiny-80{width:80%}html.no-flexbox .tiny-85,html.no-flexboxlegacy .tiny-85{width:85%}html.no-flexbox .tiny-90,html.no-flexboxlegacy .tiny-90{width:90%}html.no-flexbox .tiny-95,html.no-flexboxlegacy .tiny-95{width:95%}html.no-flexbox .tiny-100,html.no-flexboxlegacy .tiny-100{width:100%}html.no-flexbox [class*=tiny-100],html.no-flexboxlegacy [class*=tiny-100]{float:none;clear:both}html.no-flexbox .column-group,html.no-flexboxlegacy .column-group{*zoom:1}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-1em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-1em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=tiny-]{padding-left:1em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=tiny-]{margin-bottom:1em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-2em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-2em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=tiny-]{padding-left:2em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-.5em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-.5em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.25em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.25em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}html.no-flexbox .column-group.tiny-gutters,html.no-flexboxlegacy .column-group.tiny-gutters{margin-left:-1em}html.no-flexbox .column-group.tiny-gutters>[class*=all-],html.no-flexbox .column-group.tiny-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}html.no-flexbox .column-group.tiny-horizontal-gutters,html.no-flexboxlegacy .column-group.tiny-horizontal-gutters{margin-left:-1em}html.no-flexbox .column-group.tiny-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.tiny-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-horizontal-gutters>[class*=tiny-]{padding-left:1em}html.no-flexbox .column-group.tiny-vertical-gutters>[class*=all-],html.no-flexbox .column-group.tiny-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-vertical-gutters>[class*=tiny-]{margin-bottom:1em}html.no-flexbox .column-group.tiny-double-gutters,html.no-flexboxlegacy .column-group.tiny-double-gutters{margin-left:-2em}html.no-flexbox .column-group.tiny-double-gutters>[class*=all-],html.no-flexbox .column-group.tiny-double-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}html.no-flexbox .column-group.tiny-double-horizontal-gutters,html.no-flexboxlegacy .column-group.tiny-double-horizontal-gutters{margin-left:-2em}html.no-flexbox .column-group.tiny-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.tiny-double-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-double-horizontal-gutters>[class*=tiny-]{padding-left:2em}html.no-flexbox .column-group.tiny-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.tiny-double-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}html.no-flexbox .column-group.tiny-half-gutters,html.no-flexboxlegacy .column-group.tiny-half-gutters{margin-left:-.5em}html.no-flexbox .column-group.tiny-half-gutters>[class*=all-],html.no-flexbox .column-group.tiny-half-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}html.no-flexbox .column-group.tiny-half-horizontal-gutters,html.no-flexboxlegacy .column-group.tiny-half-horizontal-gutters{margin-left:-.5em}html.no-flexbox .column-group.tiny-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.tiny-half-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}html.no-flexbox .column-group.tiny-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.tiny-half-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}html.no-flexbox .column-group.tiny-quarter-gutters,html.no-flexboxlegacy .column-group.tiny-quarter-gutters{margin-left:-.25em}html.no-flexbox .column-group.tiny-quarter-gutters>[class*=all-],html.no-flexbox .column-group.tiny-quarter-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}html.no-flexbox .column-group.tiny-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.tiny-quarter-horizontal-gutters{margin-left:-.25em}html.no-flexbox .column-group.tiny-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.tiny-quarter-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}html.no-flexbox .column-group.tiny-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.tiny-quarter-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}html.no-flexbox .column-group.tiny-no-gutters,html.no-flexboxlegacy .column-group.tiny-no-gutters{margin-left:0}html.no-flexbox .column-group.tiny-no-gutters>[class*=all-],html.no-flexbox .column-group.tiny-no-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-no-gutters>[class*=tiny-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=tiny-],html.no-flexbox .ink-table td[class*=tiny-],html.no-flexbox .ink-table tfoot[class*=tiny-],html.no-flexbox .ink-table th[class*=tiny-],html.no-flexbox .ink-table thead[class*=tiny-],html.no-flexbox .ink-table tr[class*=tiny-],html.no-flexboxlegacy .ink-table tbody[class*=tiny-],html.no-flexboxlegacy .ink-table td[class*=tiny-],html.no-flexboxlegacy .ink-table tfoot[class*=tiny-],html.no-flexboxlegacy .ink-table th[class*=tiny-],html.no-flexboxlegacy .ink-table thead[class*=tiny-],html.no-flexboxlegacy .ink-table tr[class*=tiny-]{float:none}html.no-flexbox .tiny-push-left,html.no-flexboxlegacy .tiny-push-left{float:left}html.no-flexbox .tiny-push-center,html.no-flexboxlegacy .tiny-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .tiny-push-right,html.no-flexboxlegacy .tiny-push-right{float:right}html.no-flexbox .tiny-align-left,html.no-flexboxlegacy .tiny-align-left{text-align:left}html.no-flexbox .tiny-align-center,html.no-flexboxlegacy .tiny-align-center{text-align:center}html.no-flexbox .tiny-align-right,html.no-flexboxlegacy .tiny-align-right{text-align:right}html.no-flexbox .tiny-no-margin,html.no-flexboxlegacy .tiny-no-margin{margin:0!important}html.no-flexbox .space,html.no-flexbox .tiny-space,html.no-flexboxlegacy .space,html.no-flexboxlegacy .tiny-space{margin:1em}html.no-flexbox .padding,html.no-flexbox .tiny-padding,html.no-flexboxlegacy .padding,html.no-flexboxlegacy .tiny-padding{padding:1em}html.no-flexbox .double-space,html.no-flexbox .tiny-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .tiny-double-space{margin:2em}html.no-flexbox .double-padding,html.no-flexbox .tiny-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .tiny-double-padding{padding:2em}html.no-flexbox .half-space,html.no-flexbox .tiny-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .tiny-half-space{margin:.5em}html.no-flexbox .half-padding,html.no-flexbox .tiny-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .tiny-half-padding{padding:.5em}html.no-flexbox .quarter-space,html.no-flexbox .tiny-quarter-space,html.no-flexboxlegacy .quarter-space,html.no-flexboxlegacy .tiny-quarter-space{margin:.25em}html.no-flexbox .quarter-padding,html.no-flexbox .tiny-quarter-padding,html.no-flexboxlegacy .quarter-padding,html.no-flexboxlegacy .tiny-quarter-padding{padding:.25em}html.no-flexbox .tiny-vertical-space,html.no-flexbox .vertical-space,html.no-flexboxlegacy .tiny-vertical-space,html.no-flexboxlegacy .vertical-space{margin-top:1em;margin-bottom:1em}html.no-flexbox .tiny-vertical-padding,html.no-flexbox .vertical-padding,html.no-flexboxlegacy .tiny-vertical-padding,html.no-flexboxlegacy .vertical-padding{padding-top:1em;padding-bottom:1em}html.no-flexbox .double-vertical-space,html.no-flexbox .tiny-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .tiny-double-vertical-space{margin-top:2em;margin-bottom:2em}html.no-flexbox .double-vertical-padding,html.no-flexbox .tiny-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .tiny-double-vertical-padding{padding-top:2em;padding-bottom:2em}html.no-flexbox .half-vertical-space,html.no-flexbox .tiny-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .tiny-half-vertical-space{margin-top:.5em;margin-bottom:.5em}html.no-flexbox .half-vertical-padding,html.no-flexbox .tiny-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .tiny-half-vertical-padding{padding-top:.5em;padding-bottom:.5em}html.no-flexbox .quarter-vertical-space,html.no-flexbox .tiny-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space,html.no-flexboxlegacy .tiny-quarter-vertical-space{margin-top:.25em;margin-bottom:.25em}html.no-flexbox .quarter-vertical-padding,html.no-flexbox .tiny-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding,html.no-flexboxlegacy .tiny-quarter-vertical-padding{padding-top:.25em;padding-bottom:.25em}html.no-flexbox .horizontal-space,html.no-flexbox .tiny-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .tiny-horizontal-space{margin-left:1em;margin-right:1em}html.no-flexbox .horizontal-padding,html.no-flexbox .tiny-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .tiny-horizontal-padding{padding-left:1em;padding-right:1em}html.no-flexbox .double-horizontal-space,html.no-flexbox .tiny-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .tiny-double-horizontal-space{margin-left:2em;margin-right:2em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .tiny-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .tiny-double-horizontal-padding{padding-left:2em;padding-right:2em}html.no-flexbox .half-horizontal-space,html.no-flexbox .tiny-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .tiny-half-horizontal-space{margin-left:.5em;margin-right:.5em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .tiny-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .tiny-half-horizontal-padding{padding-left:.5em;padding-right:.5em}html.no-flexbox .quarter-horizontal-space,html.no-flexbox .tiny-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space,html.no-flexboxlegacy .tiny-quarter-horizontal-space{margin-left:.25em;margin-right:.25em}html.no-flexbox .quarter-horizontal-padding,html.no-flexbox .tiny-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding,html.no-flexboxlegacy .tiny-quarter-horizontal-padding{padding-left:.25em;padding-right:.25em}html.no-flexbox .tiny-top-space,html.no-flexbox .top-space,html.no-flexboxlegacy .tiny-top-space,html.no-flexboxlegacy .top-space{margin-top:1em}html.no-flexbox .tiny-top-padding,html.no-flexbox .top-padding,html.no-flexboxlegacy .tiny-top-padding,html.no-flexboxlegacy .top-padding{padding-top:1em}html.no-flexbox .double-top-space,html.no-flexbox .tiny-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .tiny-double-top-space{margin-top:2em}html.no-flexbox .double-top-padding,html.no-flexbox .tiny-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .tiny-double-top-padding{padding-top:2em}html.no-flexbox .half-top-space,html.no-flexbox .tiny-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .tiny-half-top-space{margin-top:.5em}html.no-flexbox .half-top-padding,html.no-flexbox .tiny-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .tiny-half-top-padding{padding-top:.5em}html.no-flexbox .quarter-top-space,html.no-flexbox .tiny-quarter-top-space,html.no-flexboxlegacy .quarter-top-space,html.no-flexboxlegacy .tiny-quarter-top-space{margin-top:.25em}html.no-flexbox .quarter-top-padding,html.no-flexbox .tiny-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding,html.no-flexboxlegacy .tiny-quarter-top-padding{padding-top:.25em}html.no-flexbox .right-space,html.no-flexbox .tiny-right-space,html.no-flexboxlegacy .right-space,html.no-flexboxlegacy .tiny-right-space{margin-right:1em}html.no-flexbox .right-padding,html.no-flexbox .tiny-right-padding,html.no-flexboxlegacy .right-padding,html.no-flexboxlegacy .tiny-right-padding{padding-right:1em}html.no-flexbox .double-right-space,html.no-flexbox .tiny-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .tiny-double-right-space{margin-right:2em}html.no-flexbox .double-right-padding,html.no-flexbox .tiny-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .tiny-double-right-padding{padding-right:2em}html.no-flexbox .half-right-space,html.no-flexbox .tiny-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .tiny-half-right-space{margin-right:.5em}html.no-flexbox .half-right-padding,html.no-flexbox .tiny-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .tiny-half-right-padding{padding-right:.5em}html.no-flexbox .quarter-right-space,html.no-flexbox .tiny-quarter-right-space,html.no-flexboxlegacy .quarter-right-space,html.no-flexboxlegacy .tiny-quarter-right-space{margin-right:.25em}html.no-flexbox .quarter-right-padding,html.no-flexbox .tiny-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding,html.no-flexboxlegacy .tiny-quarter-right-padding{padding-right:.25em}html.no-flexbox .bottom-space,html.no-flexbox .tiny-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .tiny-bottom-space{margin-bottom:1em}html.no-flexbox .bottom-padding,html.no-flexbox .tiny-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .tiny-bottom-padding{padding-bottom:1em}html.no-flexbox .double-bottom-space,html.no-flexbox .tiny-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .tiny-double-bottom-space{margin-bottom:2em}html.no-flexbox .double-bottom-padding,html.no-flexbox .tiny-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .tiny-double-bottom-padding{padding-bottom:2em}html.no-flexbox .half-bottom-space,html.no-flexbox .tiny-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .tiny-half-bottom-space{margin-bottom:.5em}html.no-flexbox .half-bottom-padding,html.no-flexbox .tiny-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .tiny-half-bottom-padding{padding-bottom:.5em}html.no-flexbox .quarter-bottom-space,html.no-flexbox .tiny-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space,html.no-flexboxlegacy .tiny-quarter-bottom-space{margin-bottom:.25em}html.no-flexbox .quarter-bottom-padding,html.no-flexbox .tiny-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding,html.no-flexboxlegacy .tiny-quarter-bottom-padding{padding-bottom:.25em}html.no-flexbox .left-space,html.no-flexbox .tiny-left-space,html.no-flexboxlegacy .left-space,html.no-flexboxlegacy .tiny-left-space{margin-left:1em}html.no-flexbox .left-padding,html.no-flexbox .tiny-left-padding,html.no-flexboxlegacy .left-padding,html.no-flexboxlegacy .tiny-left-padding{padding-left:1em}html.no-flexbox .double-left-space,html.no-flexbox .tiny-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .tiny-double-left-space{margin-left:2em}html.no-flexbox .double-left-padding,html.no-flexbox .tiny-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .tiny-double-left-padding{padding-left:2em}html.no-flexbox .half-left-space,html.no-flexbox .tiny-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .tiny-half-left-space{margin-left:.5em}html.no-flexbox .half-left-padding,html.no-flexbox .tiny-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .tiny-half-left-padding{padding-left:.5em}html.no-flexbox .quarter-left-space,html.no-flexbox .tiny-quarter-left-space,html.no-flexboxlegacy .quarter-left-space,html.no-flexboxlegacy .tiny-quarter-left-space{margin-left:.25em}html.no-flexbox .quarter-left-padding,html.no-flexbox .tiny-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding,html.no-flexboxlegacy .tiny-quarter-left-padding{padding-left:.25em}html.no-flexbox .hide-tiny,html.no-flexboxlegacy .hide-tiny{display:none!important}html.no-flexbox .show-tiny,html.no-flexboxlegacy .show-tiny{display:inherit!important}html.no-flexbox table.show-tiny,html.no-flexboxlegacy table.show-tiny{display:table}html.no-flexbox thead.show-tiny,html.no-flexboxlegacy thead.show-tiny{display:table-header-group}html.no-flexbox tbody.show-tiny,html.no-flexboxlegacy tbody.show-tiny{display:table-row-group}html.no-flexbox tfoot.show-tiny,html.no-flexboxlegacy tfoot.show-tiny{display:table-footer-group}html.no-flexbox tr.show-tiny,html.no-flexboxlegacy tr.show-tiny{display:table-row}html.no-flexbox td.show-tiny,html.no-flexbox th.show-tiny,html.no-flexboxlegacy td.show-tiny,html.no-flexboxlegacy th.show-tiny{display:table-cell}}html.no-flexbox:after,html.no-flexboxlegacy:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}html.no-flexbox .ink-carousel,html.no-flexboxlegacy .ink-carousel{width:100%;position:relative;overflow:hidden;display:block}html.no-flexbox .ink-carousel .stage,html.no-flexboxlegacy .ink-carousel .stage{width:100%;left:0;height:auto!important;margin-top:0;margin-bottom:0;padding-left:0;list-style-type:none;white-space:nowrap;position:relative;-webkit-transition:left .5s ease;-moz-transition:left .5s ease;-o-transition:left .5s ease;transition:left .5s ease}html.no-flexbox .ink-carousel .stage .slide,html.no-flexboxlegacy .ink-carousel .stage .slide{position:relative;display:inline-block;vertical-align:top;white-space:normal;margin:0;float:none;zoom:1;*display:inline}html.no-flexbox .ink-carousel .ink-navigation,html.no-flexboxlegacy .ink-carousel .ink-navigation{position:static}@media print{*{background:transparent!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.ink-navigation{display:none}.ink-table{border-collapse:collapse}.ink-label{border:1px solid #000}} +.show-all{display:inherit}.hide-all{display:none!important}.no-margin{margin:0!important}.no-margin-top{margin-top:0!important}.no-margin-bottom{margin-bottom:0!important}.no-padding{padding:0!important}.push-left{float:left}.push-center{float:none!important;margin-left:auto;margin-right:auto}.push-right{float:right;-webkit-justify-content:flex-end;-moz-justify-content:flex-end;justify-content:flex-end}.align-left{text-align:left}.align-center{text-align:center}.align-right{text-align:right}.clearfix{overflow:hidden;*zoom:1}.clearfix:after{content:"";display:table;clear:both}html.no-flexbox,html.no-flexboxlegacy{font-size:.97em}html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{width:auto;max-width:1440px;margin:0 auto}html.no-flexbox .all-5,html.no-flexboxlegacy .all-5{width:5%;float:left;clear:none}html.no-flexbox .all-10,html.no-flexboxlegacy .all-10{width:10%;float:left;clear:none}html.no-flexbox .all-15,html.no-flexboxlegacy .all-15{width:15%;float:left;clear:none}html.no-flexbox .all-16,html.no-flexboxlegacy .all-16{width:16.66%;float:left;clear:none}html.no-flexbox .all-20,html.no-flexboxlegacy .all-20{width:20%;float:left;clear:none}html.no-flexbox .all-25,html.no-flexboxlegacy .all-25{width:25%;float:left;clear:none}html.no-flexbox .all-30,html.no-flexboxlegacy .all-30{width:30%;float:left;clear:none}html.no-flexbox .all-33,html.no-flexboxlegacy .all-33{width:33.33%;float:left;clear:none}html.no-flexbox .all-35,html.no-flexboxlegacy .all-35{width:35%;float:left;clear:none}html.no-flexbox .all-40,html.no-flexboxlegacy .all-40{width:40%;float:left;clear:none}html.no-flexbox .all-45,html.no-flexboxlegacy .all-45{width:45%;float:left;clear:none}html.no-flexbox .all-50,html.no-flexboxlegacy .all-50{width:50%;float:left;clear:none}html.no-flexbox .all-55,html.no-flexboxlegacy .all-55{width:55%;float:left;clear:none}html.no-flexbox .all-60,html.no-flexboxlegacy .all-60{width:60%;float:left;clear:none}html.no-flexbox .all-65,html.no-flexboxlegacy .all-65{width:65%;float:left;clear:none}html.no-flexbox .all-66,html.no-flexboxlegacy .all-66{width:66.66%;float:left;clear:none}html.no-flexbox .all-70,html.no-flexboxlegacy .all-70{width:70%;float:left;clear:none}html.no-flexbox .all-75,html.no-flexboxlegacy .all-75{width:75%;float:left;clear:none}html.no-flexbox .all-80,html.no-flexboxlegacy .all-80{width:80%;float:left;clear:none}html.no-flexbox .all-85,html.no-flexboxlegacy .all-85{width:85%;float:left;clear:none}html.no-flexbox .all-90,html.no-flexboxlegacy .all-90{width:90%;float:left;clear:none}html.no-flexbox .all-95,html.no-flexboxlegacy .all-95{width:95%;float:left;clear:none}html.no-flexbox .all-100,html.no-flexboxlegacy .all-100{width:100%;float:left;clear:none}html.no-flexbox [class~=all-100],html.no-flexboxlegacy [class~=all-100]{float:none;clear:both}@media screen and (min-width:1261px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 2em}html.no-flexbox .column-group>[class*=xlarge-],html.no-flexboxlegacy .column-group>[class*=xlarge-]{float:left;clear:none}html.no-flexbox .xlarge-5,html.no-flexboxlegacy .xlarge-5{width:5%}html.no-flexbox .xlarge-10,html.no-flexboxlegacy .xlarge-10{width:10%}html.no-flexbox .xlarge-15,html.no-flexboxlegacy .xlarge-15{width:15%}html.no-flexbox .xlarge-16,html.no-flexboxlegacy .xlarge-16{width:16.66%}html.no-flexbox .xlarge-20,html.no-flexboxlegacy .xlarge-20{width:20%}html.no-flexbox .xlarge-25,html.no-flexboxlegacy .xlarge-25{width:25%}html.no-flexbox .xlarge-30,html.no-flexboxlegacy .xlarge-30{width:30%}html.no-flexbox .xlarge-33,html.no-flexboxlegacy .xlarge-33{width:33.33%}html.no-flexbox .xlarge-35,html.no-flexboxlegacy .xlarge-35{width:35%}html.no-flexbox .xlarge-40,html.no-flexboxlegacy .xlarge-40{width:40%}html.no-flexbox .xlarge-45,html.no-flexboxlegacy .xlarge-45{width:45%}html.no-flexbox .xlarge-50,html.no-flexboxlegacy .xlarge-50{width:50%}html.no-flexbox .xlarge-55,html.no-flexboxlegacy .xlarge-55{width:55%}html.no-flexbox .xlarge-60,html.no-flexboxlegacy .xlarge-60{width:60%}html.no-flexbox .xlarge-65,html.no-flexboxlegacy .xlarge-65{width:65%}html.no-flexbox .xlarge-66,html.no-flexboxlegacy .xlarge-66{width:66.66%}html.no-flexbox .xlarge-70,html.no-flexboxlegacy .xlarge-70{width:70%}html.no-flexbox .xlarge-75,html.no-flexboxlegacy .xlarge-75{width:75%}html.no-flexbox .xlarge-80,html.no-flexboxlegacy .xlarge-80{width:80%}html.no-flexbox .xlarge-85,html.no-flexboxlegacy .xlarge-85{width:85%}html.no-flexbox .xlarge-90,html.no-flexboxlegacy .xlarge-90{width:90%}html.no-flexbox .xlarge-95,html.no-flexboxlegacy .xlarge-95{width:95%}html.no-flexbox .xlarge-100,html.no-flexboxlegacy .xlarge-100{width:100%}html.no-flexbox [class*=xlarge-100],html.no-flexboxlegacy [class*=xlarge-100]{float:none;clear:both}html.no-flexbox .column-group,html.no-flexboxlegacy .column-group{*zoom:1}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-2em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-2em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=xlarge-]{padding-left:2em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=xlarge-]{margin-bottom:2em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-4em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-4em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-1em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-1em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.5em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.5em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}html.no-flexbox .column-group.xlarge-gutters,html.no-flexboxlegacy .column-group.xlarge-gutters{margin-left:-2em}html.no-flexbox .column-group.xlarge-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}html.no-flexbox .column-group.xlarge-horizontal-gutters,html.no-flexboxlegacy .column-group.xlarge-horizontal-gutters{margin-left:-2em}html.no-flexbox .column-group.xlarge-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-horizontal-gutters>[class*=xlarge-]{padding-left:2em}html.no-flexbox .column-group.xlarge-vertical-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-vertical-gutters>[class*=xlarge-]{margin-bottom:2em}html.no-flexbox .column-group.xlarge-double-gutters,html.no-flexboxlegacy .column-group.xlarge-double-gutters{margin-left:-4em}html.no-flexbox .column-group.xlarge-double-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-double-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}html.no-flexbox .column-group.xlarge-double-horizontal-gutters,html.no-flexboxlegacy .column-group.xlarge-double-horizontal-gutters{margin-left:-4em}html.no-flexbox .column-group.xlarge-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-double-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}html.no-flexbox .column-group.xlarge-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-double-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}html.no-flexbox .column-group.xlarge-half-gutters,html.no-flexboxlegacy .column-group.xlarge-half-gutters{margin-left:-1em}html.no-flexbox .column-group.xlarge-half-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-half-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}html.no-flexbox .column-group.xlarge-half-horizontal-gutters,html.no-flexboxlegacy .column-group.xlarge-half-horizontal-gutters{margin-left:-1em}html.no-flexbox .column-group.xlarge-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-half-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}html.no-flexbox .column-group.xlarge-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-half-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}html.no-flexbox .column-group.xlarge-quarter-gutters,html.no-flexboxlegacy .column-group.xlarge-quarter-gutters{margin-left:-.5em}html.no-flexbox .column-group.xlarge-quarter-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-quarter-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}html.no-flexbox .column-group.xlarge-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.xlarge-quarter-horizontal-gutters{margin-left:-.5em}html.no-flexbox .column-group.xlarge-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-quarter-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}html.no-flexbox .column-group.xlarge-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-quarter-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}html.no-flexbox .column-group.xlarge-no-gutters,html.no-flexboxlegacy .column-group.xlarge-no-gutters{margin-left:0}html.no-flexbox .column-group.xlarge-no-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-no-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-no-gutters>[class*=xlarge-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=xlarge-],html.no-flexbox .ink-table td[class*=xlarge-],html.no-flexbox .ink-table tfoot[class*=xlarge-],html.no-flexbox .ink-table th[class*=xlarge-],html.no-flexbox .ink-table thead[class*=xlarge-],html.no-flexbox .ink-table tr[class*=xlarge-],html.no-flexboxlegacy .ink-table tbody[class*=xlarge-],html.no-flexboxlegacy .ink-table td[class*=xlarge-],html.no-flexboxlegacy .ink-table tfoot[class*=xlarge-],html.no-flexboxlegacy .ink-table th[class*=xlarge-],html.no-flexboxlegacy .ink-table thead[class*=xlarge-],html.no-flexboxlegacy .ink-table tr[class*=xlarge-]{float:none}html.no-flexbox .xlarge-push-left,html.no-flexboxlegacy .xlarge-push-left{float:left}html.no-flexbox .xlarge-push-center,html.no-flexboxlegacy .xlarge-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .xlarge-push-right,html.no-flexboxlegacy .xlarge-push-right{float:right}html.no-flexbox .xlarge-align-left,html.no-flexboxlegacy .xlarge-align-left{text-align:left}html.no-flexbox .xlarge-align-center,html.no-flexboxlegacy .xlarge-align-center{text-align:center}html.no-flexbox .xlarge-align-right,html.no-flexboxlegacy .xlarge-align-right{text-align:right}html.no-flexbox .xlarge-no-margin,html.no-flexboxlegacy .xlarge-no-margin{margin:0!important}html.no-flexbox .space,html.no-flexbox .xlarge-space,html.no-flexboxlegacy .space,html.no-flexboxlegacy .xlarge-space{margin:2em}html.no-flexbox .padding,html.no-flexbox .xlarge-padding,html.no-flexboxlegacy .padding,html.no-flexboxlegacy .xlarge-padding{padding:2em}html.no-flexbox .double-space,html.no-flexbox .xlarge-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .xlarge-double-space{margin:4em}html.no-flexbox .double-padding,html.no-flexbox .xlarge-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .xlarge-double-padding{padding:4em}html.no-flexbox .half-space,html.no-flexbox .xlarge-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .xlarge-half-space{margin:1em}html.no-flexbox .half-padding,html.no-flexbox .xlarge-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .xlarge-half-padding{padding:1em}html.no-flexbox .quarter-space,html.no-flexbox .xlarge-quarter-space,html.no-flexboxlegacy .quarter-space,html.no-flexboxlegacy .xlarge-quarter-space{margin:.5em}html.no-flexbox .quarter-padding,html.no-flexbox .xlarge-quarter-padding,html.no-flexboxlegacy .quarter-padding,html.no-flexboxlegacy .xlarge-quarter-padding{padding:.5em}html.no-flexbox .vertical-space,html.no-flexbox .xlarge-vertical-space,html.no-flexboxlegacy .vertical-space,html.no-flexboxlegacy .xlarge-vertical-space{margin-top:2em;margin-bottom:2em}html.no-flexbox .vertical-padding,html.no-flexbox .xlarge-vertical-padding,html.no-flexboxlegacy .vertical-padding,html.no-flexboxlegacy .xlarge-vertical-padding{padding-top:2em;padding-bottom:2em}html.no-flexbox .double-vertical-space,html.no-flexbox .xlarge-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .xlarge-double-vertical-space{margin-top:4em;margin-bottom:4em}html.no-flexbox .double-vertical-padding,html.no-flexbox .xlarge-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .xlarge-double-vertical-padding{padding-top:4em;padding-bottom:4em}html.no-flexbox .half-vertical-space,html.no-flexbox .xlarge-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .xlarge-half-vertical-space{margin-top:1em;margin-bottom:1em}html.no-flexbox .half-vertical-padding,html.no-flexbox .xlarge-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .xlarge-half-vertical-padding{padding-top:1em;padding-bottom:1em}html.no-flexbox .quarter-vertical-space,html.no-flexbox .xlarge-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space,html.no-flexboxlegacy .xlarge-quarter-vertical-space{margin-top:.5em;margin-bottom:.5em}html.no-flexbox .quarter-vertical-padding,html.no-flexbox .xlarge-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding,html.no-flexboxlegacy .xlarge-quarter-vertical-padding{padding-top:.5em;padding-bottom:.5em}html.no-flexbox .horizontal-space,html.no-flexbox .xlarge-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .xlarge-horizontal-space{margin-left:2em;margin-right:2em}html.no-flexbox .horizontal-padding,html.no-flexbox .xlarge-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .xlarge-horizontal-padding{padding-left:2em;padding-right:2em}html.no-flexbox .double-horizontal-space,html.no-flexbox .xlarge-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .xlarge-double-horizontal-space{margin-left:4em;margin-right:4em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .xlarge-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .xlarge-double-horizontal-padding{padding-left:4em;padding-right:4em}html.no-flexbox .half-horizontal-space,html.no-flexbox .xlarge-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .xlarge-half-horizontal-space{margin-left:1em;margin-right:1em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .xlarge-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .xlarge-half-horizontal-padding{padding-left:1em;padding-right:1em}html.no-flexbox .quarter-horizontal-space,html.no-flexbox .xlarge-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space,html.no-flexboxlegacy .xlarge-quarter-horizontal-space{margin-left:.5em;margin-right:.5em}html.no-flexbox .quarter-horizontal-padding,html.no-flexbox .xlarge-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding,html.no-flexboxlegacy .xlarge-quarter-horizontal-padding{padding-left:.5em;padding-right:.5em}html.no-flexbox .top-space,html.no-flexbox .xlarge-top-space,html.no-flexboxlegacy .top-space,html.no-flexboxlegacy .xlarge-top-space{margin-top:2em}html.no-flexbox .top-padding,html.no-flexbox .xlarge-top-padding,html.no-flexboxlegacy .top-padding,html.no-flexboxlegacy .xlarge-top-padding{padding-top:2em}html.no-flexbox .double-top-space,html.no-flexbox .xlarge-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .xlarge-double-top-space{margin-top:4em}html.no-flexbox .double-top-padding,html.no-flexbox .xlarge-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .xlarge-double-top-padding{padding-top:4em}html.no-flexbox .half-top-space,html.no-flexbox .xlarge-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .xlarge-half-top-space{margin-top:1em}html.no-flexbox .half-top-padding,html.no-flexbox .xlarge-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .xlarge-half-top-padding{padding-top:1em}html.no-flexbox .quarter-top-space,html.no-flexbox .xlarge-quarter-top-space,html.no-flexboxlegacy .quarter-top-space,html.no-flexboxlegacy .xlarge-quarter-top-space{margin-top:.5em}html.no-flexbox .quarter-top-padding,html.no-flexbox .xlarge-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding,html.no-flexboxlegacy .xlarge-quarter-top-padding{padding-top:.5em}html.no-flexbox .right-space,html.no-flexbox .xlarge-right-space,html.no-flexboxlegacy .right-space,html.no-flexboxlegacy .xlarge-right-space{margin-right:2em}html.no-flexbox .right-padding,html.no-flexbox .xlarge-right-padding,html.no-flexboxlegacy .right-padding,html.no-flexboxlegacy .xlarge-right-padding{padding-right:2em}html.no-flexbox .double-right-space,html.no-flexbox .xlarge-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .xlarge-double-right-space{margin-right:4em}html.no-flexbox .double-right-padding,html.no-flexbox .xlarge-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .xlarge-double-right-padding{padding-right:4em}html.no-flexbox .half-right-space,html.no-flexbox .xlarge-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .xlarge-half-right-space{margin-right:1em}html.no-flexbox .half-right-padding,html.no-flexbox .xlarge-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .xlarge-half-right-padding{padding-right:1em}html.no-flexbox .quarter-right-space,html.no-flexbox .xlarge-quarter-right-space,html.no-flexboxlegacy .quarter-right-space,html.no-flexboxlegacy .xlarge-quarter-right-space{margin-right:.5em}html.no-flexbox .quarter-right-padding,html.no-flexbox .xlarge-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding,html.no-flexboxlegacy .xlarge-quarter-right-padding{padding-right:.5em}html.no-flexbox .bottom-space,html.no-flexbox .xlarge-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .xlarge-bottom-space{margin-bottom:2em}html.no-flexbox .bottom-padding,html.no-flexbox .xlarge-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .xlarge-bottom-padding{padding-bottom:2em}html.no-flexbox .double-bottom-space,html.no-flexbox .xlarge-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .xlarge-double-bottom-space{margin-bottom:4em}html.no-flexbox .double-bottom-padding,html.no-flexbox .xlarge-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .xlarge-double-bottom-padding{padding-bottom:4em}html.no-flexbox .half-bottom-space,html.no-flexbox .xlarge-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .xlarge-half-bottom-space{margin-bottom:1em}html.no-flexbox .half-bottom-padding,html.no-flexbox .xlarge-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .xlarge-half-bottom-padding{padding-bottom:1em}html.no-flexbox .quarter-bottom-space,html.no-flexbox .xlarge-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space,html.no-flexboxlegacy .xlarge-quarter-bottom-space{margin-bottom:.5em}html.no-flexbox .quarter-bottom-padding,html.no-flexbox .xlarge-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding,html.no-flexboxlegacy .xlarge-quarter-bottom-padding{padding-bottom:.5em}html.no-flexbox .left-space,html.no-flexbox .xlarge-left-space,html.no-flexboxlegacy .left-space,html.no-flexboxlegacy .xlarge-left-space{margin-left:2em}html.no-flexbox .left-padding,html.no-flexbox .xlarge-left-padding,html.no-flexboxlegacy .left-padding,html.no-flexboxlegacy .xlarge-left-padding{padding-left:2em}html.no-flexbox .double-left-space,html.no-flexbox .xlarge-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .xlarge-double-left-space{margin-left:4em}html.no-flexbox .double-left-padding,html.no-flexbox .xlarge-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .xlarge-double-left-padding{padding-left:4em}html.no-flexbox .half-left-space,html.no-flexbox .xlarge-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .xlarge-half-left-space{margin-left:1em}html.no-flexbox .half-left-padding,html.no-flexbox .xlarge-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .xlarge-half-left-padding{padding-left:1em}html.no-flexbox .quarter-left-space,html.no-flexbox .xlarge-quarter-left-space,html.no-flexboxlegacy .quarter-left-space,html.no-flexboxlegacy .xlarge-quarter-left-space{margin-left:.5em}html.no-flexbox .quarter-left-padding,html.no-flexbox .xlarge-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding,html.no-flexboxlegacy .xlarge-quarter-left-padding{padding-left:.5em}html.no-flexbox .hide-xlarge,html.no-flexboxlegacy .hide-xlarge{display:none!important}html.no-flexbox .show-xlarge,html.no-flexboxlegacy .show-xlarge{display:inherit!important}html.no-flexbox table.show-xlarge,html.no-flexboxlegacy table.show-xlarge{display:table}html.no-flexbox thead.show-xlarge,html.no-flexboxlegacy thead.show-xlarge{display:table-header-group}html.no-flexbox tbody.show-xlarge,html.no-flexboxlegacy tbody.show-xlarge{display:table-row-group}html.no-flexbox tfoot.show-xlarge,html.no-flexboxlegacy tfoot.show-xlarge{display:table-footer-group}html.no-flexbox tr.show-xlarge,html.no-flexboxlegacy tr.show-xlarge{display:table-row}html.no-flexbox td.show-xlarge,html.no-flexbox th.show-xlarge,html.no-flexboxlegacy td.show-xlarge,html.no-flexboxlegacy th.show-xlarge{display:table-cell}}@media screen and (min-width:961px) and (max-width:1260px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 1.75em}html.no-flexbox .column-group>[class*=large-],html.no-flexboxlegacy .column-group>[class*=large-]{float:left;clear:none}html.no-flexbox .large-5,html.no-flexboxlegacy .large-5{width:5%}html.no-flexbox .large-10,html.no-flexboxlegacy .large-10{width:10%}html.no-flexbox .large-15,html.no-flexboxlegacy .large-15{width:15%}html.no-flexbox .large-16,html.no-flexboxlegacy .large-16{width:16.66%}html.no-flexbox .large-20,html.no-flexboxlegacy .large-20{width:20%}html.no-flexbox .large-25,html.no-flexboxlegacy .large-25{width:25%}html.no-flexbox .large-30,html.no-flexboxlegacy .large-30{width:30%}html.no-flexbox .large-33,html.no-flexboxlegacy .large-33{width:33.33%}html.no-flexbox .large-35,html.no-flexboxlegacy .large-35{width:35%}html.no-flexbox .large-40,html.no-flexboxlegacy .large-40{width:40%}html.no-flexbox .large-45,html.no-flexboxlegacy .large-45{width:45%}html.no-flexbox .large-50,html.no-flexboxlegacy .large-50{width:50%}html.no-flexbox .large-55,html.no-flexboxlegacy .large-55{width:55%}html.no-flexbox .large-60,html.no-flexboxlegacy .large-60{width:60%}html.no-flexbox .large-65,html.no-flexboxlegacy .large-65{width:65%}html.no-flexbox .large-66,html.no-flexboxlegacy .large-66{width:66.66%}html.no-flexbox .large-70,html.no-flexboxlegacy .large-70{width:70%}html.no-flexbox .large-75,html.no-flexboxlegacy .large-75{width:75%}html.no-flexbox .large-80,html.no-flexboxlegacy .large-80{width:80%}html.no-flexbox .large-85,html.no-flexboxlegacy .large-85{width:85%}html.no-flexbox .large-90,html.no-flexboxlegacy .large-90{width:90%}html.no-flexbox .large-95,html.no-flexboxlegacy .large-95{width:95%}html.no-flexbox .large-100,html.no-flexboxlegacy .large-100{width:100%}html.no-flexbox [class*=large-100],html.no-flexboxlegacy [class*=large-100]{float:none;clear:both}html.no-flexbox .column-group,html.no-flexboxlegacy .column-group{*zoom:1}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-1.75em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=large-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-1.75em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=large-]{padding-left:1.75em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=large-]{margin-bottom:1.75em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-3.5em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=large-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-3.5em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=large-]{padding-left:3.5em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-.875em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=large-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-.875em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=large-]{padding-left:.875em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=large-]{margin-bottom:.875em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.4375em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=large-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.4375em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}html.no-flexbox .column-group.large-gutters,html.no-flexboxlegacy .column-group.large-gutters{margin-left:-1.75em}html.no-flexbox .column-group.large-gutters>[class*=all-],html.no-flexbox .column-group.large-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}html.no-flexbox .column-group.large-horizontal-gutters,html.no-flexboxlegacy .column-group.large-horizontal-gutters{margin-left:-1.75em}html.no-flexbox .column-group.large-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.large-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-horizontal-gutters>[class*=large-]{padding-left:1.75em}html.no-flexbox .column-group.large-vertical-gutters>[class*=all-],html.no-flexbox .column-group.large-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-vertical-gutters>[class*=large-]{margin-bottom:1.75em}html.no-flexbox .column-group.large-double-gutters,html.no-flexboxlegacy .column-group.large-double-gutters{margin-left:-3.5em}html.no-flexbox .column-group.large-double-gutters>[class*=all-],html.no-flexbox .column-group.large-double-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}html.no-flexbox .column-group.large-double-horizontal-gutters,html.no-flexboxlegacy .column-group.large-double-horizontal-gutters{margin-left:-3.5em}html.no-flexbox .column-group.large-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.large-double-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-double-horizontal-gutters>[class*=large-]{padding-left:3.5em}html.no-flexbox .column-group.large-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.large-double-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}html.no-flexbox .column-group.large-half-gutters,html.no-flexboxlegacy .column-group.large-half-gutters{margin-left:-.875em}html.no-flexbox .column-group.large-half-gutters>[class*=all-],html.no-flexbox .column-group.large-half-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}html.no-flexbox .column-group.large-half-horizontal-gutters,html.no-flexboxlegacy .column-group.large-half-horizontal-gutters{margin-left:-.875em}html.no-flexbox .column-group.large-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.large-half-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-half-horizontal-gutters>[class*=large-]{padding-left:.875em}html.no-flexbox .column-group.large-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.large-half-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-half-vertical-gutters>[class*=large-]{margin-bottom:.875em}html.no-flexbox .column-group.large-quarter-gutters,html.no-flexboxlegacy .column-group.large-quarter-gutters{margin-left:-.4375em}html.no-flexbox .column-group.large-quarter-gutters>[class*=all-],html.no-flexbox .column-group.large-quarter-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}html.no-flexbox .column-group.large-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.large-quarter-horizontal-gutters{margin-left:-.4375em}html.no-flexbox .column-group.large-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.large-quarter-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}html.no-flexbox .column-group.large-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.large-quarter-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}html.no-flexbox .column-group.large-no-gutters,html.no-flexboxlegacy .column-group.large-no-gutters{margin-left:0}html.no-flexbox .column-group.large-no-gutters>[class*=all-],html.no-flexbox .column-group.large-no-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-no-gutters>[class*=large-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=large-],html.no-flexbox .ink-table td[class*=large-],html.no-flexbox .ink-table tfoot[class*=large-],html.no-flexbox .ink-table th[class*=large-],html.no-flexbox .ink-table thead[class*=large-],html.no-flexbox .ink-table tr[class*=large-],html.no-flexboxlegacy .ink-table tbody[class*=large-],html.no-flexboxlegacy .ink-table td[class*=large-],html.no-flexboxlegacy .ink-table tfoot[class*=large-],html.no-flexboxlegacy .ink-table th[class*=large-],html.no-flexboxlegacy .ink-table thead[class*=large-],html.no-flexboxlegacy .ink-table tr[class*=large-]{float:none}html.no-flexbox .large-push-left,html.no-flexboxlegacy .large-push-left{float:left}html.no-flexbox .large-push-center,html.no-flexboxlegacy .large-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .large-push-right,html.no-flexboxlegacy .large-push-right{float:right}html.no-flexbox .large-align-left,html.no-flexboxlegacy .large-align-left{text-align:left}html.no-flexbox .large-align-center,html.no-flexboxlegacy .large-align-center{text-align:center}html.no-flexbox .large-align-right,html.no-flexboxlegacy .large-align-right{text-align:right}html.no-flexbox .large-no-margin,html.no-flexboxlegacy .large-no-margin{margin:0!important}html.no-flexbox .large-space,html.no-flexbox .space,html.no-flexboxlegacy .large-space,html.no-flexboxlegacy .space{margin:1.75em}html.no-flexbox .large-padding,html.no-flexbox .padding,html.no-flexboxlegacy .large-padding,html.no-flexboxlegacy .padding{padding:1.75em}html.no-flexbox .double-space,html.no-flexbox .large-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .large-double-space{margin:3.5em}html.no-flexbox .double-padding,html.no-flexbox .large-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .large-double-padding{padding:3.5em}html.no-flexbox .half-space,html.no-flexbox .large-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .large-half-space{margin:.875em}html.no-flexbox .half-padding,html.no-flexbox .large-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .large-half-padding{padding:.875em}html.no-flexbox .large-quarter-space,html.no-flexbox .quarter-space,html.no-flexboxlegacy .large-quarter-space,html.no-flexboxlegacy .quarter-space{margin:.4375em}html.no-flexbox .large-quarter-padding,html.no-flexbox .quarter-padding,html.no-flexboxlegacy .large-quarter-padding,html.no-flexboxlegacy .quarter-padding{padding:.4375em}html.no-flexbox .large-vertical-space,html.no-flexbox .vertical-space,html.no-flexboxlegacy .large-vertical-space,html.no-flexboxlegacy .vertical-space{margin-top:1.75em;margin-bottom:1.75em}html.no-flexbox .large-vertical-padding,html.no-flexbox .vertical-padding,html.no-flexboxlegacy .large-vertical-padding,html.no-flexboxlegacy .vertical-padding{padding-top:1.75em;padding-bottom:1.75em}html.no-flexbox .double-vertical-space,html.no-flexbox .large-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .large-double-vertical-space{margin-top:3.5em;margin-bottom:3.5em}html.no-flexbox .double-vertical-padding,html.no-flexbox .large-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .large-double-vertical-padding{padding-top:3.5em;padding-bottom:3.5em}html.no-flexbox .half-vertical-space,html.no-flexbox .large-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .large-half-vertical-space{margin-top:.875em;margin-bottom:.875em}html.no-flexbox .half-vertical-padding,html.no-flexbox .large-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .large-half-vertical-padding{padding-top:.875em;padding-bottom:.875em}html.no-flexbox .large-quarter-vertical-space,html.no-flexbox .quarter-vertical-space,html.no-flexboxlegacy .large-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space{margin-top:.4375em;margin-bottom:.4375em}html.no-flexbox .large-quarter-vertical-padding,html.no-flexbox .quarter-vertical-padding,html.no-flexboxlegacy .large-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding{padding-top:.4375em;padding-bottom:.4375em}html.no-flexbox .horizontal-space,html.no-flexbox .large-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .large-horizontal-space{margin-left:1.75em;margin-right:1.75em}html.no-flexbox .horizontal-padding,html.no-flexbox .large-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .large-horizontal-padding{padding-left:1.75em;padding-right:1.75em}html.no-flexbox .double-horizontal-space,html.no-flexbox .large-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .large-double-horizontal-space{margin-left:3.5em;margin-right:3.5em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .large-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .large-double-horizontal-padding{padding-left:3.5em;padding-right:3.5em}html.no-flexbox .half-horizontal-space,html.no-flexbox .large-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .large-half-horizontal-space{margin-left:.875em;margin-right:.875em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .large-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .large-half-horizontal-padding{padding-left:.875em;padding-right:.875em}html.no-flexbox .large-quarter-horizontal-space,html.no-flexbox .quarter-horizontal-space,html.no-flexboxlegacy .large-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space{margin-left:.4375em;margin-right:.4375em}html.no-flexbox .large-quarter-horizontal-padding,html.no-flexbox .quarter-horizontal-padding,html.no-flexboxlegacy .large-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding{padding-left:.4375em;padding-right:.4375em}html.no-flexbox .large-top-space,html.no-flexbox .top-space,html.no-flexboxlegacy .large-top-space,html.no-flexboxlegacy .top-space{margin-top:1.75em}html.no-flexbox .large-top-padding,html.no-flexbox .top-padding,html.no-flexboxlegacy .large-top-padding,html.no-flexboxlegacy .top-padding{padding-top:1.75em}html.no-flexbox .double-top-space,html.no-flexbox .large-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .large-double-top-space{margin-top:3.5em}html.no-flexbox .double-top-padding,html.no-flexbox .large-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .large-double-top-padding{padding-top:3.5em}html.no-flexbox .half-top-space,html.no-flexbox .large-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .large-half-top-space{margin-top:.875em}html.no-flexbox .half-top-padding,html.no-flexbox .large-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .large-half-top-padding{padding-top:.875em}html.no-flexbox .large-quarter-top-space,html.no-flexbox .quarter-top-space,html.no-flexboxlegacy .large-quarter-top-space,html.no-flexboxlegacy .quarter-top-space{margin-top:.4375em}html.no-flexbox .large-quarter-top-padding,html.no-flexbox .quarter-top-padding,html.no-flexboxlegacy .large-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding{padding-top:.4375em}html.no-flexbox .large-right-space,html.no-flexbox .right-space,html.no-flexboxlegacy .large-right-space,html.no-flexboxlegacy .right-space{margin-right:1.75em}html.no-flexbox .large-right-padding,html.no-flexbox .right-padding,html.no-flexboxlegacy .large-right-padding,html.no-flexboxlegacy .right-padding{padding-right:1.75em}html.no-flexbox .double-right-space,html.no-flexbox .large-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .large-double-right-space{margin-right:3.5em}html.no-flexbox .double-right-padding,html.no-flexbox .large-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .large-double-right-padding{padding-right:3.5em}html.no-flexbox .half-right-space,html.no-flexbox .large-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .large-half-right-space{margin-right:.875em}html.no-flexbox .half-right-padding,html.no-flexbox .large-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .large-half-right-padding{padding-right:.875em}html.no-flexbox .large-quarter-right-space,html.no-flexbox .quarter-right-space,html.no-flexboxlegacy .large-quarter-right-space,html.no-flexboxlegacy .quarter-right-space{margin-right:.4375em}html.no-flexbox .large-quarter-right-padding,html.no-flexbox .quarter-right-padding,html.no-flexboxlegacy .large-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding{padding-right:.4375em}html.no-flexbox .bottom-space,html.no-flexbox .large-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .large-bottom-space{margin-bottom:1.75em}html.no-flexbox .bottom-padding,html.no-flexbox .large-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .large-bottom-padding{padding-bottom:1.75em}html.no-flexbox .double-bottom-space,html.no-flexbox .large-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .large-double-bottom-space{margin-bottom:3.5em}html.no-flexbox .double-bottom-padding,html.no-flexbox .large-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .large-double-bottom-padding{padding-bottom:3.5em}html.no-flexbox .half-bottom-space,html.no-flexbox .large-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .large-half-bottom-space{margin-bottom:.875em}html.no-flexbox .half-bottom-padding,html.no-flexbox .large-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .large-half-bottom-padding{padding-bottom:.875em}html.no-flexbox .large-quarter-bottom-space,html.no-flexbox .quarter-bottom-space,html.no-flexboxlegacy .large-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space{margin-bottom:.4375em}html.no-flexbox .large-quarter-bottom-padding,html.no-flexbox .quarter-bottom-padding,html.no-flexboxlegacy .large-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding{padding-bottom:.4375em}html.no-flexbox .large-left-space,html.no-flexbox .left-space,html.no-flexboxlegacy .large-left-space,html.no-flexboxlegacy .left-space{margin-left:1.75em}html.no-flexbox .large-left-padding,html.no-flexbox .left-padding,html.no-flexboxlegacy .large-left-padding,html.no-flexboxlegacy .left-padding{padding-left:1.75em}html.no-flexbox .double-left-space,html.no-flexbox .large-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .large-double-left-space{margin-left:3.5em}html.no-flexbox .double-left-padding,html.no-flexbox .large-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .large-double-left-padding{padding-left:3.5em}html.no-flexbox .half-left-space,html.no-flexbox .large-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .large-half-left-space{margin-left:.875em}html.no-flexbox .half-left-padding,html.no-flexbox .large-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .large-half-left-padding{padding-left:.875em}html.no-flexbox .large-quarter-left-space,html.no-flexbox .quarter-left-space,html.no-flexboxlegacy .large-quarter-left-space,html.no-flexboxlegacy .quarter-left-space{margin-left:.4375em}html.no-flexbox .large-quarter-left-padding,html.no-flexbox .quarter-left-padding,html.no-flexboxlegacy .large-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding{padding-left:.4375em}html.no-flexbox .hide-large,html.no-flexboxlegacy .hide-large{display:none!important}html.no-flexbox .show-large,html.no-flexboxlegacy .show-large{display:inherit!important}html.no-flexbox table.show-large,html.no-flexboxlegacy table.show-large{display:table}html.no-flexbox thead.show-large,html.no-flexboxlegacy thead.show-large{display:table-header-group}html.no-flexbox tbody.show-large,html.no-flexboxlegacy tbody.show-large{display:table-row-group}html.no-flexbox tfoot.show-large,html.no-flexboxlegacy tfoot.show-large{display:table-footer-group}html.no-flexbox tr.show-large,html.no-flexboxlegacy tr.show-large{display:table-row}html.no-flexbox td.show-large,html.no-flexbox th.show-large,html.no-flexboxlegacy td.show-large,html.no-flexboxlegacy th.show-large{display:table-cell}}@media screen and (min-width:641px) and (max-width:960px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 1.5em}html.no-flexbox .column-group>[class*=medium-],html.no-flexboxlegacy .column-group>[class*=medium-]{float:left;clear:none}html.no-flexbox .medium-5,html.no-flexboxlegacy .medium-5{width:5%}html.no-flexbox .medium-10,html.no-flexboxlegacy .medium-10{width:10%}html.no-flexbox .medium-15,html.no-flexboxlegacy .medium-15{width:15%}html.no-flexbox .medium-16,html.no-flexboxlegacy .medium-16{width:16.66%}html.no-flexbox .medium-20,html.no-flexboxlegacy .medium-20{width:20%}html.no-flexbox .medium-25,html.no-flexboxlegacy .medium-25{width:25%}html.no-flexbox .medium-30,html.no-flexboxlegacy .medium-30{width:30%}html.no-flexbox .medium-33,html.no-flexboxlegacy .medium-33{width:33.33%}html.no-flexbox .medium-35,html.no-flexboxlegacy .medium-35{width:35%}html.no-flexbox .medium-40,html.no-flexboxlegacy .medium-40{width:40%}html.no-flexbox .medium-45,html.no-flexboxlegacy .medium-45{width:45%}html.no-flexbox .medium-50,html.no-flexboxlegacy .medium-50{width:50%}html.no-flexbox .medium-55,html.no-flexboxlegacy .medium-55{width:55%}html.no-flexbox .medium-60,html.no-flexboxlegacy .medium-60{width:60%}html.no-flexbox .medium-65,html.no-flexboxlegacy .medium-65{width:65%}html.no-flexbox .medium-66,html.no-flexboxlegacy .medium-66{width:66.66%}html.no-flexbox .medium-70,html.no-flexboxlegacy .medium-70{width:70%}html.no-flexbox .medium-75,html.no-flexboxlegacy .medium-75{width:75%}html.no-flexbox .medium-80,html.no-flexboxlegacy .medium-80{width:80%}html.no-flexbox .medium-85,html.no-flexboxlegacy .medium-85{width:85%}html.no-flexbox .medium-90,html.no-flexboxlegacy .medium-90{width:90%}html.no-flexbox .medium-95,html.no-flexboxlegacy .medium-95{width:95%}html.no-flexbox .medium-100,html.no-flexboxlegacy .medium-100{width:100%}html.no-flexbox [class*=medium-100],html.no-flexboxlegacy [class*=medium-100]{float:none;clear:both}html.no-flexbox .column-group,html.no-flexboxlegacy .column-group{*zoom:1}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-1.5em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=medium-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-1.5em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=medium-]{padding-left:1.5em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=medium-]{margin-bottom:1.5em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-3em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-3em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=medium-]{padding-left:3em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=medium-]{margin-bottom:3em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-.75em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-.75em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=medium-]{padding-left:.75em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.375em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.375em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}html.no-flexbox .column-group.medium-gutters,html.no-flexboxlegacy .column-group.medium-gutters{margin-left:-1.5em}html.no-flexbox .column-group.medium-gutters>[class*=all-],html.no-flexbox .column-group.medium-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}html.no-flexbox .column-group.medium-horizontal-gutters,html.no-flexboxlegacy .column-group.medium-horizontal-gutters{margin-left:-1.5em}html.no-flexbox .column-group.medium-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.medium-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-horizontal-gutters>[class*=medium-]{padding-left:1.5em}html.no-flexbox .column-group.medium-vertical-gutters>[class*=all-],html.no-flexbox .column-group.medium-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-vertical-gutters>[class*=medium-]{margin-bottom:1.5em}html.no-flexbox .column-group.medium-double-gutters,html.no-flexboxlegacy .column-group.medium-double-gutters{margin-left:-3em}html.no-flexbox .column-group.medium-double-gutters>[class*=all-],html.no-flexbox .column-group.medium-double-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}html.no-flexbox .column-group.medium-double-horizontal-gutters,html.no-flexboxlegacy .column-group.medium-double-horizontal-gutters{margin-left:-3em}html.no-flexbox .column-group.medium-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.medium-double-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-double-horizontal-gutters>[class*=medium-]{padding-left:3em}html.no-flexbox .column-group.medium-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.medium-double-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-double-vertical-gutters>[class*=medium-]{margin-bottom:3em}html.no-flexbox .column-group.medium-half-gutters,html.no-flexboxlegacy .column-group.medium-half-gutters{margin-left:-.75em}html.no-flexbox .column-group.medium-half-gutters>[class*=all-],html.no-flexbox .column-group.medium-half-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}html.no-flexbox .column-group.medium-half-horizontal-gutters,html.no-flexboxlegacy .column-group.medium-half-horizontal-gutters{margin-left:-.75em}html.no-flexbox .column-group.medium-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.medium-half-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-half-horizontal-gutters>[class*=medium-]{padding-left:.75em}html.no-flexbox .column-group.medium-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.medium-half-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}html.no-flexbox .column-group.medium-quarter-gutters,html.no-flexboxlegacy .column-group.medium-quarter-gutters{margin-left:-.375em}html.no-flexbox .column-group.medium-quarter-gutters>[class*=all-],html.no-flexbox .column-group.medium-quarter-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}html.no-flexbox .column-group.medium-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.medium-quarter-horizontal-gutters{margin-left:-.375em}html.no-flexbox .column-group.medium-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.medium-quarter-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}html.no-flexbox .column-group.medium-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.medium-quarter-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}html.no-flexbox .column-group.medium-no-gutters,html.no-flexboxlegacy .column-group.medium-no-gutters{margin-left:0}html.no-flexbox .column-group.medium-no-gutters>[class*=all-],html.no-flexbox .column-group.medium-no-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-no-gutters>[class*=medium-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=medium-],html.no-flexbox .ink-table td[class*=medium-],html.no-flexbox .ink-table tfoot[class*=medium-],html.no-flexbox .ink-table th[class*=medium-],html.no-flexbox .ink-table thead[class*=medium-],html.no-flexbox .ink-table tr[class*=medium-],html.no-flexboxlegacy .ink-table tbody[class*=medium-],html.no-flexboxlegacy .ink-table td[class*=medium-],html.no-flexboxlegacy .ink-table tfoot[class*=medium-],html.no-flexboxlegacy .ink-table th[class*=medium-],html.no-flexboxlegacy .ink-table thead[class*=medium-],html.no-flexboxlegacy .ink-table tr[class*=medium-]{float:none}html.no-flexbox .medium-push-left,html.no-flexboxlegacy .medium-push-left{float:left}html.no-flexbox .medium-push-center,html.no-flexboxlegacy .medium-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .medium-push-right,html.no-flexboxlegacy .medium-push-right{float:right}html.no-flexbox .medium-align-left,html.no-flexboxlegacy .medium-align-left{text-align:left}html.no-flexbox .medium-align-center,html.no-flexboxlegacy .medium-align-center{text-align:center}html.no-flexbox .medium-align-right,html.no-flexboxlegacy .medium-align-right{text-align:right}html.no-flexbox .medium-no-margin,html.no-flexboxlegacy .medium-no-margin{margin:0!important}html.no-flexbox .medium-space,html.no-flexbox .space,html.no-flexboxlegacy .medium-space,html.no-flexboxlegacy .space{margin:1.5em}html.no-flexbox .medium-padding,html.no-flexbox .padding,html.no-flexboxlegacy .medium-padding,html.no-flexboxlegacy .padding{padding:1.5em}html.no-flexbox .double-space,html.no-flexbox .medium-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .medium-double-space{margin:3em}html.no-flexbox .double-padding,html.no-flexbox .medium-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .medium-double-padding{padding:3em}html.no-flexbox .half-space,html.no-flexbox .medium-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .medium-half-space{margin:.75em}html.no-flexbox .half-padding,html.no-flexbox .medium-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .medium-half-padding{padding:.75em}html.no-flexbox .medium-quarter-space,html.no-flexbox .quarter-space,html.no-flexboxlegacy .medium-quarter-space,html.no-flexboxlegacy .quarter-space{margin:.375em}html.no-flexbox .medium-quarter-padding,html.no-flexbox .quarter-padding,html.no-flexboxlegacy .medium-quarter-padding,html.no-flexboxlegacy .quarter-padding{padding:.375em}html.no-flexbox .medium-vertical-space,html.no-flexbox .vertical-space,html.no-flexboxlegacy .medium-vertical-space,html.no-flexboxlegacy .vertical-space{margin-top:1.5em;margin-bottom:1.5em}html.no-flexbox .medium-vertical-padding,html.no-flexbox .vertical-padding,html.no-flexboxlegacy .medium-vertical-padding,html.no-flexboxlegacy .vertical-padding{padding-top:1.5em;padding-bottom:1.5em}html.no-flexbox .double-vertical-space,html.no-flexbox .medium-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .medium-double-vertical-space{margin-top:3em;margin-bottom:3em}html.no-flexbox .double-vertical-padding,html.no-flexbox .medium-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .medium-double-vertical-padding{padding-top:3em;padding-bottom:3em}html.no-flexbox .half-vertical-space,html.no-flexbox .medium-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .medium-half-vertical-space{margin-top:.75em;margin-bottom:.75em}html.no-flexbox .half-vertical-padding,html.no-flexbox .medium-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .medium-half-vertical-padding{padding-top:.75em;padding-bottom:.75em}html.no-flexbox .medium-quarter-vertical-space,html.no-flexbox .quarter-vertical-space,html.no-flexboxlegacy .medium-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space{margin-top:.375em;margin-bottom:.375em}html.no-flexbox .medium-quarter-vertical-padding,html.no-flexbox .quarter-vertical-padding,html.no-flexboxlegacy .medium-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding{padding-top:.375em;padding-bottom:.375em}html.no-flexbox .horizontal-space,html.no-flexbox .medium-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .medium-horizontal-space{margin-left:1.5em;margin-right:1.5em}html.no-flexbox .horizontal-padding,html.no-flexbox .medium-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .medium-horizontal-padding{padding-left:1.5em;padding-right:1.5em}html.no-flexbox .double-horizontal-space,html.no-flexbox .medium-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .medium-double-horizontal-space{margin-left:3em;margin-right:3em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .medium-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .medium-double-horizontal-padding{padding-left:3em;padding-right:3em}html.no-flexbox .half-horizontal-space,html.no-flexbox .medium-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .medium-half-horizontal-space{margin-left:.75em;margin-right:.75em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .medium-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .medium-half-horizontal-padding{padding-left:.75em;padding-right:.75em}html.no-flexbox .medium-quarter-horizontal-space,html.no-flexbox .quarter-horizontal-space,html.no-flexboxlegacy .medium-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space{margin-left:.375em;margin-right:.375em}html.no-flexbox .medium-quarter-horizontal-padding,html.no-flexbox .quarter-horizontal-padding,html.no-flexboxlegacy .medium-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding{padding-left:.375em;padding-right:.375em}html.no-flexbox .medium-top-space,html.no-flexbox .top-space,html.no-flexboxlegacy .medium-top-space,html.no-flexboxlegacy .top-space{margin-top:1.5em}html.no-flexbox .medium-top-padding,html.no-flexbox .top-padding,html.no-flexboxlegacy .medium-top-padding,html.no-flexboxlegacy .top-padding{padding-top:1.5em}html.no-flexbox .double-top-space,html.no-flexbox .medium-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .medium-double-top-space{margin-top:3em}html.no-flexbox .double-top-padding,html.no-flexbox .medium-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .medium-double-top-padding{padding-top:3em}html.no-flexbox .half-top-space,html.no-flexbox .medium-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .medium-half-top-space{margin-top:.75em}html.no-flexbox .half-top-padding,html.no-flexbox .medium-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .medium-half-top-padding{padding-top:.75em}html.no-flexbox .medium-quarter-top-space,html.no-flexbox .quarter-top-space,html.no-flexboxlegacy .medium-quarter-top-space,html.no-flexboxlegacy .quarter-top-space{margin-top:.375em}html.no-flexbox .medium-quarter-top-padding,html.no-flexbox .quarter-top-padding,html.no-flexboxlegacy .medium-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding{padding-top:.375em}html.no-flexbox .medium-right-space,html.no-flexbox .right-space,html.no-flexboxlegacy .medium-right-space,html.no-flexboxlegacy .right-space{margin-right:1.5em}html.no-flexbox .medium-right-padding,html.no-flexbox .right-padding,html.no-flexboxlegacy .medium-right-padding,html.no-flexboxlegacy .right-padding{padding-right:1.5em}html.no-flexbox .double-right-space,html.no-flexbox .medium-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .medium-double-right-space{margin-right:3em}html.no-flexbox .double-right-padding,html.no-flexbox .medium-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .medium-double-right-padding{padding-right:3em}html.no-flexbox .half-right-space,html.no-flexbox .medium-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .medium-half-right-space{margin-right:.75em}html.no-flexbox .half-right-padding,html.no-flexbox .medium-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .medium-half-right-padding{padding-right:.75em}html.no-flexbox .medium-quarter-right-space,html.no-flexbox .quarter-right-space,html.no-flexboxlegacy .medium-quarter-right-space,html.no-flexboxlegacy .quarter-right-space{margin-right:.375em}html.no-flexbox .medium-quarter-right-padding,html.no-flexbox .quarter-right-padding,html.no-flexboxlegacy .medium-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding{padding-right:.375em}html.no-flexbox .bottom-space,html.no-flexbox .medium-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .medium-bottom-space{margin-bottom:1.5em}html.no-flexbox .bottom-padding,html.no-flexbox .medium-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .medium-bottom-padding{padding-bottom:1.5em}html.no-flexbox .double-bottom-space,html.no-flexbox .medium-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .medium-double-bottom-space{margin-bottom:3em}html.no-flexbox .double-bottom-padding,html.no-flexbox .medium-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .medium-double-bottom-padding{padding-bottom:3em}html.no-flexbox .half-bottom-space,html.no-flexbox .medium-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .medium-half-bottom-space{margin-bottom:.75em}html.no-flexbox .half-bottom-padding,html.no-flexbox .medium-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .medium-half-bottom-padding{padding-bottom:.75em}html.no-flexbox .medium-quarter-bottom-space,html.no-flexbox .quarter-bottom-space,html.no-flexboxlegacy .medium-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space{margin-bottom:.375em}html.no-flexbox .medium-quarter-bottom-padding,html.no-flexbox .quarter-bottom-padding,html.no-flexboxlegacy .medium-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding{padding-bottom:.375em}html.no-flexbox .left-space,html.no-flexbox .medium-left-space,html.no-flexboxlegacy .left-space,html.no-flexboxlegacy .medium-left-space{margin-left:1.5em}html.no-flexbox .left-padding,html.no-flexbox .medium-left-padding,html.no-flexboxlegacy .left-padding,html.no-flexboxlegacy .medium-left-padding{padding-left:1.5em}html.no-flexbox .double-left-space,html.no-flexbox .medium-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .medium-double-left-space{margin-left:3em}html.no-flexbox .double-left-padding,html.no-flexbox .medium-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .medium-double-left-padding{padding-left:3em}html.no-flexbox .half-left-space,html.no-flexbox .medium-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .medium-half-left-space{margin-left:.75em}html.no-flexbox .half-left-padding,html.no-flexbox .medium-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .medium-half-left-padding{padding-left:.75em}html.no-flexbox .medium-quarter-left-space,html.no-flexbox .quarter-left-space,html.no-flexboxlegacy .medium-quarter-left-space,html.no-flexboxlegacy .quarter-left-space{margin-left:.375em}html.no-flexbox .medium-quarter-left-padding,html.no-flexbox .quarter-left-padding,html.no-flexboxlegacy .medium-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding{padding-left:.375em}html.no-flexbox .hide-medium,html.no-flexboxlegacy .hide-medium{display:none!important}html.no-flexbox .show-medium,html.no-flexboxlegacy .show-medium{display:inherit!important}html.no-flexbox table.show-medium,html.no-flexboxlegacy table.show-medium{display:table}html.no-flexbox thead.show-medium,html.no-flexboxlegacy thead.show-medium{display:table-header-group}html.no-flexbox tbody.show-medium,html.no-flexboxlegacy tbody.show-medium{display:table-row-group}html.no-flexbox tfoot.show-medium,html.no-flexboxlegacy tfoot.show-medium{display:table-footer-group}html.no-flexbox tr.show-medium,html.no-flexboxlegacy tr.show-medium{display:table-row}html.no-flexbox td.show-medium,html.no-flexbox th.show-medium,html.no-flexboxlegacy td.show-medium,html.no-flexboxlegacy th.show-medium{display:table-cell}}@media screen and (min-width:321px) and (max-width:640px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 1.25em}html.no-flexbox .column-group>[class*=small-],html.no-flexboxlegacy .column-group>[class*=small-]{float:left;clear:none}html.no-flexbox .small-5,html.no-flexboxlegacy .small-5{width:5%}html.no-flexbox .small-10,html.no-flexboxlegacy .small-10{width:10%}html.no-flexbox .small-15,html.no-flexboxlegacy .small-15{width:15%}html.no-flexbox .small-16,html.no-flexboxlegacy .small-16{width:16.66%}html.no-flexbox .small-20,html.no-flexboxlegacy .small-20{width:20%}html.no-flexbox .small-25,html.no-flexboxlegacy .small-25{width:25%}html.no-flexbox .small-30,html.no-flexboxlegacy .small-30{width:30%}html.no-flexbox .small-33,html.no-flexboxlegacy .small-33{width:33.33%}html.no-flexbox .small-35,html.no-flexboxlegacy .small-35{width:35%}html.no-flexbox .small-40,html.no-flexboxlegacy .small-40{width:40%}html.no-flexbox .small-45,html.no-flexboxlegacy .small-45{width:45%}html.no-flexbox .small-50,html.no-flexboxlegacy .small-50{width:50%}html.no-flexbox .small-55,html.no-flexboxlegacy .small-55{width:55%}html.no-flexbox .small-60,html.no-flexboxlegacy .small-60{width:60%}html.no-flexbox .small-65,html.no-flexboxlegacy .small-65{width:65%}html.no-flexbox .small-66,html.no-flexboxlegacy .small-66{width:66.66%}html.no-flexbox .small-70,html.no-flexboxlegacy .small-70{width:70%}html.no-flexbox .small-75,html.no-flexboxlegacy .small-75{width:75%}html.no-flexbox .small-80,html.no-flexboxlegacy .small-80{width:80%}html.no-flexbox .small-85,html.no-flexboxlegacy .small-85{width:85%}html.no-flexbox .small-90,html.no-flexboxlegacy .small-90{width:90%}html.no-flexbox .small-95,html.no-flexboxlegacy .small-95{width:95%}html.no-flexbox .small-100,html.no-flexboxlegacy .small-100{width:100%}html.no-flexbox [class*=small-100],html.no-flexboxlegacy [class*=small-100]{float:none;clear:both}html.no-flexbox .column-group,html.no-flexboxlegacy .column-group{*zoom:1}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-1.25em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=small-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-1.25em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=small-]{padding-left:1.25em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=small-]{margin-bottom:1.25em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-2.5em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=small-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-2.5em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=small-]{padding-left:2.5em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-.625em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=small-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-.625em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=small-]{padding-left:.625em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=small-]{margin-bottom:.625em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.3125em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=small-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.3125em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}html.no-flexbox .column-group.small-gutters,html.no-flexboxlegacy .column-group.small-gutters{margin-left:-1.25em}html.no-flexbox .column-group.small-gutters>[class*=all-],html.no-flexbox .column-group.small-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}html.no-flexbox .column-group.small-horizontal-gutters,html.no-flexboxlegacy .column-group.small-horizontal-gutters{margin-left:-1.25em}html.no-flexbox .column-group.small-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.small-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-horizontal-gutters>[class*=small-]{padding-left:1.25em}html.no-flexbox .column-group.small-vertical-gutters>[class*=all-],html.no-flexbox .column-group.small-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-vertical-gutters>[class*=small-]{margin-bottom:1.25em}html.no-flexbox .column-group.small-double-gutters,html.no-flexboxlegacy .column-group.small-double-gutters{margin-left:-2.5em}html.no-flexbox .column-group.small-double-gutters>[class*=all-],html.no-flexbox .column-group.small-double-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}html.no-flexbox .column-group.small-double-horizontal-gutters,html.no-flexboxlegacy .column-group.small-double-horizontal-gutters{margin-left:-2.5em}html.no-flexbox .column-group.small-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.small-double-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-double-horizontal-gutters>[class*=small-]{padding-left:2.5em}html.no-flexbox .column-group.small-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.small-double-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}html.no-flexbox .column-group.small-half-gutters,html.no-flexboxlegacy .column-group.small-half-gutters{margin-left:-.625em}html.no-flexbox .column-group.small-half-gutters>[class*=all-],html.no-flexbox .column-group.small-half-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}html.no-flexbox .column-group.small-half-horizontal-gutters,html.no-flexboxlegacy .column-group.small-half-horizontal-gutters{margin-left:-.625em}html.no-flexbox .column-group.small-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.small-half-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-half-horizontal-gutters>[class*=small-]{padding-left:.625em}html.no-flexbox .column-group.small-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.small-half-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-half-vertical-gutters>[class*=small-]{margin-bottom:.625em}html.no-flexbox .column-group.small-quarter-gutters,html.no-flexboxlegacy .column-group.small-quarter-gutters{margin-left:-.3125em}html.no-flexbox .column-group.small-quarter-gutters>[class*=all-],html.no-flexbox .column-group.small-quarter-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}html.no-flexbox .column-group.small-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.small-quarter-horizontal-gutters{margin-left:-.3125em}html.no-flexbox .column-group.small-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.small-quarter-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}html.no-flexbox .column-group.small-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.small-quarter-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}html.no-flexbox .column-group.small-no-gutters,html.no-flexboxlegacy .column-group.small-no-gutters{margin-left:0}html.no-flexbox .column-group.small-no-gutters>[class*=all-],html.no-flexbox .column-group.small-no-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-no-gutters>[class*=small-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=small-],html.no-flexbox .ink-table td[class*=small-],html.no-flexbox .ink-table tfoot[class*=small-],html.no-flexbox .ink-table th[class*=small-],html.no-flexbox .ink-table thead[class*=small-],html.no-flexbox .ink-table tr[class*=small-],html.no-flexboxlegacy .ink-table tbody[class*=small-],html.no-flexboxlegacy .ink-table td[class*=small-],html.no-flexboxlegacy .ink-table tfoot[class*=small-],html.no-flexboxlegacy .ink-table th[class*=small-],html.no-flexboxlegacy .ink-table thead[class*=small-],html.no-flexboxlegacy .ink-table tr[class*=small-]{float:none}html.no-flexbox .small-push-left,html.no-flexboxlegacy .small-push-left{float:left}html.no-flexbox .small-push-center,html.no-flexboxlegacy .small-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .small-push-right,html.no-flexboxlegacy .small-push-right{float:right}html.no-flexbox .small-align-left,html.no-flexboxlegacy .small-align-left{text-align:left}html.no-flexbox .small-align-center,html.no-flexboxlegacy .small-align-center{text-align:center}html.no-flexbox .small-align-right,html.no-flexboxlegacy .small-align-right{text-align:right}html.no-flexbox .small-no-margin,html.no-flexboxlegacy .small-no-margin{margin:0!important}html.no-flexbox .small-space,html.no-flexbox .space,html.no-flexboxlegacy .small-space,html.no-flexboxlegacy .space{margin:1.25em}html.no-flexbox .padding,html.no-flexbox .small-padding,html.no-flexboxlegacy .padding,html.no-flexboxlegacy .small-padding{padding:1.25em}html.no-flexbox .double-space,html.no-flexbox .small-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .small-double-space{margin:2.5em}html.no-flexbox .double-padding,html.no-flexbox .small-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .small-double-padding{padding:2.5em}html.no-flexbox .half-space,html.no-flexbox .small-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .small-half-space{margin:.625em}html.no-flexbox .half-padding,html.no-flexbox .small-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .small-half-padding{padding:.625em}html.no-flexbox .quarter-space,html.no-flexbox .small-quarter-space,html.no-flexboxlegacy .quarter-space,html.no-flexboxlegacy .small-quarter-space{margin:.3125em}html.no-flexbox .quarter-padding,html.no-flexbox .small-quarter-padding,html.no-flexboxlegacy .quarter-padding,html.no-flexboxlegacy .small-quarter-padding{padding:.3125em}html.no-flexbox .small-vertical-space,html.no-flexbox .vertical-space,html.no-flexboxlegacy .small-vertical-space,html.no-flexboxlegacy .vertical-space{margin-top:1.25em;margin-bottom:1.25em}html.no-flexbox .small-vertical-padding,html.no-flexbox .vertical-padding,html.no-flexboxlegacy .small-vertical-padding,html.no-flexboxlegacy .vertical-padding{padding-top:1.25em;padding-bottom:1.25em}html.no-flexbox .double-vertical-space,html.no-flexbox .small-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .small-double-vertical-space{margin-top:2.5em;margin-bottom:2.5em}html.no-flexbox .double-vertical-padding,html.no-flexbox .small-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .small-double-vertical-padding{padding-top:2.5em;padding-bottom:2.5em}html.no-flexbox .half-vertical-space,html.no-flexbox .small-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .small-half-vertical-space{margin-top:.625em;margin-bottom:.625em}html.no-flexbox .half-vertical-padding,html.no-flexbox .small-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .small-half-vertical-padding{padding-top:.625em;padding-bottom:.625em}html.no-flexbox .quarter-vertical-space,html.no-flexbox .small-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space,html.no-flexboxlegacy .small-quarter-vertical-space{margin-top:.3125em;margin-bottom:.3125em}html.no-flexbox .quarter-vertical-padding,html.no-flexbox .small-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding,html.no-flexboxlegacy .small-quarter-vertical-padding{padding-top:.3125em;padding-bottom:.3125em}html.no-flexbox .horizontal-space,html.no-flexbox .small-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .small-horizontal-space{margin-left:1.25em;margin-right:1.25em}html.no-flexbox .horizontal-padding,html.no-flexbox .small-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .small-horizontal-padding{padding-left:1.25em;padding-right:1.25em}html.no-flexbox .double-horizontal-space,html.no-flexbox .small-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .small-double-horizontal-space{margin-left:2.5em;margin-right:2.5em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .small-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .small-double-horizontal-padding{padding-left:2.5em;padding-right:2.5em}html.no-flexbox .half-horizontal-space,html.no-flexbox .small-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .small-half-horizontal-space{margin-left:.625em;margin-right:.625em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .small-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .small-half-horizontal-padding{padding-left:.625em;padding-right:.625em}html.no-flexbox .quarter-horizontal-space,html.no-flexbox .small-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space,html.no-flexboxlegacy .small-quarter-horizontal-space{margin-left:.3125em;margin-right:.3125em}html.no-flexbox .quarter-horizontal-padding,html.no-flexbox .small-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding,html.no-flexboxlegacy .small-quarter-horizontal-padding{padding-left:.3125em;padding-right:.3125em}html.no-flexbox .small-top-space,html.no-flexbox .top-space,html.no-flexboxlegacy .small-top-space,html.no-flexboxlegacy .top-space{margin-top:1.25em}html.no-flexbox .small-top-padding,html.no-flexbox .top-padding,html.no-flexboxlegacy .small-top-padding,html.no-flexboxlegacy .top-padding{padding-top:1.25em}html.no-flexbox .double-top-space,html.no-flexbox .small-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .small-double-top-space{margin-top:2.5em}html.no-flexbox .double-top-padding,html.no-flexbox .small-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .small-double-top-padding{padding-top:2.5em}html.no-flexbox .half-top-space,html.no-flexbox .small-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .small-half-top-space{margin-top:.625em}html.no-flexbox .half-top-padding,html.no-flexbox .small-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .small-half-top-padding{padding-top:.625em}html.no-flexbox .quarter-top-space,html.no-flexbox .small-quarter-top-space,html.no-flexboxlegacy .quarter-top-space,html.no-flexboxlegacy .small-quarter-top-space{margin-top:.3125em}html.no-flexbox .quarter-top-padding,html.no-flexbox .small-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding,html.no-flexboxlegacy .small-quarter-top-padding{padding-top:.3125em}html.no-flexbox .right-space,html.no-flexbox .small-right-space,html.no-flexboxlegacy .right-space,html.no-flexboxlegacy .small-right-space{margin-right:1.25em}html.no-flexbox .right-padding,html.no-flexbox .small-right-padding,html.no-flexboxlegacy .right-padding,html.no-flexboxlegacy .small-right-padding{padding-right:1.25em}html.no-flexbox .double-right-space,html.no-flexbox .small-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .small-double-right-space{margin-right:2.5em}html.no-flexbox .double-right-padding,html.no-flexbox .small-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .small-double-right-padding{padding-right:2.5em}html.no-flexbox .half-right-space,html.no-flexbox .small-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .small-half-right-space{margin-right:.625em}html.no-flexbox .half-right-padding,html.no-flexbox .small-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .small-half-right-padding{padding-right:.625em}html.no-flexbox .quarter-right-space,html.no-flexbox .small-quarter-right-space,html.no-flexboxlegacy .quarter-right-space,html.no-flexboxlegacy .small-quarter-right-space{margin-right:.3125em}html.no-flexbox .quarter-right-padding,html.no-flexbox .small-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding,html.no-flexboxlegacy .small-quarter-right-padding{padding-right:.3125em}html.no-flexbox .bottom-space,html.no-flexbox .small-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .small-bottom-space{margin-bottom:1.25em}html.no-flexbox .bottom-padding,html.no-flexbox .small-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .small-bottom-padding{padding-bottom:1.25em}html.no-flexbox .double-bottom-space,html.no-flexbox .small-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .small-double-bottom-space{margin-bottom:2.5em}html.no-flexbox .double-bottom-padding,html.no-flexbox .small-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .small-double-bottom-padding{padding-bottom:2.5em}html.no-flexbox .half-bottom-space,html.no-flexbox .small-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .small-half-bottom-space{margin-bottom:.625em}html.no-flexbox .half-bottom-padding,html.no-flexbox .small-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .small-half-bottom-padding{padding-bottom:.625em}html.no-flexbox .quarter-bottom-space,html.no-flexbox .small-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space,html.no-flexboxlegacy .small-quarter-bottom-space{margin-bottom:.3125em}html.no-flexbox .quarter-bottom-padding,html.no-flexbox .small-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding,html.no-flexboxlegacy .small-quarter-bottom-padding{padding-bottom:.3125em}html.no-flexbox .left-space,html.no-flexbox .small-left-space,html.no-flexboxlegacy .left-space,html.no-flexboxlegacy .small-left-space{margin-left:1.25em}html.no-flexbox .left-padding,html.no-flexbox .small-left-padding,html.no-flexboxlegacy .left-padding,html.no-flexboxlegacy .small-left-padding{padding-left:1.25em}html.no-flexbox .double-left-space,html.no-flexbox .small-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .small-double-left-space{margin-left:2.5em}html.no-flexbox .double-left-padding,html.no-flexbox .small-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .small-double-left-padding{padding-left:2.5em}html.no-flexbox .half-left-space,html.no-flexbox .small-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .small-half-left-space{margin-left:.625em}html.no-flexbox .half-left-padding,html.no-flexbox .small-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .small-half-left-padding{padding-left:.625em}html.no-flexbox .quarter-left-space,html.no-flexbox .small-quarter-left-space,html.no-flexboxlegacy .quarter-left-space,html.no-flexboxlegacy .small-quarter-left-space{margin-left:.3125em}html.no-flexbox .quarter-left-padding,html.no-flexbox .small-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding,html.no-flexboxlegacy .small-quarter-left-padding{padding-left:.3125em}html.no-flexbox .hide-small,html.no-flexboxlegacy .hide-small{display:none!important}html.no-flexbox .show-small,html.no-flexboxlegacy .show-small{display:inherit!important}html.no-flexbox table.show-small,html.no-flexboxlegacy table.show-small{display:table}html.no-flexbox thead.show-small,html.no-flexboxlegacy thead.show-small{display:table-header-group}html.no-flexbox tbody.show-small,html.no-flexboxlegacy tbody.show-small{display:table-row-group}html.no-flexbox tfoot.show-small,html.no-flexboxlegacy tfoot.show-small{display:table-footer-group}html.no-flexbox tr.show-small,html.no-flexboxlegacy tr.show-small{display:table-row}html.no-flexbox td.show-small,html.no-flexbox th.show-small,html.no-flexboxlegacy td.show-small,html.no-flexboxlegacy th.show-small{display:table-cell}}@media screen and (max-width:320px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 1em}html.no-flexbox .column-group>[class*=tiny-],html.no-flexboxlegacy .column-group>[class*=tiny-]{float:left;clear:none}html.no-flexbox .tiny-5,html.no-flexboxlegacy .tiny-5{width:5%}html.no-flexbox .tiny-10,html.no-flexboxlegacy .tiny-10{width:10%}html.no-flexbox .tiny-15,html.no-flexboxlegacy .tiny-15{width:15%}html.no-flexbox .tiny-16,html.no-flexboxlegacy .tiny-16{width:16.66%}html.no-flexbox .tiny-20,html.no-flexboxlegacy .tiny-20{width:20%}html.no-flexbox .tiny-25,html.no-flexboxlegacy .tiny-25{width:25%}html.no-flexbox .tiny-30,html.no-flexboxlegacy .tiny-30{width:30%}html.no-flexbox .tiny-33,html.no-flexboxlegacy .tiny-33{width:33.33%}html.no-flexbox .tiny-35,html.no-flexboxlegacy .tiny-35{width:35%}html.no-flexbox .tiny-40,html.no-flexboxlegacy .tiny-40{width:40%}html.no-flexbox .tiny-45,html.no-flexboxlegacy .tiny-45{width:45%}html.no-flexbox .tiny-50,html.no-flexboxlegacy .tiny-50{width:50%}html.no-flexbox .tiny-55,html.no-flexboxlegacy .tiny-55{width:55%}html.no-flexbox .tiny-60,html.no-flexboxlegacy .tiny-60{width:60%}html.no-flexbox .tiny-65,html.no-flexboxlegacy .tiny-65{width:65%}html.no-flexbox .tiny-66,html.no-flexboxlegacy .tiny-66{width:66.66%}html.no-flexbox .tiny-70,html.no-flexboxlegacy .tiny-70{width:70%}html.no-flexbox .tiny-75,html.no-flexboxlegacy .tiny-75{width:75%}html.no-flexbox .tiny-80,html.no-flexboxlegacy .tiny-80{width:80%}html.no-flexbox .tiny-85,html.no-flexboxlegacy .tiny-85{width:85%}html.no-flexbox .tiny-90,html.no-flexboxlegacy .tiny-90{width:90%}html.no-flexbox .tiny-95,html.no-flexboxlegacy .tiny-95{width:95%}html.no-flexbox .tiny-100,html.no-flexboxlegacy .tiny-100{width:100%}html.no-flexbox [class*=tiny-100],html.no-flexboxlegacy [class*=tiny-100]{float:none;clear:both}html.no-flexbox .column-group,html.no-flexboxlegacy .column-group{*zoom:1}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-1em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-1em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=tiny-]{padding-left:1em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=tiny-]{margin-bottom:1em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-2em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-2em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=tiny-]{padding-left:2em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-.5em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-.5em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.25em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.25em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}html.no-flexbox .column-group.tiny-gutters,html.no-flexboxlegacy .column-group.tiny-gutters{margin-left:-1em}html.no-flexbox .column-group.tiny-gutters>[class*=all-],html.no-flexbox .column-group.tiny-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}html.no-flexbox .column-group.tiny-horizontal-gutters,html.no-flexboxlegacy .column-group.tiny-horizontal-gutters{margin-left:-1em}html.no-flexbox .column-group.tiny-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.tiny-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-horizontal-gutters>[class*=tiny-]{padding-left:1em}html.no-flexbox .column-group.tiny-vertical-gutters>[class*=all-],html.no-flexbox .column-group.tiny-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-vertical-gutters>[class*=tiny-]{margin-bottom:1em}html.no-flexbox .column-group.tiny-double-gutters,html.no-flexboxlegacy .column-group.tiny-double-gutters{margin-left:-2em}html.no-flexbox .column-group.tiny-double-gutters>[class*=all-],html.no-flexbox .column-group.tiny-double-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}html.no-flexbox .column-group.tiny-double-horizontal-gutters,html.no-flexboxlegacy .column-group.tiny-double-horizontal-gutters{margin-left:-2em}html.no-flexbox .column-group.tiny-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.tiny-double-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-double-horizontal-gutters>[class*=tiny-]{padding-left:2em}html.no-flexbox .column-group.tiny-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.tiny-double-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}html.no-flexbox .column-group.tiny-half-gutters,html.no-flexboxlegacy .column-group.tiny-half-gutters{margin-left:-.5em}html.no-flexbox .column-group.tiny-half-gutters>[class*=all-],html.no-flexbox .column-group.tiny-half-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}html.no-flexbox .column-group.tiny-half-horizontal-gutters,html.no-flexboxlegacy .column-group.tiny-half-horizontal-gutters{margin-left:-.5em}html.no-flexbox .column-group.tiny-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.tiny-half-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}html.no-flexbox .column-group.tiny-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.tiny-half-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}html.no-flexbox .column-group.tiny-quarter-gutters,html.no-flexboxlegacy .column-group.tiny-quarter-gutters{margin-left:-.25em}html.no-flexbox .column-group.tiny-quarter-gutters>[class*=all-],html.no-flexbox .column-group.tiny-quarter-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}html.no-flexbox .column-group.tiny-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.tiny-quarter-horizontal-gutters{margin-left:-.25em}html.no-flexbox .column-group.tiny-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.tiny-quarter-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}html.no-flexbox .column-group.tiny-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.tiny-quarter-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}html.no-flexbox .column-group.tiny-no-gutters,html.no-flexboxlegacy .column-group.tiny-no-gutters{margin-left:0}html.no-flexbox .column-group.tiny-no-gutters>[class*=all-],html.no-flexbox .column-group.tiny-no-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-no-gutters>[class*=tiny-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=tiny-],html.no-flexbox .ink-table td[class*=tiny-],html.no-flexbox .ink-table tfoot[class*=tiny-],html.no-flexbox .ink-table th[class*=tiny-],html.no-flexbox .ink-table thead[class*=tiny-],html.no-flexbox .ink-table tr[class*=tiny-],html.no-flexboxlegacy .ink-table tbody[class*=tiny-],html.no-flexboxlegacy .ink-table td[class*=tiny-],html.no-flexboxlegacy .ink-table tfoot[class*=tiny-],html.no-flexboxlegacy .ink-table th[class*=tiny-],html.no-flexboxlegacy .ink-table thead[class*=tiny-],html.no-flexboxlegacy .ink-table tr[class*=tiny-]{float:none}html.no-flexbox .tiny-push-left,html.no-flexboxlegacy .tiny-push-left{float:left}html.no-flexbox .tiny-push-center,html.no-flexboxlegacy .tiny-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .tiny-push-right,html.no-flexboxlegacy .tiny-push-right{float:right}html.no-flexbox .tiny-align-left,html.no-flexboxlegacy .tiny-align-left{text-align:left}html.no-flexbox .tiny-align-center,html.no-flexboxlegacy .tiny-align-center{text-align:center}html.no-flexbox .tiny-align-right,html.no-flexboxlegacy .tiny-align-right{text-align:right}html.no-flexbox .tiny-no-margin,html.no-flexboxlegacy .tiny-no-margin{margin:0!important}html.no-flexbox .space,html.no-flexbox .tiny-space,html.no-flexboxlegacy .space,html.no-flexboxlegacy .tiny-space{margin:1em}html.no-flexbox .padding,html.no-flexbox .tiny-padding,html.no-flexboxlegacy .padding,html.no-flexboxlegacy .tiny-padding{padding:1em}html.no-flexbox .double-space,html.no-flexbox .tiny-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .tiny-double-space{margin:2em}html.no-flexbox .double-padding,html.no-flexbox .tiny-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .tiny-double-padding{padding:2em}html.no-flexbox .half-space,html.no-flexbox .tiny-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .tiny-half-space{margin:.5em}html.no-flexbox .half-padding,html.no-flexbox .tiny-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .tiny-half-padding{padding:.5em}html.no-flexbox .quarter-space,html.no-flexbox .tiny-quarter-space,html.no-flexboxlegacy .quarter-space,html.no-flexboxlegacy .tiny-quarter-space{margin:.25em}html.no-flexbox .quarter-padding,html.no-flexbox .tiny-quarter-padding,html.no-flexboxlegacy .quarter-padding,html.no-flexboxlegacy .tiny-quarter-padding{padding:.25em}html.no-flexbox .tiny-vertical-space,html.no-flexbox .vertical-space,html.no-flexboxlegacy .tiny-vertical-space,html.no-flexboxlegacy .vertical-space{margin-top:1em;margin-bottom:1em}html.no-flexbox .tiny-vertical-padding,html.no-flexbox .vertical-padding,html.no-flexboxlegacy .tiny-vertical-padding,html.no-flexboxlegacy .vertical-padding{padding-top:1em;padding-bottom:1em}html.no-flexbox .double-vertical-space,html.no-flexbox .tiny-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .tiny-double-vertical-space{margin-top:2em;margin-bottom:2em}html.no-flexbox .double-vertical-padding,html.no-flexbox .tiny-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .tiny-double-vertical-padding{padding-top:2em;padding-bottom:2em}html.no-flexbox .half-vertical-space,html.no-flexbox .tiny-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .tiny-half-vertical-space{margin-top:.5em;margin-bottom:.5em}html.no-flexbox .half-vertical-padding,html.no-flexbox .tiny-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .tiny-half-vertical-padding{padding-top:.5em;padding-bottom:.5em}html.no-flexbox .quarter-vertical-space,html.no-flexbox .tiny-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space,html.no-flexboxlegacy .tiny-quarter-vertical-space{margin-top:.25em;margin-bottom:.25em}html.no-flexbox .quarter-vertical-padding,html.no-flexbox .tiny-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding,html.no-flexboxlegacy .tiny-quarter-vertical-padding{padding-top:.25em;padding-bottom:.25em}html.no-flexbox .horizontal-space,html.no-flexbox .tiny-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .tiny-horizontal-space{margin-left:1em;margin-right:1em}html.no-flexbox .horizontal-padding,html.no-flexbox .tiny-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .tiny-horizontal-padding{padding-left:1em;padding-right:1em}html.no-flexbox .double-horizontal-space,html.no-flexbox .tiny-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .tiny-double-horizontal-space{margin-left:2em;margin-right:2em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .tiny-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .tiny-double-horizontal-padding{padding-left:2em;padding-right:2em}html.no-flexbox .half-horizontal-space,html.no-flexbox .tiny-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .tiny-half-horizontal-space{margin-left:.5em;margin-right:.5em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .tiny-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .tiny-half-horizontal-padding{padding-left:.5em;padding-right:.5em}html.no-flexbox .quarter-horizontal-space,html.no-flexbox .tiny-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space,html.no-flexboxlegacy .tiny-quarter-horizontal-space{margin-left:.25em;margin-right:.25em}html.no-flexbox .quarter-horizontal-padding,html.no-flexbox .tiny-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding,html.no-flexboxlegacy .tiny-quarter-horizontal-padding{padding-left:.25em;padding-right:.25em}html.no-flexbox .tiny-top-space,html.no-flexbox .top-space,html.no-flexboxlegacy .tiny-top-space,html.no-flexboxlegacy .top-space{margin-top:1em}html.no-flexbox .tiny-top-padding,html.no-flexbox .top-padding,html.no-flexboxlegacy .tiny-top-padding,html.no-flexboxlegacy .top-padding{padding-top:1em}html.no-flexbox .double-top-space,html.no-flexbox .tiny-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .tiny-double-top-space{margin-top:2em}html.no-flexbox .double-top-padding,html.no-flexbox .tiny-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .tiny-double-top-padding{padding-top:2em}html.no-flexbox .half-top-space,html.no-flexbox .tiny-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .tiny-half-top-space{margin-top:.5em}html.no-flexbox .half-top-padding,html.no-flexbox .tiny-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .tiny-half-top-padding{padding-top:.5em}html.no-flexbox .quarter-top-space,html.no-flexbox .tiny-quarter-top-space,html.no-flexboxlegacy .quarter-top-space,html.no-flexboxlegacy .tiny-quarter-top-space{margin-top:.25em}html.no-flexbox .quarter-top-padding,html.no-flexbox .tiny-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding,html.no-flexboxlegacy .tiny-quarter-top-padding{padding-top:.25em}html.no-flexbox .right-space,html.no-flexbox .tiny-right-space,html.no-flexboxlegacy .right-space,html.no-flexboxlegacy .tiny-right-space{margin-right:1em}html.no-flexbox .right-padding,html.no-flexbox .tiny-right-padding,html.no-flexboxlegacy .right-padding,html.no-flexboxlegacy .tiny-right-padding{padding-right:1em}html.no-flexbox .double-right-space,html.no-flexbox .tiny-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .tiny-double-right-space{margin-right:2em}html.no-flexbox .double-right-padding,html.no-flexbox .tiny-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .tiny-double-right-padding{padding-right:2em}html.no-flexbox .half-right-space,html.no-flexbox .tiny-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .tiny-half-right-space{margin-right:.5em}html.no-flexbox .half-right-padding,html.no-flexbox .tiny-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .tiny-half-right-padding{padding-right:.5em}html.no-flexbox .quarter-right-space,html.no-flexbox .tiny-quarter-right-space,html.no-flexboxlegacy .quarter-right-space,html.no-flexboxlegacy .tiny-quarter-right-space{margin-right:.25em}html.no-flexbox .quarter-right-padding,html.no-flexbox .tiny-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding,html.no-flexboxlegacy .tiny-quarter-right-padding{padding-right:.25em}html.no-flexbox .bottom-space,html.no-flexbox .tiny-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .tiny-bottom-space{margin-bottom:1em}html.no-flexbox .bottom-padding,html.no-flexbox .tiny-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .tiny-bottom-padding{padding-bottom:1em}html.no-flexbox .double-bottom-space,html.no-flexbox .tiny-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .tiny-double-bottom-space{margin-bottom:2em}html.no-flexbox .double-bottom-padding,html.no-flexbox .tiny-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .tiny-double-bottom-padding{padding-bottom:2em}html.no-flexbox .half-bottom-space,html.no-flexbox .tiny-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .tiny-half-bottom-space{margin-bottom:.5em}html.no-flexbox .half-bottom-padding,html.no-flexbox .tiny-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .tiny-half-bottom-padding{padding-bottom:.5em}html.no-flexbox .quarter-bottom-space,html.no-flexbox .tiny-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space,html.no-flexboxlegacy .tiny-quarter-bottom-space{margin-bottom:.25em}html.no-flexbox .quarter-bottom-padding,html.no-flexbox .tiny-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding,html.no-flexboxlegacy .tiny-quarter-bottom-padding{padding-bottom:.25em}html.no-flexbox .left-space,html.no-flexbox .tiny-left-space,html.no-flexboxlegacy .left-space,html.no-flexboxlegacy .tiny-left-space{margin-left:1em}html.no-flexbox .left-padding,html.no-flexbox .tiny-left-padding,html.no-flexboxlegacy .left-padding,html.no-flexboxlegacy .tiny-left-padding{padding-left:1em}html.no-flexbox .double-left-space,html.no-flexbox .tiny-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .tiny-double-left-space{margin-left:2em}html.no-flexbox .double-left-padding,html.no-flexbox .tiny-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .tiny-double-left-padding{padding-left:2em}html.no-flexbox .half-left-space,html.no-flexbox .tiny-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .tiny-half-left-space{margin-left:.5em}html.no-flexbox .half-left-padding,html.no-flexbox .tiny-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .tiny-half-left-padding{padding-left:.5em}html.no-flexbox .quarter-left-space,html.no-flexbox .tiny-quarter-left-space,html.no-flexboxlegacy .quarter-left-space,html.no-flexboxlegacy .tiny-quarter-left-space{margin-left:.25em}html.no-flexbox .quarter-left-padding,html.no-flexbox .tiny-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding,html.no-flexboxlegacy .tiny-quarter-left-padding{padding-left:.25em}html.no-flexbox .hide-tiny,html.no-flexboxlegacy .hide-tiny{display:none!important}html.no-flexbox .show-tiny,html.no-flexboxlegacy .show-tiny{display:inherit!important}html.no-flexbox table.show-tiny,html.no-flexboxlegacy table.show-tiny{display:table}html.no-flexbox thead.show-tiny,html.no-flexboxlegacy thead.show-tiny{display:table-header-group}html.no-flexbox tbody.show-tiny,html.no-flexboxlegacy tbody.show-tiny{display:table-row-group}html.no-flexbox tfoot.show-tiny,html.no-flexboxlegacy tfoot.show-tiny{display:table-footer-group}html.no-flexbox tr.show-tiny,html.no-flexboxlegacy tr.show-tiny{display:table-row}html.no-flexbox td.show-tiny,html.no-flexbox th.show-tiny,html.no-flexboxlegacy td.show-tiny,html.no-flexboxlegacy th.show-tiny{display:table-cell}}html.no-flexbox:after,html.no-flexboxlegacy:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}html.no-flexbox .ink-carousel,html.no-flexboxlegacy .ink-carousel{width:100%;position:relative;overflow:hidden;display:block}html.no-flexbox .ink-carousel .stage,html.no-flexboxlegacy .ink-carousel .stage{width:100%;left:0;height:auto!important;margin-top:0;margin-bottom:0;padding-left:0;list-style-type:none;white-space:nowrap;position:relative;-webkit-transition:left .5s ease;-moz-transition:left .5s ease;-o-transition:left .5s ease;transition:left .5s ease}html.no-flexbox .ink-carousel .stage .slide,html.no-flexboxlegacy .ink-carousel .stage .slide{position:relative;display:inline-block;vertical-align:top;white-space:normal;margin:0;float:none;zoom:1;*display:inline}html.no-flexbox .ink-carousel .ink-navigation,html.no-flexboxlegacy .ink-carousel .ink-navigation{position:static}@media print{*{background:transparent!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.ink-navigation{display:none}.ink-table{border-collapse:collapse}.ink-label{border:1px solid #000}} \ No newline at end of file diff --git a/dist/css/ink.css b/dist/css/ink.css index cc07e71c6..4d897884b 100644 --- a/dist/css/ink.css +++ b/dist/css/ink.css @@ -990,11 +990,11 @@ th { .ink-form .control-group .control > input + .fa, .ink-form .control-group .control > select + .fa, .ink-form .control-group .control > textarea + .fa { display: none; } -.ink-form .control-group .control.append-button span, .ink-form .control-group .control.append-symbol span, .ink-form .control-group .control.prepend-button span, .ink-form .control-group .control.prepend-symbol span { +.ink-form .control-group .control.append-button > span, .ink-form .control-group .control.append-symbol > span, .ink-form .control-group .control.prepend-button > span, .ink-form .control-group .control.prepend-symbol > span { width: 100%; position: relative; } -.ink-form .control-group .control.append-button span > input, .ink-form .control-group .control.append-button span > select, .ink-form .control-group .control.append-button span > textarea, .ink-form .control-group .control.append-symbol span > input, .ink-form .control-group .control.append-symbol span > select, .ink-form .control-group .control.append-symbol span > textarea, .ink-form .control-group .control.prepend-button span > input, .ink-form .control-group .control.prepend-button span > select, .ink-form .control-group .control.prepend-button span > textarea, .ink-form .control-group .control.prepend-symbol span > input, .ink-form .control-group .control.prepend-symbol span > select, .ink-form .control-group .control.prepend-symbol span > textarea { +.ink-form .control-group .control.append-button > span > input, .ink-form .control-group .control.append-button > span > select, .ink-form .control-group .control.append-button > span > textarea, .ink-form .control-group .control.append-symbol > span > input, .ink-form .control-group .control.append-symbol > span > select, .ink-form .control-group .control.append-symbol > span > textarea, .ink-form .control-group .control.prepend-button > span > input, .ink-form .control-group .control.prepend-button > span > select, .ink-form .control-group .control.prepend-button > span > textarea, .ink-form .control-group .control.prepend-symbol > span > input, .ink-form .control-group .control.prepend-symbol > span > select, .ink-form .control-group .control.prepend-symbol > span > textarea { width: 100%; } .ink-form .control-group .control.append-button > input[type="submit"], .ink-form .control-group .control.append-button > input[type="button"], .ink-form .control-group .control.append-button > input[type="reset"], .ink-form .control-group .control.append-symbol > input[type="submit"], .ink-form .control-group .control.append-symbol > input[type="button"], .ink-form .control-group .control.append-symbol > input[type="reset"], .ink-form .control-group .control.prepend-button > input[type="submit"], .ink-form .control-group .control.prepend-button > input[type="button"], .ink-form .control-group .control.prepend-button > input[type="reset"], .ink-form .control-group .control.prepend-symbol > input[type="submit"], .ink-form .control-group .control.prepend-symbol > input[type="button"], .ink-form .control-group .control.prepend-symbol > input[type="reset"] { @@ -1003,10 +1003,10 @@ th { .ink-form .control-group .control.append-button { display: table; } -.ink-form .control-group .control.append-button span { +.ink-form .control-group .control.append-button > span { display: table-cell; } -.ink-form .control-group .control.append-button span > input, .ink-form .control-group .control.append-button span > select, .ink-form .control-group .control.append-button span > textarea { +.ink-form .control-group .control.append-button > span > input, .ink-form .control-group .control.append-button > span > select, .ink-form .control-group .control.append-button > span > textarea { -webkit-border-radius: 2px 0 0 2px; -moz-border-radius: 2px 0 0 2px; -ms-border-radius: 2px 0 0 2px; @@ -1025,10 +1025,10 @@ th { .ink-form .control-group .control.prepend-button { display: table; } -.ink-form .control-group .control.prepend-button span { +.ink-form .control-group .control.prepend-button > span { display: table-cell; } -.ink-form .control-group .control.prepend-button span > input, .ink-form .control-group .control.prepend-button span > select, .ink-form .control-group .control.prepend-button span > textarea { +.ink-form .control-group .control.prepend-button > span > input, .ink-form .control-group .control.prepend-button > span > select, .ink-form .control-group .control.prepend-button > span > textarea { -webkit-border-radius: 0 2px 2px 0; -moz-border-radius: 0 2px 2px 0; -ms-border-radius: 0 2px 2px 0; @@ -1044,25 +1044,25 @@ th { border-radius: 2px 0 0 2px; border-right: none; } -.ink-form .control-group .control.append-symbol span { +.ink-form .control-group .control.append-symbol > span { display: block; } -.ink-form .control-group .control.append-symbol span > input, .ink-form .control-group .control.append-symbol span > select, .ink-form .control-group .control.append-symbol span > textarea { +.ink-form .control-group .control.append-symbol > span > input, .ink-form .control-group .control.append-symbol > span > select, .ink-form .control-group .control.append-symbol > span > textarea { padding-right: 2.5em; } -.ink-form .control-group .control.append-symbol span > [class^="fa-"], .ink-form .control-group .control.append-symbol span > [class*=" fa-"] { +.ink-form .control-group .control.append-symbol > span > [class^="fa-"], .ink-form .control-group .control.append-symbol > span > [class*=" fa-"] { position: absolute; right: 1em; top: .86em; pointer-events: none; } -.ink-form .control-group .control.prepend-symbol span { +.ink-form .control-group .control.prepend-symbol > span { display: block; } -.ink-form .control-group .control.prepend-symbol span > input, .ink-form .control-group .control.prepend-symbol span > select, .ink-form .control-group .control.prepend-symbol span > textarea { +.ink-form .control-group .control.prepend-symbol > span > input, .ink-form .control-group .control.prepend-symbol > span > select, .ink-form .control-group .control.prepend-symbol > span > textarea { padding-left: 2.5em; } -.ink-form .control-group .control.prepend-symbol span > [class^="fa-"], .ink-form .control-group .control.prepend-symbol span > [class*=" fa-"] { +.ink-form .control-group .control.prepend-symbol > span > [class^="fa-"], .ink-form .control-group .control.prepend-symbol > span > [class*=" fa-"] { position: absolute; left: 1em; top: .86em; diff --git a/dist/css/ink.min.css b/dist/css/ink.min.css index 8aad3ee54..fabc1c46f 100644 --- a/dist/css/ink.min.css +++ b/dist/css/ink.min.css @@ -1 +1 @@ -@charset "UTF-8";.show-all{display:inherit}.hide-all{display:none!important}.no-margin{margin:0!important}.no-margin-top{margin-top:0!important}.no-margin-bottom{margin-bottom:0!important}.no-padding{padding:0!important}.push-left{float:left}.push-center{float:none!important;margin-left:auto;margin-right:auto}.push-right{float:right;-webkit-justify-content:flex-end;-moz-justify-content:flex-end;justify-content:flex-end}.align-left{text-align:left}.align-center{text-align:center}.align-right{text-align:right}.clearfix{overflow:hidden;*zoom:1}.clearfix:after{content:"";display:table;clear:both}html{font-family:sans-serif}html *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}figure{margin:0}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.ink-alert.basic,.ink-alert.block{font-size:.938em;margin:1em 0;position:relative;overflow:hidden}.ink-alert.basic{padding:1em 3em 1em 1em}.ink-alert.basic p{margin:0}.ink-alert.basic .ink-close{top:.55em;*top:.2em}.ink-alert.block{font-size:1em}.ink-alert.block>h4{padding:1em 3em 1em 1em;font-size:.938em;line-height:1.5;margin:0}.ink-alert.block p{margin:1.5em 1em}.ink-alert.block ul{list-style:inside}.ink-alert .ink-dismiss{position:absolute;line-height:.56em;font-size:1.8em;padding:5px;border:0;background:0 0;top:.5em;*top:.2em;right:.4em}.ink-badge{padding:.2em .6em;font-size:.813em;margin-left:.6em}.ink-button{-webkit-appearance:menuitem;padding:8px 12px;cursor:pointer;text-decoration:none;text-align:center;display:inline-block;vertical-align:middle;white-space:nowrap;line-height:normal}.ink-button+.ink-button{margin-left:5px}.button-group{*zoom:1}.button-group>.ink-button{float:left;margin:5px 0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;border-left:0}.button-group>.ink-button:active,.button-group>.ink-button:hover{border-left:0}.button-group>.ink-button:first-child{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px;border-left:1px solid #bfbfbf}.button-group>.ink-button:last-child{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.button-group:after{content:"";display:table;clear:both}.button-toolbar{*zoom:1}.button-toolbar>.button-group{margin-right:10px;float:left}.button-toolbar:after{content:"";display:table;clear:both}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-thin-webfont.eot);src:url(../fonts/Roboto/roboto-thin-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-thin-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-thin-webfont.ttf) format('truetype');font-weight:100;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-thinitalic-webfont.eot);src:url(../fonts/Roboto/roboto-thinitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-thinitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-thinitalic-webfont.ttf) format('truetype');font-weight:100;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-light-webfont.eot);src:url(../fonts/Roboto/roboto-light-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-light-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-light-webfont.ttf) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-lightitalic-webfont.eot);src:url(../fonts/Roboto/roboto-lightitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-lightitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-lightitalic-webfont.ttf) format('truetype');font-weight:300;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-regular-webfont.eot);src:url(../fonts/Roboto/roboto-regular-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-regular-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-regular-webfont.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-italic-webfont.eot);src:url(../fonts/Roboto/roboto-italic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-italic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-italic-webfont.ttf) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-medium-webfont.eot);src:url(../fonts/Roboto/roboto-medium-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-medium-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-medium-webfont.ttf) format('truetype');font-weight:500;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-mediumitalic-webfont.eot);src:url(../fonts/Roboto/roboto-mediumitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-mediumitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-mediumitalic-webfont.ttf) format('truetype');font-weight:500;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-bold-webfont.eot);src:url(../fonts/Roboto/roboto-bold-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-bold-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-bold-webfont.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-bolditalic-webfont.eot);src:url(../fonts/Roboto/roboto-bolditalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-bolditalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-bolditalic-webfont.ttf) format('truetype');font-weight:700;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-black-webfont.eot);src:url(../fonts/Roboto/roboto-black-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-black-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-black-webfont.ttf) format('truetype');font-weight:900;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-blackitalic-webfont.eot);src:url(../fonts/Roboto/roboto-blackitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-blackitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-blackitalic-webfont.ttf) format('truetype');font-weight:900;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-light-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-light-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-light-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-light-webfont.ttf) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.ttf) format('truetype');font-weight:300;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.ttf) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.ttf) format('truetype');font-weight:700;font-style:italic}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-thin-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-thin-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-thin-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-thin-webfont.ttf) format('truetype');font-weight:100;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-light-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-light-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-light-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-light-webfont.ttf) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-regular-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-regular-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-regular-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-regular-webfont.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-bold-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-bold-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-bold-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-bold-webfont.ttf) format('truetype');font-weight:700;font-style:normal}.ink-form fieldset{border:0;padding:0;margin:0}.ink-form fieldset legend{font-size:1.438em;font-weight:700;width:100%;border-bottom:1px solid #ddd}.ink-form fieldset legend+*{-webkit-margin-top-collapse:separate;margin:2em 0}.ink-form p.tip{font-size:.875em;color:#909090;position:relative;margin:.2em 0 0 .1em}.ink-form p.label{padding:0;margin:0;color:#555;white-space:normal}.ink-form input[type=color],.ink-form input[type=date],.ink-form input[type=datetime-local],.ink-form input[type=datetime],.ink-form input[type=email],.ink-form input[type=month],.ink-form input[type=number],.ink-form input[type=password],.ink-form input[type=search],.ink-form input[type=tel],.ink-form input[type=text],.ink-form input[type=time],.ink-form input[type=url],.ink-form input[type=week],.ink-form select,.ink-form textarea{font-family:Roboto,Arial,Helvetica,sans-serif;font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;padding:8px 6px;border:1px solid #c6c6c6;resize:none;background:#fff;vertical-align:middle}.ink-form input[type=color]:focus,.ink-form input[type=date]:focus,.ink-form input[type=datetime-local]:focus,.ink-form input[type=datetime]:focus,.ink-form input[type=email]:focus,.ink-form input[type=month]:focus,.ink-form input[type=number]:focus,.ink-form input[type=password]:focus,.ink-form input[type=search]:focus,.ink-form input[type=tel]:focus,.ink-form input[type=text]:focus,.ink-form input[type=time]:focus,.ink-form input[type=url]:focus,.ink-form input[type=week]:focus,.ink-form select:focus,.ink-form textarea:focus{border-color:rgba(153,153,153,.9);-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;outline:0 none}.ink-form input[type=color]:disabled,.ink-form input[type=date]:disabled,.ink-form input[type=datetime-local]:disabled,.ink-form input[type=datetime]:disabled,.ink-form input[type=email]:disabled,.ink-form input[type=month]:disabled,.ink-form input[type=number]:disabled,.ink-form input[type=password]:disabled,.ink-form input[type=search]:disabled,.ink-form input[type=tel]:disabled,.ink-form input[type=text]:disabled,.ink-form input[type=time]:disabled,.ink-form input[type=url]:disabled,.ink-form input[type=week]:disabled,.ink-form select:disabled,.ink-form textarea:disabled{background:#f2f2f2;cursor:not-allowed}.ink-form .input-file{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;padding:6px;border:1px solid #c6c6c6;background:#fff;vertical-align:middle;line-height:1.2}.ink-form .input-file input[type=file]{-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;border:0;padding:0;background:0 0;width:100%}.ink-form .ink-button{margin:0 5px}.ink-form label{cursor:pointer}.ink-form select{line-height:2;cursor:pointer}.ink-form textarea{min-height:5em}.ink-form .control-group{line-height:2;margin-bottom:1em;*zoom:1}.ink-form .control-group:after{content:"";display:table;clear:both}.ink-form .control-group .control{position:relative;*zoom:1}.ink-form .control-group .control:after{content:"";display:table;clear:both}.ink-form .control-group .control>li{position:relative;*zoom:1}.ink-form .control-group .control>li:after{content:"";display:table;clear:both}.ink-form .control-group .control>input,.ink-form .control-group .control>select,.ink-form .control-group .control>textarea{width:100%}.ink-form .control-group .control>input+.fa,.ink-form .control-group .control>select+.fa,.ink-form .control-group .control>textarea+.fa{display:none}.ink-form .control-group .control.append-button span,.ink-form .control-group .control.append-symbol span,.ink-form .control-group .control.prepend-button span,.ink-form .control-group .control.prepend-symbol span{width:100%;position:relative}.ink-form .control-group .control.append-button span>input,.ink-form .control-group .control.append-button span>select,.ink-form .control-group .control.append-button span>textarea,.ink-form .control-group .control.append-symbol span>input,.ink-form .control-group .control.append-symbol span>select,.ink-form .control-group .control.append-symbol span>textarea,.ink-form .control-group .control.prepend-button span>input,.ink-form .control-group .control.prepend-button span>select,.ink-form .control-group .control.prepend-button span>textarea,.ink-form .control-group .control.prepend-symbol span>input,.ink-form .control-group .control.prepend-symbol span>select,.ink-form .control-group .control.prepend-symbol span>textarea{width:100%}.ink-form .control-group .control.append-button>input[type=button],.ink-form .control-group .control.append-button>input[type=reset],.ink-form .control-group .control.append-button>input[type=submit],.ink-form .control-group .control.append-symbol>input[type=button],.ink-form .control-group .control.append-symbol>input[type=reset],.ink-form .control-group .control.append-symbol>input[type=submit],.ink-form .control-group .control.prepend-button>input[type=button],.ink-form .control-group .control.prepend-button>input[type=reset],.ink-form .control-group .control.prepend-button>input[type=submit],.ink-form .control-group .control.prepend-symbol>input[type=button],.ink-form .control-group .control.prepend-symbol>input[type=reset],.ink-form .control-group .control.prepend-symbol>input[type=submit]{width:auto}.ink-form .control-group .control.append-button{display:table}.ink-form .control-group .control.append-button span{display:table-cell}.ink-form .control-group .control.append-button span>input,.ink-form .control-group .control.append-button span>select,.ink-form .control-group .control.append-button span>textarea{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-form .control-group .control.append-button .ink-button{margin:0;-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0;border-left:0}.ink-form .control-group .control.prepend-button{display:table}.ink-form .control-group .control.prepend-button span{display:table-cell}.ink-form .control-group .control.prepend-button span>input,.ink-form .control-group .control.prepend-button span>select,.ink-form .control-group .control.prepend-button span>textarea{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-form .control-group .control.prepend-button .ink-button{margin:0;-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px;border-right:0}.ink-form .control-group .control.append-symbol span{display:block}.ink-form .control-group .control.append-symbol span>input,.ink-form .control-group .control.append-symbol span>select,.ink-form .control-group .control.append-symbol span>textarea{padding-right:2.5em}.ink-form .control-group .control.append-symbol span>[class*=" fa-"],.ink-form .control-group .control.append-symbol span>[class^=fa-]{position:absolute;right:1em;top:.86em;pointer-events:none}.ink-form .control-group .control.prepend-symbol span{display:block}.ink-form .control-group .control.prepend-symbol span>input,.ink-form .control-group .control.prepend-symbol span>select,.ink-form .control-group .control.prepend-symbol span>textarea{padding-left:2.5em}.ink-form .control-group .control.prepend-symbol span>[class*=" fa-"],.ink-form .control-group .control.prepend-symbol span>[class^=fa-]{position:absolute;left:1em;top:.86em;pointer-events:none}.ink-form .control-group input[type=checkbox],.ink-form .control-group input[type=radio]{position:absolute;border:0;cursor:pointer}.ink-form .control-group input[type=checkbox]+label,.ink-form .control-group input[type=radio]+label{margin-top:-.28em;padding-left:1.25em;vertical-align:super;display:inline-block}.ink-form .control-group .inline li{padding:0}.ink-form .control-group .inline li label{margin-right:1em}.ink-form .control-group.validation.error input,.ink-form .control-group.validation.error select,.ink-form .control-group.validation.error textarea{outline:0;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;border:1px solid rgba(200,10,16,.5)}.ink-form .control-group.validation.error p.tip{color:rgba(150,7,12,.55)}.ink-form .control-group.validation.warning input,.ink-form .control-group.validation.warning select,.ink-form .control-group.validation.warning textarea{outline:0;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;border:1px solid rgba(255,156,0,.6)}.ink-form .control-group.validation.warning p.tip{color:rgba(204,125,0,.6)}.ink-form .control-group.required label,.ink-form .control-group.required p.label{color:#555}.ink-form .control-group.required label:after,.ink-form .control-group.required p.label:after{content:"\f069";color:#c91111;margin-left:.6em;font-family:FontAwesome;font-size:.75em;width:1.25em}.ink-form .control-group.required ul.control label:after{content:""}.ink-grid{width:auto;max-width:1440px;margin:0 auto}.all-5{width:5%;float:left;clear:none}.all-10{width:10%;float:left;clear:none}.all-15{width:15%;float:left;clear:none}.all-16{width:16.66%;float:left;clear:none}.all-20{width:20%;float:left;clear:none}.all-25{width:25%;float:left;clear:none}.all-30{width:30%;float:left;clear:none}.all-33{width:33.33%;float:left;clear:none}.all-35{width:35%;float:left;clear:none}.all-40{width:40%;float:left;clear:none}.all-45{width:45%;float:left;clear:none}.all-50{width:50%;float:left;clear:none}.all-55{width:55%;float:left;clear:none}.all-60{width:60%;float:left;clear:none}.all-65{width:65%;float:left;clear:none}.all-66{width:66.66%;float:left;clear:none}.all-70{width:70%;float:left;clear:none}.all-75{width:75%;float:left;clear:none}.all-80{width:80%;float:left;clear:none}.all-85{width:85%;float:left;clear:none}.all-90{width:90%;float:left;clear:none}.all-95{width:95%;float:left;clear:none}.all-100{width:100%;float:left;clear:none}[class~=all-100]{float:none;clear:both}@media screen and (min-width:1261px){.ink-grid{padding:0 2em}.column-group>[class*=xlarge-]{float:left;clear:none}.xlarge-5{width:5%}.xlarge-10{width:10%}.xlarge-15{width:15%}.xlarge-16{width:16.66%}.xlarge-20{width:20%}.xlarge-25{width:25%}.xlarge-30{width:30%}.xlarge-33{width:33.33%}.xlarge-35{width:35%}.xlarge-40{width:40%}.xlarge-45{width:45%}.xlarge-50{width:50%}.xlarge-55{width:55%}.xlarge-60{width:60%}.xlarge-65{width:65%}.xlarge-66{width:66.66%}.xlarge-70{width:70%}.xlarge-75{width:75%}.xlarge-80{width:80%}.xlarge-85{width:85%}.xlarge-90{width:90%}.xlarge-95{width:95%}.xlarge-100{width:100%}[class*=xlarge-100]{float:none;clear:both}.column-group{*zoom:1}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-2em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}.column-group.horizontal-gutters{margin-left:-2em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=xlarge-]{padding-left:2em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=xlarge-]{margin-bottom:2em}.column-group.double-gutters{margin-left:-4em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}.column-group.double-horizontal-gutters{margin-left:-4em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}.column-group.half-gutters{margin-left:-1em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}.column-group.half-horizontal-gutters{margin-left:-1em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}.column-group.quarter-gutters{margin-left:-.5em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}.column-group.quarter-horizontal-gutters{margin-left:-.5em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}.column-group.xlarge-gutters{margin-left:-2em}.column-group.xlarge-gutters>[class*=all-],.column-group.xlarge-gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}.column-group.xlarge-horizontal-gutters{margin-left:-2em}.column-group.xlarge-horizontal-gutters>[class*=all-],.column-group.xlarge-horizontal-gutters>[class*=xlarge-]{padding-left:2em}.column-group.xlarge-vertical-gutters>[class*=all-],.column-group.xlarge-vertical-gutters>[class*=xlarge-]{margin-bottom:2em}.column-group.xlarge-double-gutters{margin-left:-4em}.column-group.xlarge-double-gutters>[class*=all-],.column-group.xlarge-double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}.column-group.xlarge-double-horizontal-gutters{margin-left:-4em}.column-group.xlarge-double-horizontal-gutters>[class*=all-],.column-group.xlarge-double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}.column-group.xlarge-double-vertical-gutters>[class*=all-],.column-group.xlarge-double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}.column-group.xlarge-half-gutters{margin-left:-1em}.column-group.xlarge-half-gutters>[class*=all-],.column-group.xlarge-half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}.column-group.xlarge-half-horizontal-gutters{margin-left:-1em}.column-group.xlarge-half-horizontal-gutters>[class*=all-],.column-group.xlarge-half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}.column-group.xlarge-half-vertical-gutters>[class*=all-],.column-group.xlarge-half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}.column-group.xlarge-quarter-gutters{margin-left:-.5em}.column-group.xlarge-quarter-gutters>[class*=all-],.column-group.xlarge-quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}.column-group.xlarge-quarter-horizontal-gutters{margin-left:-.5em}.column-group.xlarge-quarter-horizontal-gutters>[class*=all-],.column-group.xlarge-quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}.column-group.xlarge-quarter-vertical-gutters>[class*=all-],.column-group.xlarge-quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}.column-group.xlarge-no-gutters{margin-left:0}.column-group.xlarge-no-gutters>[class*=all-],.column-group.xlarge-no-gutters>[class*=xlarge-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=xlarge-],.ink-table td[class*=xlarge-],.ink-table tfoot[class*=xlarge-],.ink-table th[class*=xlarge-],.ink-table thead[class*=xlarge-],.ink-table tr[class*=xlarge-]{float:none}.xlarge-push-left{float:left}.xlarge-push-center{float:none;margin-left:auto;margin-right:auto}.xlarge-push-right{float:right}.xlarge-align-left{text-align:left}.xlarge-align-center{text-align:center}.xlarge-align-right{text-align:right}.xlarge-no-margin{margin:0!important}.space,.xlarge-space{margin:2em}.padding,.xlarge-padding{padding:2em}.double-space,.xlarge-double-space{margin:4em}.double-padding,.xlarge-double-padding{padding:4em}.half-space,.xlarge-half-space{margin:1em}.half-padding,.xlarge-half-padding{padding:1em}.quarter-space,.xlarge-quarter-space{margin:.5em}.quarter-padding,.xlarge-quarter-padding{padding:.5em}.vertical-space,.xlarge-vertical-space{margin-top:2em;margin-bottom:2em}.vertical-padding,.xlarge-vertical-padding{padding-top:2em;padding-bottom:2em}.double-vertical-space,.xlarge-double-vertical-space{margin-top:4em;margin-bottom:4em}.double-vertical-padding,.xlarge-double-vertical-padding{padding-top:4em;padding-bottom:4em}.half-vertical-space,.xlarge-half-vertical-space{margin-top:1em;margin-bottom:1em}.half-vertical-padding,.xlarge-half-vertical-padding{padding-top:1em;padding-bottom:1em}.quarter-vertical-space,.xlarge-quarter-vertical-space{margin-top:.5em;margin-bottom:.5em}.quarter-vertical-padding,.xlarge-quarter-vertical-padding{padding-top:.5em;padding-bottom:.5em}.horizontal-space,.xlarge-horizontal-space{margin-left:2em;margin-right:2em}.horizontal-padding,.xlarge-horizontal-padding{padding-left:2em;padding-right:2em}.double-horizontal-space,.xlarge-double-horizontal-space{margin-left:4em;margin-right:4em}.double-horizontal-padding,.xlarge-double-horizontal-padding{padding-left:4em;padding-right:4em}.half-horizontal-space,.xlarge-half-horizontal-space{margin-left:1em;margin-right:1em}.half-horizontal-padding,.xlarge-half-horizontal-padding{padding-left:1em;padding-right:1em}.quarter-horizontal-space,.xlarge-quarter-horizontal-space{margin-left:.5em;margin-right:.5em}.quarter-horizontal-padding,.xlarge-quarter-horizontal-padding{padding-left:.5em;padding-right:.5em}.top-space,.xlarge-top-space{margin-top:2em}.top-padding,.xlarge-top-padding{padding-top:2em}.double-top-space,.xlarge-double-top-space{margin-top:4em}.double-top-padding,.xlarge-double-top-padding{padding-top:4em}.half-top-space,.xlarge-half-top-space{margin-top:1em}.half-top-padding,.xlarge-half-top-padding{padding-top:1em}.quarter-top-space,.xlarge-quarter-top-space{margin-top:.5em}.quarter-top-padding,.xlarge-quarter-top-padding{padding-top:.5em}.right-space,.xlarge-right-space{margin-right:2em}.right-padding,.xlarge-right-padding{padding-right:2em}.double-right-space,.xlarge-double-right-space{margin-right:4em}.double-right-padding,.xlarge-double-right-padding{padding-right:4em}.half-right-space,.xlarge-half-right-space{margin-right:1em}.half-right-padding,.xlarge-half-right-padding{padding-right:1em}.quarter-right-space,.xlarge-quarter-right-space{margin-right:.5em}.quarter-right-padding,.xlarge-quarter-right-padding{padding-right:.5em}.bottom-space,.xlarge-bottom-space{margin-bottom:2em}.bottom-padding,.xlarge-bottom-padding{padding-bottom:2em}.double-bottom-space,.xlarge-double-bottom-space{margin-bottom:4em}.double-bottom-padding,.xlarge-double-bottom-padding{padding-bottom:4em}.half-bottom-space,.xlarge-half-bottom-space{margin-bottom:1em}.half-bottom-padding,.xlarge-half-bottom-padding{padding-bottom:1em}.quarter-bottom-space,.xlarge-quarter-bottom-space{margin-bottom:.5em}.quarter-bottom-padding,.xlarge-quarter-bottom-padding{padding-bottom:.5em}.left-space,.xlarge-left-space{margin-left:2em}.left-padding,.xlarge-left-padding{padding-left:2em}.double-left-space,.xlarge-double-left-space{margin-left:4em}.double-left-padding,.xlarge-double-left-padding{padding-left:4em}.half-left-space,.xlarge-half-left-space{margin-left:1em}.half-left-padding,.xlarge-half-left-padding{padding-left:1em}.quarter-left-space,.xlarge-quarter-left-space{margin-left:.5em}.quarter-left-padding,.xlarge-quarter-left-padding{padding-left:.5em}.hide-xlarge{display:none!important}.show-xlarge{display:inherit!important}table.show-xlarge{display:table}thead.show-xlarge{display:table-header-group}tbody.show-xlarge{display:table-row-group}tfoot.show-xlarge{display:table-footer-group}tr.show-xlarge{display:table-row}td.show-xlarge,th.show-xlarge{display:table-cell}}@media screen and (min-width:961px) and (max-width:1260px){.ink-grid{padding:0 1.75em}.column-group>[class*=large-]{float:left;clear:none}.large-5{width:5%}.large-10{width:10%}.large-15{width:15%}.large-16{width:16.66%}.large-20{width:20%}.large-25{width:25%}.large-30{width:30%}.large-33{width:33.33%}.large-35{width:35%}.large-40{width:40%}.large-45{width:45%}.large-50{width:50%}.large-55{width:55%}.large-60{width:60%}.large-65{width:65%}.large-66{width:66.66%}.large-70{width:70%}.large-75{width:75%}.large-80{width:80%}.large-85{width:85%}.large-90{width:90%}.large-95{width:95%}.large-100{width:100%}[class*=large-100]{float:none;clear:both}.column-group{*zoom:1}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1.75em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.horizontal-gutters{margin-left:-1.75em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.double-gutters{margin-left:-3.5em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.double-horizontal-gutters{margin-left:-3.5em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.half-gutters{margin-left:-.875em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.half-horizontal-gutters{margin-left:-.875em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.quarter-gutters{margin-left:-.4375em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.quarter-horizontal-gutters{margin-left:-.4375em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-gutters{margin-left:-1.75em}.column-group.large-gutters>[class*=all-],.column-group.large-gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.large-horizontal-gutters{margin-left:-1.75em}.column-group.large-horizontal-gutters>[class*=all-],.column-group.large-horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.large-vertical-gutters>[class*=all-],.column-group.large-vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.large-double-gutters{margin-left:-3.5em}.column-group.large-double-gutters>[class*=all-],.column-group.large-double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.large-double-horizontal-gutters{margin-left:-3.5em}.column-group.large-double-horizontal-gutters>[class*=all-],.column-group.large-double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.large-double-vertical-gutters>[class*=all-],.column-group.large-double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.large-half-gutters{margin-left:-.875em}.column-group.large-half-gutters>[class*=all-],.column-group.large-half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.large-half-horizontal-gutters{margin-left:-.875em}.column-group.large-half-horizontal-gutters>[class*=all-],.column-group.large-half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.large-half-vertical-gutters>[class*=all-],.column-group.large-half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.large-quarter-gutters{margin-left:-.4375em}.column-group.large-quarter-gutters>[class*=all-],.column-group.large-quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.large-quarter-horizontal-gutters{margin-left:-.4375em}.column-group.large-quarter-horizontal-gutters>[class*=all-],.column-group.large-quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.large-quarter-vertical-gutters>[class*=all-],.column-group.large-quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-no-gutters{margin-left:0}.column-group.large-no-gutters>[class*=all-],.column-group.large-no-gutters>[class*=large-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=large-],.ink-table td[class*=large-],.ink-table tfoot[class*=large-],.ink-table th[class*=large-],.ink-table thead[class*=large-],.ink-table tr[class*=large-]{float:none}.large-push-left{float:left}.large-push-center{float:none;margin-left:auto;margin-right:auto}.large-push-right{float:right}.large-align-left{text-align:left}.large-align-center{text-align:center}.large-align-right{text-align:right}.large-no-margin{margin:0!important}.large-space,.space{margin:1.75em}.large-padding,.padding{padding:1.75em}.double-space,.large-double-space{margin:3.5em}.double-padding,.large-double-padding{padding:3.5em}.half-space,.large-half-space{margin:.875em}.half-padding,.large-half-padding{padding:.875em}.large-quarter-space,.quarter-space{margin:.4375em}.large-quarter-padding,.quarter-padding{padding:.4375em}.large-vertical-space,.vertical-space{margin-top:1.75em;margin-bottom:1.75em}.large-vertical-padding,.vertical-padding{padding-top:1.75em;padding-bottom:1.75em}.double-vertical-space,.large-double-vertical-space{margin-top:3.5em;margin-bottom:3.5em}.double-vertical-padding,.large-double-vertical-padding{padding-top:3.5em;padding-bottom:3.5em}.half-vertical-space,.large-half-vertical-space{margin-top:.875em;margin-bottom:.875em}.half-vertical-padding,.large-half-vertical-padding{padding-top:.875em;padding-bottom:.875em}.large-quarter-vertical-space,.quarter-vertical-space{margin-top:.4375em;margin-bottom:.4375em}.large-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.4375em;padding-bottom:.4375em}.horizontal-space,.large-horizontal-space{margin-left:1.75em;margin-right:1.75em}.horizontal-padding,.large-horizontal-padding{padding-left:1.75em;padding-right:1.75em}.double-horizontal-space,.large-double-horizontal-space{margin-left:3.5em;margin-right:3.5em}.double-horizontal-padding,.large-double-horizontal-padding{padding-left:3.5em;padding-right:3.5em}.half-horizontal-space,.large-half-horizontal-space{margin-left:.875em;margin-right:.875em}.half-horizontal-padding,.large-half-horizontal-padding{padding-left:.875em;padding-right:.875em}.large-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.4375em;margin-right:.4375em}.large-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.4375em;padding-right:.4375em}.large-top-space,.top-space{margin-top:1.75em}.large-top-padding,.top-padding{padding-top:1.75em}.double-top-space,.large-double-top-space{margin-top:3.5em}.double-top-padding,.large-double-top-padding{padding-top:3.5em}.half-top-space,.large-half-top-space{margin-top:.875em}.half-top-padding,.large-half-top-padding{padding-top:.875em}.large-quarter-top-space,.quarter-top-space{margin-top:.4375em}.large-quarter-top-padding,.quarter-top-padding{padding-top:.4375em}.large-right-space,.right-space{margin-right:1.75em}.large-right-padding,.right-padding{padding-right:1.75em}.double-right-space,.large-double-right-space{margin-right:3.5em}.double-right-padding,.large-double-right-padding{padding-right:3.5em}.half-right-space,.large-half-right-space{margin-right:.875em}.half-right-padding,.large-half-right-padding{padding-right:.875em}.large-quarter-right-space,.quarter-right-space{margin-right:.4375em}.large-quarter-right-padding,.quarter-right-padding{padding-right:.4375em}.bottom-space,.large-bottom-space{margin-bottom:1.75em}.bottom-padding,.large-bottom-padding{padding-bottom:1.75em}.double-bottom-space,.large-double-bottom-space{margin-bottom:3.5em}.double-bottom-padding,.large-double-bottom-padding{padding-bottom:3.5em}.half-bottom-space,.large-half-bottom-space{margin-bottom:.875em}.half-bottom-padding,.large-half-bottom-padding{padding-bottom:.875em}.large-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.4375em}.large-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.4375em}.large-left-space,.left-space{margin-left:1.75em}.large-left-padding,.left-padding{padding-left:1.75em}.double-left-space,.large-double-left-space{margin-left:3.5em}.double-left-padding,.large-double-left-padding{padding-left:3.5em}.half-left-space,.large-half-left-space{margin-left:.875em}.half-left-padding,.large-half-left-padding{padding-left:.875em}.large-quarter-left-space,.quarter-left-space{margin-left:.4375em}.large-quarter-left-padding,.quarter-left-padding{padding-left:.4375em}.hide-large{display:none!important}.show-large{display:inherit!important}table.show-large{display:table}thead.show-large{display:table-header-group}tbody.show-large{display:table-row-group}tfoot.show-large{display:table-footer-group}tr.show-large{display:table-row}td.show-large,th.show-large{display:table-cell}}@media screen and (min-width:641px) and (max-width:960px){.ink-grid{padding:0 1.5em}.column-group>[class*=medium-]{float:left;clear:none}.medium-5{width:5%}.medium-10{width:10%}.medium-15{width:15%}.medium-16{width:16.66%}.medium-20{width:20%}.medium-25{width:25%}.medium-30{width:30%}.medium-33{width:33.33%}.medium-35{width:35%}.medium-40{width:40%}.medium-45{width:45%}.medium-50{width:50%}.medium-55{width:55%}.medium-60{width:60%}.medium-65{width:65%}.medium-66{width:66.66%}.medium-70{width:70%}.medium-75{width:75%}.medium-80{width:80%}.medium-85{width:85%}.medium-90{width:90%}.medium-95{width:95%}.medium-100{width:100%}[class*=medium-100]{float:none;clear:both}.column-group{*zoom:1}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1.5em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}.column-group.horizontal-gutters{margin-left:-1.5em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=medium-]{padding-left:1.5em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=medium-]{margin-bottom:1.5em}.column-group.double-gutters{margin-left:-3em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}.column-group.double-horizontal-gutters{margin-left:-3em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=medium-]{padding-left:3em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=medium-]{margin-bottom:3em}.column-group.half-gutters{margin-left:-.75em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}.column-group.half-horizontal-gutters{margin-left:-.75em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=medium-]{padding-left:.75em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}.column-group.quarter-gutters{margin-left:-.375em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}.column-group.quarter-horizontal-gutters{margin-left:-.375em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}.column-group.medium-gutters{margin-left:-1.5em}.column-group.medium-gutters>[class*=all-],.column-group.medium-gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}.column-group.medium-horizontal-gutters{margin-left:-1.5em}.column-group.medium-horizontal-gutters>[class*=all-],.column-group.medium-horizontal-gutters>[class*=medium-]{padding-left:1.5em}.column-group.medium-vertical-gutters>[class*=all-],.column-group.medium-vertical-gutters>[class*=medium-]{margin-bottom:1.5em}.column-group.medium-double-gutters{margin-left:-3em}.column-group.medium-double-gutters>[class*=all-],.column-group.medium-double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}.column-group.medium-double-horizontal-gutters{margin-left:-3em}.column-group.medium-double-horizontal-gutters>[class*=all-],.column-group.medium-double-horizontal-gutters>[class*=medium-]{padding-left:3em}.column-group.medium-double-vertical-gutters>[class*=all-],.column-group.medium-double-vertical-gutters>[class*=medium-]{margin-bottom:3em}.column-group.medium-half-gutters{margin-left:-.75em}.column-group.medium-half-gutters>[class*=all-],.column-group.medium-half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}.column-group.medium-half-horizontal-gutters{margin-left:-.75em}.column-group.medium-half-horizontal-gutters>[class*=all-],.column-group.medium-half-horizontal-gutters>[class*=medium-]{padding-left:.75em}.column-group.medium-half-vertical-gutters>[class*=all-],.column-group.medium-half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}.column-group.medium-quarter-gutters{margin-left:-.375em}.column-group.medium-quarter-gutters>[class*=all-],.column-group.medium-quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}.column-group.medium-quarter-horizontal-gutters{margin-left:-.375em}.column-group.medium-quarter-horizontal-gutters>[class*=all-],.column-group.medium-quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}.column-group.medium-quarter-vertical-gutters>[class*=all-],.column-group.medium-quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}.column-group.medium-no-gutters{margin-left:0}.column-group.medium-no-gutters>[class*=all-],.column-group.medium-no-gutters>[class*=medium-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=medium-],.ink-table td[class*=medium-],.ink-table tfoot[class*=medium-],.ink-table th[class*=medium-],.ink-table thead[class*=medium-],.ink-table tr[class*=medium-]{float:none}.medium-push-left{float:left}.medium-push-center{float:none;margin-left:auto;margin-right:auto}.medium-push-right{float:right}.medium-align-left{text-align:left}.medium-align-center{text-align:center}.medium-align-right{text-align:right}.medium-no-margin{margin:0!important}.medium-space,.space{margin:1.5em}.medium-padding,.padding{padding:1.5em}.double-space,.medium-double-space{margin:3em}.double-padding,.medium-double-padding{padding:3em}.half-space,.medium-half-space{margin:.75em}.half-padding,.medium-half-padding{padding:.75em}.medium-quarter-space,.quarter-space{margin:.375em}.medium-quarter-padding,.quarter-padding{padding:.375em}.medium-vertical-space,.vertical-space{margin-top:1.5em;margin-bottom:1.5em}.medium-vertical-padding,.vertical-padding{padding-top:1.5em;padding-bottom:1.5em}.double-vertical-space,.medium-double-vertical-space{margin-top:3em;margin-bottom:3em}.double-vertical-padding,.medium-double-vertical-padding{padding-top:3em;padding-bottom:3em}.half-vertical-space,.medium-half-vertical-space{margin-top:.75em;margin-bottom:.75em}.half-vertical-padding,.medium-half-vertical-padding{padding-top:.75em;padding-bottom:.75em}.medium-quarter-vertical-space,.quarter-vertical-space{margin-top:.375em;margin-bottom:.375em}.medium-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.375em;padding-bottom:.375em}.horizontal-space,.medium-horizontal-space{margin-left:1.5em;margin-right:1.5em}.horizontal-padding,.medium-horizontal-padding{padding-left:1.5em;padding-right:1.5em}.double-horizontal-space,.medium-double-horizontal-space{margin-left:3em;margin-right:3em}.double-horizontal-padding,.medium-double-horizontal-padding{padding-left:3em;padding-right:3em}.half-horizontal-space,.medium-half-horizontal-space{margin-left:.75em;margin-right:.75em}.half-horizontal-padding,.medium-half-horizontal-padding{padding-left:.75em;padding-right:.75em}.medium-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.375em;margin-right:.375em}.medium-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.375em;padding-right:.375em}.medium-top-space,.top-space{margin-top:1.5em}.medium-top-padding,.top-padding{padding-top:1.5em}.double-top-space,.medium-double-top-space{margin-top:3em}.double-top-padding,.medium-double-top-padding{padding-top:3em}.half-top-space,.medium-half-top-space{margin-top:.75em}.half-top-padding,.medium-half-top-padding{padding-top:.75em}.medium-quarter-top-space,.quarter-top-space{margin-top:.375em}.medium-quarter-top-padding,.quarter-top-padding{padding-top:.375em}.medium-right-space,.right-space{margin-right:1.5em}.medium-right-padding,.right-padding{padding-right:1.5em}.double-right-space,.medium-double-right-space{margin-right:3em}.double-right-padding,.medium-double-right-padding{padding-right:3em}.half-right-space,.medium-half-right-space{margin-right:.75em}.half-right-padding,.medium-half-right-padding{padding-right:.75em}.medium-quarter-right-space,.quarter-right-space{margin-right:.375em}.medium-quarter-right-padding,.quarter-right-padding{padding-right:.375em}.bottom-space,.medium-bottom-space{margin-bottom:1.5em}.bottom-padding,.medium-bottom-padding{padding-bottom:1.5em}.double-bottom-space,.medium-double-bottom-space{margin-bottom:3em}.double-bottom-padding,.medium-double-bottom-padding{padding-bottom:3em}.half-bottom-space,.medium-half-bottom-space{margin-bottom:.75em}.half-bottom-padding,.medium-half-bottom-padding{padding-bottom:.75em}.medium-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.375em}.medium-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.375em}.left-space,.medium-left-space{margin-left:1.5em}.left-padding,.medium-left-padding{padding-left:1.5em}.double-left-space,.medium-double-left-space{margin-left:3em}.double-left-padding,.medium-double-left-padding{padding-left:3em}.half-left-space,.medium-half-left-space{margin-left:.75em}.half-left-padding,.medium-half-left-padding{padding-left:.75em}.medium-quarter-left-space,.quarter-left-space{margin-left:.375em}.medium-quarter-left-padding,.quarter-left-padding{padding-left:.375em}.hide-medium{display:none!important}.show-medium{display:inherit!important}table.show-medium{display:table}thead.show-medium{display:table-header-group}tbody.show-medium{display:table-row-group}tfoot.show-medium{display:table-footer-group}tr.show-medium{display:table-row}td.show-medium,th.show-medium{display:table-cell}}@media screen and (min-width:321px) and (max-width:640px){.ink-grid{padding:0 1.25em}.column-group>[class*=small-]{float:left;clear:none}.small-5{width:5%}.small-10{width:10%}.small-15{width:15%}.small-16{width:16.66%}.small-20{width:20%}.small-25{width:25%}.small-30{width:30%}.small-33{width:33.33%}.small-35{width:35%}.small-40{width:40%}.small-45{width:45%}.small-50{width:50%}.small-55{width:55%}.small-60{width:60%}.small-65{width:65%}.small-66{width:66.66%}.small-70{width:70%}.small-75{width:75%}.small-80{width:80%}.small-85{width:85%}.small-90{width:90%}.small-95{width:95%}.small-100{width:100%}[class*=small-100]{float:none;clear:both}.column-group{*zoom:1}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1.25em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}.column-group.horizontal-gutters{margin-left:-1.25em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=small-]{padding-left:1.25em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=small-]{margin-bottom:1.25em}.column-group.double-gutters{margin-left:-2.5em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}.column-group.double-horizontal-gutters{margin-left:-2.5em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=small-]{padding-left:2.5em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}.column-group.half-gutters{margin-left:-.625em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}.column-group.half-horizontal-gutters{margin-left:-.625em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=small-]{padding-left:.625em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=small-]{margin-bottom:.625em}.column-group.quarter-gutters{margin-left:-.3125em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}.column-group.quarter-horizontal-gutters{margin-left:-.3125em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}.column-group.small-gutters{margin-left:-1.25em}.column-group.small-gutters>[class*=all-],.column-group.small-gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}.column-group.small-horizontal-gutters{margin-left:-1.25em}.column-group.small-horizontal-gutters>[class*=all-],.column-group.small-horizontal-gutters>[class*=small-]{padding-left:1.25em}.column-group.small-vertical-gutters>[class*=all-],.column-group.small-vertical-gutters>[class*=small-]{margin-bottom:1.25em}.column-group.small-double-gutters{margin-left:-2.5em}.column-group.small-double-gutters>[class*=all-],.column-group.small-double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}.column-group.small-double-horizontal-gutters{margin-left:-2.5em}.column-group.small-double-horizontal-gutters>[class*=all-],.column-group.small-double-horizontal-gutters>[class*=small-]{padding-left:2.5em}.column-group.small-double-vertical-gutters>[class*=all-],.column-group.small-double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}.column-group.small-half-gutters{margin-left:-.625em}.column-group.small-half-gutters>[class*=all-],.column-group.small-half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}.column-group.small-half-horizontal-gutters{margin-left:-.625em}.column-group.small-half-horizontal-gutters>[class*=all-],.column-group.small-half-horizontal-gutters>[class*=small-]{padding-left:.625em}.column-group.small-half-vertical-gutters>[class*=all-],.column-group.small-half-vertical-gutters>[class*=small-]{margin-bottom:.625em}.column-group.small-quarter-gutters{margin-left:-.3125em}.column-group.small-quarter-gutters>[class*=all-],.column-group.small-quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}.column-group.small-quarter-horizontal-gutters{margin-left:-.3125em}.column-group.small-quarter-horizontal-gutters>[class*=all-],.column-group.small-quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}.column-group.small-quarter-vertical-gutters>[class*=all-],.column-group.small-quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}.column-group.small-no-gutters{margin-left:0}.column-group.small-no-gutters>[class*=all-],.column-group.small-no-gutters>[class*=small-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=small-],.ink-table td[class*=small-],.ink-table tfoot[class*=small-],.ink-table th[class*=small-],.ink-table thead[class*=small-],.ink-table tr[class*=small-]{float:none}.small-push-left{float:left}.small-push-center{float:none;margin-left:auto;margin-right:auto}.small-push-right{float:right}.small-align-left{text-align:left}.small-align-center{text-align:center}.small-align-right{text-align:right}.small-no-margin{margin:0!important}.small-space,.space{margin:1.25em}.padding,.small-padding{padding:1.25em}.double-space,.small-double-space{margin:2.5em}.double-padding,.small-double-padding{padding:2.5em}.half-space,.small-half-space{margin:.625em}.half-padding,.small-half-padding{padding:.625em}.quarter-space,.small-quarter-space{margin:.3125em}.quarter-padding,.small-quarter-padding{padding:.3125em}.small-vertical-space,.vertical-space{margin-top:1.25em;margin-bottom:1.25em}.small-vertical-padding,.vertical-padding{padding-top:1.25em;padding-bottom:1.25em}.double-vertical-space,.small-double-vertical-space{margin-top:2.5em;margin-bottom:2.5em}.double-vertical-padding,.small-double-vertical-padding{padding-top:2.5em;padding-bottom:2.5em}.half-vertical-space,.small-half-vertical-space{margin-top:.625em;margin-bottom:.625em}.half-vertical-padding,.small-half-vertical-padding{padding-top:.625em;padding-bottom:.625em}.quarter-vertical-space,.small-quarter-vertical-space{margin-top:.3125em;margin-bottom:.3125em}.quarter-vertical-padding,.small-quarter-vertical-padding{padding-top:.3125em;padding-bottom:.3125em}.horizontal-space,.small-horizontal-space{margin-left:1.25em;margin-right:1.25em}.horizontal-padding,.small-horizontal-padding{padding-left:1.25em;padding-right:1.25em}.double-horizontal-space,.small-double-horizontal-space{margin-left:2.5em;margin-right:2.5em}.double-horizontal-padding,.small-double-horizontal-padding{padding-left:2.5em;padding-right:2.5em}.half-horizontal-space,.small-half-horizontal-space{margin-left:.625em;margin-right:.625em}.half-horizontal-padding,.small-half-horizontal-padding{padding-left:.625em;padding-right:.625em}.quarter-horizontal-space,.small-quarter-horizontal-space{margin-left:.3125em;margin-right:.3125em}.quarter-horizontal-padding,.small-quarter-horizontal-padding{padding-left:.3125em;padding-right:.3125em}.small-top-space,.top-space{margin-top:1.25em}.small-top-padding,.top-padding{padding-top:1.25em}.double-top-space,.small-double-top-space{margin-top:2.5em}.double-top-padding,.small-double-top-padding{padding-top:2.5em}.half-top-space,.small-half-top-space{margin-top:.625em}.half-top-padding,.small-half-top-padding{padding-top:.625em}.quarter-top-space,.small-quarter-top-space{margin-top:.3125em}.quarter-top-padding,.small-quarter-top-padding{padding-top:.3125em}.right-space,.small-right-space{margin-right:1.25em}.right-padding,.small-right-padding{padding-right:1.25em}.double-right-space,.small-double-right-space{margin-right:2.5em}.double-right-padding,.small-double-right-padding{padding-right:2.5em}.half-right-space,.small-half-right-space{margin-right:.625em}.half-right-padding,.small-half-right-padding{padding-right:.625em}.quarter-right-space,.small-quarter-right-space{margin-right:.3125em}.quarter-right-padding,.small-quarter-right-padding{padding-right:.3125em}.bottom-space,.small-bottom-space{margin-bottom:1.25em}.bottom-padding,.small-bottom-padding{padding-bottom:1.25em}.double-bottom-space,.small-double-bottom-space{margin-bottom:2.5em}.double-bottom-padding,.small-double-bottom-padding{padding-bottom:2.5em}.half-bottom-space,.small-half-bottom-space{margin-bottom:.625em}.half-bottom-padding,.small-half-bottom-padding{padding-bottom:.625em}.quarter-bottom-space,.small-quarter-bottom-space{margin-bottom:.3125em}.quarter-bottom-padding,.small-quarter-bottom-padding{padding-bottom:.3125em}.left-space,.small-left-space{margin-left:1.25em}.left-padding,.small-left-padding{padding-left:1.25em}.double-left-space,.small-double-left-space{margin-left:2.5em}.double-left-padding,.small-double-left-padding{padding-left:2.5em}.half-left-space,.small-half-left-space{margin-left:.625em}.half-left-padding,.small-half-left-padding{padding-left:.625em}.quarter-left-space,.small-quarter-left-space{margin-left:.3125em}.quarter-left-padding,.small-quarter-left-padding{padding-left:.3125em}.hide-small{display:none!important}.show-small{display:inherit!important}table.show-small{display:table}thead.show-small{display:table-header-group}tbody.show-small{display:table-row-group}tfoot.show-small{display:table-footer-group}tr.show-small{display:table-row}td.show-small,th.show-small{display:table-cell}}@media screen and (max-width:320px){.ink-grid{padding:0 1em}.column-group>[class*=tiny-]{float:left;clear:none}.tiny-5{width:5%}.tiny-10{width:10%}.tiny-15{width:15%}.tiny-16{width:16.66%}.tiny-20{width:20%}.tiny-25{width:25%}.tiny-30{width:30%}.tiny-33{width:33.33%}.tiny-35{width:35%}.tiny-40{width:40%}.tiny-45{width:45%}.tiny-50{width:50%}.tiny-55{width:55%}.tiny-60{width:60%}.tiny-65{width:65%}.tiny-66{width:66.66%}.tiny-70{width:70%}.tiny-75{width:75%}.tiny-80{width:80%}.tiny-85{width:85%}.tiny-90{width:90%}.tiny-95{width:95%}.tiny-100{width:100%}[class*=tiny-100]{float:none;clear:both}.column-group{*zoom:1}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}.column-group.horizontal-gutters{margin-left:-1em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=tiny-]{padding-left:1em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=tiny-]{margin-bottom:1em}.column-group.double-gutters{margin-left:-2em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}.column-group.double-horizontal-gutters{margin-left:-2em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=tiny-]{padding-left:2em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}.column-group.half-gutters{margin-left:-.5em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}.column-group.half-horizontal-gutters{margin-left:-.5em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}.column-group.quarter-gutters{margin-left:-.25em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}.column-group.quarter-horizontal-gutters{margin-left:-.25em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}.column-group.tiny-gutters{margin-left:-1em}.column-group.tiny-gutters>[class*=all-],.column-group.tiny-gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}.column-group.tiny-horizontal-gutters{margin-left:-1em}.column-group.tiny-horizontal-gutters>[class*=all-],.column-group.tiny-horizontal-gutters>[class*=tiny-]{padding-left:1em}.column-group.tiny-vertical-gutters>[class*=all-],.column-group.tiny-vertical-gutters>[class*=tiny-]{margin-bottom:1em}.column-group.tiny-double-gutters{margin-left:-2em}.column-group.tiny-double-gutters>[class*=all-],.column-group.tiny-double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}.column-group.tiny-double-horizontal-gutters{margin-left:-2em}.column-group.tiny-double-horizontal-gutters>[class*=all-],.column-group.tiny-double-horizontal-gutters>[class*=tiny-]{padding-left:2em}.column-group.tiny-double-vertical-gutters>[class*=all-],.column-group.tiny-double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}.column-group.tiny-half-gutters{margin-left:-.5em}.column-group.tiny-half-gutters>[class*=all-],.column-group.tiny-half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}.column-group.tiny-half-horizontal-gutters{margin-left:-.5em}.column-group.tiny-half-horizontal-gutters>[class*=all-],.column-group.tiny-half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}.column-group.tiny-half-vertical-gutters>[class*=all-],.column-group.tiny-half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}.column-group.tiny-quarter-gutters{margin-left:-.25em}.column-group.tiny-quarter-gutters>[class*=all-],.column-group.tiny-quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}.column-group.tiny-quarter-horizontal-gutters{margin-left:-.25em}.column-group.tiny-quarter-horizontal-gutters>[class*=all-],.column-group.tiny-quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}.column-group.tiny-quarter-vertical-gutters>[class*=all-],.column-group.tiny-quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}.column-group.tiny-no-gutters{margin-left:0}.column-group.tiny-no-gutters>[class*=all-],.column-group.tiny-no-gutters>[class*=tiny-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=tiny-],.ink-table td[class*=tiny-],.ink-table tfoot[class*=tiny-],.ink-table th[class*=tiny-],.ink-table thead[class*=tiny-],.ink-table tr[class*=tiny-]{float:none}.tiny-push-left{float:left}.tiny-push-center{float:none;margin-left:auto;margin-right:auto}.tiny-push-right{float:right}.tiny-align-left{text-align:left}.tiny-align-center{text-align:center}.tiny-align-right{text-align:right}.tiny-no-margin{margin:0!important}.space,.tiny-space{margin:1em}.padding,.tiny-padding{padding:1em}.double-space,.tiny-double-space{margin:2em}.double-padding,.tiny-double-padding{padding:2em}.half-space,.tiny-half-space{margin:.5em}.half-padding,.tiny-half-padding{padding:.5em}.quarter-space,.tiny-quarter-space{margin:.25em}.quarter-padding,.tiny-quarter-padding{padding:.25em}.tiny-vertical-space,.vertical-space{margin-top:1em;margin-bottom:1em}.tiny-vertical-padding,.vertical-padding{padding-top:1em;padding-bottom:1em}.double-vertical-space,.tiny-double-vertical-space{margin-top:2em;margin-bottom:2em}.double-vertical-padding,.tiny-double-vertical-padding{padding-top:2em;padding-bottom:2em}.half-vertical-space,.tiny-half-vertical-space{margin-top:.5em;margin-bottom:.5em}.half-vertical-padding,.tiny-half-vertical-padding{padding-top:.5em;padding-bottom:.5em}.quarter-vertical-space,.tiny-quarter-vertical-space{margin-top:.25em;margin-bottom:.25em}.quarter-vertical-padding,.tiny-quarter-vertical-padding{padding-top:.25em;padding-bottom:.25em}.horizontal-space,.tiny-horizontal-space{margin-left:1em;margin-right:1em}.horizontal-padding,.tiny-horizontal-padding{padding-left:1em;padding-right:1em}.double-horizontal-space,.tiny-double-horizontal-space{margin-left:2em;margin-right:2em}.double-horizontal-padding,.tiny-double-horizontal-padding{padding-left:2em;padding-right:2em}.half-horizontal-space,.tiny-half-horizontal-space{margin-left:.5em;margin-right:.5em}.half-horizontal-padding,.tiny-half-horizontal-padding{padding-left:.5em;padding-right:.5em}.quarter-horizontal-space,.tiny-quarter-horizontal-space{margin-left:.25em;margin-right:.25em}.quarter-horizontal-padding,.tiny-quarter-horizontal-padding{padding-left:.25em;padding-right:.25em}.tiny-top-space,.top-space{margin-top:1em}.tiny-top-padding,.top-padding{padding-top:1em}.double-top-space,.tiny-double-top-space{margin-top:2em}.double-top-padding,.tiny-double-top-padding{padding-top:2em}.half-top-space,.tiny-half-top-space{margin-top:.5em}.half-top-padding,.tiny-half-top-padding{padding-top:.5em}.quarter-top-space,.tiny-quarter-top-space{margin-top:.25em}.quarter-top-padding,.tiny-quarter-top-padding{padding-top:.25em}.right-space,.tiny-right-space{margin-right:1em}.right-padding,.tiny-right-padding{padding-right:1em}.double-right-space,.tiny-double-right-space{margin-right:2em}.double-right-padding,.tiny-double-right-padding{padding-right:2em}.half-right-space,.tiny-half-right-space{margin-right:.5em}.half-right-padding,.tiny-half-right-padding{padding-right:.5em}.quarter-right-space,.tiny-quarter-right-space{margin-right:.25em}.quarter-right-padding,.tiny-quarter-right-padding{padding-right:.25em}.bottom-space,.tiny-bottom-space{margin-bottom:1em}.bottom-padding,.tiny-bottom-padding{padding-bottom:1em}.double-bottom-space,.tiny-double-bottom-space{margin-bottom:2em}.double-bottom-padding,.tiny-double-bottom-padding{padding-bottom:2em}.half-bottom-space,.tiny-half-bottom-space{margin-bottom:.5em}.half-bottom-padding,.tiny-half-bottom-padding{padding-bottom:.5em}.quarter-bottom-space,.tiny-quarter-bottom-space{margin-bottom:.25em}.quarter-bottom-padding,.tiny-quarter-bottom-padding{padding-bottom:.25em}.left-space,.tiny-left-space{margin-left:1em}.left-padding,.tiny-left-padding{padding-left:1em}.double-left-space,.tiny-double-left-space{margin-left:2em}.double-left-padding,.tiny-double-left-padding{padding-left:2em}.half-left-space,.tiny-half-left-space{margin-left:.5em}.half-left-padding,.tiny-half-left-padding{padding-left:.5em}.quarter-left-space,.tiny-quarter-left-space{margin-left:.25em}.quarter-left-padding,.tiny-quarter-left-padding{padding-left:.25em}.hide-tiny{display:none!important}.show-tiny{display:inherit!important}table.show-tiny{display:table}thead.show-tiny{display:table-header-group}tbody.show-tiny{display:table-row-group}tfoot.show-tiny{display:table-footer-group}tr.show-tiny{display:table-row}td.show-tiny,th.show-tiny{display:table-cell}}@media screen and (min-width:1261px){html{font-size:1.08em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:961px) and (max-width:1260px){html{font-size:1.05em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:641px) and (max-width:960px){html{font-size:1em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:321px) and (max-width:640px){html{font-size:.98em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (max-width:320px){html{font-size:.97em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}.ink-label{padding:0 .35em;white-space:nowrap}.ink-navigation{overflow:visible}.ink-navigation ul{list-style-type:none;padding:0;margin:0}.ink-navigation ul li{margin:0}.ink-navigation .breadcrumbs li{line-height:2.7em;display:inline}.ink-navigation .breadcrumbs li a{display:inline;padding:0}.ink-navigation .breadcrumbs li a:hover{background:0 0}.ink-navigation .breadcrumbs li.active a{cursor:default;text-decoration:none}.ink-navigation .breadcrumbs li:first-child a{padding-left:1.2em}.ink-navigation .breadcrumbs li:after{content:'/';display:inline;margin:0 .7em}.ink-navigation .breadcrumbs li:last-child:after{content:'';display:none}.ink-dropdown,.ink-navigation{position:relative}.ink-dropdown ul.dropdown,.ink-dropdown ul.dropdown-menu,.ink-navigation ul.dropdown,.ink-navigation ul.dropdown-menu{position:absolute;top:110%;background:#fff;z-index:30;border:1px solid #d9d9d9;height:auto;width:auto;min-width:10em;max-width:12em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:rgba(100,100,100,.3) 0 0 1px 0;-moz-box-shadow:rgba(100,100,100,.3) 0 0 1px 0;box-shadow:rgba(100,100,100,.3) 0 0 1px 0;margin-left:0;padding:.35em 0;font-size:.85em}.ink-dropdown ul.dropdown li,.ink-dropdown ul.dropdown-menu li,.ink-navigation ul.dropdown li,.ink-navigation ul.dropdown-menu li{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-border-radius:none;-moz-border-radius:none;-ms-border-radius:none;-o-border-radius:none;border-radius:none;width:auto;height:auto;min-height:auto;display:list-item;float:none;margin:0;text-align:left;text-transform:none;padding:0;position:relative;list-style-type:none}.ink-dropdown ul.dropdown li.separator-above,.ink-dropdown ul.dropdown-menu li.separator-above,.ink-navigation ul.dropdown li.separator-above,.ink-navigation ul.dropdown-menu li.separator-above{padding-top:.35em;margin-top:.35em;border-top:1px solid #d9d9d9}.ink-dropdown ul.dropdown li.separator-below,.ink-dropdown ul.dropdown-menu li.separator-below,.ink-navigation ul.dropdown li.separator-below,.ink-navigation ul.dropdown-menu li.separator-below{padding-bottom:.35em;margin-bottom:.35em;border-bottom:1px solid #d9d9d9}.ink-dropdown ul.dropdown li.heading,.ink-dropdown ul.dropdown-menu li.heading,.ink-navigation ul.dropdown li.heading,.ink-navigation ul.dropdown-menu li.heading{font-weight:700;margin-bottom:.35em;padding:.5em .8em;color:#333}.ink-dropdown ul.dropdown li a,.ink-dropdown ul.dropdown-menu li a,.ink-navigation ul.dropdown li a,.ink-navigation ul.dropdown-menu li a{color:#444;padding:.5em .8em;display:block;clear:both}.ink-dropdown ul.dropdown li a:hover,.ink-dropdown ul.dropdown-menu li a:hover,.ink-navigation ul.dropdown li a:hover,.ink-navigation ul.dropdown-menu li a:hover{background:#f2f2f2;text-decoration:none}.ink-dropdown ul.dropdown li.active a,.ink-dropdown ul.dropdown-menu li.active a,.ink-navigation ul.dropdown li.active a,.ink-navigation ul.dropdown-menu li.active a{background:#999;color:#fff}.ink-dropdown ul.dropdown li.disabled a,.ink-dropdown ul.dropdown-menu li.disabled a,.ink-navigation ul.dropdown li.disabled a,.ink-navigation ul.dropdown-menu li.disabled a{color:#b3b3b3}.ink-dropdown ul.dropdown li.disabled a:hover,.ink-dropdown ul.dropdown-menu li.disabled a:hover,.ink-navigation ul.dropdown li.disabled a:hover,.ink-navigation ul.dropdown-menu li.disabled a:hover{background:0 0;cursor:default}.ink-dropdown ul.dropdown li.submenu,.ink-dropdown ul.dropdown-menu li.submenu,.ink-navigation ul.dropdown li.submenu,.ink-navigation ul.dropdown-menu li.submenu{overflow:visible}.ink-dropdown ul.dropdown li.submenu>a,.ink-dropdown ul.dropdown-menu li.submenu>a,.ink-navigation ul.dropdown li.submenu>a,.ink-navigation ul.dropdown-menu li.submenu>a{white-space:nowrap}.ink-dropdown ul.dropdown li.submenu>a:after,.ink-dropdown ul.dropdown-menu li.submenu>a:after,.ink-navigation ul.dropdown li.submenu>a:after,.ink-navigation ul.dropdown-menu li.submenu>a:after{content:"\f0da";width:auto;margin-left:.8em;font-family:FontAwesome;color:#b3b3b3}.ink-dropdown ul.dropdown li.submenu:hover>a,.ink-dropdown ul.dropdown-menu li.submenu:hover>a,.ink-navigation ul.dropdown li.submenu:hover>a,.ink-navigation ul.dropdown-menu li.submenu:hover>a{background:#f2f2f2;text-decoration:none}.ink-dropdown ul.dropdown li.submenu:hover:hover>ul.dropdown,.ink-dropdown ul.dropdown li.submenu:hover:hover>ul.dropdown-menu,.ink-dropdown ul.dropdown-menu li.submenu:hover:hover>ul.dropdown,.ink-dropdown ul.dropdown-menu li.submenu:hover:hover>ul.dropdown-menu,.ink-navigation ul.dropdown li.submenu:hover:hover>ul.dropdown,.ink-navigation ul.dropdown li.submenu:hover:hover>ul.dropdown-menu,.ink-navigation ul.dropdown-menu li.submenu:hover:hover>ul.dropdown,.ink-navigation ul.dropdown-menu li.submenu:hover:hover>ul.dropdown-menu{display:block}.ink-dropdown ul.dropdown li.submenu>ul.dropdown,.ink-dropdown ul.dropdown li.submenu>ul.dropdown-menu,.ink-dropdown ul.dropdown-menu li.submenu>ul.dropdown,.ink-dropdown ul.dropdown-menu li.submenu>ul.dropdown-menu,.ink-navigation ul.dropdown li.submenu>ul.dropdown,.ink-navigation ul.dropdown li.submenu>ul.dropdown-menu,.ink-navigation ul.dropdown-menu li.submenu>ul.dropdown,.ink-navigation ul.dropdown-menu li.submenu>ul.dropdown-menu{font-size:inherit;position:absolute;top:-.36em;left:100%;display:none}.ink-navigation ul.pagination{overflow:hidden;*zoom:1}.ink-navigation ul.pagination li{line-height:1.7;float:left}.ink-navigation ul.pagination li a{padding:.5em 1em;display:block;float:left}.ink-navigation ul.pagination.dotted li a{display:block;height:1em;width:1em;margin-right:.6em;padding:0;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%;text-indent:99999px}.ink-navigation ul.pagination.dotted li a:first-child,.ink-navigation ul.pagination.dotted li a:last-child{-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%}.ink-navigation ul.pagination.chevron li{display:none}.ink-navigation ul.pagination.chevron li.next,.ink-navigation ul.pagination.chevron li.previous{display:block}.ink-navigation ul.pagination.chevron li.next a,.ink-navigation ul.pagination.chevron li.previous a{display:block;position:absolute;top:35%;padding:0 .5em;margin:0;font-family:FontAwesome;font-size:4em}.ink-navigation ul.pagination.chevron li.next a span,.ink-navigation ul.pagination.chevron li.previous a span{text-indent:-99999px;display:inline-block}.ink-navigation ul.pagination.chevron li.previous a{left:0}.ink-navigation ul.pagination.chevron li.previous a:after{content:"\f137"}.ink-navigation ul.pagination.chevron li.next a{right:0}.ink-navigation ul.pagination.chevron li.next a:after{content:"\f138"}.ink-navigation .pills{overflow:hidden;*zoom:1}.ink-navigation .pills li{overflow:hidden;display:block;float:left;margin:0 .5em .5em 0;line-height:1.7}.ink-navigation .pills li a{display:block;padding:.5em 1em}.ink-navigation .pills li a:hover{text-decoration:none}.ink-navigation .pills li.active a,.ink-navigation .pills li.disabled a{cursor:default}.ink-navigation ul{*height:100%}.ink-navigation ul.menu{*zoom:1}.ink-navigation ul.menu:after{content:"";display:table;clear:both}.ink-navigation ul.menu li{*height:100%}.ink-navigation ul.menu li:hover>ul.submenu{display:block}.ink-navigation ul.menu li ul.submenu{display:none;position:absolute;z-index:10}.ink-navigation ul.menu li ul.submenu li a{padding:.5em 1em;display:block;float:none}.ink-navigation ul.menu.horizontal.scrollable{font-size:0;white-space:nowrap;overflow-x:scroll;overflow-y:hidden;-webkit-overflow-scrolling:touch;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}.ink-navigation ul.menu.horizontal.scrollable li{display:inline-block;float:none}.ink-navigation ul.menu.horizontal.scrollable li a{border-right:rgba(10,10,10,.3) 1px solid;font-size:initial}.ink-navigation ul.menu.horizontal.scrollable li:last-child a{border-right:0}.ink-navigation ul.menu.horizontal li{float:left;position:relative}.ink-navigation ul.menu.horizontal li a{padding:.5em 1em;display:block;line-height:1.7}.ink-navigation ul.menu.horizontal li .control{margin-top:.3em}.ink-navigation ul.menu.horizontal li ul.submenu{min-width:100%;z-index:50;top:auto;left:auto}.ink-navigation ul.menu.horizontal li ul.submenu li{float:none}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout{position:absolute;top:0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout.left{right:100%}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout.right{left:100%}.ink-navigation ul.menu.vertical li{line-height:1.7;position:relative}.ink-navigation ul.menu.vertical li a{padding:.5em 1em;display:block}.ink-navigation ul.menu.vertical li ul.submenu{position:relative;top:auto;left:auto}.ink-navigation ul.menu.vertical li ul.submenu.flyout{position:absolute;min-width:8em;top:0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.vertical li ul.submenu.flyout.left{right:100%}.ink-navigation ul.menu.vertical li ul.submenu.flyout.right{left:100%}@media print{*{background:transparent!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.ink-navigation{display:none}.ink-table{border-collapse:collapse}.ink-label{border:1px solid #000}}table.ink-table{width:100%;border-collapse:collapse;border-spacing:0}table.ink-table tr th{padding:5px 10px;line-height:1.3}table.ink-table tr th[data-sortable=true]:hover{cursor:pointer;text-decoration:underline}table.ink-table tr th[data-sortable=true]:hover i{text-decoration:none}table.ink-table tr th[data-sortable=true] i{padding-left:.5em}table.ink-table tr td{padding:5px 10px;line-height:1.3}table.ink-table.hover tbody tr:hover{cursor:pointer}table.ink-table.bordered{border-collapse:separate}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{color:#555;font-family:Roboto,Arial,Helvetica,sans-serif;line-height:1.45}.fw-100,.fw-light{font-weight:100}.fw-300,.fw-thin{font-weight:300}.fw-400,.fw-regular{font-weight:400}.fw-500,.fw-medium{font-weight:500}.fw-700,.fw-bold{font-weight:700}.fw-900,.fw-black{font-weight:900}.condensed-300,.condensed-thin{font-weight:200;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.condensed-400,.condensed-regular{font-weight:400;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.condensed-700,.condensed-bold{font-weight:700;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.slab-100,.slab-light{font-weight:100;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-300,.slab-thin{font-weight:300;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-400,.slab-regular{font-weight:400;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-700,.slab-bold{font-weight:700;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.sans{font-family:Roboto,Arial,Helvetica,sans-serif}.serif{font-family:Times,"Times New Roman",serif}.monospace{font-family:Monaco,"Andale Mono","Courier New",monospace}.condensed{font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.slab{font-family:Roboto_slab,Arial,Helvetica,sans-serif}.italic{font-style:italic}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalizer{text-transform:capitalize}.fa{font-size:14px}a{color:#6998c9;text-decoration:none;cursor:pointer}a:hover{color:#007ed5;text-decoration:underline}h1{font-size:2.2em;margin-top:0;margin-bottom:.57539em}h2{font-size:1.75em;margin-top:0;margin-bottom:.72334em}h3{font-size:1.5em;margin-top:0;margin-bottom:.8439em}h4{font-size:1.25em;margin-top:0;margin-bottom:1.01268em}h5,h6{font-size:1.1em;margin-top:0;margin-bottom:1.15077em}p,table{font-size:1em;margin-top:0;margin-bottom:1.26585em}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,h6:first-child,p:first-child{margin-top:0}h1,h2,h3,h4,h5,h6{color:#404040;font-weight:700;line-height:1.16}small{color:#888}input,textarea{color:#666}h1 small,h2 small,h3 small,h4 small{color:#bbb;font-size:.6em;font-weight:100;line-height:1}mark{background:#dae5f2}address{color:#777;font-size:1em;line-height:1.4}address p{margin-top:0}address h6{color:#555}abbr:hover{cursor:help}blockquote{border-left:4px solid #ddd;padding-left:25px;margin:1em 0;font-weight:200;font-size:1.1em}blockquote small{font-size:.9em}blockquote small::after,blockquote small::before{content:' — '}.note{font-size:.9em;color:#777}.note strong{color:#555}.small{font-size:.75em}.medium{font-size:.85em}.large{font-size:1.2em}.extralarge{font-size:1.45em!important}hr{border:0;border-top:1px solid #ddd;margin:1em 0}.lead{font-size:1.1em;font-weight:700}ol,ul{line-height:1.4;padding:0 0 0 1.45em;margin:1em 0}ol li,ul li{margin:.5em 0}ul.unstyled{list-style:none;padding-left:0}ul.unstyled ul{list-style:disc outside}ul.unstyled ul.unstyled{list-style:none;padding-left:0}ul.inline{list-style:none}ul.inline li{display:inline-block;padding:0 .5em}ul.inline li:first-child{padding:0 .5em 0 0}dl{margin:1em 0}dl dt{font-weight:700;margin:.5em 0}dl dd{margin:.5em 0 .5em 25px}dl.inline dt{float:left;clear:left;text-align:right;width:180px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;margin:0}dl.inline dd{margin:.5em 0 .5em 200px}figure.ink-image{position:relative;border:1px solid #555}figure.ink-image>img{width:100%}figure.ink-image>figcaption{padding:1em;background:#fff;line-height:1.3}figure.ink-image>figcaption.over-bottom,figure.ink-image>figcaption.over-top{position:absolute;width:100%;left:0;border:0}figure.ink-image>figcaption.over-bottom.dark,figure.ink-image>figcaption.over-top.dark{color:#fff;background:rgba(0,0,0,.6)}figure.ink-image>figcaption.over-top{top:0;background:rgba(255,255,255,.7)}figure.ink-image>figcaption.over-bottom{bottom:0;background:rgba(255,255,255,.7)}figure.ink-image>figcaption.dark{color:#fff;background:#222}img{border:0;width:auto;max-width:100%;vertical-align:top}.ink-alert.basic,.ink-alert.block{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-alert.basic{background:rgba(255,156,0,.25);color:#b87814;border:1px solid #b87814}.ink-alert.basic .ink-dismiss{color:#b87814}.ink-alert.basic.success{background:rgba(74,155,23,.25);color:#38621d;border:1px solid #38621d}.ink-alert.basic.success .ink-dismiss{color:#38621d}.ink-alert.basic.error{background:rgba(201,17,17,.25);color:#891e1e;border:1px solid #891e1e}.ink-alert.basic.error .ink-dismiss{color:#891e1e}.ink-alert.basic.info{background:rgba(15,117,218,.25);color:#1e5b98;border:1px solid #1e5b98}.ink-alert.basic.info .ink-dismiss{color:#1e5b98}.ink-alert.block{border:1px solid #b87814;background:#fff}.ink-alert.block>h4{background:rgba(255,156,0,.3);color:#b87814}.ink-alert.block .ink-dismiss{color:#b87814}.ink-alert.block.success{border:1px solid #38621d;background:#fff}.ink-alert.block.success>h4{background:rgba(74,155,23,.3);color:#38621d}.ink-alert.block.success .ink-dismiss{color:#38621d}.ink-alert.block.error{border:1px solid #891e1e;background:#fff}.ink-alert.block.error>h4{background:rgba(201,17,17,.3);color:#891e1e}.ink-alert.block.error .ink-dismiss{color:#891e1e}.ink-alert.block.info{border:1px solid #1e5b98;background:#fff}.ink-alert.block.info>h4{background:rgba(15,117,218,.3);color:#1e5b98}.ink-alert.block.info .ink-dismiss{color:#1e5b98}.ink-alert .ink-dismiss{font-family:Arial,sans-serif;font-weight:700;text-shadow:#fff 0 1px 0;filter:alpha(Opacity=25);opacity:.25}.ink-alert .ink-dismiss:hover{filter:alpha(Opacity=60);opacity:.6}.ink-badge{-webkit-border-radius:8em;-moz-border-radius:8em;-ms-border-radius:8em;-o-border-radius:8em;border-radius:8em;color:#fff}.ink-badge.white{background:#fff;color:#555}.ink-badge.black{background:#000}.ink-badge.orange{background:#ff9c00}.ink-badge.red{background:#c91111}.ink-badge.green{background:#4a9b17}.ink-badge.blue{background:#0f75da}.ink-badge.yellow{background:#ffd500;color:#555}.ink-badge.grey{background:gray}.ink-badge+.ink-badge{margin-left:.2em}.ink-button{background:#d9d9d9;color:#000;border:1px solid #bfbfbf;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;font-weight:300}.ink-button:active,.ink-button:hover{text-decoration:none;color:#000;background:#ccc;border:1px solid #b3b3b3;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px;box-shadow:rgba(0,0,0,.2) 0 1px 1px}.ink-button:focus{outline:0;background:#ccc;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset}.ink-button[disabled]{background:#e6e6e6;border:1px solid #e6e6e6;color:#999}.ink-button[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.blue{color:#fff;background:#0f75da;border:1px solid #0c63b9}.ink-button.blue:active,.ink-button.blue:hover{background:#0d68c2;border:1px solid #0a56a1;color:#fff;text-decoration:none}.ink-button.blue:focus{background:#0d68c2}.ink-button.blue[disabled]{background:rgba(15,117,218,.6);border:1px solid rgba(15,117,218,0);color:#0c5baa}.ink-button.blue[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.green{color:#fff;background:#4a9b17;border:1px solid #3e8313}.ink-button.green:active,.ink-button.green:hover{background:#3f8514;border:1px solid #336d10;color:#fff;text-decoration:none}.ink-button.green:focus{background:#3f8514}.ink-button.green[disabled]{background:rgba(74,155,23,.6);border:1px solid rgba(74,155,23,0);color:#356f10}.ink-button.green[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.orange{color:#fff;background:#ff9c00;border:1px solid #d88400}.ink-button.orange:active,.ink-button.orange:hover{background:#e68c00;border:1px solid #bf7400;color:#fff;text-decoration:none}.ink-button.orange:focus{background:#e68c00}.ink-button.orange[disabled]{background:rgba(255,156,0,.6);border:1px solid rgba(255,156,0,0);color:#cc7d00}.ink-button.orange[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.red{color:#fff;background:#c91111;border:1px solid #aa0e0e}.ink-button.red:active,.ink-button.red:hover{background:#b10f0f;border:1px solid #920c0c;color:#fff;text-decoration:none}.ink-button.red:focus{background:#b10f0f}.ink-button.red[disabled]{background:rgba(201,17,17,.6);border:1px solid rgba(201,17,17,0);color:#9a0d0d}.ink-button.red[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.black{color:#fff;background:#1a1a1a;border:1px solid #161616}.ink-button.black:active,.ink-button.black:hover{background:#0d0d0d;border:1px solid #090909;color:#fff;text-decoration:none}.ink-button.black:focus{background:#0d0d0d}.ink-button.black[disabled]{background:rgba(26,26,26,.6);border:1px solid rgba(26,26,26,0);color:#000}.ink-button.black[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.white{color:#555;background:#fff;border:1px solid #d8d8d8}.ink-button.white:active,.ink-button.white:hover{background:#f2f2f2;border:1px solid #cbcbcb;color:#555;text-decoration:none}.ink-button.white:focus{background:#f2f2f2}.ink-button.white[disabled]{background:rgba(255,255,255,.6);border:1px solid rgba(255,255,255,0);color:#e6e6e6}.ink-button.white[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.button-group>.ink-button[disabled]{background:#e6e6e6;border:1px solid rgba(217,217,217,.6)}.button-group>.ink-button[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.button-group>.ink-button.blue:first-child{border-left:#0c63b9}.button-group>.ink-button.blue[disabled]{background:rgba(15,117,218,.6);border:1px solid rgba(15,117,218,.3)}.button-group>.ink-button.green:first-child{border-left:#3e8313}.button-group>.ink-button.green[disabled]{background:rgba(74,155,23,.6);border:1px solid rgba(74,155,23,.3)}.button-group>.ink-button.orange:first-child{border-left:#d88400}.button-group>.ink-button.orange[disabled]{background:rgba(255,156,0,.6);border:1px solid rgba(255,156,0,.3)}.button-group>.ink-button.red:first-child{border-left:#aa0e0e}.button-group>.ink-button.red[disabled]{background:rgba(201,17,17,.6);border:1px solid rgba(201,17,17,.3)}.button-group>.ink-button.black:first-child{border-left:#161616}.button-group>.ink-button.black[disabled]{background:rgba(26,26,26,.6);border:1px solid rgba(26,26,26,.3)}.button-group>.ink-button.white:first-child{border-left:#d8d8d8}.button-group>.ink-button.white[disabled]{background:rgba(255,255,255,.6);border:1px solid rgba(255,255,255,.3)}.ink-label{color:#fff;font-weight:300;font-size:.938em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-label.white{background:#fff;color:#555}.ink-label.black{background:#000}.ink-label.orange{background:#ff9c00}.ink-label.red{background:#c91111}.ink-label.green{background:#4a9b17}.ink-label.blue{background:#0f75da}.ink-label.yellow{background:#ffd500;color:#555}.ink-label.grey{background:gray}.ink-label+.ink-label{margin-left:.2em}.ink-navigation ul.breadcrumbs{font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.breadcrumbs li.active a{background:0 0;color:#999}.ink-navigation ul.breadcrumbs li.active a:hover{cursor:default;text-decoration:none}.ink-navigation ul.breadcrumbs li a:hover{background:0 0;text-decoration:underline}.ink-navigation ul.breadcrumbs.white{background:#fff}.ink-navigation ul.breadcrumbs.white li a,.ink-navigation ul.breadcrumbs.white li:after{color:#555}.ink-navigation ul.breadcrumbs.white li.active a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.breadcrumbs.grey{background:#d9d9d9}.ink-navigation ul.breadcrumbs.grey li a,.ink-navigation ul.breadcrumbs.grey li:after{color:#555}.ink-navigation ul.breadcrumbs.grey li.active a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.breadcrumbs.black{background:#1a1a1a}.ink-navigation ul.breadcrumbs.black li a,.ink-navigation ul.breadcrumbs.black li:after{color:#fff}.ink-navigation ul.breadcrumbs.black li.active a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.breadcrumbs.blue{background:#1b75ce}.ink-navigation ul.breadcrumbs.blue li a,.ink-navigation ul.breadcrumbs.blue li:after{color:#fff}.ink-navigation ul.breadcrumbs.blue li.active a{color:#08427b;text-shadow:#1884ef 0 1px 0}.ink-navigation ul.breadcrumbs.orange{background:#f2990d}.ink-navigation ul.breadcrumbs.orange li a,.ink-navigation ul.breadcrumbs.orange li:after{color:#fff}.ink-navigation ul.breadcrumbs.orange li.active a{color:#995e00;text-shadow:#ffa81f 0 1px 0}.ink-navigation ul.breadcrumbs.green{background:#4c9220}.ink-navigation ul.breadcrumbs.green li a,.ink-navigation ul.breadcrumbs.green li:after{color:#fff}.ink-navigation ul.breadcrumbs.green li.active a{color:#20420a;text-shadow:#57b61b 0 1px 0}.ink-navigation ul.breadcrumbs.red{background:#be1c1c}.ink-navigation ul.breadcrumbs.red li a,.ink-navigation ul.breadcrumbs.red li:after{color:#fff}.ink-navigation ul.breadcrumbs.red li.active a{color:#6b0909;text-shadow:#e51313 0 1px 0}.ink-dropdown.green ul.dropdown-menu li.active a{background:#4a9b17;color:#fff}.ink-dropdown.orange ul.dropdown-menu li.active a{background:#ff9c00;color:#fff}.ink-dropdown.red ul.dropdown-menu li.active a{background:#c91111;color:#fff}.ink-dropdown.black ul.dropdown-menu li.active a{background:#1a1a1a;color:#fff}.ink-dropdown.blue ul.dropdown-menu li.active a{background:#0f75da;color:#fff}.ink-navigation ul.menu{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu>li{font-weight:300}.ink-navigation ul.menu>li.active a{text-decoration:underline}.ink-navigation ul.menu>li.heading{font-weight:500}.ink-navigation ul.menu>li.disabled a{color:#b3b3b3;text-shadow:#fff 0 1px 0}.ink-navigation ul.menu>li.disabled a:hover{cursor:default;background:0 0;text-decoration:none}.ink-navigation ul.menu>li ul.submenu li{font-size:.875em}.ink-navigation ul.menu>li ul.submenu li a{border-bottom:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.vertical li a{border-bottom:1px solid rgba(0,0,0,.15)}.ink-navigation ul.menu.vertical li:first-child,.ink-navigation ul.menu.vertical li:first-child>a{-webkit-border-radius:2px 2px 0 0;-moz-border-radius:2px 2px 0 0;-ms-border-radius:2px 2px 0 0;-o-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0}.ink-navigation ul.menu.vertical li:last-child{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child>a{border-bottom:0;-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child .submenu{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child .submenu.flyout{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.vertical li:last-child .submenu li:last-child,.ink-navigation ul.menu.vertical li:last-child .submenu li:last-child a{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.horizontal>li:first-child,.ink-navigation ul.menu.horizontal>li:first-child a{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-navigation ul.menu.horizontal>li:last-child,.ink-navigation ul.menu.horizontal>li:last-child a{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-navigation ul.menu.horizontal>li ul.submenu{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#fff}.ink-navigation ul.menu.horizontal>li ul.submenu li:last-child{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.horizontal>li ul.submenu li:last-child a{border-bottom:0}.ink-navigation ul.menu.white{background:#fff}.ink-navigation ul.menu.white li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.white li ul.submenu li a{color:#555}.ink-navigation ul.menu.white li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.white li.disabled a:hover{background:0 0}.ink-navigation ul.menu.white li.active{background:#e6e6e6}.ink-navigation ul.menu.white li.disabled a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.menu.white li a{color:#555;text-decoration:none}.ink-navigation ul.menu.white li a:hover{background:#f2f2f2}.ink-navigation ul.menu.grey{background:#d9d9d9}.ink-navigation ul.menu.grey li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.grey li ul.submenu li a{color:#555}.ink-navigation ul.menu.grey li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.grey li.disabled a:hover{background:0 0}.ink-navigation ul.menu.grey li.active{background:#bfbfbf}.ink-navigation ul.menu.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.menu.grey li a{color:#555;text-decoration:none}.ink-navigation ul.menu.grey li a:hover{background:#ccc}.ink-navigation ul.menu.black{background:#1a1a1a}.ink-navigation ul.menu.black li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.black li ul.submenu li a{color:#555}.ink-navigation ul.menu.black li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.black li.disabled a:hover{background:0 0}.ink-navigation ul.menu.black li.active{background:#333}.ink-navigation ul.menu.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.menu.black li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.black li a:hover{background:#404040}.ink-navigation ul.menu.blue{background:#1b75ce}.ink-navigation ul.menu.blue li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.blue li ul.submenu li a{color:#555}.ink-navigation ul.menu.blue li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.blue li.disabled a:hover{background:0 0}.ink-navigation ul.menu.blue li.active{background:#0c5baa}.ink-navigation ul.menu.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.menu.blue li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.blue li a:hover{background:#0d68c2}.ink-navigation ul.menu.green{background:#4c9220}.ink-navigation ul.menu.green li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.green li ul.submenu li a{color:#555}.ink-navigation ul.menu.green li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.green li.disabled a:hover{background:0 0}.ink-navigation ul.menu.green li.active{background:#356f10}.ink-navigation ul.menu.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.menu.green li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.green li a:hover{background:#3f8514}.ink-navigation ul.menu.orange{background:#f2990d}.ink-navigation ul.menu.orange li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.orange li ul.submenu li a{color:#555}.ink-navigation ul.menu.orange li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.orange li.disabled a:hover{background:0 0}.ink-navigation ul.menu.orange li.active{background:#cc7d00}.ink-navigation ul.menu.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.menu.orange li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.orange li a:hover{background:#e68c00}.ink-navigation ul.menu.red{background:#be1c1c}.ink-navigation ul.menu.red li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.red li ul.submenu li a{color:#555}.ink-navigation ul.menu.red li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.red li.disabled a:hover{background:0 0}.ink-navigation ul.menu.red li.active{background:#9a0d0d}.ink-navigation ul.menu.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.menu.red li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.red li a:hover{background:#b10f0f}.ink-navigation ul.pagination{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.pagination li{font-weight:300}.ink-navigation ul.pagination li.active a{text-decoration:underline}.ink-navigation ul.pagination li.disabled a{color:#b3b3b3;text-shadow:#fff 0 1px 0}.ink-navigation ul.pagination li.disabled a:hover{cursor:default;background:0 0;text-decoration:none}.ink-navigation ul.pagination li:first-child,.ink-navigation ul.pagination li:first-child a{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-navigation ul.pagination li:last-child,.ink-navigation ul.pagination li:last-child a{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-navigation ul.pagination.white li{background:#fff}.ink-navigation ul.pagination.white li.active a{background:#e6e6e6}.ink-navigation ul.pagination.white li.disabled a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.pagination.white li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.white li a{color:#555;text-decoration:none}.ink-navigation ul.pagination.white li a:hover{background:#f2f2f2}.ink-navigation ul.pagination.grey li{background:#d9d9d9}.ink-navigation ul.pagination.grey li.active a{background:#bfbfbf}.ink-navigation ul.pagination.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.pagination.grey li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.grey li a{color:#555;text-decoration:none}.ink-navigation ul.pagination.grey li a:hover{background:#ccc}.ink-navigation ul.pagination.black li{background:#1a1a1a}.ink-navigation ul.pagination.black li.active a{background:#333}.ink-navigation ul.pagination.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.pagination.black li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.black li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.black li a:hover{background:#292929}.ink-navigation ul.pagination.orange li{background:#f2990d}.ink-navigation ul.pagination.orange li.active a{background:#cc7d00}.ink-navigation ul.pagination.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.pagination.orange li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.orange li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.orange li a:hover{background:#e68c00}.ink-navigation ul.pagination.blue li{background:#1b75ce}.ink-navigation ul.pagination.blue li.active a{background:#0c5baa}.ink-navigation ul.pagination.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.pagination.blue li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.blue li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.blue li a:hover{background:#0d68c2}.ink-navigation ul.pagination.green li{background:#4c9220}.ink-navigation ul.pagination.green li.active a{background:#356f10}.ink-navigation ul.pagination.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.pagination.green li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.green li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.green li a:hover{background:#3f8514}.ink-navigation ul.pagination.red li{background:#be1c1c}.ink-navigation ul.pagination.red li.active a{background:#9a0d0d}.ink-navigation ul.pagination.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.pagination.red li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.red li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.red li a:hover{background:#b10f0f}.ink-navigation ul.pagination.dotted li{background:0 0}.ink-navigation ul.pagination.dotted li a{background:#999;filter:alpha(Opacity=50);opacity:.5}.ink-navigation ul.pagination.dotted li.active a,.ink-navigation ul.pagination.dotted li:hover a{filter:alpha(Opacity=100);opacity:1}.ink-navigation ul.pagination.dotted.black li a{background:#1a1a1a}.ink-navigation ul.pagination.dotted.white li a{background:#fff}.ink-navigation ul.pagination.dotted.blue li a{background:#1b75ce}.ink-navigation ul.pagination.dotted.green li a{background:#4c9220}.ink-navigation ul.pagination.dotted.orange li a{background:#f2990d}.ink-navigation ul.pagination.dotted.red li a{background:#be1c1c}.ink-navigation ul.pagination.chevron li.next a,.ink-navigation ul.pagination.chevron li.previous a{color:#fff;filter:alpha(Opacity=60);opacity:.6}.ink-navigation ul.pagination.chevron li.next a.active,.ink-navigation ul.pagination.chevron li.next a:focus,.ink-navigation ul.pagination.chevron li.next a:hover,.ink-navigation ul.pagination.chevron li.previous a.active,.ink-navigation ul.pagination.chevron li.previous a:focus,.ink-navigation ul.pagination.chevron li.previous a:hover{filter:alpha(Opacity=70);opacity:.7;text-decoration:none;background:0 0}.ink-navigation ul.pagination.chevron li.disabled a{color:#fff;filter:alpha(Opacity=40);opacity:.4;text-shadow:none}.ink-navigation ul.pagination.chevron li.disabled a:focus,.ink-navigation ul.pagination.chevron li.disabled a:hover{color:#fff;filter:alpha(Opacity=40);opacity:.4}.ink-navigation ul.pagination.chevron.black li.disabled a,.ink-navigation ul.pagination.chevron.black li.next a,.ink-navigation ul.pagination.chevron.black li.previous a{color:#1a1a1a}.ink-navigation ul.pagination.chevron.grey li.disabled a,.ink-navigation ul.pagination.chevron.grey li.next a,.ink-navigation ul.pagination.chevron.grey li.previous a{color:#d9d9d9}.ink-navigation ul.pagination.chevron.blue li.disabled a,.ink-navigation ul.pagination.chevron.blue li.next a,.ink-navigation ul.pagination.chevron.blue li.previous a{color:#1b75ce}.ink-navigation ul.pagination.chevron.green li.disabled a,.ink-navigation ul.pagination.chevron.green li.next a,.ink-navigation ul.pagination.chevron.green li.previous a{color:#4c9220}.ink-navigation ul.pagination.chevron.orange li.disabled a,.ink-navigation ul.pagination.chevron.orange li.next a,.ink-navigation ul.pagination.chevron.orange li.previous a{color:#f2990d}.ink-navigation ul.pagination.chevron.red li.disabled a,.ink-navigation ul.pagination.chevron.red li.next a,.ink-navigation ul.pagination.chevron.red li.previous a{color:#be1c1c}.ink-navigation ul.pills li{background:#fff;font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.pills li a{color:#555;background:0 0}.ink-navigation ul.pills li a:hover,.ink-navigation ul.pills li.active a{background:#e6e6e6}.ink-navigation ul.pills li.disabled a{color:#999;text-shadow:#fff 0 1px 0}.ink-navigation ul.pills li.disabled a:hover{background:0 0}.ink-navigation ul.pills.grey li{background:#d9d9d9}.ink-navigation ul.pills.grey li.active a{background:#bfbfbf}.ink-navigation ul.pills.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.pills.grey li.disabled a:hover{background:0 0}.ink-navigation ul.pills.grey li a{color:#555}.ink-navigation ul.pills.grey li a:hover{background:#ccc}.ink-navigation ul.pills.black li{background:#1a1a1a}.ink-navigation ul.pills.black li.active a{background:#333}.ink-navigation ul.pills.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.pills.black li.disabled a:hover{background:0 0}.ink-navigation ul.pills.black li a{color:#fff}.ink-navigation ul.pills.black li a:hover{background:#292929}.ink-navigation ul.pills.blue li{background:#1b75ce}.ink-navigation ul.pills.blue li.active a{background:#0c5baa}.ink-navigation ul.pills.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.pills.blue li.disabled a:hover{background:0 0}.ink-navigation ul.pills.blue li a{color:#fff}.ink-navigation ul.pills.blue li a:hover{background:#0d68c2}.ink-navigation ul.pills.green li{background:#4c9220}.ink-navigation ul.pills.green li.active a{background:#356f10}.ink-navigation ul.pills.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.pills.green li.disabled a:hover{background:0 0}.ink-navigation ul.pills.green li a{color:#fff}.ink-navigation ul.pills.green li a:hover{background:#3f8514}.ink-navigation ul.pills.orange li{background:#f2990d}.ink-navigation ul.pills.orange li.active a{background:#cc7d00}.ink-navigation ul.pills.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.pills.orange li.disabled a:hover{background:0 0}.ink-navigation ul.pills.orange li a{color:#fff}.ink-navigation ul.pills.orange li a:hover{background:#e68c00}.ink-navigation ul.pills.red li{background:#be1c1c}.ink-navigation ul.pills.red li.active a{background:#9a0d0d}.ink-navigation ul.pills.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.pills.red li.disabled a:hover{background:0 0}.ink-navigation ul.pills.red li a{color:#fff}.ink-navigation ul.pills.red li a:hover{background:#b10f0f}table.ink-table{background:#fff}table.ink-table tr td,table.ink-table tr th{border-bottom:#bbb 1px solid;background:0 0}table.ink-table tr:last-child td{border-bottom:0}table.ink-table tfoot tr td,table.ink-table tfoot tr th{border-top:#bbb 1px solid}table.ink-table.alternating tbody tr:nth-child(odd){background-color:#f5f5f5}table.ink-table.hover tbody tr:hover{background:#fefbd6;color:#555}table.ink-table.bordered{border:#bbb 1px solid;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}table.ink-table.bordered tr th{border-left:#bbb 1px solid}table.ink-table.bordered tr th:first-child{border-left:0}table.ink-table.bordered tr:last-child td{border-bottom:0}table.ink-table.bordered tr td{border-left:#bbb 1px solid}table.ink-table.bordered tr td:first-child{border-left:0}table.ink-table tbody>tr.red td{background:#c91111;color:#fff}table.ink-table tbody>tr.green td{background:#4a9b17;color:#fff}table.ink-table tbody>tr.blue td{background:#0f75da;color:#fff}table.ink-table tbody>tr.orange td{background:#ff9c00;color:#fff}table.ink-table tbody>tr.black td{background:#000;color:#ccc}table.ink-table tbody>tr.yellow td{background:#ffd500;color:#000}.animated.slow{animation-duration:1s}.animated.medium{animation-duration:.5s}.animated.fast{animation-duration:.2s}.ink-carousel{width:100%;position:relative;overflow:hidden;display:block}.ink-carousel .stage{width:100%;left:0;height:auto!important;margin-top:0;margin-bottom:0;padding-left:0;list-style-type:none;white-space:nowrap;position:relative;-webkit-transition:left .5s ease;-moz-transition:left .5s ease;-o-transition:left .5s ease;transition:left .5s ease}.ink-carousel .stage .slide{position:relative;display:inline-block;vertical-align:top;white-space:normal;margin:0;float:none;zoom:1;*display:inline}.ink-carousel .ink-navigation{position:static}.ink-datepicker-wrapper{position:relative}.ink-datepicker-calendar{margin-top:0;position:absolute}.ink-datepicker-calendar.right{left:100%;top:0}.ink-datepicker-calendar.left{right:100%;top:0}.ink-datepicker-calendar.bottom{top:100%;left:0}.ink-datepicker-calendar.top{bottom:100%;left:0}.ink-datepicker-calendar,.ink-datepicker-wrapper{display:inline;display:inline-block}.ink-calendar{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;text-align:center;padding:.3em;min-width:17.4em;font-size:13px;-webkit-box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;-moz-box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;background:#fff;z-index:10}.ink-calendar a{text-decoration:none}.ink-calendar li{list-style:none inside}html.ink-modal-is-open .ink-calendar{z-index:101}.ink-calendar-top-options{padding:5px;font-size:.813em;cursor:pointer}.ink-calendar-top-options .clean{float:left}.ink-calendar-top-options .close{float:right}.ink-calendar-top{line-height:2em;background:#e6e6e6;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-calendar-top div{float:left}.ink-calendar-top .ink-calendar-next,.ink-calendar-top .ink-calendar-prev{width:10%}.ink-calendar-top .ink-calendar-next a,.ink-calendar-top .ink-calendar-prev a{display:block}.ink-calendar-top .ink-calendar-month_desc{width:80%}.ink-calendar-month,.ink-calendar-month-selector,.ink-calendar-year-selector{margin-top:.5em;padding-left:0}.ink-calendar-month li a,.ink-calendar-month-selector li a,.ink-calendar-year-selector li a{margin:0;line-height:2em;vertical-align:middle;display:block;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;color:#444}.ink-calendar-month li a:hover,.ink-calendar-month-selector li a:hover,.ink-calendar-year-selector li a:hover{background:#e6e6e6}.ink-calendar-month li a.ink-calendar-on,.ink-calendar-month li a.ink-calendar-on:hover,.ink-calendar-month-selector li a.ink-calendar-on,.ink-calendar-month-selector li a.ink-calendar-on:hover,.ink-calendar-year-selector li a.ink-calendar-on,.ink-calendar-year-selector li a.ink-calendar-on:hover{background:#0069d6;color:#fff}.ink-calendar-month li a.ink-calendar-off,.ink-calendar-month li a.ink-calendar-off:hover,.ink-calendar-month-selector li a.ink-calendar-off,.ink-calendar-month-selector li a.ink-calendar-off:hover,.ink-calendar-year-selector li a.ink-calendar-off,.ink-calendar-year-selector li a.ink-calendar-off:hover{background:#fff;color:#aaa;cursor:default}.ink-calendar-month ul,.ink-calendar-month-selector ul,.ink-calendar-year-selector ul{clear:both;padding-left:0}.ink-calendar-month ul li,.ink-calendar-month-selector ul li,.ink-calendar-year-selector ul li{width:2.4em;float:left;text-align:center;padding:0;margin:0}.ink-calendar-month-selector ul li,.ink-calendar-year-selector ul li{width:25%}.ink-calendar-month-selector,.ink-calendar-year-selector{display:none}.action_inactive,.ink-calendar-off{color:#ddd!important}.ink-calendar-month .ink-calendar-header{border-bottom:1px solid rgba(0,0,0,.1);padding-bottom:.5em;margin-bottom:.5em;color:#aaa}.ink-calendar-middle,.ink-calendar-month .ink-calendar-header,.ink-calendar-month .ink-calendar-middle ul,.ink-calendar-top,.ink-calendar-top-options{*zoom:1}.ink-calendar-middle:after,.ink-calendar-month .ink-calendar-header:after,.ink-calendar-month .ink-calendar-middle ul:after,.ink-calendar-top-options:after,.ink-calendar-top:after{content:"";display:table;clear:both}body.ink-drawer{max-width:100%}body.ink-drawer .content-drawer,body.ink-drawer .left-drawer,body.ink-drawer .right-drawer{-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;transition-property:transform;-webkit-transition-duration:300ms;-moz-transition-duration:300ms;-o-transition-duration:300ms;transition-duration:300ms;-webkit-transition-timing-function:cubic-bezier(0.86,0,.07,1);-moz-transition-timing-function:cubic-bezier(0.86,0,.07,1);-o-transition-timing-function:cubic-bezier(0.86,0,.07,1);transition-timing-function:cubic-bezier(0.86,0,.07,1)}body.ink-drawer .left-drawer{left:-220px}body.ink-drawer .right-drawer{right:-220px}body.ink-drawer .content-drawer{width:100%}body.ink-drawer .left-drawer,body.ink-drawer .right-drawer{position:absolute;top:0;z-index:0;display:none;overflow-x:hidden;overflow-y:auto;width:220px;height:100%;-webkit-overflow-scrolling:touch}body.ink-drawer .left-drawer.show,body.ink-drawer .right-drawer.show{display:block;position:fixed}body.ink-drawer.push{overflow:hidden;width:100%;height:100%}body.ink-drawer.push .content-drawer{overflow:hidden}body.ink-drawer.push.left .content-drawer,body.ink-drawer.push.left .left-drawer{-webkit-transform:translate(220px,0);-moz-transform:translate(220px,0);-ms-transform:translate(220px,0);-o-transform:translate(220px,0);transform:translate(220px,0)}body.ink-drawer.push.right .content-drawer,body.ink-drawer.push.right .right-drawer{-webkit-transform:translate(-220px,0);-moz-transform:translate(-220px,0);-ms-transform:translate(-220px,0);-o-transform:translate(-220px,0);transform:translate(-220px,0)}body.ink-drawer.over{overflow:hidden;-webkit-user-drag:none}body.ink-drawer.over.left .left-drawer{-webkit-transform:translate(220px,0);-moz-transform:translate(220px,0);-ms-transform:translate(220px,0);-o-transform:translate(220px,0);transform:translate(220px,0)}body.ink-drawer.over.right .right-drawer{-webkit-transform:translate(-220px,0);-moz-transform:translate(-220px,0);-ms-transform:translate(-220px,0);-o-transform:translate(-220px,0);transform:translate(-220px,0)}.ink-shade{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgOAMAAM8AzbfAeUUAAAAASUVORK5CYII=);background:rgba(0,0,0,.8);width:100%;height:100%;top:0;right:0;bottom:0;left:0;margin-top:0;position:fixed;z-index:100;display:none;filter:alpha(Opacity=0);opacity:0}.ink-shade.fade{-webkit-transition:opacity 300ms;-moz-transition:opacity 300ms;-o-transition:opacity 300ms;transition:opacity 300ms}.ink-shade.visible{filter:alpha(Opacity=100);opacity:1}.ink-modal{top:50%;left:50%;width:90%;height:90%;background:#fff;z-index:100;position:absolute;overflow:hidden;filter:alpha(Opacity=100);opacity:1;-webkit-box-shadow:rgba(0,0,0,.8) 0 0 15px 0;-moz-box-shadow:rgba(0,0,0,.8) 0 0 15px 0;box-shadow:rgba(0,0,0,.8) 0 0 15px 0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;*zoom:1}.ink-modal:after{content:"";display:table;clear:both}.ink-modal>.modal-body{padding:1em;overflow-y:auto;overflow-x:hidden;height:auto}.ink-modal>.modal-body .ink-grid{padding-left:0;padding-right:0;width:100%;min-width:100%}.ink-modal>.modal-header,.ink-modal>header{border-bottom:1px #e6e6e6 solid;overflow:hidden;-webkit-box-shadow:rgba(175,175,175,.2) 0 1px 2px 0;-moz-box-shadow:rgba(175,175,175,.2) 0 1px 2px 0;box-shadow:rgba(175,175,175,.2) 0 1px 2px 0}.ink-modal>.modal-header>.modal-close,.ink-modal>header>.modal-close{padding-top:2px;text-align:center;color:#fff;width:26px;height:26px;line-height:1.2em;border:0;background:#bfbfbf;font-size:0;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%;text-shadow:rgba(0,0,0,.6) 0 -1px 0;filter:alpha(Opacity=60);opacity:.6;float:right}.ink-modal>.modal-header>.modal-close:after,.ink-modal>header>.modal-close:after{content:"\f00d";font-family:FontAwesome;font-size:medium;line-height:22px}.ink-modal>.modal-header>.modal-close:hover,.ink-modal>header>.modal-close:hover{filter:alpha(Opacity=100);opacity:1}.ink-modal>.modal-footer,.ink-modal>footer{background:#e6e6e6;margin-bottom:0;zoom:1;-webkit-box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0;-moz-box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0;box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0}.ink-modal>.modal-footer,.ink-modal>.modal-header,.ink-modal>footer,.ink-modal>header{padding:.8em 1em .65em}.ink-modal>.modal-footer:after,.ink-modal>.modal-footer:before,.ink-modal>.modal-header:after,.ink-modal>.modal-header:before,.ink-modal>footer:after,.ink-modal>footer:before,.ink-modal>header:after,.ink-modal>header:before{content:".";display:block;height:0;clear:both;visibility:hidden}.ink-modal-open{overflow:hidden}.ink-progress-bar{margin-bottom:1em;overflow:hidden;background:#f2f2f2;position:relative;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset;-moz-box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset;box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset}.ink-progress-bar .caption{position:absolute;top:0;left:0;width:100%;height:100%;line-height:1.7;text-align:center;color:#000;font-size:.813em;z-index:10}.ink-progress-bar .bar{height:1.3em;text-shadow:rgba(0,0,0,.25),0,1px,0;-webkit-box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;-moz-box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;-webkit-transition-property:width;-moz-transition-property:width;-o-transition-property:width;transition-property:width;-webkit-transition-duration:.6s;-moz-transition-duration:.6s;-o-transition-duration:.6s;transition-duration:.6s;-webkit-transition-timing-function:ease;-moz-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.ink-progress-bar .bar.grey{background:#ccc;color:#555}.ink-progress-bar .bar.green{background:#4a9b17;color:#fff}.ink-progress-bar .bar.blue{background:#0f75da;color:#fff}.ink-progress-bar .bar.red{background:#c91111;color:#fff}.ink-progress-bar .bar.orange{background:#ff9c00;color:#555}.ink-progress-bar .bar.black{background:#000;color:#fff}.dragging,.ink-sortable-list li{cursor:move;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;-ms-user-select:none;user-select:none;-ms-user-drag:none;-moz-user-drag:none;-khtml-user-drag:none;-webkit-user-drag:none;-o-user-drag:none;user-drag:none}.drag,.ink-sortable-list li.placeholder{-webkit-box-shadow:0,0,10px,0,rgba(0,0,0,.3);-moz-box-shadow:0,0,10px,0,rgba(0,0,0,.3);box-shadow:0,0,10px,0,rgba(0,0,0,.3)}.ink-sortable-list li{margin:0;border-bottom:1px solid #ccc;line-height:40px}.ink-sortable-list li.placeholder,.ink-sortable-list li:hover{background:#ccc;background:rgba(204,204,204,.2)}.ink-sortable-list li .ink-label{margin:0 .8em}.ink-sticky-stuck{position:fixed}.ink-tabs .tabs-nav{list-style:none;padding:0;*zoom:1}.ink-tabs .tabs-nav li{line-height:1.7;position:relative;margin:0}.ink-tabs .tabs-nav li a{padding:.5em 1em;display:block;border:1px solid transparent}.ink-tabs .tabs-nav li a:hover{background:#f0f0f0}.ink-tabs .tabs-nav li.active a{color:#555;cursor:default;text-decoration:none;background:#fff;border:1px solid #ccc}.ink-tabs .tabs-nav:after{content:"";display:table;clear:both}.ink-tabs .tabs-content{margin-top:1.5em;overflow:auto}.ink-tabs.top>.tabs-nav{border-bottom:1px solid #ccc}.ink-tabs.top>.tabs-nav li{float:left}.ink-tabs.top>.tabs-nav li a{margin-right:.4em;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;-ms-border-radius:4px 4px 0 0;-o-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.ink-tabs.top>.tabs-nav li.active{margin:0 0 -2px 0}.ink-tabs.top>.tabs-nav li.active a{border-bottom-color:transparent}.ink-tabs.bottom>.tabs-nav{border-top:1px solid #ccc}.ink-tabs.bottom>.tabs-nav li{float:left}.ink-tabs.bottom>.tabs-nav li a{margin-right:.4em;-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;-ms-border-radius:0 0 4px 4px;-o-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.ink-tabs.bottom>.tabs-nav li.active{margin:-2px 0 0 0}.ink-tabs.bottom>.tabs-nav li.active a{border-top-color:transparent}.ink-tabs.left>.tabs-nav{border-right:1px solid #ccc;float:left;margin-right:2em}.ink-tabs.left>.tabs-nav li{float:none;text-align:right}.ink-tabs.left>.tabs-nav li a{margin-bottom:.4em;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;-ms-border-radius:4px 0 0 4px;-o-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.ink-tabs.left>.tabs-nav li.active{margin:0 -2px 0 0}.ink-tabs.left>.tabs-nav li.active a{border-right-color:transparent}.ink-tabs.right>.tabs-nav{border-left:1px solid #ccc;float:right;margin-left:2em}.ink-tabs.right>.tabs-nav li{float:none}.ink-tabs.right>.tabs-nav li a{margin-bottom:.4em;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;-ms-border-radius:0 4px 4px 0;-o-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.ink-tabs.right>.tabs-nav li.active{margin:0 0 0 -2px}.ink-tabs.right>.tabs-nav li.active a{border-left-color:transparent}.ink-tagfield input[type=text].new-tag-input{background-color:#fff;border:1px solid #ccc;line-height:1em;margin:0;padding:5px;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-tagfield input[type=text].new-tag-input:focus{-webkit-box-shadow:0,0,0,3px,#eaeaea;-moz-box-shadow:0,0,0,3px,#eaeaea;box-shadow:0,0,0,3px,#eaeaea;border:1px solid #c3c3c3}.ink-tagfield span.ink-tag{background-color:#1b1b1b;color:#eaeaea;text-shadow:none;font-size:.9em;font-weight:400;border:1px solid #000;padding:4px 6px}.ink-tagfield span.ink-tag i.icon-remove{color:#ccc;font-size:.9em;font-weight:400;margin-left:4px}.ink-tagfield span.ink-tag i.icon-remove:hover{cursor:pointer;color:red}.ink-tooltip{display:inline-block;position:relative}.ink-tooltip>.content{background:#f0f0f0;padding:.5em .6em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;font-size:.8em;color:#8c8c8c}.ink-tooltip>.arrow{position:absolute}.ink-tooltip>.arrow.down,.ink-tooltip>.arrow.left,.ink-tooltip>.arrow.right,.ink-tooltip>.arrow.up{width:0;height:0}.ink-tooltip>.arrow.up{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #f0f0f0;top:-6px;left:50%;margin-left:-3px}.ink-tooltip>.arrow.down{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #f0f0f0;bottom:-5.45455px;left:50%;margin-left:-3px}.ink-tooltip>.arrow.right{border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:6px solid #f0f0f0;top:50%;right:-5.45455px;margin-top:-6px}.ink-tooltip>.arrow.left{border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:6px solid #f0f0f0;top:50%;left:-5.45455px;margin-top:-6px}.ink-tooltip.blue>.content{background:#0f75da;color:#fff}.ink-tooltip.blue>.arrow.up{border-bottom-color:#0f75da}.ink-tooltip.blue>.arrow.down{border-top-color:#0f75da}.ink-tooltip.blue>.arrow.left{border-right-color:#0f75da}.ink-tooltip.blue>.arrow.right{border-left-color:#0f75da}.ink-tooltip.red>.content{background:#c91111;color:#fff}.ink-tooltip.red>.arrow.up{border-bottom-color:#c91111}.ink-tooltip.red>.arrow.down{border-top-color:#c91111}.ink-tooltip.red>.arrow.left{border-right-color:#c91111}.ink-tooltip.red>.arrow.right{border-left-color:#c91111}.ink-tooltip.orange>.content{background:#ff9c00;color:#fff}.ink-tooltip.orange>.arrow.up{border-bottom-color:#ff9c00}.ink-tooltip.orange>.arrow.down{border-top-color:#ff9c00}.ink-tooltip.orange>.arrow.left{border-right-color:#ff9c00}.ink-tooltip.orange>.arrow.right{border-left-color:#ff9c00}.ink-tooltip.green>.content{background:#4a9b17;color:#fff}.ink-tooltip.green>.arrow.up{border-bottom-color:#4a9b17}.ink-tooltip.green>.arrow.down{border-top-color:#4a9b17}.ink-tooltip.green>.arrow.left{border-right-color:#4a9b17}.ink-tooltip.green>.arrow.right{border-left-color:#4a9b17}.ink-tooltip.black>.content{background:#000;color:#fff}.ink-tooltip.black>.arrow.up{border-bottom-color:#000}.ink-tooltip.black>.arrow.down{border-top-color:#000}.ink-tooltip.black>.arrow.left{border-right-color:#000}.ink-tooltip.black>.arrow.right{border-left-color:#000}.ink-tooltip.grey>.content{background:#ccc;color:#333}.ink-tooltip.grey>.arrow.up{border-bottom-color:#ccc}.ink-tooltip.grey>.arrow.down{border-top-color:#ccc}.ink-tooltip.grey>.arrow.left{border-right-color:#ccc}.ink-tooltip.grey>.arrow.right{border-left-color:#ccc}.ink-tree-view li{list-style-type:none}.ink-tree-view [data-open]>:before{margin-left:-1.3em;margin-right:.4em;text-decoration:none} +@charset "UTF-8";.show-all{display:inherit}.hide-all{display:none!important}.no-margin{margin:0!important}.no-margin-top{margin-top:0!important}.no-margin-bottom{margin-bottom:0!important}.no-padding{padding:0!important}.push-left{float:left}.push-center{float:none!important;margin-left:auto;margin-right:auto}.push-right{float:right;-webkit-justify-content:flex-end;-moz-justify-content:flex-end;justify-content:flex-end}.align-left{text-align:left}.align-center{text-align:center}.align-right{text-align:right}.clearfix{overflow:hidden;*zoom:1}.clearfix:after{content:"";display:table;clear:both}html{font-family:sans-serif}html *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}figure{margin:0}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.ink-alert.basic,.ink-alert.block{font-size:.938em;margin:1em 0;position:relative;overflow:hidden}.ink-alert.basic{padding:1em 3em 1em 1em}.ink-alert.basic p{margin:0}.ink-alert.basic .ink-close{top:.55em;*top:.2em}.ink-alert.block{font-size:1em}.ink-alert.block>h4{padding:1em 3em 1em 1em;font-size:.938em;line-height:1.5;margin:0}.ink-alert.block p{margin:1.5em 1em}.ink-alert.block ul{list-style:inside}.ink-alert .ink-dismiss{position:absolute;line-height:.56em;font-size:1.8em;padding:5px;border:0;background:0 0;top:.5em;*top:.2em;right:.4em}.ink-badge{padding:.2em .6em;font-size:.813em;margin-left:.6em}.ink-button{-webkit-appearance:menuitem;padding:8px 12px;cursor:pointer;text-decoration:none;text-align:center;display:inline-block;vertical-align:middle;white-space:nowrap;line-height:normal}.ink-button+.ink-button{margin-left:5px}.button-group{*zoom:1}.button-group>.ink-button{float:left;margin:5px 0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;border-left:0}.button-group>.ink-button:active,.button-group>.ink-button:hover{border-left:0}.button-group>.ink-button:first-child{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px;border-left:1px solid #bfbfbf}.button-group>.ink-button:last-child{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.button-group:after{content:"";display:table;clear:both}.button-toolbar{*zoom:1}.button-toolbar>.button-group{margin-right:10px;float:left}.button-toolbar:after{content:"";display:table;clear:both}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-thin-webfont.eot);src:url(../fonts/Roboto/roboto-thin-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-thin-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-thin-webfont.ttf) format('truetype');font-weight:100;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-thinitalic-webfont.eot);src:url(../fonts/Roboto/roboto-thinitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-thinitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-thinitalic-webfont.ttf) format('truetype');font-weight:100;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-light-webfont.eot);src:url(../fonts/Roboto/roboto-light-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-light-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-light-webfont.ttf) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-lightitalic-webfont.eot);src:url(../fonts/Roboto/roboto-lightitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-lightitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-lightitalic-webfont.ttf) format('truetype');font-weight:300;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-regular-webfont.eot);src:url(../fonts/Roboto/roboto-regular-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-regular-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-regular-webfont.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-italic-webfont.eot);src:url(../fonts/Roboto/roboto-italic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-italic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-italic-webfont.ttf) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-medium-webfont.eot);src:url(../fonts/Roboto/roboto-medium-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-medium-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-medium-webfont.ttf) format('truetype');font-weight:500;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-mediumitalic-webfont.eot);src:url(../fonts/Roboto/roboto-mediumitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-mediumitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-mediumitalic-webfont.ttf) format('truetype');font-weight:500;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-bold-webfont.eot);src:url(../fonts/Roboto/roboto-bold-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-bold-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-bold-webfont.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-bolditalic-webfont.eot);src:url(../fonts/Roboto/roboto-bolditalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-bolditalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-bolditalic-webfont.ttf) format('truetype');font-weight:700;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-black-webfont.eot);src:url(../fonts/Roboto/roboto-black-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-black-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-black-webfont.ttf) format('truetype');font-weight:900;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-blackitalic-webfont.eot);src:url(../fonts/Roboto/roboto-blackitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-blackitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-blackitalic-webfont.ttf) format('truetype');font-weight:900;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-light-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-light-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-light-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-light-webfont.ttf) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.ttf) format('truetype');font-weight:300;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.ttf) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.ttf) format('truetype');font-weight:700;font-style:italic}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-thin-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-thin-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-thin-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-thin-webfont.ttf) format('truetype');font-weight:100;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-light-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-light-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-light-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-light-webfont.ttf) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-regular-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-regular-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-regular-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-regular-webfont.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-bold-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-bold-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-bold-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-bold-webfont.ttf) format('truetype');font-weight:700;font-style:normal}.ink-form fieldset{border:0;padding:0;margin:0}.ink-form fieldset legend{font-size:1.438em;font-weight:700;width:100%;border-bottom:1px solid #ddd}.ink-form fieldset legend+*{-webkit-margin-top-collapse:separate;margin:2em 0}.ink-form p.tip{font-size:.875em;color:#909090;position:relative;margin:.2em 0 0 .1em}.ink-form p.label{padding:0;margin:0;color:#555;white-space:normal}.ink-form input[type=color],.ink-form input[type=date],.ink-form input[type=datetime-local],.ink-form input[type=datetime],.ink-form input[type=email],.ink-form input[type=month],.ink-form input[type=number],.ink-form input[type=password],.ink-form input[type=search],.ink-form input[type=tel],.ink-form input[type=text],.ink-form input[type=time],.ink-form input[type=url],.ink-form input[type=week],.ink-form select,.ink-form textarea{font-family:Roboto,Arial,Helvetica,sans-serif;font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;padding:8px 6px;border:1px solid #c6c6c6;resize:none;background:#fff;vertical-align:middle}.ink-form input[type=color]:focus,.ink-form input[type=date]:focus,.ink-form input[type=datetime-local]:focus,.ink-form input[type=datetime]:focus,.ink-form input[type=email]:focus,.ink-form input[type=month]:focus,.ink-form input[type=number]:focus,.ink-form input[type=password]:focus,.ink-form input[type=search]:focus,.ink-form input[type=tel]:focus,.ink-form input[type=text]:focus,.ink-form input[type=time]:focus,.ink-form input[type=url]:focus,.ink-form input[type=week]:focus,.ink-form select:focus,.ink-form textarea:focus{border-color:rgba(153,153,153,.9);-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;outline:0 none}.ink-form input[type=color]:disabled,.ink-form input[type=date]:disabled,.ink-form input[type=datetime-local]:disabled,.ink-form input[type=datetime]:disabled,.ink-form input[type=email]:disabled,.ink-form input[type=month]:disabled,.ink-form input[type=number]:disabled,.ink-form input[type=password]:disabled,.ink-form input[type=search]:disabled,.ink-form input[type=tel]:disabled,.ink-form input[type=text]:disabled,.ink-form input[type=time]:disabled,.ink-form input[type=url]:disabled,.ink-form input[type=week]:disabled,.ink-form select:disabled,.ink-form textarea:disabled{background:#f2f2f2;cursor:not-allowed}.ink-form .input-file{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;padding:6px;border:1px solid #c6c6c6;background:#fff;vertical-align:middle;line-height:1.2}.ink-form .input-file input[type=file]{-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;border:0;padding:0;background:0 0;width:100%}.ink-form .ink-button{margin:0 5px}.ink-form label{cursor:pointer}.ink-form select{line-height:2;cursor:pointer}.ink-form textarea{min-height:5em}.ink-form .control-group{line-height:2;margin-bottom:1em;*zoom:1}.ink-form .control-group:after{content:"";display:table;clear:both}.ink-form .control-group .control{position:relative;*zoom:1}.ink-form .control-group .control:after{content:"";display:table;clear:both}.ink-form .control-group .control>li{position:relative;*zoom:1}.ink-form .control-group .control>li:after{content:"";display:table;clear:both}.ink-form .control-group .control>input,.ink-form .control-group .control>select,.ink-form .control-group .control>textarea{width:100%}.ink-form .control-group .control>input+.fa,.ink-form .control-group .control>select+.fa,.ink-form .control-group .control>textarea+.fa{display:none}.ink-form .control-group .control.append-button>span,.ink-form .control-group .control.append-symbol>span,.ink-form .control-group .control.prepend-button>span,.ink-form .control-group .control.prepend-symbol>span{width:100%;position:relative}.ink-form .control-group .control.append-button>span>input,.ink-form .control-group .control.append-button>span>select,.ink-form .control-group .control.append-button>span>textarea,.ink-form .control-group .control.append-symbol>span>input,.ink-form .control-group .control.append-symbol>span>select,.ink-form .control-group .control.append-symbol>span>textarea,.ink-form .control-group .control.prepend-button>span>input,.ink-form .control-group .control.prepend-button>span>select,.ink-form .control-group .control.prepend-button>span>textarea,.ink-form .control-group .control.prepend-symbol>span>input,.ink-form .control-group .control.prepend-symbol>span>select,.ink-form .control-group .control.prepend-symbol>span>textarea{width:100%}.ink-form .control-group .control.append-button>input[type=button],.ink-form .control-group .control.append-button>input[type=reset],.ink-form .control-group .control.append-button>input[type=submit],.ink-form .control-group .control.append-symbol>input[type=button],.ink-form .control-group .control.append-symbol>input[type=reset],.ink-form .control-group .control.append-symbol>input[type=submit],.ink-form .control-group .control.prepend-button>input[type=button],.ink-form .control-group .control.prepend-button>input[type=reset],.ink-form .control-group .control.prepend-button>input[type=submit],.ink-form .control-group .control.prepend-symbol>input[type=button],.ink-form .control-group .control.prepend-symbol>input[type=reset],.ink-form .control-group .control.prepend-symbol>input[type=submit]{width:auto}.ink-form .control-group .control.append-button{display:table}.ink-form .control-group .control.append-button>span{display:table-cell}.ink-form .control-group .control.append-button>span>input,.ink-form .control-group .control.append-button>span>select,.ink-form .control-group .control.append-button>span>textarea{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-form .control-group .control.append-button .ink-button{margin:0;-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0;border-left:0}.ink-form .control-group .control.prepend-button{display:table}.ink-form .control-group .control.prepend-button>span{display:table-cell}.ink-form .control-group .control.prepend-button>span>input,.ink-form .control-group .control.prepend-button>span>select,.ink-form .control-group .control.prepend-button>span>textarea{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-form .control-group .control.prepend-button .ink-button{margin:0;-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px;border-right:0}.ink-form .control-group .control.append-symbol>span{display:block}.ink-form .control-group .control.append-symbol>span>input,.ink-form .control-group .control.append-symbol>span>select,.ink-form .control-group .control.append-symbol>span>textarea{padding-right:2.5em}.ink-form .control-group .control.append-symbol>span>[class*=" fa-"],.ink-form .control-group .control.append-symbol>span>[class^=fa-]{position:absolute;right:1em;top:.86em;pointer-events:none}.ink-form .control-group .control.prepend-symbol>span{display:block}.ink-form .control-group .control.prepend-symbol>span>input,.ink-form .control-group .control.prepend-symbol>span>select,.ink-form .control-group .control.prepend-symbol>span>textarea{padding-left:2.5em}.ink-form .control-group .control.prepend-symbol>span>[class*=" fa-"],.ink-form .control-group .control.prepend-symbol>span>[class^=fa-]{position:absolute;left:1em;top:.86em;pointer-events:none}.ink-form .control-group input[type=checkbox],.ink-form .control-group input[type=radio]{position:absolute;border:0;cursor:pointer}.ink-form .control-group input[type=checkbox]+label,.ink-form .control-group input[type=radio]+label{margin-top:-.28em;padding-left:1.25em;vertical-align:super;display:inline-block}.ink-form .control-group .inline li{padding:0}.ink-form .control-group .inline li label{margin-right:1em}.ink-form .control-group.validation.error input,.ink-form .control-group.validation.error select,.ink-form .control-group.validation.error textarea{outline:0;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;border:1px solid rgba(200,10,16,.5)}.ink-form .control-group.validation.error p.tip{color:rgba(150,7,12,.55)}.ink-form .control-group.validation.warning input,.ink-form .control-group.validation.warning select,.ink-form .control-group.validation.warning textarea{outline:0;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;border:1px solid rgba(255,156,0,.6)}.ink-form .control-group.validation.warning p.tip{color:rgba(204,125,0,.6)}.ink-form .control-group.required label,.ink-form .control-group.required p.label{color:#555}.ink-form .control-group.required label:after,.ink-form .control-group.required p.label:after{content:"\f069";color:#c91111;margin-left:.6em;font-family:FontAwesome;font-size:.75em;width:1.25em}.ink-form .control-group.required ul.control label:after{content:""}.ink-grid{width:auto;max-width:1440px;margin:0 auto}.all-5{width:5%;float:left;clear:none}.all-10{width:10%;float:left;clear:none}.all-15{width:15%;float:left;clear:none}.all-16{width:16.66%;float:left;clear:none}.all-20{width:20%;float:left;clear:none}.all-25{width:25%;float:left;clear:none}.all-30{width:30%;float:left;clear:none}.all-33{width:33.33%;float:left;clear:none}.all-35{width:35%;float:left;clear:none}.all-40{width:40%;float:left;clear:none}.all-45{width:45%;float:left;clear:none}.all-50{width:50%;float:left;clear:none}.all-55{width:55%;float:left;clear:none}.all-60{width:60%;float:left;clear:none}.all-65{width:65%;float:left;clear:none}.all-66{width:66.66%;float:left;clear:none}.all-70{width:70%;float:left;clear:none}.all-75{width:75%;float:left;clear:none}.all-80{width:80%;float:left;clear:none}.all-85{width:85%;float:left;clear:none}.all-90{width:90%;float:left;clear:none}.all-95{width:95%;float:left;clear:none}.all-100{width:100%;float:left;clear:none}[class~=all-100]{float:none;clear:both}@media screen and (min-width:1261px){.ink-grid{padding:0 2em}.column-group>[class*=xlarge-]{float:left;clear:none}.xlarge-5{width:5%}.xlarge-10{width:10%}.xlarge-15{width:15%}.xlarge-16{width:16.66%}.xlarge-20{width:20%}.xlarge-25{width:25%}.xlarge-30{width:30%}.xlarge-33{width:33.33%}.xlarge-35{width:35%}.xlarge-40{width:40%}.xlarge-45{width:45%}.xlarge-50{width:50%}.xlarge-55{width:55%}.xlarge-60{width:60%}.xlarge-65{width:65%}.xlarge-66{width:66.66%}.xlarge-70{width:70%}.xlarge-75{width:75%}.xlarge-80{width:80%}.xlarge-85{width:85%}.xlarge-90{width:90%}.xlarge-95{width:95%}.xlarge-100{width:100%}[class*=xlarge-100]{float:none;clear:both}.column-group{*zoom:1}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-2em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}.column-group.horizontal-gutters{margin-left:-2em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=xlarge-]{padding-left:2em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=xlarge-]{margin-bottom:2em}.column-group.double-gutters{margin-left:-4em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}.column-group.double-horizontal-gutters{margin-left:-4em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}.column-group.half-gutters{margin-left:-1em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}.column-group.half-horizontal-gutters{margin-left:-1em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}.column-group.quarter-gutters{margin-left:-.5em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}.column-group.quarter-horizontal-gutters{margin-left:-.5em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}.column-group.xlarge-gutters{margin-left:-2em}.column-group.xlarge-gutters>[class*=all-],.column-group.xlarge-gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}.column-group.xlarge-horizontal-gutters{margin-left:-2em}.column-group.xlarge-horizontal-gutters>[class*=all-],.column-group.xlarge-horizontal-gutters>[class*=xlarge-]{padding-left:2em}.column-group.xlarge-vertical-gutters>[class*=all-],.column-group.xlarge-vertical-gutters>[class*=xlarge-]{margin-bottom:2em}.column-group.xlarge-double-gutters{margin-left:-4em}.column-group.xlarge-double-gutters>[class*=all-],.column-group.xlarge-double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}.column-group.xlarge-double-horizontal-gutters{margin-left:-4em}.column-group.xlarge-double-horizontal-gutters>[class*=all-],.column-group.xlarge-double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}.column-group.xlarge-double-vertical-gutters>[class*=all-],.column-group.xlarge-double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}.column-group.xlarge-half-gutters{margin-left:-1em}.column-group.xlarge-half-gutters>[class*=all-],.column-group.xlarge-half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}.column-group.xlarge-half-horizontal-gutters{margin-left:-1em}.column-group.xlarge-half-horizontal-gutters>[class*=all-],.column-group.xlarge-half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}.column-group.xlarge-half-vertical-gutters>[class*=all-],.column-group.xlarge-half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}.column-group.xlarge-quarter-gutters{margin-left:-.5em}.column-group.xlarge-quarter-gutters>[class*=all-],.column-group.xlarge-quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}.column-group.xlarge-quarter-horizontal-gutters{margin-left:-.5em}.column-group.xlarge-quarter-horizontal-gutters>[class*=all-],.column-group.xlarge-quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}.column-group.xlarge-quarter-vertical-gutters>[class*=all-],.column-group.xlarge-quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}.column-group.xlarge-no-gutters{margin-left:0}.column-group.xlarge-no-gutters>[class*=all-],.column-group.xlarge-no-gutters>[class*=xlarge-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=xlarge-],.ink-table td[class*=xlarge-],.ink-table tfoot[class*=xlarge-],.ink-table th[class*=xlarge-],.ink-table thead[class*=xlarge-],.ink-table tr[class*=xlarge-]{float:none}.xlarge-push-left{float:left}.xlarge-push-center{float:none;margin-left:auto;margin-right:auto}.xlarge-push-right{float:right}.xlarge-align-left{text-align:left}.xlarge-align-center{text-align:center}.xlarge-align-right{text-align:right}.xlarge-no-margin{margin:0!important}.space,.xlarge-space{margin:2em}.padding,.xlarge-padding{padding:2em}.double-space,.xlarge-double-space{margin:4em}.double-padding,.xlarge-double-padding{padding:4em}.half-space,.xlarge-half-space{margin:1em}.half-padding,.xlarge-half-padding{padding:1em}.quarter-space,.xlarge-quarter-space{margin:.5em}.quarter-padding,.xlarge-quarter-padding{padding:.5em}.vertical-space,.xlarge-vertical-space{margin-top:2em;margin-bottom:2em}.vertical-padding,.xlarge-vertical-padding{padding-top:2em;padding-bottom:2em}.double-vertical-space,.xlarge-double-vertical-space{margin-top:4em;margin-bottom:4em}.double-vertical-padding,.xlarge-double-vertical-padding{padding-top:4em;padding-bottom:4em}.half-vertical-space,.xlarge-half-vertical-space{margin-top:1em;margin-bottom:1em}.half-vertical-padding,.xlarge-half-vertical-padding{padding-top:1em;padding-bottom:1em}.quarter-vertical-space,.xlarge-quarter-vertical-space{margin-top:.5em;margin-bottom:.5em}.quarter-vertical-padding,.xlarge-quarter-vertical-padding{padding-top:.5em;padding-bottom:.5em}.horizontal-space,.xlarge-horizontal-space{margin-left:2em;margin-right:2em}.horizontal-padding,.xlarge-horizontal-padding{padding-left:2em;padding-right:2em}.double-horizontal-space,.xlarge-double-horizontal-space{margin-left:4em;margin-right:4em}.double-horizontal-padding,.xlarge-double-horizontal-padding{padding-left:4em;padding-right:4em}.half-horizontal-space,.xlarge-half-horizontal-space{margin-left:1em;margin-right:1em}.half-horizontal-padding,.xlarge-half-horizontal-padding{padding-left:1em;padding-right:1em}.quarter-horizontal-space,.xlarge-quarter-horizontal-space{margin-left:.5em;margin-right:.5em}.quarter-horizontal-padding,.xlarge-quarter-horizontal-padding{padding-left:.5em;padding-right:.5em}.top-space,.xlarge-top-space{margin-top:2em}.top-padding,.xlarge-top-padding{padding-top:2em}.double-top-space,.xlarge-double-top-space{margin-top:4em}.double-top-padding,.xlarge-double-top-padding{padding-top:4em}.half-top-space,.xlarge-half-top-space{margin-top:1em}.half-top-padding,.xlarge-half-top-padding{padding-top:1em}.quarter-top-space,.xlarge-quarter-top-space{margin-top:.5em}.quarter-top-padding,.xlarge-quarter-top-padding{padding-top:.5em}.right-space,.xlarge-right-space{margin-right:2em}.right-padding,.xlarge-right-padding{padding-right:2em}.double-right-space,.xlarge-double-right-space{margin-right:4em}.double-right-padding,.xlarge-double-right-padding{padding-right:4em}.half-right-space,.xlarge-half-right-space{margin-right:1em}.half-right-padding,.xlarge-half-right-padding{padding-right:1em}.quarter-right-space,.xlarge-quarter-right-space{margin-right:.5em}.quarter-right-padding,.xlarge-quarter-right-padding{padding-right:.5em}.bottom-space,.xlarge-bottom-space{margin-bottom:2em}.bottom-padding,.xlarge-bottom-padding{padding-bottom:2em}.double-bottom-space,.xlarge-double-bottom-space{margin-bottom:4em}.double-bottom-padding,.xlarge-double-bottom-padding{padding-bottom:4em}.half-bottom-space,.xlarge-half-bottom-space{margin-bottom:1em}.half-bottom-padding,.xlarge-half-bottom-padding{padding-bottom:1em}.quarter-bottom-space,.xlarge-quarter-bottom-space{margin-bottom:.5em}.quarter-bottom-padding,.xlarge-quarter-bottom-padding{padding-bottom:.5em}.left-space,.xlarge-left-space{margin-left:2em}.left-padding,.xlarge-left-padding{padding-left:2em}.double-left-space,.xlarge-double-left-space{margin-left:4em}.double-left-padding,.xlarge-double-left-padding{padding-left:4em}.half-left-space,.xlarge-half-left-space{margin-left:1em}.half-left-padding,.xlarge-half-left-padding{padding-left:1em}.quarter-left-space,.xlarge-quarter-left-space{margin-left:.5em}.quarter-left-padding,.xlarge-quarter-left-padding{padding-left:.5em}.hide-xlarge{display:none!important}.show-xlarge{display:inherit!important}table.show-xlarge{display:table}thead.show-xlarge{display:table-header-group}tbody.show-xlarge{display:table-row-group}tfoot.show-xlarge{display:table-footer-group}tr.show-xlarge{display:table-row}td.show-xlarge,th.show-xlarge{display:table-cell}}@media screen and (min-width:961px) and (max-width:1260px){.ink-grid{padding:0 1.75em}.column-group>[class*=large-]{float:left;clear:none}.large-5{width:5%}.large-10{width:10%}.large-15{width:15%}.large-16{width:16.66%}.large-20{width:20%}.large-25{width:25%}.large-30{width:30%}.large-33{width:33.33%}.large-35{width:35%}.large-40{width:40%}.large-45{width:45%}.large-50{width:50%}.large-55{width:55%}.large-60{width:60%}.large-65{width:65%}.large-66{width:66.66%}.large-70{width:70%}.large-75{width:75%}.large-80{width:80%}.large-85{width:85%}.large-90{width:90%}.large-95{width:95%}.large-100{width:100%}[class*=large-100]{float:none;clear:both}.column-group{*zoom:1}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1.75em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.horizontal-gutters{margin-left:-1.75em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.double-gutters{margin-left:-3.5em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.double-horizontal-gutters{margin-left:-3.5em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.half-gutters{margin-left:-.875em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.half-horizontal-gutters{margin-left:-.875em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.quarter-gutters{margin-left:-.4375em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.quarter-horizontal-gutters{margin-left:-.4375em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-gutters{margin-left:-1.75em}.column-group.large-gutters>[class*=all-],.column-group.large-gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.large-horizontal-gutters{margin-left:-1.75em}.column-group.large-horizontal-gutters>[class*=all-],.column-group.large-horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.large-vertical-gutters>[class*=all-],.column-group.large-vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.large-double-gutters{margin-left:-3.5em}.column-group.large-double-gutters>[class*=all-],.column-group.large-double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.large-double-horizontal-gutters{margin-left:-3.5em}.column-group.large-double-horizontal-gutters>[class*=all-],.column-group.large-double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.large-double-vertical-gutters>[class*=all-],.column-group.large-double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.large-half-gutters{margin-left:-.875em}.column-group.large-half-gutters>[class*=all-],.column-group.large-half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.large-half-horizontal-gutters{margin-left:-.875em}.column-group.large-half-horizontal-gutters>[class*=all-],.column-group.large-half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.large-half-vertical-gutters>[class*=all-],.column-group.large-half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.large-quarter-gutters{margin-left:-.4375em}.column-group.large-quarter-gutters>[class*=all-],.column-group.large-quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.large-quarter-horizontal-gutters{margin-left:-.4375em}.column-group.large-quarter-horizontal-gutters>[class*=all-],.column-group.large-quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.large-quarter-vertical-gutters>[class*=all-],.column-group.large-quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-no-gutters{margin-left:0}.column-group.large-no-gutters>[class*=all-],.column-group.large-no-gutters>[class*=large-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=large-],.ink-table td[class*=large-],.ink-table tfoot[class*=large-],.ink-table th[class*=large-],.ink-table thead[class*=large-],.ink-table tr[class*=large-]{float:none}.large-push-left{float:left}.large-push-center{float:none;margin-left:auto;margin-right:auto}.large-push-right{float:right}.large-align-left{text-align:left}.large-align-center{text-align:center}.large-align-right{text-align:right}.large-no-margin{margin:0!important}.large-space,.space{margin:1.75em}.large-padding,.padding{padding:1.75em}.double-space,.large-double-space{margin:3.5em}.double-padding,.large-double-padding{padding:3.5em}.half-space,.large-half-space{margin:.875em}.half-padding,.large-half-padding{padding:.875em}.large-quarter-space,.quarter-space{margin:.4375em}.large-quarter-padding,.quarter-padding{padding:.4375em}.large-vertical-space,.vertical-space{margin-top:1.75em;margin-bottom:1.75em}.large-vertical-padding,.vertical-padding{padding-top:1.75em;padding-bottom:1.75em}.double-vertical-space,.large-double-vertical-space{margin-top:3.5em;margin-bottom:3.5em}.double-vertical-padding,.large-double-vertical-padding{padding-top:3.5em;padding-bottom:3.5em}.half-vertical-space,.large-half-vertical-space{margin-top:.875em;margin-bottom:.875em}.half-vertical-padding,.large-half-vertical-padding{padding-top:.875em;padding-bottom:.875em}.large-quarter-vertical-space,.quarter-vertical-space{margin-top:.4375em;margin-bottom:.4375em}.large-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.4375em;padding-bottom:.4375em}.horizontal-space,.large-horizontal-space{margin-left:1.75em;margin-right:1.75em}.horizontal-padding,.large-horizontal-padding{padding-left:1.75em;padding-right:1.75em}.double-horizontal-space,.large-double-horizontal-space{margin-left:3.5em;margin-right:3.5em}.double-horizontal-padding,.large-double-horizontal-padding{padding-left:3.5em;padding-right:3.5em}.half-horizontal-space,.large-half-horizontal-space{margin-left:.875em;margin-right:.875em}.half-horizontal-padding,.large-half-horizontal-padding{padding-left:.875em;padding-right:.875em}.large-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.4375em;margin-right:.4375em}.large-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.4375em;padding-right:.4375em}.large-top-space,.top-space{margin-top:1.75em}.large-top-padding,.top-padding{padding-top:1.75em}.double-top-space,.large-double-top-space{margin-top:3.5em}.double-top-padding,.large-double-top-padding{padding-top:3.5em}.half-top-space,.large-half-top-space{margin-top:.875em}.half-top-padding,.large-half-top-padding{padding-top:.875em}.large-quarter-top-space,.quarter-top-space{margin-top:.4375em}.large-quarter-top-padding,.quarter-top-padding{padding-top:.4375em}.large-right-space,.right-space{margin-right:1.75em}.large-right-padding,.right-padding{padding-right:1.75em}.double-right-space,.large-double-right-space{margin-right:3.5em}.double-right-padding,.large-double-right-padding{padding-right:3.5em}.half-right-space,.large-half-right-space{margin-right:.875em}.half-right-padding,.large-half-right-padding{padding-right:.875em}.large-quarter-right-space,.quarter-right-space{margin-right:.4375em}.large-quarter-right-padding,.quarter-right-padding{padding-right:.4375em}.bottom-space,.large-bottom-space{margin-bottom:1.75em}.bottom-padding,.large-bottom-padding{padding-bottom:1.75em}.double-bottom-space,.large-double-bottom-space{margin-bottom:3.5em}.double-bottom-padding,.large-double-bottom-padding{padding-bottom:3.5em}.half-bottom-space,.large-half-bottom-space{margin-bottom:.875em}.half-bottom-padding,.large-half-bottom-padding{padding-bottom:.875em}.large-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.4375em}.large-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.4375em}.large-left-space,.left-space{margin-left:1.75em}.large-left-padding,.left-padding{padding-left:1.75em}.double-left-space,.large-double-left-space{margin-left:3.5em}.double-left-padding,.large-double-left-padding{padding-left:3.5em}.half-left-space,.large-half-left-space{margin-left:.875em}.half-left-padding,.large-half-left-padding{padding-left:.875em}.large-quarter-left-space,.quarter-left-space{margin-left:.4375em}.large-quarter-left-padding,.quarter-left-padding{padding-left:.4375em}.hide-large{display:none!important}.show-large{display:inherit!important}table.show-large{display:table}thead.show-large{display:table-header-group}tbody.show-large{display:table-row-group}tfoot.show-large{display:table-footer-group}tr.show-large{display:table-row}td.show-large,th.show-large{display:table-cell}}@media screen and (min-width:641px) and (max-width:960px){.ink-grid{padding:0 1.5em}.column-group>[class*=medium-]{float:left;clear:none}.medium-5{width:5%}.medium-10{width:10%}.medium-15{width:15%}.medium-16{width:16.66%}.medium-20{width:20%}.medium-25{width:25%}.medium-30{width:30%}.medium-33{width:33.33%}.medium-35{width:35%}.medium-40{width:40%}.medium-45{width:45%}.medium-50{width:50%}.medium-55{width:55%}.medium-60{width:60%}.medium-65{width:65%}.medium-66{width:66.66%}.medium-70{width:70%}.medium-75{width:75%}.medium-80{width:80%}.medium-85{width:85%}.medium-90{width:90%}.medium-95{width:95%}.medium-100{width:100%}[class*=medium-100]{float:none;clear:both}.column-group{*zoom:1}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1.5em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}.column-group.horizontal-gutters{margin-left:-1.5em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=medium-]{padding-left:1.5em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=medium-]{margin-bottom:1.5em}.column-group.double-gutters{margin-left:-3em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}.column-group.double-horizontal-gutters{margin-left:-3em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=medium-]{padding-left:3em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=medium-]{margin-bottom:3em}.column-group.half-gutters{margin-left:-.75em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}.column-group.half-horizontal-gutters{margin-left:-.75em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=medium-]{padding-left:.75em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}.column-group.quarter-gutters{margin-left:-.375em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}.column-group.quarter-horizontal-gutters{margin-left:-.375em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}.column-group.medium-gutters{margin-left:-1.5em}.column-group.medium-gutters>[class*=all-],.column-group.medium-gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}.column-group.medium-horizontal-gutters{margin-left:-1.5em}.column-group.medium-horizontal-gutters>[class*=all-],.column-group.medium-horizontal-gutters>[class*=medium-]{padding-left:1.5em}.column-group.medium-vertical-gutters>[class*=all-],.column-group.medium-vertical-gutters>[class*=medium-]{margin-bottom:1.5em}.column-group.medium-double-gutters{margin-left:-3em}.column-group.medium-double-gutters>[class*=all-],.column-group.medium-double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}.column-group.medium-double-horizontal-gutters{margin-left:-3em}.column-group.medium-double-horizontal-gutters>[class*=all-],.column-group.medium-double-horizontal-gutters>[class*=medium-]{padding-left:3em}.column-group.medium-double-vertical-gutters>[class*=all-],.column-group.medium-double-vertical-gutters>[class*=medium-]{margin-bottom:3em}.column-group.medium-half-gutters{margin-left:-.75em}.column-group.medium-half-gutters>[class*=all-],.column-group.medium-half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}.column-group.medium-half-horizontal-gutters{margin-left:-.75em}.column-group.medium-half-horizontal-gutters>[class*=all-],.column-group.medium-half-horizontal-gutters>[class*=medium-]{padding-left:.75em}.column-group.medium-half-vertical-gutters>[class*=all-],.column-group.medium-half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}.column-group.medium-quarter-gutters{margin-left:-.375em}.column-group.medium-quarter-gutters>[class*=all-],.column-group.medium-quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}.column-group.medium-quarter-horizontal-gutters{margin-left:-.375em}.column-group.medium-quarter-horizontal-gutters>[class*=all-],.column-group.medium-quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}.column-group.medium-quarter-vertical-gutters>[class*=all-],.column-group.medium-quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}.column-group.medium-no-gutters{margin-left:0}.column-group.medium-no-gutters>[class*=all-],.column-group.medium-no-gutters>[class*=medium-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=medium-],.ink-table td[class*=medium-],.ink-table tfoot[class*=medium-],.ink-table th[class*=medium-],.ink-table thead[class*=medium-],.ink-table tr[class*=medium-]{float:none}.medium-push-left{float:left}.medium-push-center{float:none;margin-left:auto;margin-right:auto}.medium-push-right{float:right}.medium-align-left{text-align:left}.medium-align-center{text-align:center}.medium-align-right{text-align:right}.medium-no-margin{margin:0!important}.medium-space,.space{margin:1.5em}.medium-padding,.padding{padding:1.5em}.double-space,.medium-double-space{margin:3em}.double-padding,.medium-double-padding{padding:3em}.half-space,.medium-half-space{margin:.75em}.half-padding,.medium-half-padding{padding:.75em}.medium-quarter-space,.quarter-space{margin:.375em}.medium-quarter-padding,.quarter-padding{padding:.375em}.medium-vertical-space,.vertical-space{margin-top:1.5em;margin-bottom:1.5em}.medium-vertical-padding,.vertical-padding{padding-top:1.5em;padding-bottom:1.5em}.double-vertical-space,.medium-double-vertical-space{margin-top:3em;margin-bottom:3em}.double-vertical-padding,.medium-double-vertical-padding{padding-top:3em;padding-bottom:3em}.half-vertical-space,.medium-half-vertical-space{margin-top:.75em;margin-bottom:.75em}.half-vertical-padding,.medium-half-vertical-padding{padding-top:.75em;padding-bottom:.75em}.medium-quarter-vertical-space,.quarter-vertical-space{margin-top:.375em;margin-bottom:.375em}.medium-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.375em;padding-bottom:.375em}.horizontal-space,.medium-horizontal-space{margin-left:1.5em;margin-right:1.5em}.horizontal-padding,.medium-horizontal-padding{padding-left:1.5em;padding-right:1.5em}.double-horizontal-space,.medium-double-horizontal-space{margin-left:3em;margin-right:3em}.double-horizontal-padding,.medium-double-horizontal-padding{padding-left:3em;padding-right:3em}.half-horizontal-space,.medium-half-horizontal-space{margin-left:.75em;margin-right:.75em}.half-horizontal-padding,.medium-half-horizontal-padding{padding-left:.75em;padding-right:.75em}.medium-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.375em;margin-right:.375em}.medium-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.375em;padding-right:.375em}.medium-top-space,.top-space{margin-top:1.5em}.medium-top-padding,.top-padding{padding-top:1.5em}.double-top-space,.medium-double-top-space{margin-top:3em}.double-top-padding,.medium-double-top-padding{padding-top:3em}.half-top-space,.medium-half-top-space{margin-top:.75em}.half-top-padding,.medium-half-top-padding{padding-top:.75em}.medium-quarter-top-space,.quarter-top-space{margin-top:.375em}.medium-quarter-top-padding,.quarter-top-padding{padding-top:.375em}.medium-right-space,.right-space{margin-right:1.5em}.medium-right-padding,.right-padding{padding-right:1.5em}.double-right-space,.medium-double-right-space{margin-right:3em}.double-right-padding,.medium-double-right-padding{padding-right:3em}.half-right-space,.medium-half-right-space{margin-right:.75em}.half-right-padding,.medium-half-right-padding{padding-right:.75em}.medium-quarter-right-space,.quarter-right-space{margin-right:.375em}.medium-quarter-right-padding,.quarter-right-padding{padding-right:.375em}.bottom-space,.medium-bottom-space{margin-bottom:1.5em}.bottom-padding,.medium-bottom-padding{padding-bottom:1.5em}.double-bottom-space,.medium-double-bottom-space{margin-bottom:3em}.double-bottom-padding,.medium-double-bottom-padding{padding-bottom:3em}.half-bottom-space,.medium-half-bottom-space{margin-bottom:.75em}.half-bottom-padding,.medium-half-bottom-padding{padding-bottom:.75em}.medium-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.375em}.medium-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.375em}.left-space,.medium-left-space{margin-left:1.5em}.left-padding,.medium-left-padding{padding-left:1.5em}.double-left-space,.medium-double-left-space{margin-left:3em}.double-left-padding,.medium-double-left-padding{padding-left:3em}.half-left-space,.medium-half-left-space{margin-left:.75em}.half-left-padding,.medium-half-left-padding{padding-left:.75em}.medium-quarter-left-space,.quarter-left-space{margin-left:.375em}.medium-quarter-left-padding,.quarter-left-padding{padding-left:.375em}.hide-medium{display:none!important}.show-medium{display:inherit!important}table.show-medium{display:table}thead.show-medium{display:table-header-group}tbody.show-medium{display:table-row-group}tfoot.show-medium{display:table-footer-group}tr.show-medium{display:table-row}td.show-medium,th.show-medium{display:table-cell}}@media screen and (min-width:321px) and (max-width:640px){.ink-grid{padding:0 1.25em}.column-group>[class*=small-]{float:left;clear:none}.small-5{width:5%}.small-10{width:10%}.small-15{width:15%}.small-16{width:16.66%}.small-20{width:20%}.small-25{width:25%}.small-30{width:30%}.small-33{width:33.33%}.small-35{width:35%}.small-40{width:40%}.small-45{width:45%}.small-50{width:50%}.small-55{width:55%}.small-60{width:60%}.small-65{width:65%}.small-66{width:66.66%}.small-70{width:70%}.small-75{width:75%}.small-80{width:80%}.small-85{width:85%}.small-90{width:90%}.small-95{width:95%}.small-100{width:100%}[class*=small-100]{float:none;clear:both}.column-group{*zoom:1}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1.25em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}.column-group.horizontal-gutters{margin-left:-1.25em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=small-]{padding-left:1.25em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=small-]{margin-bottom:1.25em}.column-group.double-gutters{margin-left:-2.5em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}.column-group.double-horizontal-gutters{margin-left:-2.5em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=small-]{padding-left:2.5em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}.column-group.half-gutters{margin-left:-.625em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}.column-group.half-horizontal-gutters{margin-left:-.625em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=small-]{padding-left:.625em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=small-]{margin-bottom:.625em}.column-group.quarter-gutters{margin-left:-.3125em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}.column-group.quarter-horizontal-gutters{margin-left:-.3125em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}.column-group.small-gutters{margin-left:-1.25em}.column-group.small-gutters>[class*=all-],.column-group.small-gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}.column-group.small-horizontal-gutters{margin-left:-1.25em}.column-group.small-horizontal-gutters>[class*=all-],.column-group.small-horizontal-gutters>[class*=small-]{padding-left:1.25em}.column-group.small-vertical-gutters>[class*=all-],.column-group.small-vertical-gutters>[class*=small-]{margin-bottom:1.25em}.column-group.small-double-gutters{margin-left:-2.5em}.column-group.small-double-gutters>[class*=all-],.column-group.small-double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}.column-group.small-double-horizontal-gutters{margin-left:-2.5em}.column-group.small-double-horizontal-gutters>[class*=all-],.column-group.small-double-horizontal-gutters>[class*=small-]{padding-left:2.5em}.column-group.small-double-vertical-gutters>[class*=all-],.column-group.small-double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}.column-group.small-half-gutters{margin-left:-.625em}.column-group.small-half-gutters>[class*=all-],.column-group.small-half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}.column-group.small-half-horizontal-gutters{margin-left:-.625em}.column-group.small-half-horizontal-gutters>[class*=all-],.column-group.small-half-horizontal-gutters>[class*=small-]{padding-left:.625em}.column-group.small-half-vertical-gutters>[class*=all-],.column-group.small-half-vertical-gutters>[class*=small-]{margin-bottom:.625em}.column-group.small-quarter-gutters{margin-left:-.3125em}.column-group.small-quarter-gutters>[class*=all-],.column-group.small-quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}.column-group.small-quarter-horizontal-gutters{margin-left:-.3125em}.column-group.small-quarter-horizontal-gutters>[class*=all-],.column-group.small-quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}.column-group.small-quarter-vertical-gutters>[class*=all-],.column-group.small-quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}.column-group.small-no-gutters{margin-left:0}.column-group.small-no-gutters>[class*=all-],.column-group.small-no-gutters>[class*=small-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=small-],.ink-table td[class*=small-],.ink-table tfoot[class*=small-],.ink-table th[class*=small-],.ink-table thead[class*=small-],.ink-table tr[class*=small-]{float:none}.small-push-left{float:left}.small-push-center{float:none;margin-left:auto;margin-right:auto}.small-push-right{float:right}.small-align-left{text-align:left}.small-align-center{text-align:center}.small-align-right{text-align:right}.small-no-margin{margin:0!important}.small-space,.space{margin:1.25em}.padding,.small-padding{padding:1.25em}.double-space,.small-double-space{margin:2.5em}.double-padding,.small-double-padding{padding:2.5em}.half-space,.small-half-space{margin:.625em}.half-padding,.small-half-padding{padding:.625em}.quarter-space,.small-quarter-space{margin:.3125em}.quarter-padding,.small-quarter-padding{padding:.3125em}.small-vertical-space,.vertical-space{margin-top:1.25em;margin-bottom:1.25em}.small-vertical-padding,.vertical-padding{padding-top:1.25em;padding-bottom:1.25em}.double-vertical-space,.small-double-vertical-space{margin-top:2.5em;margin-bottom:2.5em}.double-vertical-padding,.small-double-vertical-padding{padding-top:2.5em;padding-bottom:2.5em}.half-vertical-space,.small-half-vertical-space{margin-top:.625em;margin-bottom:.625em}.half-vertical-padding,.small-half-vertical-padding{padding-top:.625em;padding-bottom:.625em}.quarter-vertical-space,.small-quarter-vertical-space{margin-top:.3125em;margin-bottom:.3125em}.quarter-vertical-padding,.small-quarter-vertical-padding{padding-top:.3125em;padding-bottom:.3125em}.horizontal-space,.small-horizontal-space{margin-left:1.25em;margin-right:1.25em}.horizontal-padding,.small-horizontal-padding{padding-left:1.25em;padding-right:1.25em}.double-horizontal-space,.small-double-horizontal-space{margin-left:2.5em;margin-right:2.5em}.double-horizontal-padding,.small-double-horizontal-padding{padding-left:2.5em;padding-right:2.5em}.half-horizontal-space,.small-half-horizontal-space{margin-left:.625em;margin-right:.625em}.half-horizontal-padding,.small-half-horizontal-padding{padding-left:.625em;padding-right:.625em}.quarter-horizontal-space,.small-quarter-horizontal-space{margin-left:.3125em;margin-right:.3125em}.quarter-horizontal-padding,.small-quarter-horizontal-padding{padding-left:.3125em;padding-right:.3125em}.small-top-space,.top-space{margin-top:1.25em}.small-top-padding,.top-padding{padding-top:1.25em}.double-top-space,.small-double-top-space{margin-top:2.5em}.double-top-padding,.small-double-top-padding{padding-top:2.5em}.half-top-space,.small-half-top-space{margin-top:.625em}.half-top-padding,.small-half-top-padding{padding-top:.625em}.quarter-top-space,.small-quarter-top-space{margin-top:.3125em}.quarter-top-padding,.small-quarter-top-padding{padding-top:.3125em}.right-space,.small-right-space{margin-right:1.25em}.right-padding,.small-right-padding{padding-right:1.25em}.double-right-space,.small-double-right-space{margin-right:2.5em}.double-right-padding,.small-double-right-padding{padding-right:2.5em}.half-right-space,.small-half-right-space{margin-right:.625em}.half-right-padding,.small-half-right-padding{padding-right:.625em}.quarter-right-space,.small-quarter-right-space{margin-right:.3125em}.quarter-right-padding,.small-quarter-right-padding{padding-right:.3125em}.bottom-space,.small-bottom-space{margin-bottom:1.25em}.bottom-padding,.small-bottom-padding{padding-bottom:1.25em}.double-bottom-space,.small-double-bottom-space{margin-bottom:2.5em}.double-bottom-padding,.small-double-bottom-padding{padding-bottom:2.5em}.half-bottom-space,.small-half-bottom-space{margin-bottom:.625em}.half-bottom-padding,.small-half-bottom-padding{padding-bottom:.625em}.quarter-bottom-space,.small-quarter-bottom-space{margin-bottom:.3125em}.quarter-bottom-padding,.small-quarter-bottom-padding{padding-bottom:.3125em}.left-space,.small-left-space{margin-left:1.25em}.left-padding,.small-left-padding{padding-left:1.25em}.double-left-space,.small-double-left-space{margin-left:2.5em}.double-left-padding,.small-double-left-padding{padding-left:2.5em}.half-left-space,.small-half-left-space{margin-left:.625em}.half-left-padding,.small-half-left-padding{padding-left:.625em}.quarter-left-space,.small-quarter-left-space{margin-left:.3125em}.quarter-left-padding,.small-quarter-left-padding{padding-left:.3125em}.hide-small{display:none!important}.show-small{display:inherit!important}table.show-small{display:table}thead.show-small{display:table-header-group}tbody.show-small{display:table-row-group}tfoot.show-small{display:table-footer-group}tr.show-small{display:table-row}td.show-small,th.show-small{display:table-cell}}@media screen and (max-width:320px){.ink-grid{padding:0 1em}.column-group>[class*=tiny-]{float:left;clear:none}.tiny-5{width:5%}.tiny-10{width:10%}.tiny-15{width:15%}.tiny-16{width:16.66%}.tiny-20{width:20%}.tiny-25{width:25%}.tiny-30{width:30%}.tiny-33{width:33.33%}.tiny-35{width:35%}.tiny-40{width:40%}.tiny-45{width:45%}.tiny-50{width:50%}.tiny-55{width:55%}.tiny-60{width:60%}.tiny-65{width:65%}.tiny-66{width:66.66%}.tiny-70{width:70%}.tiny-75{width:75%}.tiny-80{width:80%}.tiny-85{width:85%}.tiny-90{width:90%}.tiny-95{width:95%}.tiny-100{width:100%}[class*=tiny-100]{float:none;clear:both}.column-group{*zoom:1}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}.column-group.horizontal-gutters{margin-left:-1em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=tiny-]{padding-left:1em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=tiny-]{margin-bottom:1em}.column-group.double-gutters{margin-left:-2em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}.column-group.double-horizontal-gutters{margin-left:-2em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=tiny-]{padding-left:2em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}.column-group.half-gutters{margin-left:-.5em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}.column-group.half-horizontal-gutters{margin-left:-.5em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}.column-group.quarter-gutters{margin-left:-.25em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}.column-group.quarter-horizontal-gutters{margin-left:-.25em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}.column-group.tiny-gutters{margin-left:-1em}.column-group.tiny-gutters>[class*=all-],.column-group.tiny-gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}.column-group.tiny-horizontal-gutters{margin-left:-1em}.column-group.tiny-horizontal-gutters>[class*=all-],.column-group.tiny-horizontal-gutters>[class*=tiny-]{padding-left:1em}.column-group.tiny-vertical-gutters>[class*=all-],.column-group.tiny-vertical-gutters>[class*=tiny-]{margin-bottom:1em}.column-group.tiny-double-gutters{margin-left:-2em}.column-group.tiny-double-gutters>[class*=all-],.column-group.tiny-double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}.column-group.tiny-double-horizontal-gutters{margin-left:-2em}.column-group.tiny-double-horizontal-gutters>[class*=all-],.column-group.tiny-double-horizontal-gutters>[class*=tiny-]{padding-left:2em}.column-group.tiny-double-vertical-gutters>[class*=all-],.column-group.tiny-double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}.column-group.tiny-half-gutters{margin-left:-.5em}.column-group.tiny-half-gutters>[class*=all-],.column-group.tiny-half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}.column-group.tiny-half-horizontal-gutters{margin-left:-.5em}.column-group.tiny-half-horizontal-gutters>[class*=all-],.column-group.tiny-half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}.column-group.tiny-half-vertical-gutters>[class*=all-],.column-group.tiny-half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}.column-group.tiny-quarter-gutters{margin-left:-.25em}.column-group.tiny-quarter-gutters>[class*=all-],.column-group.tiny-quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}.column-group.tiny-quarter-horizontal-gutters{margin-left:-.25em}.column-group.tiny-quarter-horizontal-gutters>[class*=all-],.column-group.tiny-quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}.column-group.tiny-quarter-vertical-gutters>[class*=all-],.column-group.tiny-quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}.column-group.tiny-no-gutters{margin-left:0}.column-group.tiny-no-gutters>[class*=all-],.column-group.tiny-no-gutters>[class*=tiny-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=tiny-],.ink-table td[class*=tiny-],.ink-table tfoot[class*=tiny-],.ink-table th[class*=tiny-],.ink-table thead[class*=tiny-],.ink-table tr[class*=tiny-]{float:none}.tiny-push-left{float:left}.tiny-push-center{float:none;margin-left:auto;margin-right:auto}.tiny-push-right{float:right}.tiny-align-left{text-align:left}.tiny-align-center{text-align:center}.tiny-align-right{text-align:right}.tiny-no-margin{margin:0!important}.space,.tiny-space{margin:1em}.padding,.tiny-padding{padding:1em}.double-space,.tiny-double-space{margin:2em}.double-padding,.tiny-double-padding{padding:2em}.half-space,.tiny-half-space{margin:.5em}.half-padding,.tiny-half-padding{padding:.5em}.quarter-space,.tiny-quarter-space{margin:.25em}.quarter-padding,.tiny-quarter-padding{padding:.25em}.tiny-vertical-space,.vertical-space{margin-top:1em;margin-bottom:1em}.tiny-vertical-padding,.vertical-padding{padding-top:1em;padding-bottom:1em}.double-vertical-space,.tiny-double-vertical-space{margin-top:2em;margin-bottom:2em}.double-vertical-padding,.tiny-double-vertical-padding{padding-top:2em;padding-bottom:2em}.half-vertical-space,.tiny-half-vertical-space{margin-top:.5em;margin-bottom:.5em}.half-vertical-padding,.tiny-half-vertical-padding{padding-top:.5em;padding-bottom:.5em}.quarter-vertical-space,.tiny-quarter-vertical-space{margin-top:.25em;margin-bottom:.25em}.quarter-vertical-padding,.tiny-quarter-vertical-padding{padding-top:.25em;padding-bottom:.25em}.horizontal-space,.tiny-horizontal-space{margin-left:1em;margin-right:1em}.horizontal-padding,.tiny-horizontal-padding{padding-left:1em;padding-right:1em}.double-horizontal-space,.tiny-double-horizontal-space{margin-left:2em;margin-right:2em}.double-horizontal-padding,.tiny-double-horizontal-padding{padding-left:2em;padding-right:2em}.half-horizontal-space,.tiny-half-horizontal-space{margin-left:.5em;margin-right:.5em}.half-horizontal-padding,.tiny-half-horizontal-padding{padding-left:.5em;padding-right:.5em}.quarter-horizontal-space,.tiny-quarter-horizontal-space{margin-left:.25em;margin-right:.25em}.quarter-horizontal-padding,.tiny-quarter-horizontal-padding{padding-left:.25em;padding-right:.25em}.tiny-top-space,.top-space{margin-top:1em}.tiny-top-padding,.top-padding{padding-top:1em}.double-top-space,.tiny-double-top-space{margin-top:2em}.double-top-padding,.tiny-double-top-padding{padding-top:2em}.half-top-space,.tiny-half-top-space{margin-top:.5em}.half-top-padding,.tiny-half-top-padding{padding-top:.5em}.quarter-top-space,.tiny-quarter-top-space{margin-top:.25em}.quarter-top-padding,.tiny-quarter-top-padding{padding-top:.25em}.right-space,.tiny-right-space{margin-right:1em}.right-padding,.tiny-right-padding{padding-right:1em}.double-right-space,.tiny-double-right-space{margin-right:2em}.double-right-padding,.tiny-double-right-padding{padding-right:2em}.half-right-space,.tiny-half-right-space{margin-right:.5em}.half-right-padding,.tiny-half-right-padding{padding-right:.5em}.quarter-right-space,.tiny-quarter-right-space{margin-right:.25em}.quarter-right-padding,.tiny-quarter-right-padding{padding-right:.25em}.bottom-space,.tiny-bottom-space{margin-bottom:1em}.bottom-padding,.tiny-bottom-padding{padding-bottom:1em}.double-bottom-space,.tiny-double-bottom-space{margin-bottom:2em}.double-bottom-padding,.tiny-double-bottom-padding{padding-bottom:2em}.half-bottom-space,.tiny-half-bottom-space{margin-bottom:.5em}.half-bottom-padding,.tiny-half-bottom-padding{padding-bottom:.5em}.quarter-bottom-space,.tiny-quarter-bottom-space{margin-bottom:.25em}.quarter-bottom-padding,.tiny-quarter-bottom-padding{padding-bottom:.25em}.left-space,.tiny-left-space{margin-left:1em}.left-padding,.tiny-left-padding{padding-left:1em}.double-left-space,.tiny-double-left-space{margin-left:2em}.double-left-padding,.tiny-double-left-padding{padding-left:2em}.half-left-space,.tiny-half-left-space{margin-left:.5em}.half-left-padding,.tiny-half-left-padding{padding-left:.5em}.quarter-left-space,.tiny-quarter-left-space{margin-left:.25em}.quarter-left-padding,.tiny-quarter-left-padding{padding-left:.25em}.hide-tiny{display:none!important}.show-tiny{display:inherit!important}table.show-tiny{display:table}thead.show-tiny{display:table-header-group}tbody.show-tiny{display:table-row-group}tfoot.show-tiny{display:table-footer-group}tr.show-tiny{display:table-row}td.show-tiny,th.show-tiny{display:table-cell}}@media screen and (min-width:1261px){html{font-size:1.08em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:961px) and (max-width:1260px){html{font-size:1.05em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:641px) and (max-width:960px){html{font-size:1em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:321px) and (max-width:640px){html{font-size:.98em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (max-width:320px){html{font-size:.97em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}.ink-label{padding:0 .35em;white-space:nowrap}.ink-navigation{overflow:visible}.ink-navigation ul{list-style-type:none;padding:0;margin:0}.ink-navigation ul li{margin:0}.ink-navigation .breadcrumbs li{line-height:2.7em;display:inline}.ink-navigation .breadcrumbs li a{display:inline;padding:0}.ink-navigation .breadcrumbs li a:hover{background:0 0}.ink-navigation .breadcrumbs li.active a{cursor:default;text-decoration:none}.ink-navigation .breadcrumbs li:first-child a{padding-left:1.2em}.ink-navigation .breadcrumbs li:after{content:'/';display:inline;margin:0 .7em}.ink-navigation .breadcrumbs li:last-child:after{content:'';display:none}.ink-dropdown,.ink-navigation{position:relative}.ink-dropdown ul.dropdown,.ink-dropdown ul.dropdown-menu,.ink-navigation ul.dropdown,.ink-navigation ul.dropdown-menu{position:absolute;top:110%;background:#fff;z-index:30;border:1px solid #d9d9d9;height:auto;width:auto;min-width:10em;max-width:12em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:rgba(100,100,100,.3) 0 0 1px 0;-moz-box-shadow:rgba(100,100,100,.3) 0 0 1px 0;box-shadow:rgba(100,100,100,.3) 0 0 1px 0;margin-left:0;padding:.35em 0;font-size:.85em}.ink-dropdown ul.dropdown li,.ink-dropdown ul.dropdown-menu li,.ink-navigation ul.dropdown li,.ink-navigation ul.dropdown-menu li{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-border-radius:none;-moz-border-radius:none;-ms-border-radius:none;-o-border-radius:none;border-radius:none;width:auto;height:auto;min-height:auto;display:list-item;float:none;margin:0;text-align:left;text-transform:none;padding:0;position:relative;list-style-type:none}.ink-dropdown ul.dropdown li.separator-above,.ink-dropdown ul.dropdown-menu li.separator-above,.ink-navigation ul.dropdown li.separator-above,.ink-navigation ul.dropdown-menu li.separator-above{padding-top:.35em;margin-top:.35em;border-top:1px solid #d9d9d9}.ink-dropdown ul.dropdown li.separator-below,.ink-dropdown ul.dropdown-menu li.separator-below,.ink-navigation ul.dropdown li.separator-below,.ink-navigation ul.dropdown-menu li.separator-below{padding-bottom:.35em;margin-bottom:.35em;border-bottom:1px solid #d9d9d9}.ink-dropdown ul.dropdown li.heading,.ink-dropdown ul.dropdown-menu li.heading,.ink-navigation ul.dropdown li.heading,.ink-navigation ul.dropdown-menu li.heading{font-weight:700;margin-bottom:.35em;padding:.5em .8em;color:#333}.ink-dropdown ul.dropdown li a,.ink-dropdown ul.dropdown-menu li a,.ink-navigation ul.dropdown li a,.ink-navigation ul.dropdown-menu li a{color:#444;padding:.5em .8em;display:block;clear:both}.ink-dropdown ul.dropdown li a:hover,.ink-dropdown ul.dropdown-menu li a:hover,.ink-navigation ul.dropdown li a:hover,.ink-navigation ul.dropdown-menu li a:hover{background:#f2f2f2;text-decoration:none}.ink-dropdown ul.dropdown li.active a,.ink-dropdown ul.dropdown-menu li.active a,.ink-navigation ul.dropdown li.active a,.ink-navigation ul.dropdown-menu li.active a{background:#999;color:#fff}.ink-dropdown ul.dropdown li.disabled a,.ink-dropdown ul.dropdown-menu li.disabled a,.ink-navigation ul.dropdown li.disabled a,.ink-navigation ul.dropdown-menu li.disabled a{color:#b3b3b3}.ink-dropdown ul.dropdown li.disabled a:hover,.ink-dropdown ul.dropdown-menu li.disabled a:hover,.ink-navigation ul.dropdown li.disabled a:hover,.ink-navigation ul.dropdown-menu li.disabled a:hover{background:0 0;cursor:default}.ink-dropdown ul.dropdown li.submenu,.ink-dropdown ul.dropdown-menu li.submenu,.ink-navigation ul.dropdown li.submenu,.ink-navigation ul.dropdown-menu li.submenu{overflow:visible}.ink-dropdown ul.dropdown li.submenu>a,.ink-dropdown ul.dropdown-menu li.submenu>a,.ink-navigation ul.dropdown li.submenu>a,.ink-navigation ul.dropdown-menu li.submenu>a{white-space:nowrap}.ink-dropdown ul.dropdown li.submenu>a:after,.ink-dropdown ul.dropdown-menu li.submenu>a:after,.ink-navigation ul.dropdown li.submenu>a:after,.ink-navigation ul.dropdown-menu li.submenu>a:after{content:"\f0da";width:auto;margin-left:.8em;font-family:FontAwesome;color:#b3b3b3}.ink-dropdown ul.dropdown li.submenu:hover>a,.ink-dropdown ul.dropdown-menu li.submenu:hover>a,.ink-navigation ul.dropdown li.submenu:hover>a,.ink-navigation ul.dropdown-menu li.submenu:hover>a{background:#f2f2f2;text-decoration:none}.ink-dropdown ul.dropdown li.submenu:hover:hover>ul.dropdown,.ink-dropdown ul.dropdown li.submenu:hover:hover>ul.dropdown-menu,.ink-dropdown ul.dropdown-menu li.submenu:hover:hover>ul.dropdown,.ink-dropdown ul.dropdown-menu li.submenu:hover:hover>ul.dropdown-menu,.ink-navigation ul.dropdown li.submenu:hover:hover>ul.dropdown,.ink-navigation ul.dropdown li.submenu:hover:hover>ul.dropdown-menu,.ink-navigation ul.dropdown-menu li.submenu:hover:hover>ul.dropdown,.ink-navigation ul.dropdown-menu li.submenu:hover:hover>ul.dropdown-menu{display:block}.ink-dropdown ul.dropdown li.submenu>ul.dropdown,.ink-dropdown ul.dropdown li.submenu>ul.dropdown-menu,.ink-dropdown ul.dropdown-menu li.submenu>ul.dropdown,.ink-dropdown ul.dropdown-menu li.submenu>ul.dropdown-menu,.ink-navigation ul.dropdown li.submenu>ul.dropdown,.ink-navigation ul.dropdown li.submenu>ul.dropdown-menu,.ink-navigation ul.dropdown-menu li.submenu>ul.dropdown,.ink-navigation ul.dropdown-menu li.submenu>ul.dropdown-menu{font-size:inherit;position:absolute;top:-.36em;left:100%;display:none}.ink-navigation ul.pagination{overflow:hidden;*zoom:1}.ink-navigation ul.pagination li{line-height:1.7;float:left}.ink-navigation ul.pagination li a{padding:.5em 1em;display:block;float:left}.ink-navigation ul.pagination.dotted li a{display:block;height:1em;width:1em;margin-right:.6em;padding:0;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%;text-indent:99999px}.ink-navigation ul.pagination.dotted li a:first-child,.ink-navigation ul.pagination.dotted li a:last-child{-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%}.ink-navigation ul.pagination.chevron li{display:none}.ink-navigation ul.pagination.chevron li.next,.ink-navigation ul.pagination.chevron li.previous{display:block}.ink-navigation ul.pagination.chevron li.next a,.ink-navigation ul.pagination.chevron li.previous a{display:block;position:absolute;top:35%;padding:0 .5em;margin:0;font-family:FontAwesome;font-size:4em}.ink-navigation ul.pagination.chevron li.next a span,.ink-navigation ul.pagination.chevron li.previous a span{text-indent:-99999px;display:inline-block}.ink-navigation ul.pagination.chevron li.previous a{left:0}.ink-navigation ul.pagination.chevron li.previous a:after{content:"\f137"}.ink-navigation ul.pagination.chevron li.next a{right:0}.ink-navigation ul.pagination.chevron li.next a:after{content:"\f138"}.ink-navigation .pills{overflow:hidden;*zoom:1}.ink-navigation .pills li{overflow:hidden;display:block;float:left;margin:0 .5em .5em 0;line-height:1.7}.ink-navigation .pills li a{display:block;padding:.5em 1em}.ink-navigation .pills li a:hover{text-decoration:none}.ink-navigation .pills li.active a,.ink-navigation .pills li.disabled a{cursor:default}.ink-navigation ul{*height:100%}.ink-navigation ul.menu{*zoom:1}.ink-navigation ul.menu:after{content:"";display:table;clear:both}.ink-navigation ul.menu li{*height:100%}.ink-navigation ul.menu li:hover>ul.submenu{display:block}.ink-navigation ul.menu li ul.submenu{display:none;position:absolute;z-index:10}.ink-navigation ul.menu li ul.submenu li a{padding:.5em 1em;display:block;float:none}.ink-navigation ul.menu.horizontal.scrollable{font-size:0;white-space:nowrap;overflow-x:scroll;overflow-y:hidden;-webkit-overflow-scrolling:touch;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}.ink-navigation ul.menu.horizontal.scrollable li{display:inline-block;float:none}.ink-navigation ul.menu.horizontal.scrollable li a{border-right:rgba(10,10,10,.3) 1px solid;font-size:initial}.ink-navigation ul.menu.horizontal.scrollable li:last-child a{border-right:0}.ink-navigation ul.menu.horizontal li{float:left;position:relative}.ink-navigation ul.menu.horizontal li a{padding:.5em 1em;display:block;line-height:1.7}.ink-navigation ul.menu.horizontal li .control{margin-top:.3em}.ink-navigation ul.menu.horizontal li ul.submenu{min-width:100%;z-index:50;top:auto;left:auto}.ink-navigation ul.menu.horizontal li ul.submenu li{float:none}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout{position:absolute;top:0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout.left{right:100%}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout.right{left:100%}.ink-navigation ul.menu.vertical li{line-height:1.7;position:relative}.ink-navigation ul.menu.vertical li a{padding:.5em 1em;display:block}.ink-navigation ul.menu.vertical li ul.submenu{position:relative;top:auto;left:auto}.ink-navigation ul.menu.vertical li ul.submenu.flyout{position:absolute;min-width:8em;top:0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.vertical li ul.submenu.flyout.left{right:100%}.ink-navigation ul.menu.vertical li ul.submenu.flyout.right{left:100%}@media print{*{background:transparent!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.ink-navigation{display:none}.ink-table{border-collapse:collapse}.ink-label{border:1px solid #000}}table.ink-table{width:100%;border-collapse:collapse;border-spacing:0}table.ink-table tr th{padding:5px 10px;line-height:1.3}table.ink-table tr th[data-sortable=true]:hover{cursor:pointer;text-decoration:underline}table.ink-table tr th[data-sortable=true]:hover i{text-decoration:none}table.ink-table tr th[data-sortable=true] i{padding-left:.5em}table.ink-table tr td{padding:5px 10px;line-height:1.3}table.ink-table.hover tbody tr:hover{cursor:pointer}table.ink-table.bordered{border-collapse:separate}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{color:#555;font-family:Roboto,Arial,Helvetica,sans-serif;line-height:1.45}.fw-100,.fw-light{font-weight:100}.fw-300,.fw-thin{font-weight:300}.fw-400,.fw-regular{font-weight:400}.fw-500,.fw-medium{font-weight:500}.fw-700,.fw-bold{font-weight:700}.fw-900,.fw-black{font-weight:900}.condensed-300,.condensed-thin{font-weight:200;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.condensed-400,.condensed-regular{font-weight:400;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.condensed-700,.condensed-bold{font-weight:700;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.slab-100,.slab-light{font-weight:100;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-300,.slab-thin{font-weight:300;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-400,.slab-regular{font-weight:400;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-700,.slab-bold{font-weight:700;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.sans{font-family:Roboto,Arial,Helvetica,sans-serif}.serif{font-family:Times,"Times New Roman",serif}.monospace{font-family:Monaco,"Andale Mono","Courier New",monospace}.condensed{font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.slab{font-family:Roboto_slab,Arial,Helvetica,sans-serif}.italic{font-style:italic}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalizer{text-transform:capitalize}.fa{font-size:14px}a{color:#6998c9;text-decoration:none;cursor:pointer}a:hover{color:#007ed5;text-decoration:underline}h1{font-size:2.2em;margin-top:0;margin-bottom:.57539em}h2{font-size:1.75em;margin-top:0;margin-bottom:.72334em}h3{font-size:1.5em;margin-top:0;margin-bottom:.8439em}h4{font-size:1.25em;margin-top:0;margin-bottom:1.01268em}h5,h6{font-size:1.1em;margin-top:0;margin-bottom:1.15077em}p,table{font-size:1em;margin-top:0;margin-bottom:1.26585em}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,h6:first-child,p:first-child{margin-top:0}h1,h2,h3,h4,h5,h6{color:#404040;font-weight:700;line-height:1.16}small{color:#888}input,textarea{color:#666}h1 small,h2 small,h3 small,h4 small{color:#bbb;font-size:.6em;font-weight:100;line-height:1}mark{background:#dae5f2}address{color:#777;font-size:1em;line-height:1.4}address p{margin-top:0}address h6{color:#555}abbr:hover{cursor:help}blockquote{border-left:4px solid #ddd;padding-left:25px;margin:1em 0;font-weight:200;font-size:1.1em}blockquote small{font-size:.9em}blockquote small::after,blockquote small::before{content:' — '}.note{font-size:.9em;color:#777}.note strong{color:#555}.small{font-size:.75em}.medium{font-size:.85em}.large{font-size:1.2em}.extralarge{font-size:1.45em!important}hr{border:0;border-top:1px solid #ddd;margin:1em 0}.lead{font-size:1.1em;font-weight:700}ol,ul{line-height:1.4;padding:0 0 0 1.45em;margin:1em 0}ol li,ul li{margin:.5em 0}ul.unstyled{list-style:none;padding-left:0}ul.unstyled ul{list-style:disc outside}ul.unstyled ul.unstyled{list-style:none;padding-left:0}ul.inline{list-style:none}ul.inline li{display:inline-block;padding:0 .5em}ul.inline li:first-child{padding:0 .5em 0 0}dl{margin:1em 0}dl dt{font-weight:700;margin:.5em 0}dl dd{margin:.5em 0 .5em 25px}dl.inline dt{float:left;clear:left;text-align:right;width:180px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;margin:0}dl.inline dd{margin:.5em 0 .5em 200px}figure.ink-image{position:relative;border:1px solid #555}figure.ink-image>img{width:100%}figure.ink-image>figcaption{padding:1em;background:#fff;line-height:1.3}figure.ink-image>figcaption.over-bottom,figure.ink-image>figcaption.over-top{position:absolute;width:100%;left:0;border:0}figure.ink-image>figcaption.over-bottom.dark,figure.ink-image>figcaption.over-top.dark{color:#fff;background:rgba(0,0,0,.6)}figure.ink-image>figcaption.over-top{top:0;background:rgba(255,255,255,.7)}figure.ink-image>figcaption.over-bottom{bottom:0;background:rgba(255,255,255,.7)}figure.ink-image>figcaption.dark{color:#fff;background:#222}img{border:0;width:auto;max-width:100%;vertical-align:top}.ink-alert.basic,.ink-alert.block{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-alert.basic{background:rgba(255,156,0,.25);color:#b87814;border:1px solid #b87814}.ink-alert.basic .ink-dismiss{color:#b87814}.ink-alert.basic.success{background:rgba(74,155,23,.25);color:#38621d;border:1px solid #38621d}.ink-alert.basic.success .ink-dismiss{color:#38621d}.ink-alert.basic.error{background:rgba(201,17,17,.25);color:#891e1e;border:1px solid #891e1e}.ink-alert.basic.error .ink-dismiss{color:#891e1e}.ink-alert.basic.info{background:rgba(15,117,218,.25);color:#1e5b98;border:1px solid #1e5b98}.ink-alert.basic.info .ink-dismiss{color:#1e5b98}.ink-alert.block{border:1px solid #b87814;background:#fff}.ink-alert.block>h4{background:rgba(255,156,0,.3);color:#b87814}.ink-alert.block .ink-dismiss{color:#b87814}.ink-alert.block.success{border:1px solid #38621d;background:#fff}.ink-alert.block.success>h4{background:rgba(74,155,23,.3);color:#38621d}.ink-alert.block.success .ink-dismiss{color:#38621d}.ink-alert.block.error{border:1px solid #891e1e;background:#fff}.ink-alert.block.error>h4{background:rgba(201,17,17,.3);color:#891e1e}.ink-alert.block.error .ink-dismiss{color:#891e1e}.ink-alert.block.info{border:1px solid #1e5b98;background:#fff}.ink-alert.block.info>h4{background:rgba(15,117,218,.3);color:#1e5b98}.ink-alert.block.info .ink-dismiss{color:#1e5b98}.ink-alert .ink-dismiss{font-family:Arial,sans-serif;font-weight:700;text-shadow:#fff 0 1px 0;filter:alpha(Opacity=25);opacity:.25}.ink-alert .ink-dismiss:hover{filter:alpha(Opacity=60);opacity:.6}.ink-badge{-webkit-border-radius:8em;-moz-border-radius:8em;-ms-border-radius:8em;-o-border-radius:8em;border-radius:8em;color:#fff}.ink-badge.white{background:#fff;color:#555}.ink-badge.black{background:#000}.ink-badge.orange{background:#ff9c00}.ink-badge.red{background:#c91111}.ink-badge.green{background:#4a9b17}.ink-badge.blue{background:#0f75da}.ink-badge.yellow{background:#ffd500;color:#555}.ink-badge.grey{background:gray}.ink-badge+.ink-badge{margin-left:.2em}.ink-button{background:#d9d9d9;color:#000;border:1px solid #bfbfbf;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;font-weight:300}.ink-button:active,.ink-button:hover{text-decoration:none;color:#000;background:#ccc;border:1px solid #b3b3b3;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px;box-shadow:rgba(0,0,0,.2) 0 1px 1px}.ink-button:focus{outline:0;background:#ccc;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset}.ink-button[disabled]{background:#e6e6e6;border:1px solid #e6e6e6;color:#999}.ink-button[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.blue{color:#fff;background:#0f75da;border:1px solid #0c63b9}.ink-button.blue:active,.ink-button.blue:hover{background:#0d68c2;border:1px solid #0a56a1;color:#fff;text-decoration:none}.ink-button.blue:focus{background:#0d68c2}.ink-button.blue[disabled]{background:rgba(15,117,218,.6);border:1px solid rgba(15,117,218,0);color:#0c5baa}.ink-button.blue[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.green{color:#fff;background:#4a9b17;border:1px solid #3e8313}.ink-button.green:active,.ink-button.green:hover{background:#3f8514;border:1px solid #336d10;color:#fff;text-decoration:none}.ink-button.green:focus{background:#3f8514}.ink-button.green[disabled]{background:rgba(74,155,23,.6);border:1px solid rgba(74,155,23,0);color:#356f10}.ink-button.green[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.orange{color:#fff;background:#ff9c00;border:1px solid #d88400}.ink-button.orange:active,.ink-button.orange:hover{background:#e68c00;border:1px solid #bf7400;color:#fff;text-decoration:none}.ink-button.orange:focus{background:#e68c00}.ink-button.orange[disabled]{background:rgba(255,156,0,.6);border:1px solid rgba(255,156,0,0);color:#cc7d00}.ink-button.orange[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.red{color:#fff;background:#c91111;border:1px solid #aa0e0e}.ink-button.red:active,.ink-button.red:hover{background:#b10f0f;border:1px solid #920c0c;color:#fff;text-decoration:none}.ink-button.red:focus{background:#b10f0f}.ink-button.red[disabled]{background:rgba(201,17,17,.6);border:1px solid rgba(201,17,17,0);color:#9a0d0d}.ink-button.red[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.black{color:#fff;background:#1a1a1a;border:1px solid #161616}.ink-button.black:active,.ink-button.black:hover{background:#0d0d0d;border:1px solid #090909;color:#fff;text-decoration:none}.ink-button.black:focus{background:#0d0d0d}.ink-button.black[disabled]{background:rgba(26,26,26,.6);border:1px solid rgba(26,26,26,0);color:#000}.ink-button.black[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.white{color:#555;background:#fff;border:1px solid #d8d8d8}.ink-button.white:active,.ink-button.white:hover{background:#f2f2f2;border:1px solid #cbcbcb;color:#555;text-decoration:none}.ink-button.white:focus{background:#f2f2f2}.ink-button.white[disabled]{background:rgba(255,255,255,.6);border:1px solid rgba(255,255,255,0);color:#e6e6e6}.ink-button.white[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.button-group>.ink-button[disabled]{background:#e6e6e6;border:1px solid rgba(217,217,217,.6)}.button-group>.ink-button[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.button-group>.ink-button.blue:first-child{border-left:#0c63b9}.button-group>.ink-button.blue[disabled]{background:rgba(15,117,218,.6);border:1px solid rgba(15,117,218,.3)}.button-group>.ink-button.green:first-child{border-left:#3e8313}.button-group>.ink-button.green[disabled]{background:rgba(74,155,23,.6);border:1px solid rgba(74,155,23,.3)}.button-group>.ink-button.orange:first-child{border-left:#d88400}.button-group>.ink-button.orange[disabled]{background:rgba(255,156,0,.6);border:1px solid rgba(255,156,0,.3)}.button-group>.ink-button.red:first-child{border-left:#aa0e0e}.button-group>.ink-button.red[disabled]{background:rgba(201,17,17,.6);border:1px solid rgba(201,17,17,.3)}.button-group>.ink-button.black:first-child{border-left:#161616}.button-group>.ink-button.black[disabled]{background:rgba(26,26,26,.6);border:1px solid rgba(26,26,26,.3)}.button-group>.ink-button.white:first-child{border-left:#d8d8d8}.button-group>.ink-button.white[disabled]{background:rgba(255,255,255,.6);border:1px solid rgba(255,255,255,.3)}.ink-label{color:#fff;font-weight:300;font-size:.938em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-label.white{background:#fff;color:#555}.ink-label.black{background:#000}.ink-label.orange{background:#ff9c00}.ink-label.red{background:#c91111}.ink-label.green{background:#4a9b17}.ink-label.blue{background:#0f75da}.ink-label.yellow{background:#ffd500;color:#555}.ink-label.grey{background:gray}.ink-label+.ink-label{margin-left:.2em}.ink-navigation ul.breadcrumbs{font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.breadcrumbs li.active a{background:0 0;color:#999}.ink-navigation ul.breadcrumbs li.active a:hover{cursor:default;text-decoration:none}.ink-navigation ul.breadcrumbs li a:hover{background:0 0;text-decoration:underline}.ink-navigation ul.breadcrumbs.white{background:#fff}.ink-navigation ul.breadcrumbs.white li a,.ink-navigation ul.breadcrumbs.white li:after{color:#555}.ink-navigation ul.breadcrumbs.white li.active a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.breadcrumbs.grey{background:#d9d9d9}.ink-navigation ul.breadcrumbs.grey li a,.ink-navigation ul.breadcrumbs.grey li:after{color:#555}.ink-navigation ul.breadcrumbs.grey li.active a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.breadcrumbs.black{background:#1a1a1a}.ink-navigation ul.breadcrumbs.black li a,.ink-navigation ul.breadcrumbs.black li:after{color:#fff}.ink-navigation ul.breadcrumbs.black li.active a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.breadcrumbs.blue{background:#1b75ce}.ink-navigation ul.breadcrumbs.blue li a,.ink-navigation ul.breadcrumbs.blue li:after{color:#fff}.ink-navigation ul.breadcrumbs.blue li.active a{color:#08427b;text-shadow:#1884ef 0 1px 0}.ink-navigation ul.breadcrumbs.orange{background:#f2990d}.ink-navigation ul.breadcrumbs.orange li a,.ink-navigation ul.breadcrumbs.orange li:after{color:#fff}.ink-navigation ul.breadcrumbs.orange li.active a{color:#995e00;text-shadow:#ffa81f 0 1px 0}.ink-navigation ul.breadcrumbs.green{background:#4c9220}.ink-navigation ul.breadcrumbs.green li a,.ink-navigation ul.breadcrumbs.green li:after{color:#fff}.ink-navigation ul.breadcrumbs.green li.active a{color:#20420a;text-shadow:#57b61b 0 1px 0}.ink-navigation ul.breadcrumbs.red{background:#be1c1c}.ink-navigation ul.breadcrumbs.red li a,.ink-navigation ul.breadcrumbs.red li:after{color:#fff}.ink-navigation ul.breadcrumbs.red li.active a{color:#6b0909;text-shadow:#e51313 0 1px 0}.ink-dropdown.green ul.dropdown-menu li.active a{background:#4a9b17;color:#fff}.ink-dropdown.orange ul.dropdown-menu li.active a{background:#ff9c00;color:#fff}.ink-dropdown.red ul.dropdown-menu li.active a{background:#c91111;color:#fff}.ink-dropdown.black ul.dropdown-menu li.active a{background:#1a1a1a;color:#fff}.ink-dropdown.blue ul.dropdown-menu li.active a{background:#0f75da;color:#fff}.ink-navigation ul.menu{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu>li{font-weight:300}.ink-navigation ul.menu>li.active a{text-decoration:underline}.ink-navigation ul.menu>li.heading{font-weight:500}.ink-navigation ul.menu>li.disabled a{color:#b3b3b3;text-shadow:#fff 0 1px 0}.ink-navigation ul.menu>li.disabled a:hover{cursor:default;background:0 0;text-decoration:none}.ink-navigation ul.menu>li ul.submenu li{font-size:.875em}.ink-navigation ul.menu>li ul.submenu li a{border-bottom:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.vertical li a{border-bottom:1px solid rgba(0,0,0,.15)}.ink-navigation ul.menu.vertical li:first-child,.ink-navigation ul.menu.vertical li:first-child>a{-webkit-border-radius:2px 2px 0 0;-moz-border-radius:2px 2px 0 0;-ms-border-radius:2px 2px 0 0;-o-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0}.ink-navigation ul.menu.vertical li:last-child{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child>a{border-bottom:0;-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child .submenu{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child .submenu.flyout{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.vertical li:last-child .submenu li:last-child,.ink-navigation ul.menu.vertical li:last-child .submenu li:last-child a{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.horizontal>li:first-child,.ink-navigation ul.menu.horizontal>li:first-child a{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-navigation ul.menu.horizontal>li:last-child,.ink-navigation ul.menu.horizontal>li:last-child a{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-navigation ul.menu.horizontal>li ul.submenu{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#fff}.ink-navigation ul.menu.horizontal>li ul.submenu li:last-child{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.horizontal>li ul.submenu li:last-child a{border-bottom:0}.ink-navigation ul.menu.white{background:#fff}.ink-navigation ul.menu.white li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.white li ul.submenu li a{color:#555}.ink-navigation ul.menu.white li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.white li.disabled a:hover{background:0 0}.ink-navigation ul.menu.white li.active{background:#e6e6e6}.ink-navigation ul.menu.white li.disabled a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.menu.white li a{color:#555;text-decoration:none}.ink-navigation ul.menu.white li a:hover{background:#f2f2f2}.ink-navigation ul.menu.grey{background:#d9d9d9}.ink-navigation ul.menu.grey li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.grey li ul.submenu li a{color:#555}.ink-navigation ul.menu.grey li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.grey li.disabled a:hover{background:0 0}.ink-navigation ul.menu.grey li.active{background:#bfbfbf}.ink-navigation ul.menu.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.menu.grey li a{color:#555;text-decoration:none}.ink-navigation ul.menu.grey li a:hover{background:#ccc}.ink-navigation ul.menu.black{background:#1a1a1a}.ink-navigation ul.menu.black li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.black li ul.submenu li a{color:#555}.ink-navigation ul.menu.black li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.black li.disabled a:hover{background:0 0}.ink-navigation ul.menu.black li.active{background:#333}.ink-navigation ul.menu.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.menu.black li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.black li a:hover{background:#404040}.ink-navigation ul.menu.blue{background:#1b75ce}.ink-navigation ul.menu.blue li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.blue li ul.submenu li a{color:#555}.ink-navigation ul.menu.blue li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.blue li.disabled a:hover{background:0 0}.ink-navigation ul.menu.blue li.active{background:#0c5baa}.ink-navigation ul.menu.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.menu.blue li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.blue li a:hover{background:#0d68c2}.ink-navigation ul.menu.green{background:#4c9220}.ink-navigation ul.menu.green li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.green li ul.submenu li a{color:#555}.ink-navigation ul.menu.green li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.green li.disabled a:hover{background:0 0}.ink-navigation ul.menu.green li.active{background:#356f10}.ink-navigation ul.menu.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.menu.green li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.green li a:hover{background:#3f8514}.ink-navigation ul.menu.orange{background:#f2990d}.ink-navigation ul.menu.orange li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.orange li ul.submenu li a{color:#555}.ink-navigation ul.menu.orange li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.orange li.disabled a:hover{background:0 0}.ink-navigation ul.menu.orange li.active{background:#cc7d00}.ink-navigation ul.menu.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.menu.orange li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.orange li a:hover{background:#e68c00}.ink-navigation ul.menu.red{background:#be1c1c}.ink-navigation ul.menu.red li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.red li ul.submenu li a{color:#555}.ink-navigation ul.menu.red li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.red li.disabled a:hover{background:0 0}.ink-navigation ul.menu.red li.active{background:#9a0d0d}.ink-navigation ul.menu.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.menu.red li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.red li a:hover{background:#b10f0f}.ink-navigation ul.pagination{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.pagination li{font-weight:300}.ink-navigation ul.pagination li.active a{text-decoration:underline}.ink-navigation ul.pagination li.disabled a{color:#b3b3b3;text-shadow:#fff 0 1px 0}.ink-navigation ul.pagination li.disabled a:hover{cursor:default;background:0 0;text-decoration:none}.ink-navigation ul.pagination li:first-child,.ink-navigation ul.pagination li:first-child a{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-navigation ul.pagination li:last-child,.ink-navigation ul.pagination li:last-child a{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-navigation ul.pagination.white li{background:#fff}.ink-navigation ul.pagination.white li.active a{background:#e6e6e6}.ink-navigation ul.pagination.white li.disabled a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.pagination.white li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.white li a{color:#555;text-decoration:none}.ink-navigation ul.pagination.white li a:hover{background:#f2f2f2}.ink-navigation ul.pagination.grey li{background:#d9d9d9}.ink-navigation ul.pagination.grey li.active a{background:#bfbfbf}.ink-navigation ul.pagination.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.pagination.grey li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.grey li a{color:#555;text-decoration:none}.ink-navigation ul.pagination.grey li a:hover{background:#ccc}.ink-navigation ul.pagination.black li{background:#1a1a1a}.ink-navigation ul.pagination.black li.active a{background:#333}.ink-navigation ul.pagination.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.pagination.black li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.black li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.black li a:hover{background:#292929}.ink-navigation ul.pagination.orange li{background:#f2990d}.ink-navigation ul.pagination.orange li.active a{background:#cc7d00}.ink-navigation ul.pagination.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.pagination.orange li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.orange li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.orange li a:hover{background:#e68c00}.ink-navigation ul.pagination.blue li{background:#1b75ce}.ink-navigation ul.pagination.blue li.active a{background:#0c5baa}.ink-navigation ul.pagination.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.pagination.blue li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.blue li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.blue li a:hover{background:#0d68c2}.ink-navigation ul.pagination.green li{background:#4c9220}.ink-navigation ul.pagination.green li.active a{background:#356f10}.ink-navigation ul.pagination.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.pagination.green li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.green li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.green li a:hover{background:#3f8514}.ink-navigation ul.pagination.red li{background:#be1c1c}.ink-navigation ul.pagination.red li.active a{background:#9a0d0d}.ink-navigation ul.pagination.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.pagination.red li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.red li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.red li a:hover{background:#b10f0f}.ink-navigation ul.pagination.dotted li{background:0 0}.ink-navigation ul.pagination.dotted li a{background:#999;filter:alpha(Opacity=50);opacity:.5}.ink-navigation ul.pagination.dotted li.active a,.ink-navigation ul.pagination.dotted li:hover a{filter:alpha(Opacity=100);opacity:1}.ink-navigation ul.pagination.dotted.black li a{background:#1a1a1a}.ink-navigation ul.pagination.dotted.white li a{background:#fff}.ink-navigation ul.pagination.dotted.blue li a{background:#1b75ce}.ink-navigation ul.pagination.dotted.green li a{background:#4c9220}.ink-navigation ul.pagination.dotted.orange li a{background:#f2990d}.ink-navigation ul.pagination.dotted.red li a{background:#be1c1c}.ink-navigation ul.pagination.chevron li.next a,.ink-navigation ul.pagination.chevron li.previous a{color:#fff;filter:alpha(Opacity=60);opacity:.6}.ink-navigation ul.pagination.chevron li.next a.active,.ink-navigation ul.pagination.chevron li.next a:focus,.ink-navigation ul.pagination.chevron li.next a:hover,.ink-navigation ul.pagination.chevron li.previous a.active,.ink-navigation ul.pagination.chevron li.previous a:focus,.ink-navigation ul.pagination.chevron li.previous a:hover{filter:alpha(Opacity=70);opacity:.7;text-decoration:none;background:0 0}.ink-navigation ul.pagination.chevron li.disabled a{color:#fff;filter:alpha(Opacity=40);opacity:.4;text-shadow:none}.ink-navigation ul.pagination.chevron li.disabled a:focus,.ink-navigation ul.pagination.chevron li.disabled a:hover{color:#fff;filter:alpha(Opacity=40);opacity:.4}.ink-navigation ul.pagination.chevron.black li.disabled a,.ink-navigation ul.pagination.chevron.black li.next a,.ink-navigation ul.pagination.chevron.black li.previous a{color:#1a1a1a}.ink-navigation ul.pagination.chevron.grey li.disabled a,.ink-navigation ul.pagination.chevron.grey li.next a,.ink-navigation ul.pagination.chevron.grey li.previous a{color:#d9d9d9}.ink-navigation ul.pagination.chevron.blue li.disabled a,.ink-navigation ul.pagination.chevron.blue li.next a,.ink-navigation ul.pagination.chevron.blue li.previous a{color:#1b75ce}.ink-navigation ul.pagination.chevron.green li.disabled a,.ink-navigation ul.pagination.chevron.green li.next a,.ink-navigation ul.pagination.chevron.green li.previous a{color:#4c9220}.ink-navigation ul.pagination.chevron.orange li.disabled a,.ink-navigation ul.pagination.chevron.orange li.next a,.ink-navigation ul.pagination.chevron.orange li.previous a{color:#f2990d}.ink-navigation ul.pagination.chevron.red li.disabled a,.ink-navigation ul.pagination.chevron.red li.next a,.ink-navigation ul.pagination.chevron.red li.previous a{color:#be1c1c}.ink-navigation ul.pills li{background:#fff;font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.pills li a{color:#555;background:0 0}.ink-navigation ul.pills li a:hover,.ink-navigation ul.pills li.active a{background:#e6e6e6}.ink-navigation ul.pills li.disabled a{color:#999;text-shadow:#fff 0 1px 0}.ink-navigation ul.pills li.disabled a:hover{background:0 0}.ink-navigation ul.pills.grey li{background:#d9d9d9}.ink-navigation ul.pills.grey li.active a{background:#bfbfbf}.ink-navigation ul.pills.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.pills.grey li.disabled a:hover{background:0 0}.ink-navigation ul.pills.grey li a{color:#555}.ink-navigation ul.pills.grey li a:hover{background:#ccc}.ink-navigation ul.pills.black li{background:#1a1a1a}.ink-navigation ul.pills.black li.active a{background:#333}.ink-navigation ul.pills.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.pills.black li.disabled a:hover{background:0 0}.ink-navigation ul.pills.black li a{color:#fff}.ink-navigation ul.pills.black li a:hover{background:#292929}.ink-navigation ul.pills.blue li{background:#1b75ce}.ink-navigation ul.pills.blue li.active a{background:#0c5baa}.ink-navigation ul.pills.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.pills.blue li.disabled a:hover{background:0 0}.ink-navigation ul.pills.blue li a{color:#fff}.ink-navigation ul.pills.blue li a:hover{background:#0d68c2}.ink-navigation ul.pills.green li{background:#4c9220}.ink-navigation ul.pills.green li.active a{background:#356f10}.ink-navigation ul.pills.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.pills.green li.disabled a:hover{background:0 0}.ink-navigation ul.pills.green li a{color:#fff}.ink-navigation ul.pills.green li a:hover{background:#3f8514}.ink-navigation ul.pills.orange li{background:#f2990d}.ink-navigation ul.pills.orange li.active a{background:#cc7d00}.ink-navigation ul.pills.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.pills.orange li.disabled a:hover{background:0 0}.ink-navigation ul.pills.orange li a{color:#fff}.ink-navigation ul.pills.orange li a:hover{background:#e68c00}.ink-navigation ul.pills.red li{background:#be1c1c}.ink-navigation ul.pills.red li.active a{background:#9a0d0d}.ink-navigation ul.pills.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.pills.red li.disabled a:hover{background:0 0}.ink-navigation ul.pills.red li a{color:#fff}.ink-navigation ul.pills.red li a:hover{background:#b10f0f}table.ink-table{background:#fff}table.ink-table tr td,table.ink-table tr th{border-bottom:#bbb 1px solid;background:0 0}table.ink-table tr:last-child td{border-bottom:0}table.ink-table tfoot tr td,table.ink-table tfoot tr th{border-top:#bbb 1px solid}table.ink-table.alternating tbody tr:nth-child(odd){background-color:#f5f5f5}table.ink-table.hover tbody tr:hover{background:#fefbd6;color:#555}table.ink-table.bordered{border:#bbb 1px solid;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}table.ink-table.bordered tr th{border-left:#bbb 1px solid}table.ink-table.bordered tr th:first-child{border-left:0}table.ink-table.bordered tr:last-child td{border-bottom:0}table.ink-table.bordered tr td{border-left:#bbb 1px solid}table.ink-table.bordered tr td:first-child{border-left:0}table.ink-table tbody>tr.red td{background:#c91111;color:#fff}table.ink-table tbody>tr.green td{background:#4a9b17;color:#fff}table.ink-table tbody>tr.blue td{background:#0f75da;color:#fff}table.ink-table tbody>tr.orange td{background:#ff9c00;color:#fff}table.ink-table tbody>tr.black td{background:#000;color:#ccc}table.ink-table tbody>tr.yellow td{background:#ffd500;color:#000}.animated.slow{animation-duration:1s}.animated.medium{animation-duration:.5s}.animated.fast{animation-duration:.2s}.ink-carousel{width:100%;position:relative;overflow:hidden;display:block}.ink-carousel .stage{width:100%;left:0;height:auto!important;margin-top:0;margin-bottom:0;padding-left:0;list-style-type:none;white-space:nowrap;position:relative;-webkit-transition:left .5s ease;-moz-transition:left .5s ease;-o-transition:left .5s ease;transition:left .5s ease}.ink-carousel .stage .slide{position:relative;display:inline-block;vertical-align:top;white-space:normal;margin:0;float:none;zoom:1;*display:inline}.ink-carousel .ink-navigation{position:static}.ink-datepicker-wrapper{position:relative}.ink-datepicker-calendar{margin-top:0;position:absolute}.ink-datepicker-calendar.right{left:100%;top:0}.ink-datepicker-calendar.left{right:100%;top:0}.ink-datepicker-calendar.bottom{top:100%;left:0}.ink-datepicker-calendar.top{bottom:100%;left:0}.ink-datepicker-calendar,.ink-datepicker-wrapper{display:inline;display:inline-block}.ink-calendar{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;text-align:center;padding:.3em;min-width:17.4em;font-size:13px;-webkit-box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;-moz-box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;background:#fff;z-index:10}.ink-calendar a{text-decoration:none}.ink-calendar li{list-style:none inside}html.ink-modal-is-open .ink-calendar{z-index:101}.ink-calendar-top-options{padding:5px;font-size:.813em;cursor:pointer}.ink-calendar-top-options .clean{float:left}.ink-calendar-top-options .close{float:right}.ink-calendar-top{line-height:2em;background:#e6e6e6;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-calendar-top div{float:left}.ink-calendar-top .ink-calendar-next,.ink-calendar-top .ink-calendar-prev{width:10%}.ink-calendar-top .ink-calendar-next a,.ink-calendar-top .ink-calendar-prev a{display:block}.ink-calendar-top .ink-calendar-month_desc{width:80%}.ink-calendar-month,.ink-calendar-month-selector,.ink-calendar-year-selector{margin-top:.5em;padding-left:0}.ink-calendar-month li a,.ink-calendar-month-selector li a,.ink-calendar-year-selector li a{margin:0;line-height:2em;vertical-align:middle;display:block;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;color:#444}.ink-calendar-month li a:hover,.ink-calendar-month-selector li a:hover,.ink-calendar-year-selector li a:hover{background:#e6e6e6}.ink-calendar-month li a.ink-calendar-on,.ink-calendar-month li a.ink-calendar-on:hover,.ink-calendar-month-selector li a.ink-calendar-on,.ink-calendar-month-selector li a.ink-calendar-on:hover,.ink-calendar-year-selector li a.ink-calendar-on,.ink-calendar-year-selector li a.ink-calendar-on:hover{background:#0069d6;color:#fff}.ink-calendar-month li a.ink-calendar-off,.ink-calendar-month li a.ink-calendar-off:hover,.ink-calendar-month-selector li a.ink-calendar-off,.ink-calendar-month-selector li a.ink-calendar-off:hover,.ink-calendar-year-selector li a.ink-calendar-off,.ink-calendar-year-selector li a.ink-calendar-off:hover{background:#fff;color:#aaa;cursor:default}.ink-calendar-month ul,.ink-calendar-month-selector ul,.ink-calendar-year-selector ul{clear:both;padding-left:0}.ink-calendar-month ul li,.ink-calendar-month-selector ul li,.ink-calendar-year-selector ul li{width:2.4em;float:left;text-align:center;padding:0;margin:0}.ink-calendar-month-selector ul li,.ink-calendar-year-selector ul li{width:25%}.ink-calendar-month-selector,.ink-calendar-year-selector{display:none}.action_inactive,.ink-calendar-off{color:#ddd!important}.ink-calendar-month .ink-calendar-header{border-bottom:1px solid rgba(0,0,0,.1);padding-bottom:.5em;margin-bottom:.5em;color:#aaa}.ink-calendar-middle,.ink-calendar-month .ink-calendar-header,.ink-calendar-month .ink-calendar-middle ul,.ink-calendar-top,.ink-calendar-top-options{*zoom:1}.ink-calendar-middle:after,.ink-calendar-month .ink-calendar-header:after,.ink-calendar-month .ink-calendar-middle ul:after,.ink-calendar-top-options:after,.ink-calendar-top:after{content:"";display:table;clear:both}body.ink-drawer{max-width:100%}body.ink-drawer .content-drawer,body.ink-drawer .left-drawer,body.ink-drawer .right-drawer{-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;transition-property:transform;-webkit-transition-duration:300ms;-moz-transition-duration:300ms;-o-transition-duration:300ms;transition-duration:300ms;-webkit-transition-timing-function:cubic-bezier(0.86,0,.07,1);-moz-transition-timing-function:cubic-bezier(0.86,0,.07,1);-o-transition-timing-function:cubic-bezier(0.86,0,.07,1);transition-timing-function:cubic-bezier(0.86,0,.07,1)}body.ink-drawer .left-drawer{left:-220px}body.ink-drawer .right-drawer{right:-220px}body.ink-drawer .content-drawer{width:100%}body.ink-drawer .left-drawer,body.ink-drawer .right-drawer{position:absolute;top:0;z-index:0;display:none;overflow-x:hidden;overflow-y:auto;width:220px;height:100%;-webkit-overflow-scrolling:touch}body.ink-drawer .left-drawer.show,body.ink-drawer .right-drawer.show{display:block;position:fixed}body.ink-drawer.push{overflow:hidden;width:100%;height:100%}body.ink-drawer.push .content-drawer{overflow:hidden}body.ink-drawer.push.left .content-drawer,body.ink-drawer.push.left .left-drawer{-webkit-transform:translate(220px,0);-moz-transform:translate(220px,0);-ms-transform:translate(220px,0);-o-transform:translate(220px,0);transform:translate(220px,0)}body.ink-drawer.push.right .content-drawer,body.ink-drawer.push.right .right-drawer{-webkit-transform:translate(-220px,0);-moz-transform:translate(-220px,0);-ms-transform:translate(-220px,0);-o-transform:translate(-220px,0);transform:translate(-220px,0)}body.ink-drawer.over{overflow:hidden;-webkit-user-drag:none}body.ink-drawer.over.left .left-drawer{-webkit-transform:translate(220px,0);-moz-transform:translate(220px,0);-ms-transform:translate(220px,0);-o-transform:translate(220px,0);transform:translate(220px,0)}body.ink-drawer.over.right .right-drawer{-webkit-transform:translate(-220px,0);-moz-transform:translate(-220px,0);-ms-transform:translate(-220px,0);-o-transform:translate(-220px,0);transform:translate(-220px,0)}.ink-shade{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgOAMAAM8AzbfAeUUAAAAASUVORK5CYII=);background:rgba(0,0,0,.8);width:100%;height:100%;top:0;right:0;bottom:0;left:0;margin-top:0;position:fixed;z-index:100;display:none;filter:alpha(Opacity=0);opacity:0}.ink-shade.fade{-webkit-transition:opacity 300ms;-moz-transition:opacity 300ms;-o-transition:opacity 300ms;transition:opacity 300ms}.ink-shade.visible{filter:alpha(Opacity=100);opacity:1}.ink-modal{top:50%;left:50%;width:90%;height:90%;background:#fff;z-index:100;position:absolute;overflow:hidden;filter:alpha(Opacity=100);opacity:1;-webkit-box-shadow:rgba(0,0,0,.8) 0 0 15px 0;-moz-box-shadow:rgba(0,0,0,.8) 0 0 15px 0;box-shadow:rgba(0,0,0,.8) 0 0 15px 0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;*zoom:1}.ink-modal:after{content:"";display:table;clear:both}.ink-modal>.modal-body{padding:1em;overflow-y:auto;overflow-x:hidden;height:auto}.ink-modal>.modal-body .ink-grid{padding-left:0;padding-right:0;width:100%;min-width:100%}.ink-modal>.modal-header,.ink-modal>header{border-bottom:1px #e6e6e6 solid;overflow:hidden;-webkit-box-shadow:rgba(175,175,175,.2) 0 1px 2px 0;-moz-box-shadow:rgba(175,175,175,.2) 0 1px 2px 0;box-shadow:rgba(175,175,175,.2) 0 1px 2px 0}.ink-modal>.modal-header>.modal-close,.ink-modal>header>.modal-close{padding-top:2px;text-align:center;color:#fff;width:26px;height:26px;line-height:1.2em;border:0;background:#bfbfbf;font-size:0;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%;text-shadow:rgba(0,0,0,.6) 0 -1px 0;filter:alpha(Opacity=60);opacity:.6;float:right}.ink-modal>.modal-header>.modal-close:after,.ink-modal>header>.modal-close:after{content:"\f00d";font-family:FontAwesome;font-size:medium;line-height:22px}.ink-modal>.modal-header>.modal-close:hover,.ink-modal>header>.modal-close:hover{filter:alpha(Opacity=100);opacity:1}.ink-modal>.modal-footer,.ink-modal>footer{background:#e6e6e6;margin-bottom:0;zoom:1;-webkit-box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0;-moz-box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0;box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0}.ink-modal>.modal-footer,.ink-modal>.modal-header,.ink-modal>footer,.ink-modal>header{padding:.8em 1em .65em}.ink-modal>.modal-footer:after,.ink-modal>.modal-footer:before,.ink-modal>.modal-header:after,.ink-modal>.modal-header:before,.ink-modal>footer:after,.ink-modal>footer:before,.ink-modal>header:after,.ink-modal>header:before{content:".";display:block;height:0;clear:both;visibility:hidden}.ink-modal-open{overflow:hidden}.ink-progress-bar{margin-bottom:1em;overflow:hidden;background:#f2f2f2;position:relative;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset;-moz-box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset;box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset}.ink-progress-bar .caption{position:absolute;top:0;left:0;width:100%;height:100%;line-height:1.7;text-align:center;color:#000;font-size:.813em;z-index:10}.ink-progress-bar .bar{height:1.3em;text-shadow:rgba(0,0,0,.25),0,1px,0;-webkit-box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;-moz-box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;-webkit-transition-property:width;-moz-transition-property:width;-o-transition-property:width;transition-property:width;-webkit-transition-duration:.6s;-moz-transition-duration:.6s;-o-transition-duration:.6s;transition-duration:.6s;-webkit-transition-timing-function:ease;-moz-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.ink-progress-bar .bar.grey{background:#ccc;color:#555}.ink-progress-bar .bar.green{background:#4a9b17;color:#fff}.ink-progress-bar .bar.blue{background:#0f75da;color:#fff}.ink-progress-bar .bar.red{background:#c91111;color:#fff}.ink-progress-bar .bar.orange{background:#ff9c00;color:#555}.ink-progress-bar .bar.black{background:#000;color:#fff}.dragging,.ink-sortable-list li{cursor:move;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;-ms-user-select:none;user-select:none;-ms-user-drag:none;-moz-user-drag:none;-khtml-user-drag:none;-webkit-user-drag:none;-o-user-drag:none;user-drag:none}.drag,.ink-sortable-list li.placeholder{-webkit-box-shadow:0,0,10px,0,rgba(0,0,0,.3);-moz-box-shadow:0,0,10px,0,rgba(0,0,0,.3);box-shadow:0,0,10px,0,rgba(0,0,0,.3)}.ink-sortable-list li{margin:0;border-bottom:1px solid #ccc;line-height:40px}.ink-sortable-list li.placeholder,.ink-sortable-list li:hover{background:#ccc;background:rgba(204,204,204,.2)}.ink-sortable-list li .ink-label{margin:0 .8em}.ink-sticky-stuck{position:fixed}.ink-tabs .tabs-nav{list-style:none;padding:0;*zoom:1}.ink-tabs .tabs-nav li{line-height:1.7;position:relative;margin:0}.ink-tabs .tabs-nav li a{padding:.5em 1em;display:block;border:1px solid transparent}.ink-tabs .tabs-nav li a:hover{background:#f0f0f0}.ink-tabs .tabs-nav li.active a{color:#555;cursor:default;text-decoration:none;background:#fff;border:1px solid #ccc}.ink-tabs .tabs-nav:after{content:"";display:table;clear:both}.ink-tabs .tabs-content{margin-top:1.5em;overflow:auto}.ink-tabs.top>.tabs-nav{border-bottom:1px solid #ccc}.ink-tabs.top>.tabs-nav li{float:left}.ink-tabs.top>.tabs-nav li a{margin-right:.4em;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;-ms-border-radius:4px 4px 0 0;-o-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.ink-tabs.top>.tabs-nav li.active{margin:0 0 -2px 0}.ink-tabs.top>.tabs-nav li.active a{border-bottom-color:transparent}.ink-tabs.bottom>.tabs-nav{border-top:1px solid #ccc}.ink-tabs.bottom>.tabs-nav li{float:left}.ink-tabs.bottom>.tabs-nav li a{margin-right:.4em;-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;-ms-border-radius:0 0 4px 4px;-o-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.ink-tabs.bottom>.tabs-nav li.active{margin:-2px 0 0 0}.ink-tabs.bottom>.tabs-nav li.active a{border-top-color:transparent}.ink-tabs.left>.tabs-nav{border-right:1px solid #ccc;float:left;margin-right:2em}.ink-tabs.left>.tabs-nav li{float:none;text-align:right}.ink-tabs.left>.tabs-nav li a{margin-bottom:.4em;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;-ms-border-radius:4px 0 0 4px;-o-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.ink-tabs.left>.tabs-nav li.active{margin:0 -2px 0 0}.ink-tabs.left>.tabs-nav li.active a{border-right-color:transparent}.ink-tabs.right>.tabs-nav{border-left:1px solid #ccc;float:right;margin-left:2em}.ink-tabs.right>.tabs-nav li{float:none}.ink-tabs.right>.tabs-nav li a{margin-bottom:.4em;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;-ms-border-radius:0 4px 4px 0;-o-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.ink-tabs.right>.tabs-nav li.active{margin:0 0 0 -2px}.ink-tabs.right>.tabs-nav li.active a{border-left-color:transparent}.ink-tagfield input[type=text].new-tag-input{background-color:#fff;border:1px solid #ccc;line-height:1em;margin:0;padding:5px;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-tagfield input[type=text].new-tag-input:focus{-webkit-box-shadow:0,0,0,3px,#eaeaea;-moz-box-shadow:0,0,0,3px,#eaeaea;box-shadow:0,0,0,3px,#eaeaea;border:1px solid #c3c3c3}.ink-tagfield span.ink-tag{background-color:#1b1b1b;color:#eaeaea;text-shadow:none;font-size:.9em;font-weight:400;border:1px solid #000;padding:4px 6px}.ink-tagfield span.ink-tag i.icon-remove{color:#ccc;font-size:.9em;font-weight:400;margin-left:4px}.ink-tagfield span.ink-tag i.icon-remove:hover{cursor:pointer;color:red}.ink-tooltip{display:inline-block;position:relative}.ink-tooltip>.content{background:#f0f0f0;padding:.5em .6em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;font-size:.8em;color:#8c8c8c}.ink-tooltip>.arrow{position:absolute}.ink-tooltip>.arrow.down,.ink-tooltip>.arrow.left,.ink-tooltip>.arrow.right,.ink-tooltip>.arrow.up{width:0;height:0}.ink-tooltip>.arrow.up{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #f0f0f0;top:-6px;left:50%;margin-left:-3px}.ink-tooltip>.arrow.down{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #f0f0f0;bottom:-5.45455px;left:50%;margin-left:-3px}.ink-tooltip>.arrow.right{border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:6px solid #f0f0f0;top:50%;right:-5.45455px;margin-top:-6px}.ink-tooltip>.arrow.left{border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:6px solid #f0f0f0;top:50%;left:-5.45455px;margin-top:-6px}.ink-tooltip.blue>.content{background:#0f75da;color:#fff}.ink-tooltip.blue>.arrow.up{border-bottom-color:#0f75da}.ink-tooltip.blue>.arrow.down{border-top-color:#0f75da}.ink-tooltip.blue>.arrow.left{border-right-color:#0f75da}.ink-tooltip.blue>.arrow.right{border-left-color:#0f75da}.ink-tooltip.red>.content{background:#c91111;color:#fff}.ink-tooltip.red>.arrow.up{border-bottom-color:#c91111}.ink-tooltip.red>.arrow.down{border-top-color:#c91111}.ink-tooltip.red>.arrow.left{border-right-color:#c91111}.ink-tooltip.red>.arrow.right{border-left-color:#c91111}.ink-tooltip.orange>.content{background:#ff9c00;color:#fff}.ink-tooltip.orange>.arrow.up{border-bottom-color:#ff9c00}.ink-tooltip.orange>.arrow.down{border-top-color:#ff9c00}.ink-tooltip.orange>.arrow.left{border-right-color:#ff9c00}.ink-tooltip.orange>.arrow.right{border-left-color:#ff9c00}.ink-tooltip.green>.content{background:#4a9b17;color:#fff}.ink-tooltip.green>.arrow.up{border-bottom-color:#4a9b17}.ink-tooltip.green>.arrow.down{border-top-color:#4a9b17}.ink-tooltip.green>.arrow.left{border-right-color:#4a9b17}.ink-tooltip.green>.arrow.right{border-left-color:#4a9b17}.ink-tooltip.black>.content{background:#000;color:#fff}.ink-tooltip.black>.arrow.up{border-bottom-color:#000}.ink-tooltip.black>.arrow.down{border-top-color:#000}.ink-tooltip.black>.arrow.left{border-right-color:#000}.ink-tooltip.black>.arrow.right{border-left-color:#000}.ink-tooltip.grey>.content{background:#ccc;color:#333}.ink-tooltip.grey>.arrow.up{border-bottom-color:#ccc}.ink-tooltip.grey>.arrow.down{border-top-color:#ccc}.ink-tooltip.grey>.arrow.left{border-right-color:#ccc}.ink-tooltip.grey>.arrow.right{border-left-color:#ccc}.ink-tree-view li{list-style-type:none}.ink-tree-view [data-open]>:before{margin-left:-1.3em;margin-right:.4em;text-decoration:none} \ No newline at end of file diff --git a/src/sass/modules/_forms.scss b/src/sass/modules/_forms.scss index 464639b52..d8968f856 100755 --- a/src/sass/modules/_forms.scss +++ b/src/sass/modules/_forms.scss @@ -134,7 +134,7 @@ &.prepend-button, &.prepend-symbol { - span { + > span { width: 100%; position: relative; @@ -156,7 +156,7 @@ display: table; - span { + > span { display: table-cell; @@ -178,7 +178,7 @@ display: table; - span { + > span { display: table-cell; @@ -198,7 +198,7 @@ &.append-symbol { - span { + > span { display: block; @@ -220,7 +220,7 @@ &.prepend-symbol { - span { + > span { display: block; From 05aff0b048fae76491831dff745404f5ff29b1b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rio=20Gon=C3=A7alves?= Date: Tue, 10 Feb 2015 10:52:00 +0000 Subject: [PATCH 2/5] fix: fix followup issue for #424 --- src/js/Ink/UI/DatePicker/1/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/Ink/UI/DatePicker/1/lib.js b/src/js/Ink/UI/DatePicker/1/lib.js index 30fbdd200..e49c9d882 100644 --- a/src/js/Ink/UI/DatePicker/1/lib.js +++ b/src/js/Ink/UI/DatePicker/1/lib.js @@ -402,7 +402,7 @@ Ink.createModule('Ink.UI.DatePicker', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1', var parentIsControl = Selector.matchesSelector( this._element.parentNode, - '.ink-form .control-group .control'); + '.ink-form .control-group .control, .ink-form .control-group .control > *'); if (parentIsControl) { this._wrapper = this._element.parentNode; From 5d86ae1a5c796392e229966e23af6e7b4f0f969f Mon Sep 17 00:00:00 2001 From: Pedro Correia Date: Wed, 11 Feb 2015 12:29:28 +0000 Subject: [PATCH 3/5] Fixes bug in flex grid. Gutters calculation was wrong in breakpoint dependent gutter classes. --- src/sass/mixins/_flex-grid.scss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sass/mixins/_flex-grid.scss b/src/sass/mixins/_flex-grid.scss index 71febee5d..d75c65b33 100644 --- a/src/sass/mixins/_flex-grid.scss +++ b/src/sass/mixins/_flex-grid.scss @@ -242,8 +242,8 @@ & > [class*=#{$class-name}-], & > [class*=all-], & > .all-auto { - padding-left: ( $gutter-width / 4); - margin-bottom: ( $gutter-width / 4); + padding-left: ( $gutter-width ); + margin-bottom: ( $gutter-width ); } } @@ -603,7 +603,7 @@ } } } -} +} @mixin generate-visibility-classes ($breakpoint) { From f22e76b1d123900e06c243f1e77b701a1db20e62 Mon Sep 17 00:00:00 2001 From: Pedro Correia Date: Wed, 11 Feb 2015 12:38:59 +0000 Subject: [PATCH 4/5] Updates dist files. --- dist/css/font-awesome.css | 968 +++++++++++++++++----------------- dist/css/font-awesome.min.css | 2 +- dist/css/ink-flex.css | 432 +++++++-------- dist/css/ink-flex.min.css | 2 +- dist/css/ink-ie.min.css | 2 +- dist/css/ink-legacy.css | 2 +- dist/css/ink-legacy.min.css | 2 +- dist/css/ink.css | 412 +++++++-------- dist/css/ink.min.css | 2 +- dist/css/quick-start.css | 20 +- dist/js/ink-all.js | 2 +- dist/js/ink-all.min.js | 2 +- dist/js/ink-all.min.js.map | 2 +- dist/js/ink-ui.js | 2 +- dist/js/ink-ui.min.js | 2 +- dist/js/ink-ui.min.js.map | 2 +- dist/js/ink.datepicker.js | 2 +- 17 files changed, 905 insertions(+), 953 deletions(-) diff --git a/dist/css/font-awesome.css b/dist/css/font-awesome.css index 3e24d1c79..24b376cfb 100644 --- a/dist/css/font-awesome.css +++ b/dist/css/font-awesome.css @@ -1,3 +1,4 @@ +@charset "UTF-8"; /*! * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) @@ -11,7 +12,6 @@ font-weight: normal; font-style: normal; } - .fa { display: inline-block; font: normal normal normal 14px/1 FontAwesome; @@ -71,7 +71,7 @@ .fa-border { padding: .2em .25em .15em; - border: solid 0.08em #eeeeee; + border: solid 0.08em #eee; border-radius: .1em; } @@ -100,25 +100,21 @@ -webkit-transform: rotate(0deg); transform: rotate(0deg); } - 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } - @keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } - 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } - .fa-rotate-90 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); -webkit-transform: rotate(90deg); @@ -187,1743 +183,1743 @@ } .fa-inverse { - color: white; + color: #fff; } /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .fa-glass:before { - content: "\f000"; + content: ""; } .fa-music:before { - content: "\f001"; + content: ""; } .fa-search:before { - content: "\f002"; + content: ""; } .fa-envelope-o:before { - content: "\f003"; + content: ""; } .fa-heart:before { - content: "\f004"; + content: ""; } .fa-star:before { - content: "\f005"; + content: ""; } .fa-star-o:before { - content: "\f006"; + content: ""; } .fa-user:before { - content: "\f007"; + content: ""; } .fa-film:before { - content: "\f008"; + content: ""; } .fa-th-large:before { - content: "\f009"; + content: ""; } .fa-th:before { - content: "\f00a"; + content: ""; } .fa-th-list:before { - content: "\f00b"; + content: ""; } .fa-check:before { - content: "\f00c"; + content: ""; } .fa-remove:before, .fa-close:before, .fa-times:before { - content: "\f00d"; + content: ""; } .fa-search-plus:before { - content: "\f00e"; + content: ""; } .fa-search-minus:before { - content: "\f010"; + content: ""; } .fa-power-off:before { - content: "\f011"; + content: ""; } .fa-signal:before { - content: "\f012"; + content: ""; } .fa-gear:before, .fa-cog:before { - content: "\f013"; + content: ""; } .fa-trash-o:before { - content: "\f014"; + content: ""; } .fa-home:before { - content: "\f015"; + content: ""; } .fa-file-o:before { - content: "\f016"; + content: ""; } .fa-clock-o:before { - content: "\f017"; + content: ""; } .fa-road:before { - content: "\f018"; + content: ""; } .fa-download:before { - content: "\f019"; + content: ""; } .fa-arrow-circle-o-down:before { - content: "\f01a"; + content: ""; } .fa-arrow-circle-o-up:before { - content: "\f01b"; + content: ""; } .fa-inbox:before { - content: "\f01c"; + content: ""; } .fa-play-circle-o:before { - content: "\f01d"; + content: ""; } .fa-rotate-right:before, .fa-repeat:before { - content: "\f01e"; + content: ""; } .fa-refresh:before { - content: "\f021"; + content: ""; } .fa-list-alt:before { - content: "\f022"; + content: ""; } .fa-lock:before { - content: "\f023"; + content: ""; } .fa-flag:before { - content: "\f024"; + content: ""; } .fa-headphones:before { - content: "\f025"; + content: ""; } .fa-volume-off:before { - content: "\f026"; + content: ""; } .fa-volume-down:before { - content: "\f027"; + content: ""; } .fa-volume-up:before { - content: "\f028"; + content: ""; } .fa-qrcode:before { - content: "\f029"; + content: ""; } .fa-barcode:before { - content: "\f02a"; + content: ""; } .fa-tag:before { - content: "\f02b"; + content: ""; } .fa-tags:before { - content: "\f02c"; + content: ""; } .fa-book:before { - content: "\f02d"; + content: ""; } .fa-bookmark:before { - content: "\f02e"; + content: ""; } .fa-print:before { - content: "\f02f"; + content: ""; } .fa-camera:before { - content: "\f030"; + content: ""; } .fa-font:before { - content: "\f031"; + content: ""; } .fa-bold:before { - content: "\f032"; + content: ""; } .fa-italic:before { - content: "\f033"; + content: ""; } .fa-text-height:before { - content: "\f034"; + content: ""; } .fa-text-width:before { - content: "\f035"; + content: ""; } .fa-align-left:before { - content: "\f036"; + content: ""; } .fa-align-center:before { - content: "\f037"; + content: ""; } .fa-align-right:before { - content: "\f038"; + content: ""; } .fa-align-justify:before { - content: "\f039"; + content: ""; } .fa-list:before { - content: "\f03a"; + content: ""; } .fa-dedent:before, .fa-outdent:before { - content: "\f03b"; + content: ""; } .fa-indent:before { - content: "\f03c"; + content: ""; } .fa-video-camera:before { - content: "\f03d"; + content: ""; } .fa-photo:before, .fa-image:before, .fa-picture-o:before { - content: "\f03e"; + content: ""; } .fa-pencil:before { - content: "\f040"; + content: ""; } .fa-map-marker:before { - content: "\f041"; + content: ""; } .fa-adjust:before { - content: "\f042"; + content: ""; } .fa-tint:before { - content: "\f043"; + content: ""; } .fa-edit:before, .fa-pencil-square-o:before { - content: "\f044"; + content: ""; } .fa-share-square-o:before { - content: "\f045"; + content: ""; } .fa-check-square-o:before { - content: "\f046"; + content: ""; } .fa-arrows:before { - content: "\f047"; + content: ""; } .fa-step-backward:before { - content: "\f048"; + content: ""; } .fa-fast-backward:before { - content: "\f049"; + content: ""; } .fa-backward:before { - content: "\f04a"; + content: ""; } .fa-play:before { - content: "\f04b"; + content: ""; } .fa-pause:before { - content: "\f04c"; + content: ""; } .fa-stop:before { - content: "\f04d"; + content: ""; } .fa-forward:before { - content: "\f04e"; + content: ""; } .fa-fast-forward:before { - content: "\f050"; + content: ""; } .fa-step-forward:before { - content: "\f051"; + content: ""; } .fa-eject:before { - content: "\f052"; + content: ""; } .fa-chevron-left:before { - content: "\f053"; + content: ""; } .fa-chevron-right:before { - content: "\f054"; + content: ""; } .fa-plus-circle:before { - content: "\f055"; + content: ""; } .fa-minus-circle:before { - content: "\f056"; + content: ""; } .fa-times-circle:before { - content: "\f057"; + content: ""; } .fa-check-circle:before { - content: "\f058"; + content: ""; } .fa-question-circle:before { - content: "\f059"; + content: ""; } .fa-info-circle:before { - content: "\f05a"; + content: ""; } .fa-crosshairs:before { - content: "\f05b"; + content: ""; } .fa-times-circle-o:before { - content: "\f05c"; + content: ""; } .fa-check-circle-o:before { - content: "\f05d"; + content: ""; } .fa-ban:before { - content: "\f05e"; + content: ""; } .fa-arrow-left:before { - content: "\f060"; + content: ""; } .fa-arrow-right:before { - content: "\f061"; + content: ""; } .fa-arrow-up:before { - content: "\f062"; + content: ""; } .fa-arrow-down:before { - content: "\f063"; + content: ""; } .fa-mail-forward:before, .fa-share:before { - content: "\f064"; + content: ""; } .fa-expand:before { - content: "\f065"; + content: ""; } .fa-compress:before { - content: "\f066"; + content: ""; } .fa-plus:before { - content: "\f067"; + content: ""; } .fa-minus:before { - content: "\f068"; + content: ""; } .fa-asterisk:before { - content: "\f069"; + content: ""; } .fa-exclamation-circle:before { - content: "\f06a"; + content: ""; } .fa-gift:before { - content: "\f06b"; + content: ""; } .fa-leaf:before { - content: "\f06c"; + content: ""; } .fa-fire:before { - content: "\f06d"; + content: ""; } .fa-eye:before { - content: "\f06e"; + content: ""; } .fa-eye-slash:before { - content: "\f070"; + content: ""; } .fa-warning:before, .fa-exclamation-triangle:before { - content: "\f071"; + content: ""; } .fa-plane:before { - content: "\f072"; + content: ""; } .fa-calendar:before { - content: "\f073"; + content: ""; } .fa-random:before { - content: "\f074"; + content: ""; } .fa-comment:before { - content: "\f075"; + content: ""; } .fa-magnet:before { - content: "\f076"; + content: ""; } .fa-chevron-up:before { - content: "\f077"; + content: ""; } .fa-chevron-down:before { - content: "\f078"; + content: ""; } .fa-retweet:before { - content: "\f079"; + content: ""; } .fa-shopping-cart:before { - content: "\f07a"; + content: ""; } .fa-folder:before { - content: "\f07b"; + content: ""; } .fa-folder-open:before { - content: "\f07c"; + content: ""; } .fa-arrows-v:before { - content: "\f07d"; + content: ""; } .fa-arrows-h:before { - content: "\f07e"; + content: ""; } .fa-bar-chart-o:before, .fa-bar-chart:before { - content: "\f080"; + content: ""; } .fa-twitter-square:before { - content: "\f081"; + content: ""; } .fa-facebook-square:before { - content: "\f082"; + content: ""; } .fa-camera-retro:before { - content: "\f083"; + content: ""; } .fa-key:before { - content: "\f084"; + content: ""; } .fa-gears:before, .fa-cogs:before { - content: "\f085"; + content: ""; } .fa-comments:before { - content: "\f086"; + content: ""; } .fa-thumbs-o-up:before { - content: "\f087"; + content: ""; } .fa-thumbs-o-down:before { - content: "\f088"; + content: ""; } .fa-star-half:before { - content: "\f089"; + content: ""; } .fa-heart-o:before { - content: "\f08a"; + content: ""; } .fa-sign-out:before { - content: "\f08b"; + content: ""; } .fa-linkedin-square:before { - content: "\f08c"; + content: ""; } .fa-thumb-tack:before { - content: "\f08d"; + content: ""; } .fa-external-link:before { - content: "\f08e"; + content: ""; } .fa-sign-in:before { - content: "\f090"; + content: ""; } .fa-trophy:before { - content: "\f091"; + content: ""; } .fa-github-square:before { - content: "\f092"; + content: ""; } .fa-upload:before { - content: "\f093"; + content: ""; } .fa-lemon-o:before { - content: "\f094"; + content: ""; } .fa-phone:before { - content: "\f095"; + content: ""; } .fa-square-o:before { - content: "\f096"; + content: ""; } .fa-bookmark-o:before { - content: "\f097"; + content: ""; } .fa-phone-square:before { - content: "\f098"; + content: ""; } .fa-twitter:before { - content: "\f099"; + content: ""; } .fa-facebook:before { - content: "\f09a"; + content: ""; } .fa-github:before { - content: "\f09b"; + content: ""; } .fa-unlock:before { - content: "\f09c"; + content: ""; } .fa-credit-card:before { - content: "\f09d"; + content: ""; } .fa-rss:before { - content: "\f09e"; + content: ""; } .fa-hdd-o:before { - content: "\f0a0"; + content: ""; } .fa-bullhorn:before { - content: "\f0a1"; + content: ""; } .fa-bell:before { - content: "\f0f3"; + content: ""; } .fa-certificate:before { - content: "\f0a3"; + content: ""; } .fa-hand-o-right:before { - content: "\f0a4"; + content: ""; } .fa-hand-o-left:before { - content: "\f0a5"; + content: ""; } .fa-hand-o-up:before { - content: "\f0a6"; + content: ""; } .fa-hand-o-down:before { - content: "\f0a7"; + content: ""; } .fa-arrow-circle-left:before { - content: "\f0a8"; + content: ""; } .fa-arrow-circle-right:before { - content: "\f0a9"; + content: ""; } .fa-arrow-circle-up:before { - content: "\f0aa"; + content: ""; } .fa-arrow-circle-down:before { - content: "\f0ab"; + content: ""; } .fa-globe:before { - content: "\f0ac"; + content: ""; } .fa-wrench:before { - content: "\f0ad"; + content: ""; } .fa-tasks:before { - content: "\f0ae"; + content: ""; } .fa-filter:before { - content: "\f0b0"; + content: ""; } .fa-briefcase:before { - content: "\f0b1"; + content: ""; } .fa-arrows-alt:before { - content: "\f0b2"; + content: ""; } .fa-group:before, .fa-users:before { - content: "\f0c0"; + content: ""; } .fa-chain:before, .fa-link:before { - content: "\f0c1"; + content: ""; } .fa-cloud:before { - content: "\f0c2"; + content: ""; } .fa-flask:before { - content: "\f0c3"; + content: ""; } .fa-cut:before, .fa-scissors:before { - content: "\f0c4"; + content: ""; } .fa-copy:before, .fa-files-o:before { - content: "\f0c5"; + content: ""; } .fa-paperclip:before { - content: "\f0c6"; + content: ""; } .fa-save:before, .fa-floppy-o:before { - content: "\f0c7"; + content: ""; } .fa-square:before { - content: "\f0c8"; + content: ""; } .fa-navicon:before, .fa-reorder:before, .fa-bars:before { - content: "\f0c9"; + content: ""; } .fa-list-ul:before { - content: "\f0ca"; + content: ""; } .fa-list-ol:before { - content: "\f0cb"; + content: ""; } .fa-strikethrough:before { - content: "\f0cc"; + content: ""; } .fa-underline:before { - content: "\f0cd"; + content: ""; } .fa-table:before { - content: "\f0ce"; + content: ""; } .fa-magic:before { - content: "\f0d0"; + content: ""; } .fa-truck:before { - content: "\f0d1"; + content: ""; } .fa-pinterest:before { - content: "\f0d2"; + content: ""; } .fa-pinterest-square:before { - content: "\f0d3"; + content: ""; } .fa-google-plus-square:before { - content: "\f0d4"; + content: ""; } .fa-google-plus:before { - content: "\f0d5"; + content: ""; } .fa-money:before { - content: "\f0d6"; + content: ""; } .fa-caret-down:before { - content: "\f0d7"; + content: ""; } .fa-caret-up:before { - content: "\f0d8"; + content: ""; } .fa-caret-left:before { - content: "\f0d9"; + content: ""; } .fa-caret-right:before { - content: "\f0da"; + content: ""; } .fa-columns:before { - content: "\f0db"; + content: ""; } .fa-unsorted:before, .fa-sort:before { - content: "\f0dc"; + content: ""; } .fa-sort-down:before, .fa-sort-desc:before { - content: "\f0dd"; + content: ""; } .fa-sort-up:before, .fa-sort-asc:before { - content: "\f0de"; + content: ""; } .fa-envelope:before { - content: "\f0e0"; + content: ""; } .fa-linkedin:before { - content: "\f0e1"; + content: ""; } .fa-rotate-left:before, .fa-undo:before { - content: "\f0e2"; + content: ""; } .fa-legal:before, .fa-gavel:before { - content: "\f0e3"; + content: ""; } .fa-dashboard:before, .fa-tachometer:before { - content: "\f0e4"; + content: ""; } .fa-comment-o:before { - content: "\f0e5"; + content: ""; } .fa-comments-o:before { - content: "\f0e6"; + content: ""; } .fa-flash:before, .fa-bolt:before { - content: "\f0e7"; + content: ""; } .fa-sitemap:before { - content: "\f0e8"; + content: ""; } .fa-umbrella:before { - content: "\f0e9"; + content: ""; } .fa-paste:before, .fa-clipboard:before { - content: "\f0ea"; + content: ""; } .fa-lightbulb-o:before { - content: "\f0eb"; + content: ""; } .fa-exchange:before { - content: "\f0ec"; + content: ""; } .fa-cloud-download:before { - content: "\f0ed"; + content: ""; } .fa-cloud-upload:before { - content: "\f0ee"; + content: ""; } .fa-user-md:before { - content: "\f0f0"; + content: ""; } .fa-stethoscope:before { - content: "\f0f1"; + content: ""; } .fa-suitcase:before { - content: "\f0f2"; + content: ""; } .fa-bell-o:before { - content: "\f0a2"; + content: ""; } .fa-coffee:before { - content: "\f0f4"; + content: ""; } .fa-cutlery:before { - content: "\f0f5"; + content: ""; } .fa-file-text-o:before { - content: "\f0f6"; + content: ""; } .fa-building-o:before { - content: "\f0f7"; + content: ""; } .fa-hospital-o:before { - content: "\f0f8"; + content: ""; } .fa-ambulance:before { - content: "\f0f9"; + content: ""; } .fa-medkit:before { - content: "\f0fa"; + content: ""; } .fa-fighter-jet:before { - content: "\f0fb"; + content: ""; } .fa-beer:before { - content: "\f0fc"; + content: ""; } .fa-h-square:before { - content: "\f0fd"; + content: ""; } .fa-plus-square:before { - content: "\f0fe"; + content: ""; } .fa-angle-double-left:before { - content: "\f100"; + content: ""; } .fa-angle-double-right:before { - content: "\f101"; + content: ""; } .fa-angle-double-up:before { - content: "\f102"; + content: ""; } .fa-angle-double-down:before { - content: "\f103"; + content: ""; } .fa-angle-left:before { - content: "\f104"; + content: ""; } .fa-angle-right:before { - content: "\f105"; + content: ""; } .fa-angle-up:before { - content: "\f106"; + content: ""; } .fa-angle-down:before { - content: "\f107"; + content: ""; } .fa-desktop:before { - content: "\f108"; + content: ""; } .fa-laptop:before { - content: "\f109"; + content: ""; } .fa-tablet:before { - content: "\f10a"; + content: ""; } .fa-mobile-phone:before, .fa-mobile:before { - content: "\f10b"; + content: ""; } .fa-circle-o:before { - content: "\f10c"; + content: ""; } .fa-quote-left:before { - content: "\f10d"; + content: ""; } .fa-quote-right:before { - content: "\f10e"; + content: ""; } .fa-spinner:before { - content: "\f110"; + content: ""; } .fa-circle:before { - content: "\f111"; + content: ""; } .fa-mail-reply:before, .fa-reply:before { - content: "\f112"; + content: ""; } .fa-github-alt:before { - content: "\f113"; + content: ""; } .fa-folder-o:before { - content: "\f114"; + content: ""; } .fa-folder-open-o:before { - content: "\f115"; + content: ""; } .fa-smile-o:before { - content: "\f118"; + content: ""; } .fa-frown-o:before { - content: "\f119"; + content: ""; } .fa-meh-o:before { - content: "\f11a"; + content: ""; } .fa-gamepad:before { - content: "\f11b"; + content: ""; } .fa-keyboard-o:before { - content: "\f11c"; + content: ""; } .fa-flag-o:before { - content: "\f11d"; + content: ""; } .fa-flag-checkered:before { - content: "\f11e"; + content: ""; } .fa-terminal:before { - content: "\f120"; + content: ""; } .fa-code:before { - content: "\f121"; + content: ""; } .fa-mail-reply-all:before, .fa-reply-all:before { - content: "\f122"; + content: ""; } .fa-star-half-empty:before, .fa-star-half-full:before, .fa-star-half-o:before { - content: "\f123"; + content: ""; } .fa-location-arrow:before { - content: "\f124"; + content: ""; } .fa-crop:before { - content: "\f125"; + content: ""; } .fa-code-fork:before { - content: "\f126"; + content: ""; } .fa-unlink:before, .fa-chain-broken:before { - content: "\f127"; + content: ""; } .fa-question:before { - content: "\f128"; + content: ""; } .fa-info:before { - content: "\f129"; + content: ""; } .fa-exclamation:before { - content: "\f12a"; + content: ""; } .fa-superscript:before { - content: "\f12b"; + content: ""; } .fa-subscript:before { - content: "\f12c"; + content: ""; } .fa-eraser:before { - content: "\f12d"; + content: ""; } .fa-puzzle-piece:before { - content: "\f12e"; + content: ""; } .fa-microphone:before { - content: "\f130"; + content: ""; } .fa-microphone-slash:before { - content: "\f131"; + content: ""; } .fa-shield:before { - content: "\f132"; + content: ""; } .fa-calendar-o:before { - content: "\f133"; + content: ""; } .fa-fire-extinguisher:before { - content: "\f134"; + content: ""; } .fa-rocket:before { - content: "\f135"; + content: ""; } .fa-maxcdn:before { - content: "\f136"; + content: ""; } .fa-chevron-circle-left:before { - content: "\f137"; + content: ""; } .fa-chevron-circle-right:before { - content: "\f138"; + content: ""; } .fa-chevron-circle-up:before { - content: "\f139"; + content: ""; } .fa-chevron-circle-down:before { - content: "\f13a"; + content: ""; } .fa-html5:before { - content: "\f13b"; + content: ""; } .fa-css3:before { - content: "\f13c"; + content: ""; } .fa-anchor:before { - content: "\f13d"; + content: ""; } .fa-unlock-alt:before { - content: "\f13e"; + content: ""; } .fa-bullseye:before { - content: "\f140"; + content: ""; } .fa-ellipsis-h:before { - content: "\f141"; + content: ""; } .fa-ellipsis-v:before { - content: "\f142"; + content: ""; } .fa-rss-square:before { - content: "\f143"; + content: ""; } .fa-play-circle:before { - content: "\f144"; + content: ""; } .fa-ticket:before { - content: "\f145"; + content: ""; } .fa-minus-square:before { - content: "\f146"; + content: ""; } .fa-minus-square-o:before { - content: "\f147"; + content: ""; } .fa-level-up:before { - content: "\f148"; + content: ""; } .fa-level-down:before { - content: "\f149"; + content: ""; } .fa-check-square:before { - content: "\f14a"; + content: ""; } .fa-pencil-square:before { - content: "\f14b"; + content: ""; } .fa-external-link-square:before { - content: "\f14c"; + content: ""; } .fa-share-square:before { - content: "\f14d"; + content: ""; } .fa-compass:before { - content: "\f14e"; + content: ""; } .fa-toggle-down:before, .fa-caret-square-o-down:before { - content: "\f150"; + content: ""; } .fa-toggle-up:before, .fa-caret-square-o-up:before { - content: "\f151"; + content: ""; } .fa-toggle-right:before, .fa-caret-square-o-right:before { - content: "\f152"; + content: ""; } .fa-euro:before, .fa-eur:before { - content: "\f153"; + content: ""; } .fa-gbp:before { - content: "\f154"; + content: ""; } .fa-dollar:before, .fa-usd:before { - content: "\f155"; + content: ""; } .fa-rupee:before, .fa-inr:before { - content: "\f156"; + content: ""; } .fa-cny:before, .fa-rmb:before, .fa-yen:before, .fa-jpy:before { - content: "\f157"; + content: ""; } .fa-ruble:before, .fa-rouble:before, .fa-rub:before { - content: "\f158"; + content: ""; } .fa-won:before, .fa-krw:before { - content: "\f159"; + content: ""; } .fa-bitcoin:before, .fa-btc:before { - content: "\f15a"; + content: ""; } .fa-file:before { - content: "\f15b"; + content: ""; } .fa-file-text:before { - content: "\f15c"; + content: ""; } .fa-sort-alpha-asc:before { - content: "\f15d"; + content: ""; } .fa-sort-alpha-desc:before { - content: "\f15e"; + content: ""; } .fa-sort-amount-asc:before { - content: "\f160"; + content: ""; } .fa-sort-amount-desc:before { - content: "\f161"; + content: ""; } .fa-sort-numeric-asc:before { - content: "\f162"; + content: ""; } .fa-sort-numeric-desc:before { - content: "\f163"; + content: ""; } .fa-thumbs-up:before { - content: "\f164"; + content: ""; } .fa-thumbs-down:before { - content: "\f165"; + content: ""; } .fa-youtube-square:before { - content: "\f166"; + content: ""; } .fa-youtube:before { - content: "\f167"; + content: ""; } .fa-xing:before { - content: "\f168"; + content: ""; } .fa-xing-square:before { - content: "\f169"; + content: ""; } .fa-youtube-play:before { - content: "\f16a"; + content: ""; } .fa-dropbox:before { - content: "\f16b"; + content: ""; } .fa-stack-overflow:before { - content: "\f16c"; + content: ""; } .fa-instagram:before { - content: "\f16d"; + content: ""; } .fa-flickr:before { - content: "\f16e"; + content: ""; } .fa-adn:before { - content: "\f170"; + content: ""; } .fa-bitbucket:before { - content: "\f171"; + content: ""; } .fa-bitbucket-square:before { - content: "\f172"; + content: ""; } .fa-tumblr:before { - content: "\f173"; + content: ""; } .fa-tumblr-square:before { - content: "\f174"; + content: ""; } .fa-long-arrow-down:before { - content: "\f175"; + content: ""; } .fa-long-arrow-up:before { - content: "\f176"; + content: ""; } .fa-long-arrow-left:before { - content: "\f177"; + content: ""; } .fa-long-arrow-right:before { - content: "\f178"; + content: ""; } .fa-apple:before { - content: "\f179"; + content: ""; } .fa-windows:before { - content: "\f17a"; + content: ""; } .fa-android:before { - content: "\f17b"; + content: ""; } .fa-linux:before { - content: "\f17c"; + content: ""; } .fa-dribbble:before { - content: "\f17d"; + content: ""; } .fa-skype:before { - content: "\f17e"; + content: ""; } .fa-foursquare:before { - content: "\f180"; + content: ""; } .fa-trello:before { - content: "\f181"; + content: ""; } .fa-female:before { - content: "\f182"; + content: ""; } .fa-male:before { - content: "\f183"; + content: ""; } .fa-gittip:before { - content: "\f184"; + content: ""; } .fa-sun-o:before { - content: "\f185"; + content: ""; } .fa-moon-o:before { - content: "\f186"; + content: ""; } .fa-archive:before { - content: "\f187"; + content: ""; } .fa-bug:before { - content: "\f188"; + content: ""; } .fa-vk:before { - content: "\f189"; + content: ""; } .fa-weibo:before { - content: "\f18a"; + content: ""; } .fa-renren:before { - content: "\f18b"; + content: ""; } .fa-pagelines:before { - content: "\f18c"; + content: ""; } .fa-stack-exchange:before { - content: "\f18d"; + content: ""; } .fa-arrow-circle-o-right:before { - content: "\f18e"; + content: ""; } .fa-arrow-circle-o-left:before { - content: "\f190"; + content: ""; } .fa-toggle-left:before, .fa-caret-square-o-left:before { - content: "\f191"; + content: ""; } .fa-dot-circle-o:before { - content: "\f192"; + content: ""; } .fa-wheelchair:before { - content: "\f193"; + content: ""; } .fa-vimeo-square:before { - content: "\f194"; + content: ""; } .fa-turkish-lira:before, .fa-try:before { - content: "\f195"; + content: ""; } .fa-plus-square-o:before { - content: "\f196"; + content: ""; } .fa-space-shuttle:before { - content: "\f197"; + content: ""; } .fa-slack:before { - content: "\f198"; + content: ""; } .fa-envelope-square:before { - content: "\f199"; + content: ""; } .fa-wordpress:before { - content: "\f19a"; + content: ""; } .fa-openid:before { - content: "\f19b"; + content: ""; } .fa-institution:before, .fa-bank:before, .fa-university:before { - content: "\f19c"; + content: ""; } .fa-mortar-board:before, .fa-graduation-cap:before { - content: "\f19d"; + content: ""; } .fa-yahoo:before { - content: "\f19e"; + content: ""; } .fa-google:before { - content: "\f1a0"; + content: ""; } .fa-reddit:before { - content: "\f1a1"; + content: ""; } .fa-reddit-square:before { - content: "\f1a2"; + content: ""; } .fa-stumbleupon-circle:before { - content: "\f1a3"; + content: ""; } .fa-stumbleupon:before { - content: "\f1a4"; + content: ""; } .fa-delicious:before { - content: "\f1a5"; + content: ""; } .fa-digg:before { - content: "\f1a6"; + content: ""; } .fa-pied-piper:before { - content: "\f1a7"; + content: ""; } .fa-pied-piper-alt:before { - content: "\f1a8"; + content: ""; } .fa-drupal:before { - content: "\f1a9"; + content: ""; } .fa-joomla:before { - content: "\f1aa"; + content: ""; } .fa-language:before { - content: "\f1ab"; + content: ""; } .fa-fax:before { - content: "\f1ac"; + content: ""; } .fa-building:before { - content: "\f1ad"; + content: ""; } .fa-child:before { - content: "\f1ae"; + content: ""; } .fa-paw:before { - content: "\f1b0"; + content: ""; } .fa-spoon:before { - content: "\f1b1"; + content: ""; } .fa-cube:before { - content: "\f1b2"; + content: ""; } .fa-cubes:before { - content: "\f1b3"; + content: ""; } .fa-behance:before { - content: "\f1b4"; + content: ""; } .fa-behance-square:before { - content: "\f1b5"; + content: ""; } .fa-steam:before { - content: "\f1b6"; + content: ""; } .fa-steam-square:before { - content: "\f1b7"; + content: ""; } .fa-recycle:before { - content: "\f1b8"; + content: ""; } .fa-automobile:before, .fa-car:before { - content: "\f1b9"; + content: ""; } .fa-cab:before, .fa-taxi:before { - content: "\f1ba"; + content: ""; } .fa-tree:before { - content: "\f1bb"; + content: ""; } .fa-spotify:before { - content: "\f1bc"; + content: ""; } .fa-deviantart:before { - content: "\f1bd"; + content: ""; } .fa-soundcloud:before { - content: "\f1be"; + content: ""; } .fa-database:before { - content: "\f1c0"; + content: ""; } .fa-file-pdf-o:before { - content: "\f1c1"; + content: ""; } .fa-file-word-o:before { - content: "\f1c2"; + content: ""; } .fa-file-excel-o:before { - content: "\f1c3"; + content: ""; } .fa-file-powerpoint-o:before { - content: "\f1c4"; + content: ""; } .fa-file-photo-o:before, .fa-file-picture-o:before, .fa-file-image-o:before { - content: "\f1c5"; + content: ""; } .fa-file-zip-o:before, .fa-file-archive-o:before { - content: "\f1c6"; + content: ""; } .fa-file-sound-o:before, .fa-file-audio-o:before { - content: "\f1c7"; + content: ""; } .fa-file-movie-o:before, .fa-file-video-o:before { - content: "\f1c8"; + content: ""; } .fa-file-code-o:before { - content: "\f1c9"; + content: ""; } .fa-vine:before { - content: "\f1ca"; + content: ""; } .fa-codepen:before { - content: "\f1cb"; + content: ""; } .fa-jsfiddle:before { - content: "\f1cc"; + content: ""; } .fa-life-bouy:before, @@ -1931,249 +1927,249 @@ .fa-life-saver:before, .fa-support:before, .fa-life-ring:before { - content: "\f1cd"; + content: ""; } .fa-circle-o-notch:before { - content: "\f1ce"; + content: ""; } .fa-ra:before, .fa-rebel:before { - content: "\f1d0"; + content: ""; } .fa-ge:before, .fa-empire:before { - content: "\f1d1"; + content: ""; } .fa-git-square:before { - content: "\f1d2"; + content: ""; } .fa-git:before { - content: "\f1d3"; + content: ""; } .fa-hacker-news:before { - content: "\f1d4"; + content: ""; } .fa-tencent-weibo:before { - content: "\f1d5"; + content: ""; } .fa-qq:before { - content: "\f1d6"; + content: ""; } .fa-wechat:before, .fa-weixin:before { - content: "\f1d7"; + content: ""; } .fa-send:before, .fa-paper-plane:before { - content: "\f1d8"; + content: ""; } .fa-send-o:before, .fa-paper-plane-o:before { - content: "\f1d9"; + content: ""; } .fa-history:before { - content: "\f1da"; + content: ""; } .fa-circle-thin:before { - content: "\f1db"; + content: ""; } .fa-header:before { - content: "\f1dc"; + content: ""; } .fa-paragraph:before { - content: "\f1dd"; + content: ""; } .fa-sliders:before { - content: "\f1de"; + content: ""; } .fa-share-alt:before { - content: "\f1e0"; + content: ""; } .fa-share-alt-square:before { - content: "\f1e1"; + content: ""; } .fa-bomb:before { - content: "\f1e2"; + content: ""; } .fa-soccer-ball-o:before, .fa-futbol-o:before { - content: "\f1e3"; + content: ""; } .fa-tty:before { - content: "\f1e4"; + content: ""; } .fa-binoculars:before { - content: "\f1e5"; + content: ""; } .fa-plug:before { - content: "\f1e6"; + content: ""; } .fa-slideshare:before { - content: "\f1e7"; + content: ""; } .fa-twitch:before { - content: "\f1e8"; + content: ""; } .fa-yelp:before { - content: "\f1e9"; + content: ""; } .fa-newspaper-o:before { - content: "\f1ea"; + content: ""; } .fa-wifi:before { - content: "\f1eb"; + content: ""; } .fa-calculator:before { - content: "\f1ec"; + content: ""; } .fa-paypal:before { - content: "\f1ed"; + content: ""; } .fa-google-wallet:before { - content: "\f1ee"; + content: ""; } .fa-cc-visa:before { - content: "\f1f0"; + content: ""; } .fa-cc-mastercard:before { - content: "\f1f1"; + content: ""; } .fa-cc-discover:before { - content: "\f1f2"; + content: ""; } .fa-cc-amex:before { - content: "\f1f3"; + content: ""; } .fa-cc-paypal:before { - content: "\f1f4"; + content: ""; } .fa-cc-stripe:before { - content: "\f1f5"; + content: ""; } .fa-bell-slash:before { - content: "\f1f6"; + content: ""; } .fa-bell-slash-o:before { - content: "\f1f7"; + content: ""; } .fa-trash:before { - content: "\f1f8"; + content: ""; } .fa-copyright:before { - content: "\f1f9"; + content: ""; } .fa-at:before { - content: "\f1fa"; + content: ""; } .fa-eyedropper:before { - content: "\f1fb"; + content: ""; } .fa-paint-brush:before { - content: "\f1fc"; + content: ""; } .fa-birthday-cake:before { - content: "\f1fd"; + content: ""; } .fa-area-chart:before { - content: "\f1fe"; + content: ""; } .fa-pie-chart:before { - content: "\f200"; + content: ""; } .fa-line-chart:before { - content: "\f201"; + content: ""; } .fa-lastfm:before { - content: "\f202"; + content: ""; } .fa-lastfm-square:before { - content: "\f203"; + content: ""; } .fa-toggle-off:before { - content: "\f204"; + content: ""; } .fa-toggle-on:before { - content: "\f205"; + content: ""; } .fa-bicycle:before { - content: "\f206"; + content: ""; } .fa-bus:before { - content: "\f207"; + content: ""; } .fa-ioxhost:before { - content: "\f208"; + content: ""; } .fa-angellist:before { - content: "\f209"; + content: ""; } .fa-cc:before { - content: "\f20a"; + content: ""; } .fa-shekel:before, .fa-sheqel:before, .fa-ils:before { - content: "\f20b"; + content: ""; } .fa-meanpath:before { - content: "\f20c"; + content: ""; } diff --git a/dist/css/font-awesome.min.css b/dist/css/font-awesome.min.css index c484d6e38..e3dfe5731 100644 --- a/dist/css/font-awesome.min.css +++ b/dist/css/font-awesome.min.css @@ -1 +1 @@ -@font-face{font-family:FontAwesome;src:url(../fonts/fontawesome-webfont.eot?v=4.2.0);src:url(../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0) format("embedded-opentype"),url(../fonts/fontawesome-webfont.woff?v=4.2.0) format("woff"),url(../fonts/fontawesome-webfont.ttf?v=4.2.0) format("truetype"),url(../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"} \ No newline at end of file +@charset "UTF-8";@font-face{font-family:FontAwesome;src:url(../fonts/fontawesome-webfont.eot?v=4.2.0);src:url(../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0) format("embedded-opentype"),url(../fonts/fontawesome-webfont.woff?v=4.2.0) format("woff"),url(../fonts/fontawesome-webfont.ttf?v=4.2.0) format("truetype"),url(../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before{content:""}.fa-check-circle:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook:before{content:""}.fa-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""} \ No newline at end of file diff --git a/dist/css/ink-flex.css b/dist/css/ink-flex.css index a658a4611..f7cb55627 100644 --- a/dist/css/ink-flex.css +++ b/dist/css/ink-flex.css @@ -672,7 +672,7 @@ th { .ink-form p.label { padding: 0; margin: 0; - color: #555555; + color: #555; white-space: normal; } .ink-form select, @@ -701,7 +701,7 @@ th { padding: 8px 6px; border: 1px solid #c6c6c6; resize: none; - background: white; + background: #FFF; vertical-align: middle; } .ink-form select:focus, @@ -754,7 +754,7 @@ th { border-radius: 2px; padding: 6px; border: 1px solid #c6c6c6; - background: white; + background: #FFF; vertical-align: middle; line-height: 1.2; } @@ -934,7 +934,7 @@ th { color: rgba(204, 125, 0, 0.6); } .ink-form .control-group.required label, .ink-form .control-group.required p.label { - color: #555555; + color: #555; } .ink-form .control-group.required label:after, .ink-form .control-group.required p.label:after { content: "\f069"; @@ -1258,8 +1258,8 @@ th { margin-left: -2em; } .column-group.xlarge-gutters > [class*=xlarge-], .column-group.xlarge-gutters > [class*=all-], .column-group.xlarge-gutters > .all-auto { - padding-left: 0.5em; - margin-bottom: 0.5em; + padding-left: 2em; + margin-bottom: 2em; } .column-group.xlarge-horizontal-gutters { @@ -2282,8 +2282,8 @@ th { margin-left: -1.75em; } .column-group.large-gutters > [class*=large-], .column-group.large-gutters > [class*=all-], .column-group.large-gutters > .all-auto { - padding-left: 0.4375em; - margin-bottom: 0.4375em; + padding-left: 1.75em; + margin-bottom: 1.75em; } .column-group.large-horizontal-gutters { @@ -3306,8 +3306,8 @@ th { margin-left: -1.5em; } .column-group.medium-gutters > [class*=medium-], .column-group.medium-gutters > [class*=all-], .column-group.medium-gutters > .all-auto { - padding-left: 0.375em; - margin-bottom: 0.375em; + padding-left: 1.5em; + margin-bottom: 1.5em; } .column-group.medium-horizontal-gutters { @@ -4330,8 +4330,8 @@ th { margin-left: -1.25em; } .column-group.small-gutters > [class*=small-], .column-group.small-gutters > [class*=all-], .column-group.small-gutters > .all-auto { - padding-left: 0.3125em; - margin-bottom: 0.3125em; + padding-left: 1.25em; + margin-bottom: 1.25em; } .column-group.small-horizontal-gutters { @@ -5354,8 +5354,8 @@ th { margin-left: -1em; } .column-group.tiny-gutters > [class*=tiny-], .column-group.tiny-gutters > [class*=all-], .column-group.tiny-gutters > .all-auto { - padding-left: 0.25em; - margin-bottom: 0.25em; + padding-left: 1em; + margin-bottom: 1em; } .column-group.tiny-horizontal-gutters { @@ -6340,180 +6340,158 @@ th { } @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-thin-webfont.eot'); - src: url('../fonts/Roboto/roboto-thin-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-thin-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-thin-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-thin-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-thin-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-thin-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-thin-webfont.ttf?1423657803') format('truetype'); font-weight: 100; font-style: normal; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-thinitalic-webfont.eot'); - src: url('../fonts/Roboto/roboto-thinitalic-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-thinitalic-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-thinitalic-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-thinitalic-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-thinitalic-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-thinitalic-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-thinitalic-webfont.ttf?1423657803') format('truetype'); font-weight: 100; font-style: italic; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-light-webfont.eot'); - src: url('../fonts/Roboto/roboto-light-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-light-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-light-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-light-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-light-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-light-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-light-webfont.ttf?1423657803') format('truetype'); font-weight: 300; font-style: normal; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-lightitalic-webfont.eot'); - src: url('../fonts/Roboto/roboto-lightitalic-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-lightitalic-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-lightitalic-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-lightitalic-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-lightitalic-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-lightitalic-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-lightitalic-webfont.ttf?1423657803') format('truetype'); font-weight: 300; font-style: italic; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-regular-webfont.eot'); - src: url('../fonts/Roboto/roboto-regular-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-regular-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-regular-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-regular-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-regular-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-regular-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-regular-webfont.ttf?1423657803') format('truetype'); font-weight: 400; font-style: normal; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-italic-webfont.eot'); - src: url('../fonts/Roboto/roboto-italic-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-italic-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-italic-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-italic-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-italic-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-italic-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-italic-webfont.ttf?1423657803') format('truetype'); font-weight: 400; font-style: italic; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-medium-webfont.eot'); - src: url('../fonts/Roboto/roboto-medium-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-medium-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-medium-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-medium-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-medium-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-medium-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-medium-webfont.ttf?1423657803') format('truetype'); font-weight: 500; font-style: normal; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-mediumitalic-webfont.eot'); - src: url('../fonts/Roboto/roboto-mediumitalic-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-mediumitalic-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-mediumitalic-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-mediumitalic-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-mediumitalic-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-mediumitalic-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-mediumitalic-webfont.ttf?1423657803') format('truetype'); font-weight: 500; font-style: italic; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-bold-webfont.eot'); - src: url('../fonts/Roboto/roboto-bold-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-bold-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-bold-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-bold-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-bold-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-bold-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-bold-webfont.ttf?1423657803') format('truetype'); font-weight: 700; font-style: normal; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-bolditalic-webfont.eot'); - src: url('../fonts/Roboto/roboto-bolditalic-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-bolditalic-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-bolditalic-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-bolditalic-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-bolditalic-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-bolditalic-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-bolditalic-webfont.ttf?1423657803') format('truetype'); font-weight: 700; font-style: italic; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-black-webfont.eot'); - src: url('../fonts/Roboto/roboto-black-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-black-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-black-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-black-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-black-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-black-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-black-webfont.ttf?1423657803') format('truetype'); font-weight: 900; font-style: normal; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-blackitalic-webfont.eot'); - src: url('../fonts/Roboto/roboto-blackitalic-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-blackitalic-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-blackitalic-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-blackitalic-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-blackitalic-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-blackitalic-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-blackitalic-webfont.ttf?1423657803') format('truetype'); font-weight: 900; font-style: italic; } - @font-face { font-family: "Roboto_condensed"; - src: url('../fonts/Roboto_condensed/robotocondensed-light-webfont.eot'); - src: url('../fonts/Roboto_condensed/robotocondensed-light-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-light-webfont.woff') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-light-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_condensed/robotocondensed-light-webfont.eot?1423657803'); + src: url('../fonts/Roboto_condensed/robotocondensed-light-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-light-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-light-webfont.ttf?1423657803') format('truetype'); font-weight: 300; font-style: normal; } - @font-face { font-family: "Roboto_condensed"; - src: url('../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot'); - src: url('../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.woff') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot?1423657803'); + src: url('../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.ttf?1423657803') format('truetype'); font-weight: 300; font-style: italic; } - @font-face { font-family: "Roboto_condensed"; - src: url('../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot'); - src: url('../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-regular-webfont.woff') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-regular-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot?1423657803'); + src: url('../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-regular-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-regular-webfont.ttf?1423657803') format('truetype'); font-weight: 400; font-style: normal; } - @font-face { font-family: "Roboto_condensed"; - src: url('../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot'); - src: url('../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-italic-webfont.woff') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-italic-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot?1423657803'); + src: url('../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-italic-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-italic-webfont.ttf?1423657803') format('truetype'); font-weight: 400; font-style: italic; } - @font-face { font-family: "Roboto_condensed"; - src: url('../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot'); - src: url('../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-bold-webfont.woff') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-bold-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot?1423657803'); + src: url('../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-bold-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-bold-webfont.ttf?1423657803') format('truetype'); font-weight: 700; font-style: normal; } - @font-face { font-family: "Roboto_condensed"; - src: url('../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot'); - src: url('../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.woff') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot?1423657803'); + src: url('../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.ttf?1423657803') format('truetype'); font-weight: 700; font-style: italic; } - @font-face { font-family: "Roboto_slab"; - src: url('../fonts/Roboto_slab/robotoslab-thin-webfont.eot'); - src: url('../fonts/Roboto_slab/robotoslab-thin-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_slab/robotoslab-thin-webfont.woff') format('woff'), url('../fonts/Roboto_slab/robotoslab-thin-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_slab/robotoslab-thin-webfont.eot?1408628222'); + src: url('../fonts/Roboto_slab/robotoslab-thin-webfont.eot?&1408628222#iefix') format('embedded-opentype'), url('../fonts/Roboto_slab/robotoslab-thin-webfont.woff?1408628222') format('woff'), url('../fonts/Roboto_slab/robotoslab-thin-webfont.ttf?1408628222') format('truetype'); font-weight: 100; font-style: normal; } - @font-face { font-family: "Roboto_slab"; - src: url('../fonts/Roboto_slab/robotoslab-light-webfont.eot'); - src: url('../fonts/Roboto_slab/robotoslab-light-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_slab/robotoslab-light-webfont.woff') format('woff'), url('../fonts/Roboto_slab/robotoslab-light-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_slab/robotoslab-light-webfont.eot?1408628222'); + src: url('../fonts/Roboto_slab/robotoslab-light-webfont.eot?&1408628222#iefix') format('embedded-opentype'), url('../fonts/Roboto_slab/robotoslab-light-webfont.woff?1408628222') format('woff'), url('../fonts/Roboto_slab/robotoslab-light-webfont.ttf?1408628222') format('truetype'); font-weight: 300; font-style: normal; } - @font-face { font-family: "Roboto_slab"; - src: url('../fonts/Roboto_slab/robotoslab-regular-webfont.eot'); - src: url('../fonts/Roboto_slab/robotoslab-regular-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_slab/robotoslab-regular-webfont.woff') format('woff'), url('../fonts/Roboto_slab/robotoslab-regular-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_slab/robotoslab-regular-webfont.eot?1408628222'); + src: url('../fonts/Roboto_slab/robotoslab-regular-webfont.eot?&1408628222#iefix') format('embedded-opentype'), url('../fonts/Roboto_slab/robotoslab-regular-webfont.woff?1408628222') format('woff'), url('../fonts/Roboto_slab/robotoslab-regular-webfont.ttf?1408628222') format('truetype'); font-weight: 400; font-style: normal; } - @font-face { font-family: "Roboto_slab"; - src: url('../fonts/Roboto_slab/robotoslab-bold-webfont.eot'); - src: url('../fonts/Roboto_slab/robotoslab-bold-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_slab/robotoslab-bold-webfont.woff') format('woff'), url('../fonts/Roboto_slab/robotoslab-bold-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_slab/robotoslab-bold-webfont.eot?1408628222'); + src: url('../fonts/Roboto_slab/robotoslab-bold-webfont.eot?&1408628222#iefix') format('embedded-opentype'), url('../fonts/Roboto_slab/robotoslab-bold-webfont.woff?1408628222') format('woff'), url('../fonts/Roboto_slab/robotoslab-bold-webfont.ttf?1408628222') format('truetype'); font-weight: 700; font-style: normal; } - .ink-label { padding: 0 0.35em; white-space: nowrap; @@ -6569,7 +6547,7 @@ th { .ink-navigation ul.dropdown { position: absolute; top: 110%; - background: white; + background: #fff; z-index: 30; border: 1px solid #d9d9d9; height: auto; @@ -6660,7 +6638,7 @@ th { .ink-navigation ul.dropdown-menu li.active a, .ink-navigation ul.dropdown li.active a { background: #999999; - color: white; + color: #fff; } .ink-dropdown ul.dropdown-menu li.disabled a, .ink-dropdown ul.dropdown li.disabled a, @@ -7053,7 +7031,7 @@ html { } body { - color: #555555; + color: #555; font-family: "Roboto", Arial, Helvetica, sans-serif; line-height: 1.45; } @@ -7158,61 +7136,61 @@ body { } a { - color: #6998c9; + color: #6998C9; text-decoration: none; cursor: pointer; } a:hover { - color: #007ed5; + color: #007ED5; text-decoration: underline; } h1 { font-size: 2.2em; margin-top: 0; - margin-bottom: 0.57539em; + margin-bottom: 0.59318em; } h2 { font-size: 1.75em; margin-top: 0; - margin-bottom: 0.72334em; + margin-bottom: 0.74571em; } h3 { font-size: 1.5em; margin-top: 0; - margin-bottom: 0.8439em; + margin-bottom: 0.87em; } h4 { font-size: 1.25em; margin-top: 0; - margin-bottom: 1.01268em; + margin-bottom: 1.044em; } h5 { font-size: 1.1em; margin-top: 0; - margin-bottom: 1.15077em; + margin-bottom: 1.18636em; } h6 { font-size: 1.1em; margin-top: 0; - margin-bottom: 1.15077em; + margin-bottom: 1.18636em; } p { font-size: 1em; margin-top: 0; - margin-bottom: 1.26585em; + margin-bottom: 1.305em; } table { font-size: 1em; margin-top: 0; - margin-bottom: 1.26585em; + margin-bottom: 1.305em; } h1:first-child, h2:first-child, h3:first-child, h4:first-child, h5:first-child, h6:first-child, p:first-child { @@ -7254,7 +7232,7 @@ address p { margin-top: 0; } address h6 { - color: #555555; + color: #555; } abbr:hover { @@ -7280,7 +7258,7 @@ blockquote small::before, blockquote small::after { color: #777777; } .note strong { - color: #555555; + color: #555; } .small { @@ -7367,14 +7345,14 @@ dl.inline dd { figure.ink-image { position: relative; - border: 1px solid #555555; + border: 1px solid #555; } figure.ink-image > img { width: 100%; } figure.ink-image > figcaption { padding: 1em; - background: white; + background: #fff; line-height: 1.3; } figure.ink-image > figcaption.over-top, figure.ink-image > figcaption.over-bottom { @@ -7384,7 +7362,7 @@ figure.ink-image > figcaption.over-top, figure.ink-image > figcaption.over-botto border: none; } figure.ink-image > figcaption.over-top.dark, figure.ink-image > figcaption.over-bottom.dark { - color: white; + color: #fff; background: rgba(0, 0, 0, 0.6); } figure.ink-image > figcaption.over-top { @@ -7396,8 +7374,8 @@ figure.ink-image > figcaption.over-bottom { background: rgba(255, 255, 255, 0.7); } figure.ink-image > figcaption.dark { - color: white; - background: #222222; + color: #fff; + background: #222; } img { @@ -7448,7 +7426,7 @@ img { } .ink-alert.block { border: 1px solid #b87814; - background: white; + background: #fff; } .ink-alert.block > h4 { background: rgba(255, 156, 0, 0.3); @@ -7459,7 +7437,7 @@ img { } .ink-alert.block.success { border: 1px solid #38621d; - background: white; + background: #fff; } .ink-alert.block.success > h4 { background: rgba(74, 155, 23, 0.3); @@ -7470,7 +7448,7 @@ img { } .ink-alert.block.error { border: 1px solid #891e1e; - background: white; + background: #fff; } .ink-alert.block.error > h4 { background: rgba(201, 17, 17, 0.3); @@ -7481,7 +7459,7 @@ img { } .ink-alert.block.info { border: 1px solid #1e5b98; - background: white; + background: #fff; } .ink-alert.block.info > h4 { background: rgba(15, 117, 218, 0.3); @@ -7493,7 +7471,7 @@ img { .ink-alert .ink-dismiss { font-family: Arial, sans-serif; font-weight: bold; - text-shadow: white 0 1px 0; + text-shadow: #fff 0 1px 0; filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=25); opacity: 0.25; } @@ -7508,14 +7486,14 @@ img { -ms-border-radius: 8em; -o-border-radius: 8em; border-radius: 8em; - color: white; + color: #fff; } .ink-badge.white { - background: white; - color: #555555; + background: #fff; + color: #555; } .ink-badge.black { - background: black; + background: #000; } .ink-badge.orange { background: #ff9c00; @@ -7531,7 +7509,7 @@ img { } .ink-badge.yellow { background: #ffd500; - color: #555555; + color: #555; } .ink-badge.grey { background: gray; @@ -7542,7 +7520,7 @@ img { .ink-button { background: #d9d9d9; - color: black; + color: #000; border: 1px solid #bfbfbf; -webkit-border-radius: 2px; -moz-border-radius: 2px; @@ -7553,7 +7531,7 @@ img { } .ink-button:hover, .ink-button:active { text-decoration: none; - color: black; + color: #000; background: #cccccc; border: 1px solid #b3b3b3; -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 1px; @@ -7578,14 +7556,14 @@ img { box-shadow: none; } .ink-button.blue { - color: white; + color: #fff; background: #0f75da; border: 1px solid #0c63b9; } .ink-button.blue:hover, .ink-button.blue:active { background: #0d68c2; border: 1px solid #0a56a1; - color: white; + color: #fff; text-decoration: none; } .ink-button.blue:focus { @@ -7602,14 +7580,14 @@ img { box-shadow: none; } .ink-button.green { - color: white; + color: #fff; background: #4a9b17; border: 1px solid #3e8313; } .ink-button.green:hover, .ink-button.green:active { background: #3f8514; border: 1px solid #336d10; - color: white; + color: #fff; text-decoration: none; } .ink-button.green:focus { @@ -7626,14 +7604,14 @@ img { box-shadow: none; } .ink-button.orange { - color: white; + color: #fff; background: #ff9c00; border: 1px solid #d88400; } .ink-button.orange:hover, .ink-button.orange:active { background: #e68c00; border: 1px solid #bf7400; - color: white; + color: #fff; text-decoration: none; } .ink-button.orange:focus { @@ -7650,14 +7628,14 @@ img { box-shadow: none; } .ink-button.red { - color: white; + color: #fff; background: #c91111; border: 1px solid #aa0e0e; } .ink-button.red:hover, .ink-button.red:active { background: #b10f0f; border: 1px solid #920c0c; - color: white; + color: #fff; text-decoration: none; } .ink-button.red:focus { @@ -7674,14 +7652,14 @@ img { box-shadow: none; } .ink-button.black { - color: white; + color: #fff; background: #1a1a1a; border: 1px solid #161616; } .ink-button.black:hover, .ink-button.black:active { background: #0d0d0d; border: 1px solid #090909; - color: white; + color: #fff; text-decoration: none; } .ink-button.black:focus { @@ -7698,14 +7676,14 @@ img { box-shadow: none; } .ink-button.white { - color: #555555; - background: white; + color: #555; + background: #fff; border: 1px solid #d8d8d8; } .ink-button.white:hover, .ink-button.white:active { background: #f2f2f2; border: 1px solid #cbcbcb; - color: #555555; + color: #555; text-decoration: none; } .ink-button.white:focus { @@ -7775,7 +7753,7 @@ img { } .ink-label { - color: white; + color: #fff; font-weight: 300; font-size: 0.938em; -webkit-border-radius: 2px; @@ -7785,11 +7763,11 @@ img { border-radius: 2px; } .ink-label.white { - background: white; - color: #555555; + background: #fff; + color: #555; } .ink-label.black { - background: black; + background: #000; } .ink-label.orange { background: #ff9c00; @@ -7805,7 +7783,7 @@ img { } .ink-label.yellow { background: #ffd500; - color: #555555; + color: #555; } .ink-label.grey { background: gray; @@ -7835,10 +7813,10 @@ img { text-decoration: underline; } .ink-navigation ul.breadcrumbs.white { - background: white; + background: #fff; } .ink-navigation ul.breadcrumbs.white li a, .ink-navigation ul.breadcrumbs.white li:after { - color: #555555; + color: #555; } .ink-navigation ul.breadcrumbs.white li.active a { color: #cccccc; @@ -7848,7 +7826,7 @@ img { background: #d9d9d9; } .ink-navigation ul.breadcrumbs.grey li a, .ink-navigation ul.breadcrumbs.grey li:after { - color: #555555; + color: #555; } .ink-navigation ul.breadcrumbs.grey li.active a { color: #a6a6a6; @@ -7858,7 +7836,7 @@ img { background: #1a1a1a; } .ink-navigation ul.breadcrumbs.black li a, .ink-navigation ul.breadcrumbs.black li:after { - color: white; + color: #fff; } .ink-navigation ul.breadcrumbs.black li.active a { color: #666666; @@ -7868,7 +7846,7 @@ img { background: #1b75ce; } .ink-navigation ul.breadcrumbs.blue li a, .ink-navigation ul.breadcrumbs.blue li:after { - color: white; + color: #fff; } .ink-navigation ul.breadcrumbs.blue li.active a { color: #08427b; @@ -7878,7 +7856,7 @@ img { background: #f2990d; } .ink-navigation ul.breadcrumbs.orange li a, .ink-navigation ul.breadcrumbs.orange li:after { - color: white; + color: #fff; } .ink-navigation ul.breadcrumbs.orange li.active a { color: #995e00; @@ -7888,7 +7866,7 @@ img { background: #4c9220; } .ink-navigation ul.breadcrumbs.green li a, .ink-navigation ul.breadcrumbs.green li:after { - color: white; + color: #fff; } .ink-navigation ul.breadcrumbs.green li.active a { color: #20420a; @@ -7898,7 +7876,7 @@ img { background: #be1c1c; } .ink-navigation ul.breadcrumbs.red li a, .ink-navigation ul.breadcrumbs.red li:after { - color: white; + color: #fff; } .ink-navigation ul.breadcrumbs.red li.active a { color: #6b0909; @@ -7907,27 +7885,27 @@ img { .ink-dropdown.blue ul.dropdown-menu li.active a { background: #0f75da; - color: white; + color: #fff; } .ink-dropdown.green ul.dropdown-menu li.active a { background: #4a9b17; - color: white; + color: #fff; } .ink-dropdown.orange ul.dropdown-menu li.active a { background: #ff9c00; - color: white; + color: #fff; } .ink-dropdown.red ul.dropdown-menu li.active a { background: #c91111; - color: white; + color: #fff; } .ink-dropdown.black ul.dropdown-menu li.active a { background: #1a1a1a; - color: white; + color: #fff; } .ink-dropdown.blue ul.dropdown-menu li.active a { background: #0f75da; - color: white; + color: #fff; } .ink-navigation ul.menu { @@ -8055,7 +8033,7 @@ img { -ms-border-radius: 0 0 2px 2px; -o-border-radius: 0 0 2px 2px; border-radius: 0 0 2px 2px; - background: white; + background: #fff; } .ink-navigation ul.menu.horizontal > li ul.submenu li:last-child { -webkit-border-radius: 0 0 2px 2px; @@ -8071,11 +8049,11 @@ img { background: white; } .ink-navigation ul.menu.white li ul.submenu { - background: white; + background: #fff; border: 1px solid rgba(0, 0, 0, 0.1); } .ink-navigation ul.menu.white li ul.submenu li a { - color: #555555; + color: #555; } .ink-navigation ul.menu.white li ul.submenu li a:hover { background: rgba(0, 0, 0, 0.05); @@ -8091,7 +8069,7 @@ img { text-shadow: white 0 1px 0; } .ink-navigation ul.menu.white li a { - color: #555555; + color: #555; text-decoration: none; } .ink-navigation ul.menu.white li a:hover { @@ -8101,11 +8079,11 @@ img { background: #d9d9d9; } .ink-navigation ul.menu.grey li ul.submenu { - background: white; + background: #fff; border: 1px solid rgba(0, 0, 0, 0.1); } .ink-navigation ul.menu.grey li ul.submenu li a { - color: #555555; + color: #555; } .ink-navigation ul.menu.grey li ul.submenu li a:hover { background: rgba(0, 0, 0, 0.05); @@ -8121,7 +8099,7 @@ img { text-shadow: #ededed 0 1px 0; } .ink-navigation ul.menu.grey li a { - color: #555555; + color: #555; text-decoration: none; } .ink-navigation ul.menu.grey li a:hover { @@ -8131,11 +8109,11 @@ img { background: #1a1a1a; } .ink-navigation ul.menu.black li ul.submenu { - background: white; + background: #fff; border: 1px solid rgba(0, 0, 0, 0.1); } .ink-navigation ul.menu.black li ul.submenu li a { - color: #555555; + color: #555; } .ink-navigation ul.menu.black li ul.submenu li a:hover { background: rgba(0, 0, 0, 0.05); @@ -8151,7 +8129,7 @@ img { text-shadow: black 0 -1px 0; } .ink-navigation ul.menu.black li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.menu.black li a:hover { @@ -8161,11 +8139,11 @@ img { background: #1b75ce; } .ink-navigation ul.menu.blue li ul.submenu { - background: white; + background: #fff; border: 1px solid rgba(0, 0, 0, 0.1); } .ink-navigation ul.menu.blue li ul.submenu li a { - color: #555555; + color: #555; } .ink-navigation ul.menu.blue li ul.submenu li a:hover { background: rgba(0, 0, 0, 0.05); @@ -8181,7 +8159,7 @@ img { text-shadow: #2289f0 0 1px 0; } .ink-navigation ul.menu.blue li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.menu.blue li a:hover { @@ -8191,11 +8169,11 @@ img { background: #4c9220; } .ink-navigation ul.menu.green li ul.submenu { - background: white; + background: #fff; border: 1px solid rgba(0, 0, 0, 0.1); } .ink-navigation ul.menu.green li ul.submenu li a { - color: #555555; + color: #555; } .ink-navigation ul.menu.green li ul.submenu li a:hover { background: rgba(0, 0, 0, 0.05); @@ -8211,7 +8189,7 @@ img { text-shadow: #5bbf1c 0 1px 0; } .ink-navigation ul.menu.green li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.menu.green li a:hover { @@ -8221,11 +8199,11 @@ img { background: #f2990d; } .ink-navigation ul.menu.orange li ul.submenu { - background: white; + background: #fff; border: 1px solid rgba(0, 0, 0, 0.1); } .ink-navigation ul.menu.orange li ul.submenu li a { - color: #555555; + color: #555; } .ink-navigation ul.menu.orange li ul.submenu li a:hover { background: rgba(0, 0, 0, 0.05); @@ -8241,7 +8219,7 @@ img { text-shadow: #ffac29 0 1px 0; } .ink-navigation ul.menu.orange li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.menu.orange li a:hover { @@ -8251,11 +8229,11 @@ img { background: #be1c1c; } .ink-navigation ul.menu.red li ul.submenu { - background: white; + background: #fff; border: 1px solid rgba(0, 0, 0, 0.1); } .ink-navigation ul.menu.red li ul.submenu li a { - color: #555555; + color: #555; } .ink-navigation ul.menu.red li ul.submenu li a:hover { background: rgba(0, 0, 0, 0.05); @@ -8271,7 +8249,7 @@ img { text-shadow: #eb1717 0 1px 0; } .ink-navigation ul.menu.red li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.menu.red li a:hover { @@ -8328,7 +8306,7 @@ img { background: none; } .ink-navigation ul.pagination.white li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.white li a:hover { @@ -8348,7 +8326,7 @@ img { background: none; } .ink-navigation ul.pagination.white li a { - color: #555555; + color: #555; text-decoration: none; } .ink-navigation ul.pagination.white li a:hover { @@ -8368,7 +8346,7 @@ img { background: none; } .ink-navigation ul.pagination.grey li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.grey li a:hover { @@ -8388,7 +8366,7 @@ img { background: none; } .ink-navigation ul.pagination.grey li a { - color: #555555; + color: #555; text-decoration: none; } .ink-navigation ul.pagination.grey li a:hover { @@ -8408,7 +8386,7 @@ img { background: none; } .ink-navigation ul.pagination.black li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.black li a:hover { @@ -8428,7 +8406,7 @@ img { background: none; } .ink-navigation ul.pagination.black li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.black li a:hover { @@ -8448,7 +8426,7 @@ img { background: none; } .ink-navigation ul.pagination.orange li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.orange li a:hover { @@ -8468,7 +8446,7 @@ img { background: none; } .ink-navigation ul.pagination.orange li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.orange li a:hover { @@ -8488,7 +8466,7 @@ img { background: none; } .ink-navigation ul.pagination.blue li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.blue li a:hover { @@ -8508,7 +8486,7 @@ img { background: none; } .ink-navigation ul.pagination.blue li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.blue li a:hover { @@ -8528,7 +8506,7 @@ img { background: none; } .ink-navigation ul.pagination.green li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.green li a:hover { @@ -8548,7 +8526,7 @@ img { background: none; } .ink-navigation ul.pagination.green li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.green li a:hover { @@ -8568,7 +8546,7 @@ img { background: none; } .ink-navigation ul.pagination.red li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.red li a:hover { @@ -8588,7 +8566,7 @@ img { background: none; } .ink-navigation ul.pagination.red li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.red li a:hover { @@ -8610,7 +8588,7 @@ img { background: #1a1a1a; } .ink-navigation ul.pagination.dotted.white li a { - background: white; + background: #fff; } .ink-navigation ul.pagination.dotted.blue li a { background: #1b75ce; @@ -8625,7 +8603,7 @@ img { background: #be1c1c; } .ink-navigation ul.pagination.chevron li.next a, .ink-navigation ul.pagination.chevron li.previous a { - color: white; + color: #fff; filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=60); opacity: 0.6; } @@ -8636,13 +8614,13 @@ img { background: none; } .ink-navigation ul.pagination.chevron li.disabled a { - color: white; + color: #fff; filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40); opacity: 0.4; text-shadow: none; } .ink-navigation ul.pagination.chevron li.disabled a:hover, .ink-navigation ul.pagination.chevron li.disabled a:focus { - color: white; + color: #fff; filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40); opacity: 0.4; } @@ -8666,7 +8644,7 @@ img { } .ink-navigation ul.pills li { - background: white; + background: #fff; font-weight: 300; -webkit-border-radius: 2px; -moz-border-radius: 2px; @@ -8675,7 +8653,7 @@ img { border-radius: 2px; } .ink-navigation ul.pills li a { - color: #555555; + color: #555; background: none; } .ink-navigation ul.pills li a:hover { @@ -8705,7 +8683,7 @@ img { background: none; } .ink-navigation ul.pills.grey li a { - color: #555555; + color: #555; } .ink-navigation ul.pills.grey li a:hover { background: #cccccc; @@ -8724,7 +8702,7 @@ img { background: none; } .ink-navigation ul.pills.black li a { - color: white; + color: #fff; } .ink-navigation ul.pills.black li a:hover { background: #292929; @@ -8743,7 +8721,7 @@ img { background: none; } .ink-navigation ul.pills.blue li a { - color: white; + color: #fff; } .ink-navigation ul.pills.blue li a:hover { background: #0d68c2; @@ -8762,7 +8740,7 @@ img { background: none; } .ink-navigation ul.pills.green li a { - color: white; + color: #fff; } .ink-navigation ul.pills.green li a:hover { background: #3f8514; @@ -8781,7 +8759,7 @@ img { background: none; } .ink-navigation ul.pills.orange li a { - color: white; + color: #fff; } .ink-navigation ul.pills.orange li a:hover { background: #e68c00; @@ -8800,34 +8778,34 @@ img { background: none; } .ink-navigation ul.pills.red li a { - color: white; + color: #fff; } .ink-navigation ul.pills.red li a:hover { background: #b10f0f; } table.ink-table { - background: white; + background: #fff; } table.ink-table tr th, table.ink-table tr td { - border-bottom: #bbbbbb 1px solid; + border-bottom: #bbb 1px solid; background: none; } table.ink-table tr:last-child td { border-bottom: none; } table.ink-table tfoot tr th, table.ink-table tfoot tr td { - border-top: #bbbbbb 1px solid; + border-top: #bbb 1px solid; } table.ink-table.alternating tbody tr:nth-child(odd) { background-color: whitesmoke; } table.ink-table.hover tbody tr:hover { background: #fefbd6; - color: #555555; + color: #555; } table.ink-table.bordered { - border: #bbbbbb 1px solid; + border: #bbb 1px solid; -webkit-border-radius: 2px; -moz-border-radius: 2px; -ms-border-radius: 2px; @@ -8835,7 +8813,7 @@ table.ink-table.bordered { border-radius: 2px; } table.ink-table.bordered tr th { - border-left: #bbbbbb 1px solid; + border-left: #bbb 1px solid; } table.ink-table.bordered tr th:first-child { border-left: none; @@ -8844,7 +8822,7 @@ table.ink-table.bordered tr:last-child td { border-bottom: none; } table.ink-table.bordered tr td { - border-left: #bbbbbb 1px solid; + border-left: #bbb 1px solid; } table.ink-table.bordered tr td:first-child { border-left: none; @@ -8866,7 +8844,7 @@ table.ink-table tbody > tr.orange td { color: white; } table.ink-table tbody > tr.black td { - background: black; + background: #000; color: #cccccc; } table.ink-table tbody > tr.yellow td { @@ -9002,7 +8980,7 @@ table.ink-table tbody > tr.yellow td { -webkit-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 2px 0; -moz-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 2px 0; box-shadow: rgba(0, 0, 0, 0.4) 0 1px 2px 0; - background: white; + background: #fff; z-index: 10; } .ink-calendar a { @@ -9070,7 +9048,7 @@ html.ink-modal-is-open .ink-calendar { -ms-border-radius: 2px; -o-border-radius: 2px; border-radius: 2px; - color: #444444; + color: #444; } .ink-calendar-month li a:hover, .ink-calendar-year-selector li a:hover, @@ -9083,15 +9061,15 @@ html.ink-modal-is-open .ink-calendar { .ink-calendar-month-selector li a.ink-calendar-on, .ink-calendar-month-selector li a.ink-calendar-on:hover { background: #0069d6; - color: white; + color: #fff; } .ink-calendar-month li a.ink-calendar-off, .ink-calendar-month li a.ink-calendar-off:hover, .ink-calendar-year-selector li a.ink-calendar-off, .ink-calendar-year-selector li a.ink-calendar-off:hover, .ink-calendar-month-selector li a.ink-calendar-off, .ink-calendar-month-selector li a.ink-calendar-off:hover { - background: white; - color: #aaaaaa; + background: #fff; + color: #aaa; cursor: default; } .ink-calendar-month ul, @@ -9270,7 +9248,7 @@ body.ink-drawer.over.right .right-drawer { left: 50%; width: 90%; height: 90%; - background: white; + background: #fff; z-index: 100; position: absolute; overflow: hidden; @@ -9313,7 +9291,7 @@ body.ink-drawer.over.right .right-drawer { .ink-modal > .modal-header > .modal-close, .ink-modal > header > .modal-close { padding-top: 2px; text-align: center; - color: white; + color: #fff; width: 26px; height: 26px; line-height: 1.2em; @@ -9386,7 +9364,7 @@ body.ink-drawer.over.right .right-drawer { height: 100%; line-height: 1.7; text-align: center; - color: black; + color: #000; font-size: 0.813em; z-index: 10; } @@ -9411,27 +9389,27 @@ body.ink-drawer.over.right .right-drawer { } .ink-progress-bar .bar.grey { background: #cccccc; - color: #555555; + color: #555; } .ink-progress-bar .bar.green { background: #4a9b17; - color: white; + color: #fff; } .ink-progress-bar .bar.blue { background: #0f75da; - color: white; + color: #fff; } .ink-progress-bar .bar.red { background: #c91111; - color: white; + color: #fff; } .ink-progress-bar .bar.orange { background: #ff9c00; - color: #555555; + color: #555; } .ink-progress-bar .bar.black { - background: black; - color: white; + background: #000; + color: #fff; } .dragging, .ink-sortable-list li { @@ -9493,10 +9471,10 @@ body.ink-drawer.over.right .right-drawer { background: #f0f0f0; } .ink-tabs .tabs-nav li.active a { - color: #555555; + color: #555; cursor: default; text-decoration: none; - background: white; + background: #fff; border: 1px solid #cccccc; } .ink-tabs .tabs-nav:after { @@ -9688,7 +9666,7 @@ body.ink-drawer.over.right .right-drawer { } .ink-tooltip.blue > .content { background: #0f75da; - color: white; + color: #fff; } .ink-tooltip.blue > .arrow.up { border-bottom-color: #0f75da; @@ -9704,7 +9682,7 @@ body.ink-drawer.over.right .right-drawer { } .ink-tooltip.red > .content { background: #c91111; - color: white; + color: #fff; } .ink-tooltip.red > .arrow.up { border-bottom-color: #c91111; @@ -9720,7 +9698,7 @@ body.ink-drawer.over.right .right-drawer { } .ink-tooltip.orange > .content { background: #ff9c00; - color: white; + color: #fff; } .ink-tooltip.orange > .arrow.up { border-bottom-color: #ff9c00; @@ -9736,7 +9714,7 @@ body.ink-drawer.over.right .right-drawer { } .ink-tooltip.green > .content { background: #4a9b17; - color: white; + color: #fff; } .ink-tooltip.green > .arrow.up { border-bottom-color: #4a9b17; @@ -9751,20 +9729,20 @@ body.ink-drawer.over.right .right-drawer { border-left-color: #4a9b17; } .ink-tooltip.black > .content { - background: black; - color: white; + background: #000; + color: #fff; } .ink-tooltip.black > .arrow.up { - border-bottom-color: black; + border-bottom-color: #000; } .ink-tooltip.black > .arrow.down { - border-top-color: black; + border-top-color: #000; } .ink-tooltip.black > .arrow.left { - border-right-color: black; + border-right-color: #000; } .ink-tooltip.black > .arrow.right { - border-left-color: black; + border-left-color: #000; } .ink-tooltip.grey > .content { background: #cccccc; diff --git a/dist/css/ink-flex.min.css b/dist/css/ink-flex.min.css index 4a8dee633..bfa2a774b 100644 --- a/dist/css/ink-flex.min.css +++ b/dist/css/ink-flex.min.css @@ -1 +1 @@ -@charset "UTF-8";.grid-order{flex:100%}.show-all{display:inherit}.hide-all{display:none!important}.no-margin{margin:0!important}.no-padding{padding:0!important}.push-left{float:left;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;justify-content:flex-start}.push-center{float:none!important;margin-left:auto;margin-right:auto;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center}.push-right{float:right;-webkit-justify-content:flex-end;-moz-justify-content:flex-end;justify-content:flex-end}.align-left{text-align:left}.align-center{text-align:center}.align-right{text-align:right}.clearfix{overflow:hidden;*zoom:1;*zoom:1}.clearfix:after{content:"";display:table;clear:both}html{font-family:sans-serif}html *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}figure{margin:0}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.ink-alert.basic,.ink-alert.block{font-size:.938em;margin:1em 0;position:relative;overflow:hidden}.ink-alert.basic{padding:1em 3em 1em 1em}.ink-alert.basic p{margin:0}.ink-alert.basic .ink-close{top:.55em;*top:.2em}.ink-alert.block{font-size:1em}.ink-alert.block>h4{padding:1em 3em 1em 1em;font-size:.938em;line-height:1.5;margin:0}.ink-alert.block p{margin:1.5em 1em}.ink-alert.block ul{list-style:inside}.ink-alert .ink-dismiss{position:absolute;line-height:.56em;font-size:1.8em;padding:5px;border:0;background:0 0;top:.5em;*top:.2em;right:.4em}.ink-badge{padding:.2em .6em;font-size:.813em;margin-left:.6em}.ink-button{-webkit-appearance:menuitem;padding:8px 12px;cursor:pointer;text-decoration:none;text-align:center;display:inline-block;vertical-align:middle;white-space:nowrap;line-height:normal}.ink-button+.ink-button{margin-left:5px}.button-group{*zoom:1}.button-group>.ink-button{float:left;margin:5px 0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;border-left:0}.button-group>.ink-button:active,.button-group>.ink-button:hover{border-left:0}.button-group>.ink-button:first-child{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px;border-left:1px solid #bfbfbf}.button-group>.ink-button:last-child{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.button-group:after{content:"";display:table;clear:both}.button-toolbar{*zoom:1}.button-toolbar>.button-group{margin-right:10px;float:left}.button-toolbar:after{content:"";display:table;clear:both}.ink-form fieldset{border:0;padding:0;margin:0}.ink-form fieldset legend{font-size:1.438em;font-weight:700;width:100%;border-bottom:1px solid #ddd}.ink-form fieldset legend+*{-webkit-margin-top-collapse:separate;margin:2em 0}.ink-form p.tip{font-size:.875em;color:#909090;position:relative;margin:.2em 0 0 .1em}.ink-form p.label{padding:0;margin:0;color:#555;white-space:normal}.ink-form input[type=color],.ink-form input[type=date],.ink-form input[type=datetime-local],.ink-form input[type=datetime],.ink-form input[type=email],.ink-form input[type=month],.ink-form input[type=number],.ink-form input[type=password],.ink-form input[type=search],.ink-form input[type=tel],.ink-form input[type=text],.ink-form input[type=time],.ink-form input[type=url],.ink-form input[type=week],.ink-form select,.ink-form textarea{font-family:Roboto,Arial,Helvetica,sans-serif;font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;padding:8px 6px;border:1px solid #c6c6c6;resize:none;background:#fff;vertical-align:middle}.ink-form input[type=color]:focus,.ink-form input[type=date]:focus,.ink-form input[type=datetime-local]:focus,.ink-form input[type=datetime]:focus,.ink-form input[type=email]:focus,.ink-form input[type=month]:focus,.ink-form input[type=number]:focus,.ink-form input[type=password]:focus,.ink-form input[type=search]:focus,.ink-form input[type=tel]:focus,.ink-form input[type=text]:focus,.ink-form input[type=time]:focus,.ink-form input[type=url]:focus,.ink-form input[type=week]:focus,.ink-form select:focus,.ink-form textarea:focus{border-color:rgba(153,153,153,.9);-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;outline:0 none}.ink-form input[type=color]:disabled,.ink-form input[type=date]:disabled,.ink-form input[type=datetime-local]:disabled,.ink-form input[type=datetime]:disabled,.ink-form input[type=email]:disabled,.ink-form input[type=month]:disabled,.ink-form input[type=number]:disabled,.ink-form input[type=password]:disabled,.ink-form input[type=search]:disabled,.ink-form input[type=tel]:disabled,.ink-form input[type=text]:disabled,.ink-form input[type=time]:disabled,.ink-form input[type=url]:disabled,.ink-form input[type=week]:disabled,.ink-form select:disabled,.ink-form textarea:disabled{background:#f2f2f2;cursor:not-allowed}.ink-form .input-file{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;padding:6px;border:1px solid #c6c6c6;background:#fff;vertical-align:middle;line-height:1.2}.ink-form .input-file input[type=file]{-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;border:0;padding:0;background:0 0;width:100%}.ink-form .ink-button{margin:0 5px}.ink-form label{cursor:pointer}.ink-form select{line-height:2;cursor:pointer}.ink-form textarea{min-height:5em}.ink-form .control-group{line-height:2;margin-bottom:1em;*zoom:1}.ink-form .control-group:after{content:"";display:table;clear:both}.ink-form .control-group .control{position:relative;*zoom:1}.ink-form .control-group .control:after{content:"";display:table;clear:both}.ink-form .control-group .control>li{position:relative;*zoom:1}.ink-form .control-group .control>li:after{content:"";display:table;clear:both}.ink-form .control-group .control>input,.ink-form .control-group .control>select,.ink-form .control-group .control>textarea{width:100%}.ink-form .control-group .control>input+[class*=fa-],.ink-form .control-group .control>input+[class^=fa-],.ink-form .control-group .control>select+[class*=fa-],.ink-form .control-group .control>select+[class^=fa-],.ink-form .control-group .control>textarea+[class*=fa-],.ink-form .control-group .control>textarea+[class^=fa-]{display:none}.ink-form .control-group .control.append-button span,.ink-form .control-group .control.append-symbol span,.ink-form .control-group .control.prepend-button span,.ink-form .control-group .control.prepend-symbol span{width:100%;position:relative}.ink-form .control-group .control.append-button span>input,.ink-form .control-group .control.append-button span>select,.ink-form .control-group .control.append-button span>textarea,.ink-form .control-group .control.append-symbol span>input,.ink-form .control-group .control.append-symbol span>select,.ink-form .control-group .control.append-symbol span>textarea,.ink-form .control-group .control.prepend-button span>input,.ink-form .control-group .control.prepend-button span>select,.ink-form .control-group .control.prepend-button span>textarea,.ink-form .control-group .control.prepend-symbol span>input,.ink-form .control-group .control.prepend-symbol span>select,.ink-form .control-group .control.prepend-symbol span>textarea{width:100%}.ink-form .control-group .control.append-button>input[type=button],.ink-form .control-group .control.append-button>input[type=reset],.ink-form .control-group .control.append-button>input[type=submit],.ink-form .control-group .control.append-symbol>input[type=button],.ink-form .control-group .control.append-symbol>input[type=reset],.ink-form .control-group .control.append-symbol>input[type=submit],.ink-form .control-group .control.prepend-button>input[type=button],.ink-form .control-group .control.prepend-button>input[type=reset],.ink-form .control-group .control.prepend-button>input[type=submit],.ink-form .control-group .control.prepend-symbol>input[type=button],.ink-form .control-group .control.prepend-symbol>input[type=reset],.ink-form .control-group .control.prepend-symbol>input[type=submit]{width:auto}.ink-form .control-group .control.append-button{display:-webkit-flex;display:flex;display:-ms-flexbox}.ink-form .control-group .control.append-button span>input,.ink-form .control-group .control.append-button span>select,.ink-form .control-group .control.append-button span>textarea{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-form .control-group .control.append-button .ink-button{margin:0;-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0;border-left:0}.ink-form .control-group .control.prepend-button{display:-webkit-flex;display:flex;display:-ms-flexbox}.ink-form .control-group .control.prepend-button span>input,.ink-form .control-group .control.prepend-button span>select,.ink-form .control-group .control.prepend-button span>textarea{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-form .control-group .control.prepend-button .ink-button{margin:0;-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px;border-right:0}.ink-form .control-group .control.append-symbol span{display:block}.ink-form .control-group .control.append-symbol span>input,.ink-form .control-group .control.append-symbol span>select,.ink-form .control-group .control.append-symbol span>textarea{padding-right:2.5em}.ink-form .control-group .control.append-symbol span>[class*=" fa-"],.ink-form .control-group .control.append-symbol span>[class^=fa-]{position:absolute;right:1em;top:.86em;pointer-events:none}.ink-form .control-group .control.prepend-symbol span{display:block}.ink-form .control-group .control.prepend-symbol span>input,.ink-form .control-group .control.prepend-symbol span>select,.ink-form .control-group .control.prepend-symbol span>textarea{padding-left:2.5em}.ink-form .control-group .control.prepend-symbol span>[class*=" fa-"],.ink-form .control-group .control.prepend-symbol span>[class^=fa-]{position:absolute;left:1em;top:.86em;pointer-events:none}.ink-form .control-group input[type=checkbox],.ink-form .control-group input[type=radio]{position:absolute;border:0;cursor:pointer}.ink-form .control-group input[type=checkbox]+label,.ink-form .control-group input[type=radio]+label{margin-top:-.28em;padding-left:1.25em;vertical-align:super;display:inline-block}.ink-form .control-group .inline li{padding:0}.ink-form .control-group .inline li label{margin-right:1em}.ink-form .control-group.validation.error input,.ink-form .control-group.validation.error select,.ink-form .control-group.validation.error textarea{outline:0;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;border:1px solid rgba(200,10,16,.5)}.ink-form .control-group.validation.error p.tip{color:rgba(150,7,12,.55)}.ink-form .control-group.validation.warning input,.ink-form .control-group.validation.warning select,.ink-form .control-group.validation.warning textarea{outline:0;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;border:1px solid rgba(255,156,0,.6)}.ink-form .control-group.validation.warning p.tip{color:rgba(204,125,0,.6)}.ink-form .control-group.required label,.ink-form .control-group.required p.label{color:#555}.ink-form .control-group.required label:after,.ink-form .control-group.required p.label:after{content:"\f069";color:#c91111;margin-left:.6em;font-family:FontAwesome;font-size:.75em;width:1.25em}.ink-form .control-group.required ul.control label:after{content:""}.ink-grid{width:auto;max-width:1440px;margin:0 auto}.order-1{order:1;-ms-flex-order:1}.order-2{order:2;-ms-flex-order:2}.order-3{order:3;-ms-flex-order:3}.order-4{order:4;-ms-flex-order:4}.order-5{order:5;-ms-flex-order:5}.order-6{order:6;-ms-flex-order:6}.order-7{order:7;-ms-flex-order:7}.order-8{order:8;-ms-flex-order:8}.order-9{order:9;-ms-flex-order:9}.order-10{order:10;-ms-flex-order:10}.all-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}@media screen and (min-width:1261px){.ink-grid{padding:0 2em}.column-group.gutters{margin-left:-2em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}.column-group.horizontal-gutters{margin-left:-2em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=xlarge-]{padding-left:2em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=xlarge-]{margin-bottom:2em}.column-group.double-gutters{margin-left:-4em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}.column-group.double-horizontal-gutters{margin-left:-4em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}.column-group.half-gutters{margin-left:-1em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}.column-group.half-horizontal-gutters{margin-left:-1em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}.column-group.quarter-gutters{margin-left:-.5em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}.column-group.quarter-horizontal-gutters{margin-left:-.5em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}.column-group.xlarge-gutters{margin-left:-2em}.column-group.xlarge-gutters>.all-auto,.column-group.xlarge-gutters>[class*=all-],.column-group.xlarge-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}.column-group.xlarge-horizontal-gutters{margin-left:-2em}.column-group.xlarge-horizontal-gutters>.all-auto,.column-group.xlarge-horizontal-gutters>[class*=all-],.column-group.xlarge-horizontal-gutters>[class*=xlarge-]{padding-left:2em}.column-group.xlarge-vertical-gutters>.all-auto,.column-group.xlarge-vertical-gutters>[class*=all-],.column-group.xlarge-vertical-gutters>[class*=xlarge-]{margin-bottom:2em}.column-group.xlarge-double-gutters{margin-left:-4em}.column-group.xlarge-double-gutters>.all-auto,.column-group.xlarge-double-gutters>[class*=all-],.column-group.xlarge-double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}.column-group.xlarge-double-horizontal-gutters{margin-left:-4em}.column-group.xlarge-double-horizontal-gutters>.all-auto,.column-group.xlarge-double-horizontal-gutters>[class*=all-],.column-group.xlarge-double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}.column-group.xlarge-double-vertical-gutters>.all-auto,.column-group.xlarge-double-vertical-gutters>[class*=all-],.column-group.xlarge-double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}.column-group.xlarge-half-gutters{margin-left:-1em}.column-group.xlarge-half-gutters>.all-auto,.column-group.xlarge-half-gutters>[class*=all-],.column-group.xlarge-half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}.column-group.xlarge-half-horizontal-gutters{margin-left:-1em}.column-group.xlarge-half-horizontal-gutters>.all-auto,.column-group.xlarge-half-horizontal-gutters>[class*=all-],.column-group.xlarge-half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}.column-group.xlarge-half-vertical-gutters>.all-auto,.column-group.xlarge-half-vertical-gutters>[class*=all-],.column-group.xlarge-half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}.column-group.xlarge-quarter-gutters{margin-left:-.5em}.column-group.xlarge-quarter-gutters>.all-auto,.column-group.xlarge-quarter-gutters>[class*=all-],.column-group.xlarge-quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}.column-group.xlarge-quarter-horizontal-gutters{margin-left:-.5em}.column-group.xlarge-quarter-horizontal-gutters>.all-auto,.column-group.xlarge-quarter-horizontal-gutters>[class*=all-],.column-group.xlarge-quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}.column-group.xlarge-quarter-vertical-gutters>.all-auto,.column-group.xlarge-quarter-vertical-gutters>[class*=all-],.column-group.xlarge-quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}.column-group.xlarge-no-gutters{margin-left:0}.column-group.xlarge-no-gutters>.all-auto,.column-group.xlarge-no-gutters>[class*=all-],.column-group.xlarge-no-gutters>[class*=xlarge-]{padding-left:0;margin-bottom:0}.xlarge-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.reverse,.column-group.xlarge-reverse,.ink-flex.reverse,.ink-flex.xlarge-reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.vertical,.column-group.xlarge-vertical,.ink-flex.vertical,.ink-flex.xlarge-vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.vertical.reverse,.column-group.xlarge-vertical.xlarge-reverse,.ink-flex.vertical.reverse,.ink-flex.xlarge-vertical.xlarge-reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.xlarge-order-1{order:1;-ms-flex-order:1}.xlarge-order-2{order:2;-ms-flex-order:2}.xlarge-order-3{order:3;-ms-flex-order:3}.xlarge-order-4{order:4;-ms-flex-order:4}.xlarge-order-5{order:5;-ms-flex-order:5}.xlarge-order-6{order:6;-ms-flex-order:6}.xlarge-order-7{order:7;-ms-flex-order:7}.xlarge-order-8{order:8;-ms-flex-order:8}.xlarge-order-9{order:9;-ms-flex-order:9}.xlarge-order-10{order:10;-ms-flex-order:10}.column-group .xlarge-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.push-top,.xlarge-push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.push-bottom,.xlarge-push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.push-middle,.xlarge-push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.push-left,.xlarge-push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.push-center,.xlarge-push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.push-right,.xlarge-push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.xlarge-align-left{text-align:left}.xlarge-align-center{text-align:center}.xlarge-align-right{text-align:right}.space,.xlarge-space{margin:2em}.padding,.xlarge-padding{padding:2em}.double-space,.xlarge-double-space{margin:4em}.double-padding,.xlarge-double-padding{padding:4em}.half-space,.xlarge-half-space{margin:1em}.half-padding,.xlarge-half-padding{padding:1em}.quarter-space,.xlarge-quarter-space{margin:.5em}.quarter-padding,.xlarge-quarter-padding{padding:.5em}.vertical-space,.xlarge-vertical-space{margin-top:2em;margin-bottom:2em}.vertical-padding,.xlarge-vertical-padding{padding-top:2em;padding-bottom:2em}.double-vertical-space,.xlarge-double-vertical-space{margin-top:4em;margin-bottom:4em}.double-vertical-padding,.xlarge-double-vertical-padding{padding-top:4em;padding-bottom:4em}.half-vertical-space,.xlarge-half-vertical-space{margin-top:1em;margin-bottom:1em}.half-vertical-padding,.xlarge-half-vertical-padding{padding-top:1em;padding-bottom:1em}.quarter-vertical-space,.xlarge-quarter-vertical-space{margin-top:.5em;margin-bottom:.5em}.quarter-vertical-padding,.xlarge-quarter-vertical-padding{padding-top:.5em;padding-bottom:.5em}.horizontal-space,.xlarge-horizontal-space{margin-left:2em;margin-right:2em}.horizontal-padding,.xlarge-horizontal-padding{padding-left:2em;padding-right:2em}.double-horizontal-space,.xlarge-double-horizontal-space{margin-left:4em;margin-right:4em}.double-horizontal-padding,.xlarge-double-horizontal-padding{padding-left:4em;padding-right:4em}.half-horizontal-space,.xlarge-half-horizontal-space{margin-left:1em;margin-right:1em}.half-horizontal-padding,.xlarge-half-horizontal-padding{padding-left:1em;padding-right:1em}.quarter-horizontal-space,.xlarge-quarter-horizontal-space{margin-left:.5em;margin-right:.5em}.quarter-horizontal-padding,.xlarge-quarter-horizontal-padding{padding-left:.5em;padding-right:.5em}.top-space,.xlarge-top-space{margin-top:2em}.top-padding,.xlarge-top-padding{padding-top:2em}.double-top-space,.xlarge-double-top-space{margin-top:4em}.double-top-padding,.xlarge-double-top-padding{padding-top:4em}.half-top-space,.xlarge-half-top-space{margin-top:1em}.half-top-padding,.xlarge-half-top-padding{padding-top:1em}.quarter-top-space,.xlarge-quarter-top-space{margin-top:.5em}.quarter-top-padding,.xlarge-quarter-top-padding{padding-top:.5em}.right-space,.xlarge-right-space{margin-right:2em}.right-padding,.xlarge-right-padding{padding-right:2em}.double-right-space,.xlarge-double-right-space{margin-right:4em}.double-right-padding,.xlarge-double-right-padding{padding-right:4em}.half-right-space,.xlarge-half-right-space{margin-right:1em}.half-right-padding,.xlarge-half-right-padding{padding-right:1em}.quarter-right-space,.xlarge-quarter-right-space{margin-right:.5em}.quarter-right-padding,.xlarge-quarter-right-padding{padding-right:.5em}.bottom-space,.xlarge-bottom-space{margin-bottom:2em}.bottom-padding,.xlarge-bottom-padding{padding-bottom:2em}.double-bottom-space,.xlarge-double-bottom-space{margin-bottom:4em}.double-bottom-padding,.xlarge-double-bottom-padding{padding-bottom:4em}.half-bottom-space,.xlarge-half-bottom-space{margin-bottom:1em}.half-bottom-padding,.xlarge-half-bottom-padding{padding-bottom:1em}.quarter-bottom-space,.xlarge-quarter-bottom-space{margin-bottom:.5em}.quarter-bottom-padding,.xlarge-quarter-bottom-padding{padding-bottom:.5em}.left-space,.xlarge-left-space{margin-left:2em}.left-padding,.xlarge-left-padding{padding-left:2em}.double-left-space,.xlarge-double-left-space{margin-left:4em}.double-left-padding,.xlarge-double-left-padding{padding-left:4em}.half-left-space,.xlarge-half-left-space{margin-left:1em}.half-left-padding,.xlarge-half-left-padding{padding-left:1em}.quarter-left-space,.xlarge-quarter-left-space{margin-left:.5em}.quarter-left-padding,.xlarge-quarter-left-padding{padding-left:.5em}.hide-xlarge{display:none!important}.show-xlarge{display:inherit!important}table.show-xlarge{display:table}thead.show-xlarge{display:table-header-group}tbody.show-xlarge{display:table-row-group}tfoot.show-xlarge{display:table-footer-group}tr.show-xlarge{display:table-row}td.show-xlarge,th.show-xlarge{display:table-cell}}@media screen and (min-width:961px) and (max-width:1260px){.ink-grid{padding:0 1.75em}.column-group.gutters{margin-left:-1.75em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.horizontal-gutters{margin-left:-1.75em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.double-gutters{margin-left:-3.5em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.double-horizontal-gutters{margin-left:-3.5em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.half-gutters{margin-left:-.875em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.half-horizontal-gutters{margin-left:-.875em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.quarter-gutters{margin-left:-.4375em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.quarter-horizontal-gutters{margin-left:-.4375em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-gutters{margin-left:-1.75em}.column-group.large-gutters>.all-auto,.column-group.large-gutters>[class*=all-],.column-group.large-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.large-horizontal-gutters{margin-left:-1.75em}.column-group.large-horizontal-gutters>.all-auto,.column-group.large-horizontal-gutters>[class*=all-],.column-group.large-horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.large-vertical-gutters>.all-auto,.column-group.large-vertical-gutters>[class*=all-],.column-group.large-vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.large-double-gutters{margin-left:-3.5em}.column-group.large-double-gutters>.all-auto,.column-group.large-double-gutters>[class*=all-],.column-group.large-double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.large-double-horizontal-gutters{margin-left:-3.5em}.column-group.large-double-horizontal-gutters>.all-auto,.column-group.large-double-horizontal-gutters>[class*=all-],.column-group.large-double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.large-double-vertical-gutters>.all-auto,.column-group.large-double-vertical-gutters>[class*=all-],.column-group.large-double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.large-half-gutters{margin-left:-.875em}.column-group.large-half-gutters>.all-auto,.column-group.large-half-gutters>[class*=all-],.column-group.large-half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.large-half-horizontal-gutters{margin-left:-.875em}.column-group.large-half-horizontal-gutters>.all-auto,.column-group.large-half-horizontal-gutters>[class*=all-],.column-group.large-half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.large-half-vertical-gutters>.all-auto,.column-group.large-half-vertical-gutters>[class*=all-],.column-group.large-half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.large-quarter-gutters{margin-left:-.4375em}.column-group.large-quarter-gutters>.all-auto,.column-group.large-quarter-gutters>[class*=all-],.column-group.large-quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.large-quarter-horizontal-gutters{margin-left:-.4375em}.column-group.large-quarter-horizontal-gutters>.all-auto,.column-group.large-quarter-horizontal-gutters>[class*=all-],.column-group.large-quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.large-quarter-vertical-gutters>.all-auto,.column-group.large-quarter-vertical-gutters>[class*=all-],.column-group.large-quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-no-gutters{margin-left:0}.column-group.large-no-gutters>.all-auto,.column-group.large-no-gutters>[class*=all-],.column-group.large-no-gutters>[class*=large-]{padding-left:0;margin-bottom:0}.large-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.large-reverse,.column-group.reverse,.ink-flex.large-reverse,.ink-flex.reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.large-vertical,.column-group.vertical,.ink-flex.large-vertical,.ink-flex.vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.large-vertical.large-reverse,.column-group.vertical.reverse,.ink-flex.large-vertical.large-reverse,.ink-flex.vertical.reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.large-order-1{order:1;-ms-flex-order:1}.large-order-2{order:2;-ms-flex-order:2}.large-order-3{order:3;-ms-flex-order:3}.large-order-4{order:4;-ms-flex-order:4}.large-order-5{order:5;-ms-flex-order:5}.large-order-6{order:6;-ms-flex-order:6}.large-order-7{order:7;-ms-flex-order:7}.large-order-8{order:8;-ms-flex-order:8}.large-order-9{order:9;-ms-flex-order:9}.large-order-10{order:10;-ms-flex-order:10}.column-group .large-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.large-push-top,.push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.large-push-bottom,.push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.large-push-middle,.push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.large-push-left,.push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.large-push-center,.push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.large-push-right,.push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.large-align-left{text-align:left}.large-align-center{text-align:center}.large-align-right{text-align:right}.large-space,.space{margin:1.75em}.large-padding,.padding{padding:1.75em}.double-space,.large-double-space{margin:3.5em}.double-padding,.large-double-padding{padding:3.5em}.half-space,.large-half-space{margin:.875em}.half-padding,.large-half-padding{padding:.875em}.large-quarter-space,.quarter-space{margin:.4375em}.large-quarter-padding,.quarter-padding{padding:.4375em}.large-vertical-space,.vertical-space{margin-top:1.75em;margin-bottom:1.75em}.large-vertical-padding,.vertical-padding{padding-top:1.75em;padding-bottom:1.75em}.double-vertical-space,.large-double-vertical-space{margin-top:3.5em;margin-bottom:3.5em}.double-vertical-padding,.large-double-vertical-padding{padding-top:3.5em;padding-bottom:3.5em}.half-vertical-space,.large-half-vertical-space{margin-top:.875em;margin-bottom:.875em}.half-vertical-padding,.large-half-vertical-padding{padding-top:.875em;padding-bottom:.875em}.large-quarter-vertical-space,.quarter-vertical-space{margin-top:.4375em;margin-bottom:.4375em}.large-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.4375em;padding-bottom:.4375em}.horizontal-space,.large-horizontal-space{margin-left:1.75em;margin-right:1.75em}.horizontal-padding,.large-horizontal-padding{padding-left:1.75em;padding-right:1.75em}.double-horizontal-space,.large-double-horizontal-space{margin-left:3.5em;margin-right:3.5em}.double-horizontal-padding,.large-double-horizontal-padding{padding-left:3.5em;padding-right:3.5em}.half-horizontal-space,.large-half-horizontal-space{margin-left:.875em;margin-right:.875em}.half-horizontal-padding,.large-half-horizontal-padding{padding-left:.875em;padding-right:.875em}.large-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.4375em;margin-right:.4375em}.large-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.4375em;padding-right:.4375em}.large-top-space,.top-space{margin-top:1.75em}.large-top-padding,.top-padding{padding-top:1.75em}.double-top-space,.large-double-top-space{margin-top:3.5em}.double-top-padding,.large-double-top-padding{padding-top:3.5em}.half-top-space,.large-half-top-space{margin-top:.875em}.half-top-padding,.large-half-top-padding{padding-top:.875em}.large-quarter-top-space,.quarter-top-space{margin-top:.4375em}.large-quarter-top-padding,.quarter-top-padding{padding-top:.4375em}.large-right-space,.right-space{margin-right:1.75em}.large-right-padding,.right-padding{padding-right:1.75em}.double-right-space,.large-double-right-space{margin-right:3.5em}.double-right-padding,.large-double-right-padding{padding-right:3.5em}.half-right-space,.large-half-right-space{margin-right:.875em}.half-right-padding,.large-half-right-padding{padding-right:.875em}.large-quarter-right-space,.quarter-right-space{margin-right:.4375em}.large-quarter-right-padding,.quarter-right-padding{padding-right:.4375em}.bottom-space,.large-bottom-space{margin-bottom:1.75em}.bottom-padding,.large-bottom-padding{padding-bottom:1.75em}.double-bottom-space,.large-double-bottom-space{margin-bottom:3.5em}.double-bottom-padding,.large-double-bottom-padding{padding-bottom:3.5em}.half-bottom-space,.large-half-bottom-space{margin-bottom:.875em}.half-bottom-padding,.large-half-bottom-padding{padding-bottom:.875em}.large-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.4375em}.large-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.4375em}.large-left-space,.left-space{margin-left:1.75em}.large-left-padding,.left-padding{padding-left:1.75em}.double-left-space,.large-double-left-space{margin-left:3.5em}.double-left-padding,.large-double-left-padding{padding-left:3.5em}.half-left-space,.large-half-left-space{margin-left:.875em}.half-left-padding,.large-half-left-padding{padding-left:.875em}.large-quarter-left-space,.quarter-left-space{margin-left:.4375em}.large-quarter-left-padding,.quarter-left-padding{padding-left:.4375em}.hide-large{display:none!important}.show-large{display:inherit!important}table.show-large{display:table}thead.show-large{display:table-header-group}tbody.show-large{display:table-row-group}tfoot.show-large{display:table-footer-group}tr.show-large{display:table-row}td.show-large,th.show-large{display:table-cell}}@media screen and (min-width:641px) and (max-width:960px){.ink-grid{padding:0 1.5em}.column-group.gutters{margin-left:-1.5em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}.column-group.horizontal-gutters{margin-left:-1.5em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=medium-]{padding-left:1.5em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=medium-]{margin-bottom:1.5em}.column-group.double-gutters{margin-left:-3em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}.column-group.double-horizontal-gutters{margin-left:-3em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=medium-]{padding-left:3em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=medium-]{margin-bottom:3em}.column-group.half-gutters{margin-left:-.75em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}.column-group.half-horizontal-gutters{margin-left:-.75em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=medium-]{padding-left:.75em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}.column-group.quarter-gutters{margin-left:-.375em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}.column-group.quarter-horizontal-gutters{margin-left:-.375em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}.column-group.medium-gutters{margin-left:-1.5em}.column-group.medium-gutters>.all-auto,.column-group.medium-gutters>[class*=all-],.column-group.medium-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}.column-group.medium-horizontal-gutters{margin-left:-1.5em}.column-group.medium-horizontal-gutters>.all-auto,.column-group.medium-horizontal-gutters>[class*=all-],.column-group.medium-horizontal-gutters>[class*=medium-]{padding-left:1.5em}.column-group.medium-vertical-gutters>.all-auto,.column-group.medium-vertical-gutters>[class*=all-],.column-group.medium-vertical-gutters>[class*=medium-]{margin-bottom:1.5em}.column-group.medium-double-gutters{margin-left:-3em}.column-group.medium-double-gutters>.all-auto,.column-group.medium-double-gutters>[class*=all-],.column-group.medium-double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}.column-group.medium-double-horizontal-gutters{margin-left:-3em}.column-group.medium-double-horizontal-gutters>.all-auto,.column-group.medium-double-horizontal-gutters>[class*=all-],.column-group.medium-double-horizontal-gutters>[class*=medium-]{padding-left:3em}.column-group.medium-double-vertical-gutters>.all-auto,.column-group.medium-double-vertical-gutters>[class*=all-],.column-group.medium-double-vertical-gutters>[class*=medium-]{margin-bottom:3em}.column-group.medium-half-gutters{margin-left:-.75em}.column-group.medium-half-gutters>.all-auto,.column-group.medium-half-gutters>[class*=all-],.column-group.medium-half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}.column-group.medium-half-horizontal-gutters{margin-left:-.75em}.column-group.medium-half-horizontal-gutters>.all-auto,.column-group.medium-half-horizontal-gutters>[class*=all-],.column-group.medium-half-horizontal-gutters>[class*=medium-]{padding-left:.75em}.column-group.medium-half-vertical-gutters>.all-auto,.column-group.medium-half-vertical-gutters>[class*=all-],.column-group.medium-half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}.column-group.medium-quarter-gutters{margin-left:-.375em}.column-group.medium-quarter-gutters>.all-auto,.column-group.medium-quarter-gutters>[class*=all-],.column-group.medium-quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}.column-group.medium-quarter-horizontal-gutters{margin-left:-.375em}.column-group.medium-quarter-horizontal-gutters>.all-auto,.column-group.medium-quarter-horizontal-gutters>[class*=all-],.column-group.medium-quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}.column-group.medium-quarter-vertical-gutters>.all-auto,.column-group.medium-quarter-vertical-gutters>[class*=all-],.column-group.medium-quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}.column-group.medium-no-gutters{margin-left:0}.column-group.medium-no-gutters>.all-auto,.column-group.medium-no-gutters>[class*=all-],.column-group.medium-no-gutters>[class*=medium-]{padding-left:0;margin-bottom:0}.medium-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.medium-reverse,.column-group.reverse,.ink-flex.medium-reverse,.ink-flex.reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.medium-vertical,.column-group.vertical,.ink-flex.medium-vertical,.ink-flex.vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.medium-vertical.medium-reverse,.column-group.vertical.reverse,.ink-flex.medium-vertical.medium-reverse,.ink-flex.vertical.reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.medium-order-1{order:1;-ms-flex-order:1}.medium-order-2{order:2;-ms-flex-order:2}.medium-order-3{order:3;-ms-flex-order:3}.medium-order-4{order:4;-ms-flex-order:4}.medium-order-5{order:5;-ms-flex-order:5}.medium-order-6{order:6;-ms-flex-order:6}.medium-order-7{order:7;-ms-flex-order:7}.medium-order-8{order:8;-ms-flex-order:8}.medium-order-9{order:9;-ms-flex-order:9}.medium-order-10{order:10;-ms-flex-order:10}.column-group .medium-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.medium-push-top,.push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.medium-push-bottom,.push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.medium-push-middle,.push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.medium-push-left,.push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.medium-push-center,.push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.medium-push-right,.push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.medium-align-left{text-align:left}.medium-align-center{text-align:center}.medium-align-right{text-align:right}.medium-space,.space{margin:1.5em}.medium-padding,.padding{padding:1.5em}.double-space,.medium-double-space{margin:3em}.double-padding,.medium-double-padding{padding:3em}.half-space,.medium-half-space{margin:.75em}.half-padding,.medium-half-padding{padding:.75em}.medium-quarter-space,.quarter-space{margin:.375em}.medium-quarter-padding,.quarter-padding{padding:.375em}.medium-vertical-space,.vertical-space{margin-top:1.5em;margin-bottom:1.5em}.medium-vertical-padding,.vertical-padding{padding-top:1.5em;padding-bottom:1.5em}.double-vertical-space,.medium-double-vertical-space{margin-top:3em;margin-bottom:3em}.double-vertical-padding,.medium-double-vertical-padding{padding-top:3em;padding-bottom:3em}.half-vertical-space,.medium-half-vertical-space{margin-top:.75em;margin-bottom:.75em}.half-vertical-padding,.medium-half-vertical-padding{padding-top:.75em;padding-bottom:.75em}.medium-quarter-vertical-space,.quarter-vertical-space{margin-top:.375em;margin-bottom:.375em}.medium-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.375em;padding-bottom:.375em}.horizontal-space,.medium-horizontal-space{margin-left:1.5em;margin-right:1.5em}.horizontal-padding,.medium-horizontal-padding{padding-left:1.5em;padding-right:1.5em}.double-horizontal-space,.medium-double-horizontal-space{margin-left:3em;margin-right:3em}.double-horizontal-padding,.medium-double-horizontal-padding{padding-left:3em;padding-right:3em}.half-horizontal-space,.medium-half-horizontal-space{margin-left:.75em;margin-right:.75em}.half-horizontal-padding,.medium-half-horizontal-padding{padding-left:.75em;padding-right:.75em}.medium-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.375em;margin-right:.375em}.medium-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.375em;padding-right:.375em}.medium-top-space,.top-space{margin-top:1.5em}.medium-top-padding,.top-padding{padding-top:1.5em}.double-top-space,.medium-double-top-space{margin-top:3em}.double-top-padding,.medium-double-top-padding{padding-top:3em}.half-top-space,.medium-half-top-space{margin-top:.75em}.half-top-padding,.medium-half-top-padding{padding-top:.75em}.medium-quarter-top-space,.quarter-top-space{margin-top:.375em}.medium-quarter-top-padding,.quarter-top-padding{padding-top:.375em}.medium-right-space,.right-space{margin-right:1.5em}.medium-right-padding,.right-padding{padding-right:1.5em}.double-right-space,.medium-double-right-space{margin-right:3em}.double-right-padding,.medium-double-right-padding{padding-right:3em}.half-right-space,.medium-half-right-space{margin-right:.75em}.half-right-padding,.medium-half-right-padding{padding-right:.75em}.medium-quarter-right-space,.quarter-right-space{margin-right:.375em}.medium-quarter-right-padding,.quarter-right-padding{padding-right:.375em}.bottom-space,.medium-bottom-space{margin-bottom:1.5em}.bottom-padding,.medium-bottom-padding{padding-bottom:1.5em}.double-bottom-space,.medium-double-bottom-space{margin-bottom:3em}.double-bottom-padding,.medium-double-bottom-padding{padding-bottom:3em}.half-bottom-space,.medium-half-bottom-space{margin-bottom:.75em}.half-bottom-padding,.medium-half-bottom-padding{padding-bottom:.75em}.medium-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.375em}.medium-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.375em}.left-space,.medium-left-space{margin-left:1.5em}.left-padding,.medium-left-padding{padding-left:1.5em}.double-left-space,.medium-double-left-space{margin-left:3em}.double-left-padding,.medium-double-left-padding{padding-left:3em}.half-left-space,.medium-half-left-space{margin-left:.75em}.half-left-padding,.medium-half-left-padding{padding-left:.75em}.medium-quarter-left-space,.quarter-left-space{margin-left:.375em}.medium-quarter-left-padding,.quarter-left-padding{padding-left:.375em}.hide-medium{display:none!important}.show-medium{display:inherit!important}table.show-medium{display:table}thead.show-medium{display:table-header-group}tbody.show-medium{display:table-row-group}tfoot.show-medium{display:table-footer-group}tr.show-medium{display:table-row}td.show-medium,th.show-medium{display:table-cell}}@media screen and (min-width:321px) and (max-width:640px){.ink-grid{padding:0 1.25em}.column-group.gutters{margin-left:-1.25em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}.column-group.horizontal-gutters{margin-left:-1.25em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=small-]{padding-left:1.25em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=small-]{margin-bottom:1.25em}.column-group.double-gutters{margin-left:-2.5em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}.column-group.double-horizontal-gutters{margin-left:-2.5em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=small-]{padding-left:2.5em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}.column-group.half-gutters{margin-left:-.625em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}.column-group.half-horizontal-gutters{margin-left:-.625em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=small-]{padding-left:.625em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=small-]{margin-bottom:.625em}.column-group.quarter-gutters{margin-left:-.3125em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}.column-group.quarter-horizontal-gutters{margin-left:-.3125em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}.column-group.small-gutters{margin-left:-1.25em}.column-group.small-gutters>.all-auto,.column-group.small-gutters>[class*=all-],.column-group.small-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}.column-group.small-horizontal-gutters{margin-left:-1.25em}.column-group.small-horizontal-gutters>.all-auto,.column-group.small-horizontal-gutters>[class*=all-],.column-group.small-horizontal-gutters>[class*=small-]{padding-left:1.25em}.column-group.small-vertical-gutters>.all-auto,.column-group.small-vertical-gutters>[class*=all-],.column-group.small-vertical-gutters>[class*=small-]{margin-bottom:1.25em}.column-group.small-double-gutters{margin-left:-2.5em}.column-group.small-double-gutters>.all-auto,.column-group.small-double-gutters>[class*=all-],.column-group.small-double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}.column-group.small-double-horizontal-gutters{margin-left:-2.5em}.column-group.small-double-horizontal-gutters>.all-auto,.column-group.small-double-horizontal-gutters>[class*=all-],.column-group.small-double-horizontal-gutters>[class*=small-]{padding-left:2.5em}.column-group.small-double-vertical-gutters>.all-auto,.column-group.small-double-vertical-gutters>[class*=all-],.column-group.small-double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}.column-group.small-half-gutters{margin-left:-.625em}.column-group.small-half-gutters>.all-auto,.column-group.small-half-gutters>[class*=all-],.column-group.small-half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}.column-group.small-half-horizontal-gutters{margin-left:-.625em}.column-group.small-half-horizontal-gutters>.all-auto,.column-group.small-half-horizontal-gutters>[class*=all-],.column-group.small-half-horizontal-gutters>[class*=small-]{padding-left:.625em}.column-group.small-half-vertical-gutters>.all-auto,.column-group.small-half-vertical-gutters>[class*=all-],.column-group.small-half-vertical-gutters>[class*=small-]{margin-bottom:.625em}.column-group.small-quarter-gutters{margin-left:-.3125em}.column-group.small-quarter-gutters>.all-auto,.column-group.small-quarter-gutters>[class*=all-],.column-group.small-quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}.column-group.small-quarter-horizontal-gutters{margin-left:-.3125em}.column-group.small-quarter-horizontal-gutters>.all-auto,.column-group.small-quarter-horizontal-gutters>[class*=all-],.column-group.small-quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}.column-group.small-quarter-vertical-gutters>.all-auto,.column-group.small-quarter-vertical-gutters>[class*=all-],.column-group.small-quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}.column-group.small-no-gutters{margin-left:0}.column-group.small-no-gutters>.all-auto,.column-group.small-no-gutters>[class*=all-],.column-group.small-no-gutters>[class*=small-]{padding-left:0;margin-bottom:0}.small-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.reverse,.column-group.small-reverse,.ink-flex.reverse,.ink-flex.small-reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.small-vertical,.column-group.vertical,.ink-flex.small-vertical,.ink-flex.vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.small-vertical.small-reverse,.column-group.vertical.reverse,.ink-flex.small-vertical.small-reverse,.ink-flex.vertical.reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.small-order-1{order:1;-ms-flex-order:1}.small-order-2{order:2;-ms-flex-order:2}.small-order-3{order:3;-ms-flex-order:3}.small-order-4{order:4;-ms-flex-order:4}.small-order-5{order:5;-ms-flex-order:5}.small-order-6{order:6;-ms-flex-order:6}.small-order-7{order:7;-ms-flex-order:7}.small-order-8{order:8;-ms-flex-order:8}.small-order-9{order:9;-ms-flex-order:9}.small-order-10{order:10;-ms-flex-order:10}.column-group .small-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.push-top,.small-push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.push-bottom,.small-push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.push-middle,.small-push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.push-left,.small-push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.push-center,.small-push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.push-right,.small-push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.small-align-left{text-align:left}.small-align-center{text-align:center}.small-align-right{text-align:right}.small-space,.space{margin:1.25em}.padding,.small-padding{padding:1.25em}.double-space,.small-double-space{margin:2.5em}.double-padding,.small-double-padding{padding:2.5em}.half-space,.small-half-space{margin:.625em}.half-padding,.small-half-padding{padding:.625em}.quarter-space,.small-quarter-space{margin:.3125em}.quarter-padding,.small-quarter-padding{padding:.3125em}.small-vertical-space,.vertical-space{margin-top:1.25em;margin-bottom:1.25em}.small-vertical-padding,.vertical-padding{padding-top:1.25em;padding-bottom:1.25em}.double-vertical-space,.small-double-vertical-space{margin-top:2.5em;margin-bottom:2.5em}.double-vertical-padding,.small-double-vertical-padding{padding-top:2.5em;padding-bottom:2.5em}.half-vertical-space,.small-half-vertical-space{margin-top:.625em;margin-bottom:.625em}.half-vertical-padding,.small-half-vertical-padding{padding-top:.625em;padding-bottom:.625em}.quarter-vertical-space,.small-quarter-vertical-space{margin-top:.3125em;margin-bottom:.3125em}.quarter-vertical-padding,.small-quarter-vertical-padding{padding-top:.3125em;padding-bottom:.3125em}.horizontal-space,.small-horizontal-space{margin-left:1.25em;margin-right:1.25em}.horizontal-padding,.small-horizontal-padding{padding-left:1.25em;padding-right:1.25em}.double-horizontal-space,.small-double-horizontal-space{margin-left:2.5em;margin-right:2.5em}.double-horizontal-padding,.small-double-horizontal-padding{padding-left:2.5em;padding-right:2.5em}.half-horizontal-space,.small-half-horizontal-space{margin-left:.625em;margin-right:.625em}.half-horizontal-padding,.small-half-horizontal-padding{padding-left:.625em;padding-right:.625em}.quarter-horizontal-space,.small-quarter-horizontal-space{margin-left:.3125em;margin-right:.3125em}.quarter-horizontal-padding,.small-quarter-horizontal-padding{padding-left:.3125em;padding-right:.3125em}.small-top-space,.top-space{margin-top:1.25em}.small-top-padding,.top-padding{padding-top:1.25em}.double-top-space,.small-double-top-space{margin-top:2.5em}.double-top-padding,.small-double-top-padding{padding-top:2.5em}.half-top-space,.small-half-top-space{margin-top:.625em}.half-top-padding,.small-half-top-padding{padding-top:.625em}.quarter-top-space,.small-quarter-top-space{margin-top:.3125em}.quarter-top-padding,.small-quarter-top-padding{padding-top:.3125em}.right-space,.small-right-space{margin-right:1.25em}.right-padding,.small-right-padding{padding-right:1.25em}.double-right-space,.small-double-right-space{margin-right:2.5em}.double-right-padding,.small-double-right-padding{padding-right:2.5em}.half-right-space,.small-half-right-space{margin-right:.625em}.half-right-padding,.small-half-right-padding{padding-right:.625em}.quarter-right-space,.small-quarter-right-space{margin-right:.3125em}.quarter-right-padding,.small-quarter-right-padding{padding-right:.3125em}.bottom-space,.small-bottom-space{margin-bottom:1.25em}.bottom-padding,.small-bottom-padding{padding-bottom:1.25em}.double-bottom-space,.small-double-bottom-space{margin-bottom:2.5em}.double-bottom-padding,.small-double-bottom-padding{padding-bottom:2.5em}.half-bottom-space,.small-half-bottom-space{margin-bottom:.625em}.half-bottom-padding,.small-half-bottom-padding{padding-bottom:.625em}.quarter-bottom-space,.small-quarter-bottom-space{margin-bottom:.3125em}.quarter-bottom-padding,.small-quarter-bottom-padding{padding-bottom:.3125em}.left-space,.small-left-space{margin-left:1.25em}.left-padding,.small-left-padding{padding-left:1.25em}.double-left-space,.small-double-left-space{margin-left:2.5em}.double-left-padding,.small-double-left-padding{padding-left:2.5em}.half-left-space,.small-half-left-space{margin-left:.625em}.half-left-padding,.small-half-left-padding{padding-left:.625em}.quarter-left-space,.small-quarter-left-space{margin-left:.3125em}.quarter-left-padding,.small-quarter-left-padding{padding-left:.3125em}.hide-small{display:none!important}.show-small{display:inherit!important}table.show-small{display:table}thead.show-small{display:table-header-group}tbody.show-small{display:table-row-group}tfoot.show-small{display:table-footer-group}tr.show-small{display:table-row}td.show-small,th.show-small{display:table-cell}}@media screen and (max-width:320px){.ink-grid{padding:0 1em}.column-group.gutters{margin-left:-1em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}.column-group.horizontal-gutters{margin-left:-1em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=tiny-]{padding-left:1em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=tiny-]{margin-bottom:1em}.column-group.double-gutters{margin-left:-2em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}.column-group.double-horizontal-gutters{margin-left:-2em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=tiny-]{padding-left:2em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}.column-group.half-gutters{margin-left:-.5em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}.column-group.half-horizontal-gutters{margin-left:-.5em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}.column-group.quarter-gutters{margin-left:-.25em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}.column-group.quarter-horizontal-gutters{margin-left:-.25em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}.column-group.tiny-gutters{margin-left:-1em}.column-group.tiny-gutters>.all-auto,.column-group.tiny-gutters>[class*=all-],.column-group.tiny-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}.column-group.tiny-horizontal-gutters{margin-left:-1em}.column-group.tiny-horizontal-gutters>.all-auto,.column-group.tiny-horizontal-gutters>[class*=all-],.column-group.tiny-horizontal-gutters>[class*=tiny-]{padding-left:1em}.column-group.tiny-vertical-gutters>.all-auto,.column-group.tiny-vertical-gutters>[class*=all-],.column-group.tiny-vertical-gutters>[class*=tiny-]{margin-bottom:1em}.column-group.tiny-double-gutters{margin-left:-2em}.column-group.tiny-double-gutters>.all-auto,.column-group.tiny-double-gutters>[class*=all-],.column-group.tiny-double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}.column-group.tiny-double-horizontal-gutters{margin-left:-2em}.column-group.tiny-double-horizontal-gutters>.all-auto,.column-group.tiny-double-horizontal-gutters>[class*=all-],.column-group.tiny-double-horizontal-gutters>[class*=tiny-]{padding-left:2em}.column-group.tiny-double-vertical-gutters>.all-auto,.column-group.tiny-double-vertical-gutters>[class*=all-],.column-group.tiny-double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}.column-group.tiny-half-gutters{margin-left:-.5em}.column-group.tiny-half-gutters>.all-auto,.column-group.tiny-half-gutters>[class*=all-],.column-group.tiny-half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}.column-group.tiny-half-horizontal-gutters{margin-left:-.5em}.column-group.tiny-half-horizontal-gutters>.all-auto,.column-group.tiny-half-horizontal-gutters>[class*=all-],.column-group.tiny-half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}.column-group.tiny-half-vertical-gutters>.all-auto,.column-group.tiny-half-vertical-gutters>[class*=all-],.column-group.tiny-half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}.column-group.tiny-quarter-gutters{margin-left:-.25em}.column-group.tiny-quarter-gutters>.all-auto,.column-group.tiny-quarter-gutters>[class*=all-],.column-group.tiny-quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}.column-group.tiny-quarter-horizontal-gutters{margin-left:-.25em}.column-group.tiny-quarter-horizontal-gutters>.all-auto,.column-group.tiny-quarter-horizontal-gutters>[class*=all-],.column-group.tiny-quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}.column-group.tiny-quarter-vertical-gutters>.all-auto,.column-group.tiny-quarter-vertical-gutters>[class*=all-],.column-group.tiny-quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}.column-group.tiny-no-gutters{margin-left:0}.column-group.tiny-no-gutters>.all-auto,.column-group.tiny-no-gutters>[class*=all-],.column-group.tiny-no-gutters>[class*=tiny-]{padding-left:0;margin-bottom:0}.tiny-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.reverse,.column-group.tiny-reverse,.ink-flex.reverse,.ink-flex.tiny-reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.tiny-vertical,.column-group.vertical,.ink-flex.tiny-vertical,.ink-flex.vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.tiny-vertical.tiny-reverse,.column-group.vertical.reverse,.ink-flex.tiny-vertical.tiny-reverse,.ink-flex.vertical.reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.tiny-order-1{order:1;-ms-flex-order:1}.tiny-order-2{order:2;-ms-flex-order:2}.tiny-order-3{order:3;-ms-flex-order:3}.tiny-order-4{order:4;-ms-flex-order:4}.tiny-order-5{order:5;-ms-flex-order:5}.tiny-order-6{order:6;-ms-flex-order:6}.tiny-order-7{order:7;-ms-flex-order:7}.tiny-order-8{order:8;-ms-flex-order:8}.tiny-order-9{order:9;-ms-flex-order:9}.tiny-order-10{order:10;-ms-flex-order:10}.column-group .tiny-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.push-top,.tiny-push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.push-bottom,.tiny-push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.push-middle,.tiny-push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.push-left,.tiny-push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.push-center,.tiny-push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.push-right,.tiny-push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.tiny-align-left{text-align:left}.tiny-align-center{text-align:center}.tiny-align-right{text-align:right}.space,.tiny-space{margin:1em}.padding,.tiny-padding{padding:1em}.double-space,.tiny-double-space{margin:2em}.double-padding,.tiny-double-padding{padding:2em}.half-space,.tiny-half-space{margin:.5em}.half-padding,.tiny-half-padding{padding:.5em}.quarter-space,.tiny-quarter-space{margin:.25em}.quarter-padding,.tiny-quarter-padding{padding:.25em}.tiny-vertical-space,.vertical-space{margin-top:1em;margin-bottom:1em}.tiny-vertical-padding,.vertical-padding{padding-top:1em;padding-bottom:1em}.double-vertical-space,.tiny-double-vertical-space{margin-top:2em;margin-bottom:2em}.double-vertical-padding,.tiny-double-vertical-padding{padding-top:2em;padding-bottom:2em}.half-vertical-space,.tiny-half-vertical-space{margin-top:.5em;margin-bottom:.5em}.half-vertical-padding,.tiny-half-vertical-padding{padding-top:.5em;padding-bottom:.5em}.quarter-vertical-space,.tiny-quarter-vertical-space{margin-top:.25em;margin-bottom:.25em}.quarter-vertical-padding,.tiny-quarter-vertical-padding{padding-top:.25em;padding-bottom:.25em}.horizontal-space,.tiny-horizontal-space{margin-left:1em;margin-right:1em}.horizontal-padding,.tiny-horizontal-padding{padding-left:1em;padding-right:1em}.double-horizontal-space,.tiny-double-horizontal-space{margin-left:2em;margin-right:2em}.double-horizontal-padding,.tiny-double-horizontal-padding{padding-left:2em;padding-right:2em}.half-horizontal-space,.tiny-half-horizontal-space{margin-left:.5em;margin-right:.5em}.half-horizontal-padding,.tiny-half-horizontal-padding{padding-left:.5em;padding-right:.5em}.quarter-horizontal-space,.tiny-quarter-horizontal-space{margin-left:.25em;margin-right:.25em}.quarter-horizontal-padding,.tiny-quarter-horizontal-padding{padding-left:.25em;padding-right:.25em}.tiny-top-space,.top-space{margin-top:1em}.tiny-top-padding,.top-padding{padding-top:1em}.double-top-space,.tiny-double-top-space{margin-top:2em}.double-top-padding,.tiny-double-top-padding{padding-top:2em}.half-top-space,.tiny-half-top-space{margin-top:.5em}.half-top-padding,.tiny-half-top-padding{padding-top:.5em}.quarter-top-space,.tiny-quarter-top-space{margin-top:.25em}.quarter-top-padding,.tiny-quarter-top-padding{padding-top:.25em}.right-space,.tiny-right-space{margin-right:1em}.right-padding,.tiny-right-padding{padding-right:1em}.double-right-space,.tiny-double-right-space{margin-right:2em}.double-right-padding,.tiny-double-right-padding{padding-right:2em}.half-right-space,.tiny-half-right-space{margin-right:.5em}.half-right-padding,.tiny-half-right-padding{padding-right:.5em}.quarter-right-space,.tiny-quarter-right-space{margin-right:.25em}.quarter-right-padding,.tiny-quarter-right-padding{padding-right:.25em}.bottom-space,.tiny-bottom-space{margin-bottom:1em}.bottom-padding,.tiny-bottom-padding{padding-bottom:1em}.double-bottom-space,.tiny-double-bottom-space{margin-bottom:2em}.double-bottom-padding,.tiny-double-bottom-padding{padding-bottom:2em}.half-bottom-space,.tiny-half-bottom-space{margin-bottom:.5em}.half-bottom-padding,.tiny-half-bottom-padding{padding-bottom:.5em}.quarter-bottom-space,.tiny-quarter-bottom-space{margin-bottom:.25em}.quarter-bottom-padding,.tiny-quarter-bottom-padding{padding-bottom:.25em}.left-space,.tiny-left-space{margin-left:1em}.left-padding,.tiny-left-padding{padding-left:1em}.double-left-space,.tiny-double-left-space{margin-left:2em}.double-left-padding,.tiny-double-left-padding{padding-left:2em}.half-left-space,.tiny-half-left-space{margin-left:.5em}.half-left-padding,.tiny-half-left-padding{padding-left:.5em}.quarter-left-space,.tiny-quarter-left-space{margin-left:.25em}.quarter-left-padding,.tiny-quarter-left-padding{padding-left:.25em}.hide-tiny{display:none!important}.show-tiny{display:inherit!important}table.show-tiny{display:table}thead.show-tiny{display:table-header-group}tbody.show-tiny{display:table-row-group}tfoot.show-tiny{display:table-footer-group}tr.show-tiny{display:table-row}td.show-tiny,th.show-tiny{display:table-cell}}@media screen and (min-width:1261px){html{font-size:1.08em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:961px) and (max-width:1260px){html{font-size:1.05em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:641px) and (max-width:960px){html{font-size:1em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:321px) and (max-width:640px){html{font-size:.98em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (max-width:320px){html{font-size:.97em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-thin-webfont.eot);src:url(../fonts/Roboto/roboto-thin-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-thin-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-thin-webfont.ttf) format('truetype');font-weight:100;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-thinitalic-webfont.eot);src:url(../fonts/Roboto/roboto-thinitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-thinitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-thinitalic-webfont.ttf) format('truetype');font-weight:100;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-light-webfont.eot);src:url(../fonts/Roboto/roboto-light-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-light-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-light-webfont.ttf) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-lightitalic-webfont.eot);src:url(../fonts/Roboto/roboto-lightitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-lightitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-lightitalic-webfont.ttf) format('truetype');font-weight:300;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-regular-webfont.eot);src:url(../fonts/Roboto/roboto-regular-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-regular-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-regular-webfont.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-italic-webfont.eot);src:url(../fonts/Roboto/roboto-italic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-italic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-italic-webfont.ttf) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-medium-webfont.eot);src:url(../fonts/Roboto/roboto-medium-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-medium-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-medium-webfont.ttf) format('truetype');font-weight:500;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-mediumitalic-webfont.eot);src:url(../fonts/Roboto/roboto-mediumitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-mediumitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-mediumitalic-webfont.ttf) format('truetype');font-weight:500;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-bold-webfont.eot);src:url(../fonts/Roboto/roboto-bold-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-bold-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-bold-webfont.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-bolditalic-webfont.eot);src:url(../fonts/Roboto/roboto-bolditalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-bolditalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-bolditalic-webfont.ttf) format('truetype');font-weight:700;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-black-webfont.eot);src:url(../fonts/Roboto/roboto-black-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-black-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-black-webfont.ttf) format('truetype');font-weight:900;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-blackitalic-webfont.eot);src:url(../fonts/Roboto/roboto-blackitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-blackitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-blackitalic-webfont.ttf) format('truetype');font-weight:900;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-light-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-light-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-light-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-light-webfont.ttf) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.ttf) format('truetype');font-weight:300;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.ttf) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.ttf) format('truetype');font-weight:700;font-style:italic}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-thin-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-thin-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-thin-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-thin-webfont.ttf) format('truetype');font-weight:100;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-light-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-light-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-light-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-light-webfont.ttf) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-regular-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-regular-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-regular-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-regular-webfont.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-bold-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-bold-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-bold-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-bold-webfont.ttf) format('truetype');font-weight:700;font-style:normal}.ink-label{padding:0 .35em;white-space:nowrap}.ink-navigation{overflow:visible}.ink-navigation ul{list-style-type:none;padding:0;margin:0}.ink-navigation ul li{margin:0}.ink-navigation .breadcrumbs li{line-height:2.7em;display:inline}.ink-navigation .breadcrumbs li a{display:inline;padding:0}.ink-navigation .breadcrumbs li a:hover{background:0 0}.ink-navigation .breadcrumbs li.active a{cursor:default;text-decoration:none}.ink-navigation .breadcrumbs li:first-child a{padding-left:1.2em}.ink-navigation .breadcrumbs li:after{content:'/';display:inline;margin:0 .7em}.ink-navigation .breadcrumbs li:last-child:after{content:'';display:none}.ink-dropdown,.ink-navigation{position:relative}.ink-dropdown ul.dropdown,.ink-dropdown ul.dropdown-menu,.ink-navigation ul.dropdown,.ink-navigation ul.dropdown-menu{position:absolute;top:110%;background:#fff;z-index:30;border:1px solid #d9d9d9;height:auto;width:auto;min-width:10em;max-width:12em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:rgba(100,100,100,.3) 0 0 1px 0;-moz-box-shadow:rgba(100,100,100,.3) 0 0 1px 0;box-shadow:rgba(100,100,100,.3) 0 0 1px 0;margin-left:0;padding:.35em 0;font-size:.85em}.ink-dropdown ul.dropdown li,.ink-dropdown ul.dropdown-menu li,.ink-navigation ul.dropdown li,.ink-navigation ul.dropdown-menu li{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-border-radius:none;-moz-border-radius:none;-ms-border-radius:none;-o-border-radius:none;border-radius:none;width:auto;height:auto;min-height:auto;display:list-item;float:none;margin:0;text-align:left;text-transform:none;padding:0;position:relative;list-style-type:none}.ink-dropdown ul.dropdown li.separator-above,.ink-dropdown ul.dropdown-menu li.separator-above,.ink-navigation ul.dropdown li.separator-above,.ink-navigation ul.dropdown-menu li.separator-above{padding-top:.35em;margin-top:.35em;border-top:1px solid #d9d9d9}.ink-dropdown ul.dropdown li.separator-below,.ink-dropdown ul.dropdown-menu li.separator-below,.ink-navigation ul.dropdown li.separator-below,.ink-navigation ul.dropdown-menu li.separator-below{padding-bottom:.35em;margin-bottom:.35em;border-bottom:1px solid #d9d9d9}.ink-dropdown ul.dropdown li.heading,.ink-dropdown ul.dropdown-menu li.heading,.ink-navigation ul.dropdown li.heading,.ink-navigation ul.dropdown-menu li.heading{font-weight:700;margin-bottom:.35em;padding:.5em .8em;color:#333}.ink-dropdown ul.dropdown li a,.ink-dropdown ul.dropdown-menu li a,.ink-navigation ul.dropdown li a,.ink-navigation ul.dropdown-menu li a{color:#444;padding:.5em .8em;display:block;clear:both}.ink-dropdown ul.dropdown li a:hover,.ink-dropdown ul.dropdown-menu li a:hover,.ink-navigation ul.dropdown li a:hover,.ink-navigation ul.dropdown-menu li a:hover{background:#f2f2f2;text-decoration:none}.ink-dropdown ul.dropdown li.active a,.ink-dropdown ul.dropdown-menu li.active a,.ink-navigation ul.dropdown li.active a,.ink-navigation ul.dropdown-menu li.active a{background:#999;color:#fff}.ink-dropdown ul.dropdown li.disabled a,.ink-dropdown ul.dropdown-menu li.disabled a,.ink-navigation ul.dropdown li.disabled a,.ink-navigation ul.dropdown-menu li.disabled a{color:#b3b3b3}.ink-dropdown ul.dropdown li.disabled a:hover,.ink-dropdown ul.dropdown-menu li.disabled a:hover,.ink-navigation ul.dropdown li.disabled a:hover,.ink-navigation ul.dropdown-menu li.disabled a:hover{background:0 0;cursor:default}.ink-dropdown ul.dropdown li.submenu,.ink-dropdown ul.dropdown-menu li.submenu,.ink-navigation ul.dropdown li.submenu,.ink-navigation ul.dropdown-menu li.submenu{overflow:visible}.ink-dropdown ul.dropdown li.submenu>a,.ink-dropdown ul.dropdown-menu li.submenu>a,.ink-navigation ul.dropdown li.submenu>a,.ink-navigation ul.dropdown-menu li.submenu>a{white-space:nowrap}.ink-dropdown ul.dropdown li.submenu>a:after,.ink-dropdown ul.dropdown-menu li.submenu>a:after,.ink-navigation ul.dropdown li.submenu>a:after,.ink-navigation ul.dropdown-menu li.submenu>a:after{content:"\f0da";width:auto;margin-left:.8em;font-family:FontAwesome;color:#b3b3b3}.ink-dropdown ul.dropdown li.submenu:hover>a,.ink-dropdown ul.dropdown-menu li.submenu:hover>a,.ink-navigation ul.dropdown li.submenu:hover>a,.ink-navigation ul.dropdown-menu li.submenu:hover>a{background:#f2f2f2;text-decoration:none}.ink-dropdown ul.dropdown li.submenu:hover:hover>ul.dropdown,.ink-dropdown ul.dropdown li.submenu:hover:hover>ul.dropdown-menu,.ink-dropdown ul.dropdown-menu li.submenu:hover:hover>ul.dropdown,.ink-dropdown ul.dropdown-menu li.submenu:hover:hover>ul.dropdown-menu,.ink-navigation ul.dropdown li.submenu:hover:hover>ul.dropdown,.ink-navigation ul.dropdown li.submenu:hover:hover>ul.dropdown-menu,.ink-navigation ul.dropdown-menu li.submenu:hover:hover>ul.dropdown,.ink-navigation ul.dropdown-menu li.submenu:hover:hover>ul.dropdown-menu{display:block}.ink-dropdown ul.dropdown li.submenu>ul.dropdown,.ink-dropdown ul.dropdown li.submenu>ul.dropdown-menu,.ink-dropdown ul.dropdown-menu li.submenu>ul.dropdown,.ink-dropdown ul.dropdown-menu li.submenu>ul.dropdown-menu,.ink-navigation ul.dropdown li.submenu>ul.dropdown,.ink-navigation ul.dropdown li.submenu>ul.dropdown-menu,.ink-navigation ul.dropdown-menu li.submenu>ul.dropdown,.ink-navigation ul.dropdown-menu li.submenu>ul.dropdown-menu{font-size:inherit;position:absolute;top:-.36em;left:100%;display:none}.ink-navigation ul.pagination{overflow:hidden;*zoom:1}.ink-navigation ul.pagination li{line-height:1.7;float:left}.ink-navigation ul.pagination li a{padding:.5em 1em;display:block;float:left}.ink-navigation ul.pagination.dotted li a{display:block;height:1em;width:1em;margin-right:.6em;padding:0;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%;text-indent:99999px}.ink-navigation ul.pagination.dotted li a:first-child,.ink-navigation ul.pagination.dotted li a:last-child{-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%}.ink-navigation ul.pagination.chevron li{display:none}.ink-navigation ul.pagination.chevron li.next,.ink-navigation ul.pagination.chevron li.previous{display:block}.ink-navigation ul.pagination.chevron li.next a,.ink-navigation ul.pagination.chevron li.previous a{display:block;position:absolute;top:35%;padding:0 .5em;margin:0;font-family:FontAwesome;font-size:4em}.ink-navigation ul.pagination.chevron li.next a span,.ink-navigation ul.pagination.chevron li.previous a span{text-indent:-99999px;display:inline-block}.ink-navigation ul.pagination.chevron li.previous a{left:0}.ink-navigation ul.pagination.chevron li.previous a:after{content:"\f137"}.ink-navigation ul.pagination.chevron li.next a{right:0}.ink-navigation ul.pagination.chevron li.next a:after{content:"\f138"}.ink-navigation .pills{overflow:hidden;*zoom:1}.ink-navigation .pills li{overflow:hidden;display:block;float:left;margin:0 .5em .5em 0;line-height:1.7}.ink-navigation .pills li a{display:block;padding:.5em 1em}.ink-navigation .pills li a:hover{text-decoration:none}.ink-navigation .pills li.active a,.ink-navigation .pills li.disabled a{cursor:default}.ink-navigation ul{*height:100%}.ink-navigation ul.menu{*zoom:1}.ink-navigation ul.menu:after{content:"";display:table;clear:both}.ink-navigation ul.menu li{*height:100%}.ink-navigation ul.menu li:hover>ul.submenu{display:block}.ink-navigation ul.menu li ul.submenu{display:none;position:absolute;z-index:10}.ink-navigation ul.menu li ul.submenu li a{padding:.5em 1em;display:block;float:none}.ink-navigation ul.menu.horizontal.scrollable{font-size:0;white-space:nowrap;overflow-x:scroll;overflow-y:hidden;-webkit-overflow-scrolling:touch;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}.ink-navigation ul.menu.horizontal.scrollable li{display:inline-block;float:none}.ink-navigation ul.menu.horizontal.scrollable li a{border-right:rgba(10,10,10,.3) 1px solid;font-size:initial}.ink-navigation ul.menu.horizontal.scrollable li:last-child a{border-right:0}.ink-navigation ul.menu.horizontal li{float:left;position:relative}.ink-navigation ul.menu.horizontal li a{padding:.5em 1em;display:block;line-height:1.7}.ink-navigation ul.menu.horizontal li .control{margin-top:.3em}.ink-navigation ul.menu.horizontal li ul.submenu{min-width:100%;z-index:50;top:auto;left:auto}.ink-navigation ul.menu.horizontal li ul.submenu li{float:none}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout{position:absolute;top:0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout.left{right:100%}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout.right{left:100%}.ink-navigation ul.menu.vertical li{line-height:1.7;position:relative}.ink-navigation ul.menu.vertical li a{padding:.5em 1em;display:block}.ink-navigation ul.menu.vertical li ul.submenu{position:relative;top:auto;left:auto}.ink-navigation ul.menu.vertical li ul.submenu.flyout{position:absolute;min-width:8em;top:0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.vertical li ul.submenu.flyout.left{right:100%}.ink-navigation ul.menu.vertical li ul.submenu.flyout.right{left:100%}@media print{*{background:transparent!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.ink-navigation{display:none}.ink-table{border-collapse:collapse}.ink-label{border:1px solid #000}}table.ink-table{width:100%;border-collapse:collapse;border-spacing:0}table.ink-table tr th{padding:5px 10px;line-height:1.3}table.ink-table tr th[data-sortable=true]:hover{cursor:pointer;text-decoration:underline}table.ink-table tr th[data-sortable=true]:hover i{text-decoration:none}table.ink-table tr th[data-sortable=true] i{padding-left:.5em}table.ink-table tr td{padding:5px 10px;line-height:1.3}table.ink-table.hover tbody tr:hover{cursor:pointer}table.ink-table.bordered{border-collapse:separate}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{color:#555;font-family:Roboto,Arial,Helvetica,sans-serif;line-height:1.45}.fw-100,.fw-light{font-weight:100}.fw-300,.fw-thin{font-weight:300}.fw-400,.fw-regular{font-weight:400}.fw-500,.fw-medium{font-weight:500}.fw-700,.fw-bold{font-weight:700}.fw-900,.fw-black{font-weight:900}.condensed-300,.condensed-thin{font-weight:200;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.condensed-400,.condensed-regular{font-weight:400;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.condensed-700,.condensed-bold{font-weight:700;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.slab-100,.slab-light{font-weight:100;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-300,.slab-thin{font-weight:300;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-400,.slab-regular{font-weight:400;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-700,.slab-bold{font-weight:700;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.sans{font-family:Roboto,Arial,Helvetica,sans-serif}.serif{font-family:Times,"Times New Roman",serif}.monospace{font-family:Monaco,"Andale Mono","Courier New",monospace}.condensed{font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.slab{font-family:Roboto_slab,Arial,Helvetica,sans-serif}.italic{font-style:italic}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalizer{text-transform:capitalize}.fa{font-size:14px}a{color:#6998c9;text-decoration:none;cursor:pointer}a:hover{color:#007ed5;text-decoration:underline}h1{font-size:2.2em;margin-top:0;margin-bottom:.57539em}h2{font-size:1.75em;margin-top:0;margin-bottom:.72334em}h3{font-size:1.5em;margin-top:0;margin-bottom:.8439em}h4{font-size:1.25em;margin-top:0;margin-bottom:1.01268em}h5,h6{font-size:1.1em;margin-top:0;margin-bottom:1.15077em}p,table{font-size:1em;margin-top:0;margin-bottom:1.26585em}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,h6:first-child,p:first-child{margin-top:0}h1,h2,h3,h4,h5,h6{color:#404040;font-weight:700;line-height:1.16}small{color:#888}input,textarea{color:#666}h1 small,h2 small,h3 small,h4 small{color:#bbb;font-size:.6em;font-weight:100;line-height:1}mark{background:#dae5f2}address{color:#777;font-size:1em;line-height:1.4}address p{margin-top:0}address h6{color:#555}abbr:hover{cursor:help}blockquote{border-left:4px solid #ddd;padding-left:25px;margin:1em 0;font-weight:200;font-size:1.1em}blockquote small{font-size:.9em}blockquote small::after,blockquote small::before{content:' — '}.note{font-size:.9em;color:#777}.note strong{color:#555}.small{font-size:.75em}.medium{font-size:.85em}.large{font-size:1.2em}.extralarge{font-size:1.45em!important}hr{border:0;border-top:1px solid #ddd;margin:1em 0}.lead{font-size:1.1em;font-weight:700}ol,ul{line-height:1.4;padding:0 0 0 1.45em;margin:1em 0}ol li,ul li{margin:.5em 0}ul.unstyled{list-style:none;padding-left:0}ul.unstyled ul{list-style:disc outside}ul.unstyled ul.unstyled{list-style:none;padding-left:0}ul.inline{list-style:none}ul.inline li{display:inline-block;padding:0 .5em}ul.inline li:first-child{padding:0 .5em 0 0}dl{margin:1em 0}dl dt{font-weight:700;margin:.5em 0}dl dd{margin:.5em 0 .5em 25px}dl.inline dt{float:left;clear:left;text-align:right;width:180px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;margin:0}dl.inline dd{margin:.5em 0 .5em 200px}figure.ink-image{position:relative;border:1px solid #555}figure.ink-image>img{width:100%}figure.ink-image>figcaption{padding:1em;background:#fff;line-height:1.3}figure.ink-image>figcaption.over-bottom,figure.ink-image>figcaption.over-top{position:absolute;width:100%;left:0;border:0}figure.ink-image>figcaption.over-bottom.dark,figure.ink-image>figcaption.over-top.dark{color:#fff;background:rgba(0,0,0,.6)}figure.ink-image>figcaption.over-top{top:0;background:rgba(255,255,255,.7)}figure.ink-image>figcaption.over-bottom{bottom:0;background:rgba(255,255,255,.7)}figure.ink-image>figcaption.dark{color:#fff;background:#222}img{border:0;width:auto;max-width:100%;vertical-align:top}.ink-alert.basic,.ink-alert.block{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-alert.basic{background:rgba(255,156,0,.25);color:#b87814;border:1px solid #b87814}.ink-alert.basic .ink-dismiss{color:#b87814}.ink-alert.basic.success{background:rgba(74,155,23,.25);color:#38621d;border:1px solid #38621d}.ink-alert.basic.success .ink-dismiss{color:#38621d}.ink-alert.basic.error{background:rgba(201,17,17,.25);color:#891e1e;border:1px solid #891e1e}.ink-alert.basic.error .ink-dismiss{color:#891e1e}.ink-alert.basic.info{background:rgba(15,117,218,.25);color:#1e5b98;border:1px solid #1e5b98}.ink-alert.basic.info .ink-dismiss{color:#1e5b98}.ink-alert.block{border:1px solid #b87814;background:#fff}.ink-alert.block>h4{background:rgba(255,156,0,.3);color:#b87814}.ink-alert.block .ink-dismiss{color:#b87814}.ink-alert.block.success{border:1px solid #38621d;background:#fff}.ink-alert.block.success>h4{background:rgba(74,155,23,.3);color:#38621d}.ink-alert.block.success .ink-dismiss{color:#38621d}.ink-alert.block.error{border:1px solid #891e1e;background:#fff}.ink-alert.block.error>h4{background:rgba(201,17,17,.3);color:#891e1e}.ink-alert.block.error .ink-dismiss{color:#891e1e}.ink-alert.block.info{border:1px solid #1e5b98;background:#fff}.ink-alert.block.info>h4{background:rgba(15,117,218,.3);color:#1e5b98}.ink-alert.block.info .ink-dismiss{color:#1e5b98}.ink-alert .ink-dismiss{font-family:Arial,sans-serif;font-weight:700;text-shadow:#fff 0 1px 0;filter:alpha(Opacity=25);opacity:.25}.ink-alert .ink-dismiss:hover{filter:alpha(Opacity=60);opacity:.6}.ink-badge{-webkit-border-radius:8em;-moz-border-radius:8em;-ms-border-radius:8em;-o-border-radius:8em;border-radius:8em;color:#fff}.ink-badge.white{background:#fff;color:#555}.ink-badge.black{background:#000}.ink-badge.orange{background:#ff9c00}.ink-badge.red{background:#c91111}.ink-badge.green{background:#4a9b17}.ink-badge.blue{background:#0f75da}.ink-badge.yellow{background:#ffd500;color:#555}.ink-badge.grey{background:gray}.ink-badge+.ink-badge{margin-left:.2em}.ink-button{background:#d9d9d9;color:#000;border:1px solid #bfbfbf;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;font-weight:300}.ink-button:active,.ink-button:hover{text-decoration:none;color:#000;background:#ccc;border:1px solid #b3b3b3;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px;box-shadow:rgba(0,0,0,.2) 0 1px 1px}.ink-button:focus{outline:0;background:#ccc;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset}.ink-button[disabled]{background:#e6e6e6;border:1px solid #e6e6e6;color:#999}.ink-button[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.blue{color:#fff;background:#0f75da;border:1px solid #0c63b9}.ink-button.blue:active,.ink-button.blue:hover{background:#0d68c2;border:1px solid #0a56a1;color:#fff;text-decoration:none}.ink-button.blue:focus{background:#0d68c2}.ink-button.blue[disabled]{background:rgba(15,117,218,.6);border:1px solid rgba(15,117,218,0);color:#0c5baa}.ink-button.blue[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.green{color:#fff;background:#4a9b17;border:1px solid #3e8313}.ink-button.green:active,.ink-button.green:hover{background:#3f8514;border:1px solid #336d10;color:#fff;text-decoration:none}.ink-button.green:focus{background:#3f8514}.ink-button.green[disabled]{background:rgba(74,155,23,.6);border:1px solid rgba(74,155,23,0);color:#356f10}.ink-button.green[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.orange{color:#fff;background:#ff9c00;border:1px solid #d88400}.ink-button.orange:active,.ink-button.orange:hover{background:#e68c00;border:1px solid #bf7400;color:#fff;text-decoration:none}.ink-button.orange:focus{background:#e68c00}.ink-button.orange[disabled]{background:rgba(255,156,0,.6);border:1px solid rgba(255,156,0,0);color:#cc7d00}.ink-button.orange[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.red{color:#fff;background:#c91111;border:1px solid #aa0e0e}.ink-button.red:active,.ink-button.red:hover{background:#b10f0f;border:1px solid #920c0c;color:#fff;text-decoration:none}.ink-button.red:focus{background:#b10f0f}.ink-button.red[disabled]{background:rgba(201,17,17,.6);border:1px solid rgba(201,17,17,0);color:#9a0d0d}.ink-button.red[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.black{color:#fff;background:#1a1a1a;border:1px solid #161616}.ink-button.black:active,.ink-button.black:hover{background:#0d0d0d;border:1px solid #090909;color:#fff;text-decoration:none}.ink-button.black:focus{background:#0d0d0d}.ink-button.black[disabled]{background:rgba(26,26,26,.6);border:1px solid rgba(26,26,26,0);color:#000}.ink-button.black[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.white{color:#555;background:#fff;border:1px solid #d8d8d8}.ink-button.white:active,.ink-button.white:hover{background:#f2f2f2;border:1px solid #cbcbcb;color:#555;text-decoration:none}.ink-button.white:focus{background:#f2f2f2}.ink-button.white[disabled]{background:rgba(255,255,255,.6);border:1px solid rgba(255,255,255,0);color:#e6e6e6}.ink-button.white[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.button-group>.ink-button[disabled]{background:#e6e6e6;border:1px solid rgba(217,217,217,.6)}.button-group>.ink-button[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.button-group>.ink-button.blue:first-child{border-left:#0c63b9}.button-group>.ink-button.blue[disabled]{background:rgba(15,117,218,.6);border:1px solid rgba(15,117,218,.3)}.button-group>.ink-button.green:first-child{border-left:#3e8313}.button-group>.ink-button.green[disabled]{background:rgba(74,155,23,.6);border:1px solid rgba(74,155,23,.3)}.button-group>.ink-button.orange:first-child{border-left:#d88400}.button-group>.ink-button.orange[disabled]{background:rgba(255,156,0,.6);border:1px solid rgba(255,156,0,.3)}.button-group>.ink-button.red:first-child{border-left:#aa0e0e}.button-group>.ink-button.red[disabled]{background:rgba(201,17,17,.6);border:1px solid rgba(201,17,17,.3)}.button-group>.ink-button.black:first-child{border-left:#161616}.button-group>.ink-button.black[disabled]{background:rgba(26,26,26,.6);border:1px solid rgba(26,26,26,.3)}.button-group>.ink-button.white:first-child{border-left:#d8d8d8}.button-group>.ink-button.white[disabled]{background:rgba(255,255,255,.6);border:1px solid rgba(255,255,255,.3)}.ink-label{color:#fff;font-weight:300;font-size:.938em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-label.white{background:#fff;color:#555}.ink-label.black{background:#000}.ink-label.orange{background:#ff9c00}.ink-label.red{background:#c91111}.ink-label.green{background:#4a9b17}.ink-label.blue{background:#0f75da}.ink-label.yellow{background:#ffd500;color:#555}.ink-label.grey{background:gray}.ink-label+.ink-label{margin-left:.2em}.ink-navigation ul.breadcrumbs{font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.breadcrumbs li.active a{background:0 0;color:#999}.ink-navigation ul.breadcrumbs li.active a:hover{cursor:default;text-decoration:none}.ink-navigation ul.breadcrumbs li a:hover{background:0 0;text-decoration:underline}.ink-navigation ul.breadcrumbs.white{background:#fff}.ink-navigation ul.breadcrumbs.white li a,.ink-navigation ul.breadcrumbs.white li:after{color:#555}.ink-navigation ul.breadcrumbs.white li.active a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.breadcrumbs.grey{background:#d9d9d9}.ink-navigation ul.breadcrumbs.grey li a,.ink-navigation ul.breadcrumbs.grey li:after{color:#555}.ink-navigation ul.breadcrumbs.grey li.active a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.breadcrumbs.black{background:#1a1a1a}.ink-navigation ul.breadcrumbs.black li a,.ink-navigation ul.breadcrumbs.black li:after{color:#fff}.ink-navigation ul.breadcrumbs.black li.active a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.breadcrumbs.blue{background:#1b75ce}.ink-navigation ul.breadcrumbs.blue li a,.ink-navigation ul.breadcrumbs.blue li:after{color:#fff}.ink-navigation ul.breadcrumbs.blue li.active a{color:#08427b;text-shadow:#1884ef 0 1px 0}.ink-navigation ul.breadcrumbs.orange{background:#f2990d}.ink-navigation ul.breadcrumbs.orange li a,.ink-navigation ul.breadcrumbs.orange li:after{color:#fff}.ink-navigation ul.breadcrumbs.orange li.active a{color:#995e00;text-shadow:#ffa81f 0 1px 0}.ink-navigation ul.breadcrumbs.green{background:#4c9220}.ink-navigation ul.breadcrumbs.green li a,.ink-navigation ul.breadcrumbs.green li:after{color:#fff}.ink-navigation ul.breadcrumbs.green li.active a{color:#20420a;text-shadow:#57b61b 0 1px 0}.ink-navigation ul.breadcrumbs.red{background:#be1c1c}.ink-navigation ul.breadcrumbs.red li a,.ink-navigation ul.breadcrumbs.red li:after{color:#fff}.ink-navigation ul.breadcrumbs.red li.active a{color:#6b0909;text-shadow:#e51313 0 1px 0}.ink-dropdown.green ul.dropdown-menu li.active a{background:#4a9b17;color:#fff}.ink-dropdown.orange ul.dropdown-menu li.active a{background:#ff9c00;color:#fff}.ink-dropdown.red ul.dropdown-menu li.active a{background:#c91111;color:#fff}.ink-dropdown.black ul.dropdown-menu li.active a{background:#1a1a1a;color:#fff}.ink-dropdown.blue ul.dropdown-menu li.active a{background:#0f75da;color:#fff}.ink-navigation ul.menu{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu>li{font-weight:300}.ink-navigation ul.menu>li.active a{text-decoration:underline}.ink-navigation ul.menu>li.heading{font-weight:500}.ink-navigation ul.menu>li.disabled a{color:#b3b3b3;text-shadow:#fff 0 1px 0}.ink-navigation ul.menu>li.disabled a:hover{cursor:default;background:0 0;text-decoration:none}.ink-navigation ul.menu>li ul.submenu li{font-size:.875em}.ink-navigation ul.menu>li ul.submenu li a{border-bottom:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.vertical li a{border-bottom:1px solid rgba(0,0,0,.15)}.ink-navigation ul.menu.vertical li:first-child,.ink-navigation ul.menu.vertical li:first-child>a{-webkit-border-radius:2px 2px 0 0;-moz-border-radius:2px 2px 0 0;-ms-border-radius:2px 2px 0 0;-o-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0}.ink-navigation ul.menu.vertical li:last-child{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child>a{border-bottom:0;-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child .submenu{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child .submenu.flyout{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.vertical li:last-child .submenu li:last-child,.ink-navigation ul.menu.vertical li:last-child .submenu li:last-child a{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.horizontal>li:first-child,.ink-navigation ul.menu.horizontal>li:first-child a{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-navigation ul.menu.horizontal>li:last-child,.ink-navigation ul.menu.horizontal>li:last-child a{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-navigation ul.menu.horizontal>li ul.submenu{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#fff}.ink-navigation ul.menu.horizontal>li ul.submenu li:last-child{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.horizontal>li ul.submenu li:last-child a{border-bottom:0}.ink-navigation ul.menu.white{background:#fff}.ink-navigation ul.menu.white li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.white li ul.submenu li a{color:#555}.ink-navigation ul.menu.white li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.white li.disabled a:hover{background:0 0}.ink-navigation ul.menu.white li.active{background:#e6e6e6}.ink-navigation ul.menu.white li.disabled a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.menu.white li a{color:#555;text-decoration:none}.ink-navigation ul.menu.white li a:hover{background:#f2f2f2}.ink-navigation ul.menu.grey{background:#d9d9d9}.ink-navigation ul.menu.grey li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.grey li ul.submenu li a{color:#555}.ink-navigation ul.menu.grey li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.grey li.disabled a:hover{background:0 0}.ink-navigation ul.menu.grey li.active{background:#bfbfbf}.ink-navigation ul.menu.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.menu.grey li a{color:#555;text-decoration:none}.ink-navigation ul.menu.grey li a:hover{background:#ccc}.ink-navigation ul.menu.black{background:#1a1a1a}.ink-navigation ul.menu.black li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.black li ul.submenu li a{color:#555}.ink-navigation ul.menu.black li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.black li.disabled a:hover{background:0 0}.ink-navigation ul.menu.black li.active{background:#333}.ink-navigation ul.menu.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.menu.black li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.black li a:hover{background:#404040}.ink-navigation ul.menu.blue{background:#1b75ce}.ink-navigation ul.menu.blue li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.blue li ul.submenu li a{color:#555}.ink-navigation ul.menu.blue li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.blue li.disabled a:hover{background:0 0}.ink-navigation ul.menu.blue li.active{background:#0c5baa}.ink-navigation ul.menu.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.menu.blue li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.blue li a:hover{background:#0d68c2}.ink-navigation ul.menu.green{background:#4c9220}.ink-navigation ul.menu.green li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.green li ul.submenu li a{color:#555}.ink-navigation ul.menu.green li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.green li.disabled a:hover{background:0 0}.ink-navigation ul.menu.green li.active{background:#356f10}.ink-navigation ul.menu.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.menu.green li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.green li a:hover{background:#3f8514}.ink-navigation ul.menu.orange{background:#f2990d}.ink-navigation ul.menu.orange li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.orange li ul.submenu li a{color:#555}.ink-navigation ul.menu.orange li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.orange li.disabled a:hover{background:0 0}.ink-navigation ul.menu.orange li.active{background:#cc7d00}.ink-navigation ul.menu.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.menu.orange li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.orange li a:hover{background:#e68c00}.ink-navigation ul.menu.red{background:#be1c1c}.ink-navigation ul.menu.red li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.red li ul.submenu li a{color:#555}.ink-navigation ul.menu.red li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.red li.disabled a:hover{background:0 0}.ink-navigation ul.menu.red li.active{background:#9a0d0d}.ink-navigation ul.menu.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.menu.red li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.red li a:hover{background:#b10f0f}.ink-navigation ul.pagination{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.pagination li{font-weight:300}.ink-navigation ul.pagination li.active a{text-decoration:underline}.ink-navigation ul.pagination li.disabled a{color:#b3b3b3;text-shadow:#fff 0 1px 0}.ink-navigation ul.pagination li.disabled a:hover{cursor:default;background:0 0;text-decoration:none}.ink-navigation ul.pagination li:first-child,.ink-navigation ul.pagination li:first-child a{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-navigation ul.pagination li:last-child,.ink-navigation ul.pagination li:last-child a{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-navigation ul.pagination.white li{background:#fff}.ink-navigation ul.pagination.white li.active a{background:#e6e6e6}.ink-navigation ul.pagination.white li.disabled a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.pagination.white li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.white li a{color:#555;text-decoration:none}.ink-navigation ul.pagination.white li a:hover{background:#f2f2f2}.ink-navigation ul.pagination.grey li{background:#d9d9d9}.ink-navigation ul.pagination.grey li.active a{background:#bfbfbf}.ink-navigation ul.pagination.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.pagination.grey li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.grey li a{color:#555;text-decoration:none}.ink-navigation ul.pagination.grey li a:hover{background:#ccc}.ink-navigation ul.pagination.black li{background:#1a1a1a}.ink-navigation ul.pagination.black li.active a{background:#333}.ink-navigation ul.pagination.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.pagination.black li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.black li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.black li a:hover{background:#292929}.ink-navigation ul.pagination.orange li{background:#f2990d}.ink-navigation ul.pagination.orange li.active a{background:#cc7d00}.ink-navigation ul.pagination.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.pagination.orange li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.orange li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.orange li a:hover{background:#e68c00}.ink-navigation ul.pagination.blue li{background:#1b75ce}.ink-navigation ul.pagination.blue li.active a{background:#0c5baa}.ink-navigation ul.pagination.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.pagination.blue li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.blue li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.blue li a:hover{background:#0d68c2}.ink-navigation ul.pagination.green li{background:#4c9220}.ink-navigation ul.pagination.green li.active a{background:#356f10}.ink-navigation ul.pagination.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.pagination.green li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.green li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.green li a:hover{background:#3f8514}.ink-navigation ul.pagination.red li{background:#be1c1c}.ink-navigation ul.pagination.red li.active a{background:#9a0d0d}.ink-navigation ul.pagination.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.pagination.red li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.red li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.red li a:hover{background:#b10f0f}.ink-navigation ul.pagination.dotted li{background:0 0}.ink-navigation ul.pagination.dotted li a{background:#999;filter:alpha(Opacity=50);opacity:.5}.ink-navigation ul.pagination.dotted li.active a,.ink-navigation ul.pagination.dotted li:hover a{filter:alpha(Opacity=100);opacity:1}.ink-navigation ul.pagination.dotted.black li a{background:#1a1a1a}.ink-navigation ul.pagination.dotted.white li a{background:#fff}.ink-navigation ul.pagination.dotted.blue li a{background:#1b75ce}.ink-navigation ul.pagination.dotted.green li a{background:#4c9220}.ink-navigation ul.pagination.dotted.orange li a{background:#f2990d}.ink-navigation ul.pagination.dotted.red li a{background:#be1c1c}.ink-navigation ul.pagination.chevron li.next a,.ink-navigation ul.pagination.chevron li.previous a{color:#fff;filter:alpha(Opacity=60);opacity:.6}.ink-navigation ul.pagination.chevron li.next a.active,.ink-navigation ul.pagination.chevron li.next a:focus,.ink-navigation ul.pagination.chevron li.next a:hover,.ink-navigation ul.pagination.chevron li.previous a.active,.ink-navigation ul.pagination.chevron li.previous a:focus,.ink-navigation ul.pagination.chevron li.previous a:hover{filter:alpha(Opacity=70);opacity:.7;text-decoration:none;background:0 0}.ink-navigation ul.pagination.chevron li.disabled a{color:#fff;filter:alpha(Opacity=40);opacity:.4;text-shadow:none}.ink-navigation ul.pagination.chevron li.disabled a:focus,.ink-navigation ul.pagination.chevron li.disabled a:hover{color:#fff;filter:alpha(Opacity=40);opacity:.4}.ink-navigation ul.pagination.chevron.black li.disabled a,.ink-navigation ul.pagination.chevron.black li.next a,.ink-navigation ul.pagination.chevron.black li.previous a{color:#1a1a1a}.ink-navigation ul.pagination.chevron.grey li.disabled a,.ink-navigation ul.pagination.chevron.grey li.next a,.ink-navigation ul.pagination.chevron.grey li.previous a{color:#d9d9d9}.ink-navigation ul.pagination.chevron.blue li.disabled a,.ink-navigation ul.pagination.chevron.blue li.next a,.ink-navigation ul.pagination.chevron.blue li.previous a{color:#1b75ce}.ink-navigation ul.pagination.chevron.green li.disabled a,.ink-navigation ul.pagination.chevron.green li.next a,.ink-navigation ul.pagination.chevron.green li.previous a{color:#4c9220}.ink-navigation ul.pagination.chevron.orange li.disabled a,.ink-navigation ul.pagination.chevron.orange li.next a,.ink-navigation ul.pagination.chevron.orange li.previous a{color:#f2990d}.ink-navigation ul.pagination.chevron.red li.disabled a,.ink-navigation ul.pagination.chevron.red li.next a,.ink-navigation ul.pagination.chevron.red li.previous a{color:#be1c1c}.ink-navigation ul.pills li{background:#fff;font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.pills li a{color:#555;background:0 0}.ink-navigation ul.pills li a:hover,.ink-navigation ul.pills li.active a{background:#e6e6e6}.ink-navigation ul.pills li.disabled a{color:#999;text-shadow:#fff 0 1px 0}.ink-navigation ul.pills li.disabled a:hover{background:0 0}.ink-navigation ul.pills.grey li{background:#d9d9d9}.ink-navigation ul.pills.grey li.active a{background:#bfbfbf}.ink-navigation ul.pills.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.pills.grey li.disabled a:hover{background:0 0}.ink-navigation ul.pills.grey li a{color:#555}.ink-navigation ul.pills.grey li a:hover{background:#ccc}.ink-navigation ul.pills.black li{background:#1a1a1a}.ink-navigation ul.pills.black li.active a{background:#333}.ink-navigation ul.pills.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.pills.black li.disabled a:hover{background:0 0}.ink-navigation ul.pills.black li a{color:#fff}.ink-navigation ul.pills.black li a:hover{background:#292929}.ink-navigation ul.pills.blue li{background:#1b75ce}.ink-navigation ul.pills.blue li.active a{background:#0c5baa}.ink-navigation ul.pills.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.pills.blue li.disabled a:hover{background:0 0}.ink-navigation ul.pills.blue li a{color:#fff}.ink-navigation ul.pills.blue li a:hover{background:#0d68c2}.ink-navigation ul.pills.green li{background:#4c9220}.ink-navigation ul.pills.green li.active a{background:#356f10}.ink-navigation ul.pills.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.pills.green li.disabled a:hover{background:0 0}.ink-navigation ul.pills.green li a{color:#fff}.ink-navigation ul.pills.green li a:hover{background:#3f8514}.ink-navigation ul.pills.orange li{background:#f2990d}.ink-navigation ul.pills.orange li.active a{background:#cc7d00}.ink-navigation ul.pills.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.pills.orange li.disabled a:hover{background:0 0}.ink-navigation ul.pills.orange li a{color:#fff}.ink-navigation ul.pills.orange li a:hover{background:#e68c00}.ink-navigation ul.pills.red li{background:#be1c1c}.ink-navigation ul.pills.red li.active a{background:#9a0d0d}.ink-navigation ul.pills.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.pills.red li.disabled a:hover{background:0 0}.ink-navigation ul.pills.red li a{color:#fff}.ink-navigation ul.pills.red li a:hover{background:#b10f0f}table.ink-table{background:#fff}table.ink-table tr td,table.ink-table tr th{border-bottom:#bbb 1px solid;background:0 0}table.ink-table tr:last-child td{border-bottom:0}table.ink-table tfoot tr td,table.ink-table tfoot tr th{border-top:#bbb 1px solid}table.ink-table.alternating tbody tr:nth-child(odd){background-color:#f5f5f5}table.ink-table.hover tbody tr:hover{background:#fefbd6;color:#555}table.ink-table.bordered{border:#bbb 1px solid;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}table.ink-table.bordered tr th{border-left:#bbb 1px solid}table.ink-table.bordered tr th:first-child{border-left:0}table.ink-table.bordered tr:last-child td{border-bottom:0}table.ink-table.bordered tr td{border-left:#bbb 1px solid}table.ink-table.bordered tr td:first-child{border-left:0}table.ink-table tbody>tr.red td{background:#c91111;color:#fff}table.ink-table tbody>tr.green td{background:#4a9b17;color:#fff}table.ink-table tbody>tr.blue td{background:#0f75da;color:#fff}table.ink-table tbody>tr.orange td{background:#ff9c00;color:#fff}table.ink-table tbody>tr.black td{background:#000;color:#ccc}table.ink-table tbody>tr.yellow td{background:#ffd500;color:#000}.animated.slow{animation-duration:1s}.animated.medium{animation-duration:.5s}.animated.fast{animation-duration:.2s}.ink-carousel .stage{width:100%}.ink-carousel .ink-navigation{position:static}.ink-carousel{width:100%;position:relative;overflow:hidden;display:block}.ink-carousel .stage{left:0;height:auto!important;margin-top:0;margin-bottom:0;padding-left:0;list-style-type:none;white-space:nowrap;position:relative;overflow:visible;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}.ink-carousel .stage.column-group{display:-webkit-block;display:-moz-block;display:block;-webkit-flex-flow:none;-moz-flex-flow:none;flex-flow:none}.ink-carousel .stage .slide{position:relative;display:inline-block;vertical-align:top;white-space:normal;margin:0;float:none;zoom:1;*display:inline}.ink-datepicker-wrapper{position:relative}.ink-datepicker-calendar{margin-top:0;position:absolute}.ink-datepicker-calendar.right{left:100%;top:0}.ink-datepicker-calendar.left{right:100%;top:0}.ink-datepicker-calendar.bottom{top:100%;left:0}.ink-datepicker-calendar.top{bottom:100%;left:0}.ink-datepicker-calendar,.ink-datepicker-wrapper{display:inline;display:inline-block}.ink-calendar{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;text-align:center;padding:.3em;min-width:17.4em;font-size:13px;-webkit-box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;-moz-box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;background:#fff;z-index:10}.ink-calendar a{text-decoration:none}.ink-calendar li{list-style:none inside}html.ink-modal-is-open .ink-calendar{z-index:101}.ink-calendar-top-options{padding:5px;font-size:.813em;cursor:pointer}.ink-calendar-top-options .clean{float:left}.ink-calendar-top-options .close{float:right}.ink-calendar-top{line-height:2em;background:#e6e6e6;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-calendar-top div{float:left}.ink-calendar-top .ink-calendar-next,.ink-calendar-top .ink-calendar-prev{width:10%}.ink-calendar-top .ink-calendar-next a,.ink-calendar-top .ink-calendar-prev a{display:block}.ink-calendar-top .ink-calendar-month_desc{width:80%}.ink-calendar-month,.ink-calendar-month-selector,.ink-calendar-year-selector{margin-top:.5em;padding-left:0}.ink-calendar-month li a,.ink-calendar-month-selector li a,.ink-calendar-year-selector li a{margin:0;line-height:2em;vertical-align:middle;display:block;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;color:#444}.ink-calendar-month li a:hover,.ink-calendar-month-selector li a:hover,.ink-calendar-year-selector li a:hover{background:#e6e6e6}.ink-calendar-month li a.ink-calendar-on,.ink-calendar-month li a.ink-calendar-on:hover,.ink-calendar-month-selector li a.ink-calendar-on,.ink-calendar-month-selector li a.ink-calendar-on:hover,.ink-calendar-year-selector li a.ink-calendar-on,.ink-calendar-year-selector li a.ink-calendar-on:hover{background:#0069d6;color:#fff}.ink-calendar-month li a.ink-calendar-off,.ink-calendar-month li a.ink-calendar-off:hover,.ink-calendar-month-selector li a.ink-calendar-off,.ink-calendar-month-selector li a.ink-calendar-off:hover,.ink-calendar-year-selector li a.ink-calendar-off,.ink-calendar-year-selector li a.ink-calendar-off:hover{background:#fff;color:#aaa;cursor:default}.ink-calendar-month ul,.ink-calendar-month-selector ul,.ink-calendar-year-selector ul{clear:both;padding-left:0}.ink-calendar-month ul li,.ink-calendar-month-selector ul li,.ink-calendar-year-selector ul li{width:2.4em;float:left;text-align:center;padding:0;margin:0}.ink-calendar-month-selector ul li,.ink-calendar-year-selector ul li{width:25%}.ink-calendar-month-selector,.ink-calendar-year-selector{display:none}.action_inactive,.ink-calendar-off{color:#ddd!important}.ink-calendar-month .ink-calendar-header{border-bottom:1px solid rgba(0,0,0,.1);padding-bottom:.5em;margin-bottom:.5em;color:#aaa}.ink-calendar-middle,.ink-calendar-month .ink-calendar-header,.ink-calendar-month .ink-calendar-middle ul,.ink-calendar-top,.ink-calendar-top-options{*zoom:1}.ink-calendar-middle:after,.ink-calendar-month .ink-calendar-header:after,.ink-calendar-month .ink-calendar-middle ul:after,.ink-calendar-top-options:after,.ink-calendar-top:after{content:"";display:table;clear:both}body.ink-drawer{max-width:100%}body.ink-drawer .content-drawer,body.ink-drawer .left-drawer,body.ink-drawer .right-drawer{-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;transition-property:transform;-webkit-transition-duration:300ms;-moz-transition-duration:300ms;-o-transition-duration:300ms;transition-duration:300ms;-webkit-transition-timing-function:cubic-bezier(0.86,0,.07,1);-moz-transition-timing-function:cubic-bezier(0.86,0,.07,1);-o-transition-timing-function:cubic-bezier(0.86,0,.07,1);transition-timing-function:cubic-bezier(0.86,0,.07,1)}body.ink-drawer .left-drawer{left:-220px}body.ink-drawer .right-drawer{right:-220px}body.ink-drawer .content-drawer{width:100%}body.ink-drawer .left-drawer,body.ink-drawer .right-drawer{position:absolute;top:0;z-index:0;display:none;overflow-x:hidden;overflow-y:auto;width:220px;height:100%;-webkit-overflow-scrolling:touch}body.ink-drawer .left-drawer.show,body.ink-drawer .right-drawer.show{display:block;position:fixed}body.ink-drawer.push{overflow:hidden;width:100%;height:100%}body.ink-drawer.push .content-drawer{overflow:hidden}body.ink-drawer.push.left .content-drawer,body.ink-drawer.push.left .left-drawer{-webkit-transform:translate(220px,0);-moz-transform:translate(220px,0);-ms-transform:translate(220px,0);-o-transform:translate(220px,0);transform:translate(220px,0)}body.ink-drawer.push.right .content-drawer,body.ink-drawer.push.right .right-drawer{-webkit-transform:translate(-220px,0);-moz-transform:translate(-220px,0);-ms-transform:translate(-220px,0);-o-transform:translate(-220px,0);transform:translate(-220px,0)}body.ink-drawer.over{overflow:hidden;-webkit-user-drag:none}body.ink-drawer.over.left .left-drawer{-webkit-transform:translate(220px,0);-moz-transform:translate(220px,0);-ms-transform:translate(220px,0);-o-transform:translate(220px,0);transform:translate(220px,0)}body.ink-drawer.over.right .right-drawer{-webkit-transform:translate(-220px,0);-moz-transform:translate(-220px,0);-ms-transform:translate(-220px,0);-o-transform:translate(-220px,0);transform:translate(-220px,0)}.ink-shade{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgOAMAAM8AzbfAeUUAAAAASUVORK5CYII=);background:rgba(0,0,0,.8);width:100%;height:100%;top:0;right:0;bottom:0;left:0;margin-top:0;position:fixed;z-index:100;display:none;filter:alpha(Opacity=0);opacity:0}.ink-shade.fade{-webkit-transition:opacity 300ms;-moz-transition:opacity 300ms;-o-transition:opacity 300ms;transition:opacity 300ms}.ink-shade.visible{filter:alpha(Opacity=100);opacity:1}.ink-modal{top:50%;left:50%;width:90%;height:90%;background:#fff;z-index:100;position:absolute;overflow:hidden;filter:alpha(Opacity=100);opacity:1;-webkit-box-shadow:rgba(0,0,0,.8) 0 0 15px 0;-moz-box-shadow:rgba(0,0,0,.8) 0 0 15px 0;box-shadow:rgba(0,0,0,.8) 0 0 15px 0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;*zoom:1}.ink-modal:after{content:"";display:table;clear:both}.ink-modal>.modal-body{padding:1em;overflow-y:auto;overflow-x:hidden;height:auto}.ink-modal>.modal-body .ink-grid{padding-left:0;padding-right:0;width:100%;min-width:100%}.ink-modal>.modal-header,.ink-modal>header{border-bottom:1px #e6e6e6 solid;overflow:hidden;-webkit-box-shadow:rgba(175,175,175,.2) 0 1px 2px 0;-moz-box-shadow:rgba(175,175,175,.2) 0 1px 2px 0;box-shadow:rgba(175,175,175,.2) 0 1px 2px 0}.ink-modal>.modal-header>.modal-close,.ink-modal>header>.modal-close{padding-top:2px;text-align:center;color:#fff;width:26px;height:26px;line-height:1.2em;border:0;background:#bfbfbf;font-size:0;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%;text-shadow:rgba(0,0,0,.6) 0 -1px 0;filter:alpha(Opacity=60);opacity:.6;float:right}.ink-modal>.modal-header>.modal-close:after,.ink-modal>header>.modal-close:after{content:"\f00d";font-family:FontAwesome;font-size:medium;line-height:22px}.ink-modal>.modal-header>.modal-close:hover,.ink-modal>header>.modal-close:hover{filter:alpha(Opacity=100);opacity:1}.ink-modal>.modal-footer,.ink-modal>footer{background:#e6e6e6;margin-bottom:0;zoom:1;-webkit-box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0;-moz-box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0;box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0}.ink-modal>.modal-footer,.ink-modal>.modal-header,.ink-modal>footer,.ink-modal>header{padding:.8em 1em .65em}.ink-modal>.modal-footer:after,.ink-modal>.modal-footer:before,.ink-modal>.modal-header:after,.ink-modal>.modal-header:before,.ink-modal>footer:after,.ink-modal>footer:before,.ink-modal>header:after,.ink-modal>header:before{content:".";display:block;height:0;clear:both;visibility:hidden}.ink-modal-open{overflow:hidden}.ink-progress-bar{margin-bottom:1em;overflow:hidden;background:#f2f2f2;position:relative;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset;-moz-box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset;box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset}.ink-progress-bar .caption{position:absolute;top:0;left:0;width:100%;height:100%;line-height:1.7;text-align:center;color:#000;font-size:.813em;z-index:10}.ink-progress-bar .bar{height:1.3em;text-shadow:rgba(0,0,0,.25),0,1px,0;-webkit-box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;-moz-box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;-webkit-transition-property:width;-moz-transition-property:width;-o-transition-property:width;transition-property:width;-webkit-transition-duration:.6s;-moz-transition-duration:.6s;-o-transition-duration:.6s;transition-duration:.6s;-webkit-transition-timing-function:ease;-moz-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.ink-progress-bar .bar.grey{background:#ccc;color:#555}.ink-progress-bar .bar.green{background:#4a9b17;color:#fff}.ink-progress-bar .bar.blue{background:#0f75da;color:#fff}.ink-progress-bar .bar.red{background:#c91111;color:#fff}.ink-progress-bar .bar.orange{background:#ff9c00;color:#555}.ink-progress-bar .bar.black{background:#000;color:#fff}.dragging,.ink-sortable-list li{cursor:move;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;-ms-user-select:none;user-select:none;-ms-user-drag:none;-moz-user-drag:none;-khtml-user-drag:none;-webkit-user-drag:none;-o-user-drag:none;user-drag:none}.drag,.ink-sortable-list li.placeholder{-webkit-box-shadow:0,0,10px,0,rgba(0,0,0,.3);-moz-box-shadow:0,0,10px,0,rgba(0,0,0,.3);box-shadow:0,0,10px,0,rgba(0,0,0,.3)}.ink-sortable-list li{margin:0;border-bottom:1px solid #ccc;line-height:40px}.ink-sortable-list li.placeholder,.ink-sortable-list li:hover{background:#ccc;background:rgba(204,204,204,.2)}.ink-sortable-list li .ink-label{margin:0 .8em}.ink-sticky-stuck{position:fixed}.ink-tabs .tabs-nav{list-style:none;padding:0;*zoom:1}.ink-tabs .tabs-nav li{line-height:1.7;position:relative;margin:0}.ink-tabs .tabs-nav li a{padding:.5em 1em;display:block;border:1px solid transparent}.ink-tabs .tabs-nav li a:hover{background:#f0f0f0}.ink-tabs .tabs-nav li.active a{color:#555;cursor:default;text-decoration:none;background:#fff;border:1px solid #ccc}.ink-tabs .tabs-nav:after{content:"";display:table;clear:both}.ink-tabs .tabs-content{margin-top:1.5em;overflow:auto}.ink-tabs.top>.tabs-nav{border-bottom:1px solid #ccc}.ink-tabs.top>.tabs-nav li{float:left}.ink-tabs.top>.tabs-nav li a{margin-right:.4em;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;-ms-border-radius:4px 4px 0 0;-o-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.ink-tabs.top>.tabs-nav li.active{margin:0 0 -2px 0}.ink-tabs.top>.tabs-nav li.active a{border-bottom-color:transparent}.ink-tabs.bottom>.tabs-nav{border-top:1px solid #ccc}.ink-tabs.bottom>.tabs-nav li{float:left}.ink-tabs.bottom>.tabs-nav li a{margin-right:.4em;-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;-ms-border-radius:0 0 4px 4px;-o-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.ink-tabs.bottom>.tabs-nav li.active{margin:-2px 0 0 0}.ink-tabs.bottom>.tabs-nav li.active a{border-top-color:transparent}.ink-tabs.left>.tabs-nav{border-right:1px solid #ccc;float:left;margin-right:2em}.ink-tabs.left>.tabs-nav li{float:none;text-align:right}.ink-tabs.left>.tabs-nav li a{margin-bottom:.4em;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;-ms-border-radius:4px 0 0 4px;-o-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.ink-tabs.left>.tabs-nav li.active{margin:0 -2px 0 0}.ink-tabs.left>.tabs-nav li.active a{border-right-color:transparent}.ink-tabs.right>.tabs-nav{border-left:1px solid #ccc;float:right;margin-left:2em}.ink-tabs.right>.tabs-nav li{float:none}.ink-tabs.right>.tabs-nav li a{margin-bottom:.4em;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;-ms-border-radius:0 4px 4px 0;-o-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.ink-tabs.right>.tabs-nav li.active{margin:0 0 0 -2px}.ink-tabs.right>.tabs-nav li.active a{border-left-color:transparent}.ink-tagfield input[type=text].new-tag-input{background-color:#fff;border:1px solid #ccc;line-height:1em;margin:0;padding:5px;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-tagfield input[type=text].new-tag-input:focus{-webkit-box-shadow:0,0,0,3px,#eaeaea;-moz-box-shadow:0,0,0,3px,#eaeaea;box-shadow:0,0,0,3px,#eaeaea;border:1px solid #c3c3c3}.ink-tagfield span.ink-tag{background-color:#1b1b1b;color:#eaeaea;text-shadow:none;font-size:.9em;font-weight:400;border:1px solid #000;padding:4px 6px}.ink-tagfield span.ink-tag i.icon-remove{color:#ccc;font-size:.9em;font-weight:400;margin-left:4px}.ink-tagfield span.ink-tag i.icon-remove:hover{cursor:pointer;color:red}.ink-tooltip{display:inline-block;position:relative}.ink-tooltip>.content{background:#f0f0f0;padding:.5em .6em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;font-size:.8em;color:#8c8c8c}.ink-tooltip>.arrow{position:absolute}.ink-tooltip>.arrow.down,.ink-tooltip>.arrow.left,.ink-tooltip>.arrow.right,.ink-tooltip>.arrow.up{width:0;height:0}.ink-tooltip>.arrow.up{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #f0f0f0;top:-6px;left:50%;margin-left:-3px}.ink-tooltip>.arrow.down{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #f0f0f0;bottom:-5.45455px;left:50%;margin-left:-3px}.ink-tooltip>.arrow.right{border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:6px solid #f0f0f0;top:50%;right:-5.45455px;margin-top:-6px}.ink-tooltip>.arrow.left{border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:6px solid #f0f0f0;top:50%;left:-5.45455px;margin-top:-6px}.ink-tooltip.blue>.content{background:#0f75da;color:#fff}.ink-tooltip.blue>.arrow.up{border-bottom-color:#0f75da}.ink-tooltip.blue>.arrow.down{border-top-color:#0f75da}.ink-tooltip.blue>.arrow.left{border-right-color:#0f75da}.ink-tooltip.blue>.arrow.right{border-left-color:#0f75da}.ink-tooltip.red>.content{background:#c91111;color:#fff}.ink-tooltip.red>.arrow.up{border-bottom-color:#c91111}.ink-tooltip.red>.arrow.down{border-top-color:#c91111}.ink-tooltip.red>.arrow.left{border-right-color:#c91111}.ink-tooltip.red>.arrow.right{border-left-color:#c91111}.ink-tooltip.orange>.content{background:#ff9c00;color:#fff}.ink-tooltip.orange>.arrow.up{border-bottom-color:#ff9c00}.ink-tooltip.orange>.arrow.down{border-top-color:#ff9c00}.ink-tooltip.orange>.arrow.left{border-right-color:#ff9c00}.ink-tooltip.orange>.arrow.right{border-left-color:#ff9c00}.ink-tooltip.green>.content{background:#4a9b17;color:#fff}.ink-tooltip.green>.arrow.up{border-bottom-color:#4a9b17}.ink-tooltip.green>.arrow.down{border-top-color:#4a9b17}.ink-tooltip.green>.arrow.left{border-right-color:#4a9b17}.ink-tooltip.green>.arrow.right{border-left-color:#4a9b17}.ink-tooltip.black>.content{background:#000;color:#fff}.ink-tooltip.black>.arrow.up{border-bottom-color:#000}.ink-tooltip.black>.arrow.down{border-top-color:#000}.ink-tooltip.black>.arrow.left{border-right-color:#000}.ink-tooltip.black>.arrow.right{border-left-color:#000}.ink-tooltip.grey>.content{background:#ccc;color:#333}.ink-tooltip.grey>.arrow.up{border-bottom-color:#ccc}.ink-tooltip.grey>.arrow.down{border-top-color:#ccc}.ink-tooltip.grey>.arrow.left{border-right-color:#ccc}.ink-tooltip.grey>.arrow.right{border-left-color:#ccc}.ink-tree-view li{list-style-type:none}.ink-tree-view [data-open]>:before{margin-left:-1.3em;margin-right:.4em;text-decoration:none} \ No newline at end of file +@charset "UTF-8";.grid-order{flex:100%}.show-all{display:inherit}.hide-all{display:none!important}.no-margin{margin:0!important}.no-padding{padding:0!important}.push-left{float:left;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;justify-content:flex-start}.push-center{float:none!important;margin-left:auto;margin-right:auto;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center}.push-right{float:right;-webkit-justify-content:flex-end;-moz-justify-content:flex-end;justify-content:flex-end}.align-left{text-align:left}.align-center{text-align:center}.align-right{text-align:right}.clearfix{overflow:hidden}.clearfix:after{content:"";display:table;clear:both}html{font-family:sans-serif}html *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}figure{margin:0}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.ink-alert.basic,.ink-alert.block{font-size:.938em;margin:1em 0;position:relative;overflow:hidden}.ink-alert.basic{padding:1em 3em 1em 1em}.ink-alert.basic p{margin:0}.ink-alert.basic .ink-close{top:.55em}.ink-alert.block{font-size:1em}.ink-alert.block>h4{padding:1em 3em 1em 1em;font-size:.938em;line-height:1.5;margin:0}.ink-alert.block p{margin:1.5em 1em}.ink-alert.block ul{list-style:inside}.ink-alert .ink-dismiss{position:absolute;line-height:.56em;font-size:1.8em;padding:5px;border:none;background:0 0;top:.5em;right:.4em}.ink-badge{padding:.2em .6em;font-size:.813em;margin-left:.6em}.ink-button{-webkit-appearance:menuitem;padding:8px 12px;cursor:pointer;text-decoration:none;text-align:center;display:inline-block;vertical-align:middle;white-space:nowrap;line-height:normal}.ink-button+.ink-button{margin-left:5px}.button-group>.ink-button{float:left;margin:5px 0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;border-left:none}.button-group>.ink-button:active,.button-group>.ink-button:hover{border-left:none}.button-group>.ink-button:first-child{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px;border-left:1px solid #bfbfbf}.button-group>.ink-button:last-child{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.button-group:after{content:"";display:table;clear:both}.button-toolbar>.button-group{margin-right:10px;float:left}.button-toolbar:after{content:"";display:table;clear:both}.ink-form fieldset{border:none;padding:0;margin:0}.ink-form fieldset legend{font-size:1.438em;font-weight:700;width:100%;border-bottom:1px solid #ddd}.ink-form fieldset legend+*{-webkit-margin-top-collapse:separate;margin:2em 0}.ink-form p.tip{font-size:.875em;color:#909090;position:relative;margin:.2em 0 0 .1em}.ink-form p.label{padding:0;margin:0;color:#555;white-space:normal}.ink-form input[type=color],.ink-form input[type=date],.ink-form input[type=datetime-local],.ink-form input[type=datetime],.ink-form input[type=email],.ink-form input[type=month],.ink-form input[type=number],.ink-form input[type=password],.ink-form input[type=search],.ink-form input[type=tel],.ink-form input[type=text],.ink-form input[type=time],.ink-form input[type=url],.ink-form input[type=week],.ink-form select,.ink-form textarea{font-family:Roboto,Arial,Helvetica,sans-serif;font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;padding:8px 6px;border:1px solid #c6c6c6;resize:none;background:#FFF;vertical-align:middle}.ink-form input[type=color]:focus,.ink-form input[type=date]:focus,.ink-form input[type=datetime-local]:focus,.ink-form input[type=datetime]:focus,.ink-form input[type=email]:focus,.ink-form input[type=month]:focus,.ink-form input[type=number]:focus,.ink-form input[type=password]:focus,.ink-form input[type=search]:focus,.ink-form input[type=tel]:focus,.ink-form input[type=text]:focus,.ink-form input[type=time]:focus,.ink-form input[type=url]:focus,.ink-form input[type=week]:focus,.ink-form select:focus,.ink-form textarea:focus{border-color:rgba(153,153,153,.9);-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;outline:0}.ink-form input[type=color]:disabled,.ink-form input[type=date]:disabled,.ink-form input[type=datetime-local]:disabled,.ink-form input[type=datetime]:disabled,.ink-form input[type=email]:disabled,.ink-form input[type=month]:disabled,.ink-form input[type=number]:disabled,.ink-form input[type=password]:disabled,.ink-form input[type=search]:disabled,.ink-form input[type=tel]:disabled,.ink-form input[type=text]:disabled,.ink-form input[type=time]:disabled,.ink-form input[type=url]:disabled,.ink-form input[type=week]:disabled,.ink-form select:disabled,.ink-form textarea:disabled{background:#f2f2f2;cursor:not-allowed}.ink-form .input-file{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;padding:6px;border:1px solid #c6c6c6;background:#FFF;vertical-align:middle;line-height:1.2}.ink-form .input-file input[type=file]{-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;border:none;padding:0;background:0 0;width:100%}.ink-form .ink-button{margin:0 5px}.ink-form label{cursor:pointer}.ink-form select{line-height:2;cursor:pointer}.ink-form textarea{min-height:5em}.ink-form .control-group{line-height:2;margin-bottom:1em}.ink-form .control-group:after{content:"";display:table;clear:both}.ink-form .control-group .control{position:relative}.ink-form .control-group .control:after{content:"";display:table;clear:both}.ink-form .control-group .control>li{position:relative}.ink-form .control-group .control>li:after{content:"";display:table;clear:both}.ink-form .control-group .control>input,.ink-form .control-group .control>select,.ink-form .control-group .control>textarea{width:100%}.ink-form .control-group .control>input+[class*=fa-],.ink-form .control-group .control>input+[class^=fa-],.ink-form .control-group .control>select+[class*=fa-],.ink-form .control-group .control>select+[class^=fa-],.ink-form .control-group .control>textarea+[class*=fa-],.ink-form .control-group .control>textarea+[class^=fa-]{display:none}.ink-form .control-group .control.append-button span,.ink-form .control-group .control.append-symbol span,.ink-form .control-group .control.prepend-button span,.ink-form .control-group .control.prepend-symbol span{width:100%;position:relative}.ink-form .control-group .control.append-button span>input,.ink-form .control-group .control.append-button span>select,.ink-form .control-group .control.append-button span>textarea,.ink-form .control-group .control.append-symbol span>input,.ink-form .control-group .control.append-symbol span>select,.ink-form .control-group .control.append-symbol span>textarea,.ink-form .control-group .control.prepend-button span>input,.ink-form .control-group .control.prepend-button span>select,.ink-form .control-group .control.prepend-button span>textarea,.ink-form .control-group .control.prepend-symbol span>input,.ink-form .control-group .control.prepend-symbol span>select,.ink-form .control-group .control.prepend-symbol span>textarea{width:100%}.ink-form .control-group .control.append-button>input[type=button],.ink-form .control-group .control.append-button>input[type=reset],.ink-form .control-group .control.append-button>input[type=submit],.ink-form .control-group .control.append-symbol>input[type=button],.ink-form .control-group .control.append-symbol>input[type=reset],.ink-form .control-group .control.append-symbol>input[type=submit],.ink-form .control-group .control.prepend-button>input[type=button],.ink-form .control-group .control.prepend-button>input[type=reset],.ink-form .control-group .control.prepend-button>input[type=submit],.ink-form .control-group .control.prepend-symbol>input[type=button],.ink-form .control-group .control.prepend-symbol>input[type=reset],.ink-form .control-group .control.prepend-symbol>input[type=submit]{width:auto}.ink-form .control-group .control.append-button{display:-webkit-flex;display:flex;display:-ms-flexbox}.ink-form .control-group .control.append-button span>input,.ink-form .control-group .control.append-button span>select,.ink-form .control-group .control.append-button span>textarea{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-form .control-group .control.append-button .ink-button{margin:0;-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0;border-left:none}.ink-form .control-group .control.prepend-button{display:-webkit-flex;display:flex;display:-ms-flexbox}.ink-form .control-group .control.prepend-button span>input,.ink-form .control-group .control.prepend-button span>select,.ink-form .control-group .control.prepend-button span>textarea{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-form .control-group .control.prepend-button .ink-button{margin:0;-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px;border-right:none}.ink-form .control-group .control.append-symbol span{display:block}.ink-form .control-group .control.append-symbol span>input,.ink-form .control-group .control.append-symbol span>select,.ink-form .control-group .control.append-symbol span>textarea{padding-right:2.5em}.ink-form .control-group .control.append-symbol span>[class*=" fa-"],.ink-form .control-group .control.append-symbol span>[class^=fa-]{position:absolute;right:1em;top:.86em;pointer-events:none}.ink-form .control-group .control.prepend-symbol span{display:block}.ink-form .control-group .control.prepend-symbol span>input,.ink-form .control-group .control.prepend-symbol span>select,.ink-form .control-group .control.prepend-symbol span>textarea{padding-left:2.5em}.ink-form .control-group .control.prepend-symbol span>[class*=" fa-"],.ink-form .control-group .control.prepend-symbol span>[class^=fa-]{position:absolute;left:1em;top:.86em;pointer-events:none}.ink-form .control-group input[type=checkbox],.ink-form .control-group input[type=radio]{position:absolute;border:none;cursor:pointer}.ink-form .control-group input[type=checkbox]+label,.ink-form .control-group input[type=radio]+label{margin-top:-.28em;padding-left:1.25em;vertical-align:super;display:inline-block}.ink-form .control-group .inline li{padding:0}.ink-form .control-group .inline li label{margin-right:1em}.ink-form .control-group.validation.error input,.ink-form .control-group.validation.error select,.ink-form .control-group.validation.error textarea{outline:0;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;border:1px solid rgba(200,10,16,.5)}.ink-form .control-group.validation.error p.tip{color:rgba(150,7,12,.55)}.ink-form .control-group.validation.warning input,.ink-form .control-group.validation.warning select,.ink-form .control-group.validation.warning textarea{outline:0;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;border:1px solid rgba(255,156,0,.6)}.ink-form .control-group.validation.warning p.tip{color:rgba(204,125,0,.6)}.ink-form .control-group.required label,.ink-form .control-group.required p.label{color:#555}.ink-form .control-group.required label:after,.ink-form .control-group.required p.label:after{content:"\f069";color:#c91111;margin-left:.6em;font-family:FontAwesome;font-size:.75em;width:1.25em}.ink-form .control-group.required ul.control label:after{content:""}.ink-grid{width:auto;max-width:1440px;margin:0 auto}.order-1{order:1;-ms-flex-order:1}.order-2{order:2;-ms-flex-order:2}.order-3{order:3;-ms-flex-order:3}.order-4{order:4;-ms-flex-order:4}.order-5{order:5;-ms-flex-order:5}.order-6{order:6;-ms-flex-order:6}.order-7{order:7;-ms-flex-order:7}.order-8{order:8;-ms-flex-order:8}.order-9{order:9;-ms-flex-order:9}.order-10{order:10;-ms-flex-order:10}.all-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.all-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}@media screen and (min-width:1261px){.ink-grid{padding:0 2em}.column-group.gutters{margin-left:-2em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}.column-group.horizontal-gutters{margin-left:-2em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=xlarge-]{padding-left:2em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=xlarge-]{margin-bottom:2em}.column-group.double-gutters{margin-left:-4em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}.column-group.double-horizontal-gutters{margin-left:-4em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}.column-group.half-gutters{margin-left:-1em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}.column-group.half-horizontal-gutters{margin-left:-1em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}.column-group.quarter-gutters{margin-left:-.5em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}.column-group.quarter-horizontal-gutters{margin-left:-.5em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}.column-group.xlarge-gutters{margin-left:-2em}.column-group.xlarge-gutters>.all-auto,.column-group.xlarge-gutters>[class*=all-],.column-group.xlarge-gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}.column-group.xlarge-horizontal-gutters{margin-left:-2em}.column-group.xlarge-horizontal-gutters>.all-auto,.column-group.xlarge-horizontal-gutters>[class*=all-],.column-group.xlarge-horizontal-gutters>[class*=xlarge-]{padding-left:2em}.column-group.xlarge-vertical-gutters>.all-auto,.column-group.xlarge-vertical-gutters>[class*=all-],.column-group.xlarge-vertical-gutters>[class*=xlarge-]{margin-bottom:2em}.column-group.xlarge-double-gutters{margin-left:-4em}.column-group.xlarge-double-gutters>.all-auto,.column-group.xlarge-double-gutters>[class*=all-],.column-group.xlarge-double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}.column-group.xlarge-double-horizontal-gutters{margin-left:-4em}.column-group.xlarge-double-horizontal-gutters>.all-auto,.column-group.xlarge-double-horizontal-gutters>[class*=all-],.column-group.xlarge-double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}.column-group.xlarge-double-vertical-gutters>.all-auto,.column-group.xlarge-double-vertical-gutters>[class*=all-],.column-group.xlarge-double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}.column-group.xlarge-half-gutters{margin-left:-1em}.column-group.xlarge-half-gutters>.all-auto,.column-group.xlarge-half-gutters>[class*=all-],.column-group.xlarge-half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}.column-group.xlarge-half-horizontal-gutters{margin-left:-1em}.column-group.xlarge-half-horizontal-gutters>.all-auto,.column-group.xlarge-half-horizontal-gutters>[class*=all-],.column-group.xlarge-half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}.column-group.xlarge-half-vertical-gutters>.all-auto,.column-group.xlarge-half-vertical-gutters>[class*=all-],.column-group.xlarge-half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}.column-group.xlarge-quarter-gutters{margin-left:-.5em}.column-group.xlarge-quarter-gutters>.all-auto,.column-group.xlarge-quarter-gutters>[class*=all-],.column-group.xlarge-quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}.column-group.xlarge-quarter-horizontal-gutters{margin-left:-.5em}.column-group.xlarge-quarter-horizontal-gutters>.all-auto,.column-group.xlarge-quarter-horizontal-gutters>[class*=all-],.column-group.xlarge-quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}.column-group.xlarge-quarter-vertical-gutters>.all-auto,.column-group.xlarge-quarter-vertical-gutters>[class*=all-],.column-group.xlarge-quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}.column-group.xlarge-no-gutters{margin-left:0}.column-group.xlarge-no-gutters>.all-auto,.column-group.xlarge-no-gutters>[class*=all-],.column-group.xlarge-no-gutters>[class*=xlarge-]{padding-left:0;margin-bottom:0}.xlarge-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.xlarge-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.reverse,.column-group.xlarge-reverse,.ink-flex.reverse,.ink-flex.xlarge-reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.vertical,.column-group.xlarge-vertical,.ink-flex.vertical,.ink-flex.xlarge-vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.vertical.reverse,.column-group.xlarge-vertical.xlarge-reverse,.ink-flex.vertical.reverse,.ink-flex.xlarge-vertical.xlarge-reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.xlarge-order-1{order:1;-ms-flex-order:1}.xlarge-order-2{order:2;-ms-flex-order:2}.xlarge-order-3{order:3;-ms-flex-order:3}.xlarge-order-4{order:4;-ms-flex-order:4}.xlarge-order-5{order:5;-ms-flex-order:5}.xlarge-order-6{order:6;-ms-flex-order:6}.xlarge-order-7{order:7;-ms-flex-order:7}.xlarge-order-8{order:8;-ms-flex-order:8}.xlarge-order-9{order:9;-ms-flex-order:9}.xlarge-order-10{order:10;-ms-flex-order:10}.column-group .xlarge-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.push-top,.xlarge-push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.push-bottom,.xlarge-push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.push-middle,.xlarge-push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.push-left,.xlarge-push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.push-center,.xlarge-push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.push-right,.xlarge-push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.xlarge-align-left{text-align:left}.xlarge-align-center{text-align:center}.xlarge-align-right{text-align:right}.space,.xlarge-space{margin:2em}.padding,.xlarge-padding{padding:2em}.double-space,.xlarge-double-space{margin:4em}.double-padding,.xlarge-double-padding{padding:4em}.half-space,.xlarge-half-space{margin:1em}.half-padding,.xlarge-half-padding{padding:1em}.quarter-space,.xlarge-quarter-space{margin:.5em}.quarter-padding,.xlarge-quarter-padding{padding:.5em}.vertical-space,.xlarge-vertical-space{margin-top:2em;margin-bottom:2em}.vertical-padding,.xlarge-vertical-padding{padding-top:2em;padding-bottom:2em}.double-vertical-space,.xlarge-double-vertical-space{margin-top:4em;margin-bottom:4em}.double-vertical-padding,.xlarge-double-vertical-padding{padding-top:4em;padding-bottom:4em}.half-vertical-space,.xlarge-half-vertical-space{margin-top:1em;margin-bottom:1em}.half-vertical-padding,.xlarge-half-vertical-padding{padding-top:1em;padding-bottom:1em}.quarter-vertical-space,.xlarge-quarter-vertical-space{margin-top:.5em;margin-bottom:.5em}.quarter-vertical-padding,.xlarge-quarter-vertical-padding{padding-top:.5em;padding-bottom:.5em}.horizontal-space,.xlarge-horizontal-space{margin-left:2em;margin-right:2em}.horizontal-padding,.xlarge-horizontal-padding{padding-left:2em;padding-right:2em}.double-horizontal-space,.xlarge-double-horizontal-space{margin-left:4em;margin-right:4em}.double-horizontal-padding,.xlarge-double-horizontal-padding{padding-left:4em;padding-right:4em}.half-horizontal-space,.xlarge-half-horizontal-space{margin-left:1em;margin-right:1em}.half-horizontal-padding,.xlarge-half-horizontal-padding{padding-left:1em;padding-right:1em}.quarter-horizontal-space,.xlarge-quarter-horizontal-space{margin-left:.5em;margin-right:.5em}.quarter-horizontal-padding,.xlarge-quarter-horizontal-padding{padding-left:.5em;padding-right:.5em}.top-space,.xlarge-top-space{margin-top:2em}.top-padding,.xlarge-top-padding{padding-top:2em}.double-top-space,.xlarge-double-top-space{margin-top:4em}.double-top-padding,.xlarge-double-top-padding{padding-top:4em}.half-top-space,.xlarge-half-top-space{margin-top:1em}.half-top-padding,.xlarge-half-top-padding{padding-top:1em}.quarter-top-space,.xlarge-quarter-top-space{margin-top:.5em}.quarter-top-padding,.xlarge-quarter-top-padding{padding-top:.5em}.right-space,.xlarge-right-space{margin-right:2em}.right-padding,.xlarge-right-padding{padding-right:2em}.double-right-space,.xlarge-double-right-space{margin-right:4em}.double-right-padding,.xlarge-double-right-padding{padding-right:4em}.half-right-space,.xlarge-half-right-space{margin-right:1em}.half-right-padding,.xlarge-half-right-padding{padding-right:1em}.quarter-right-space,.xlarge-quarter-right-space{margin-right:.5em}.quarter-right-padding,.xlarge-quarter-right-padding{padding-right:.5em}.bottom-space,.xlarge-bottom-space{margin-bottom:2em}.bottom-padding,.xlarge-bottom-padding{padding-bottom:2em}.double-bottom-space,.xlarge-double-bottom-space{margin-bottom:4em}.double-bottom-padding,.xlarge-double-bottom-padding{padding-bottom:4em}.half-bottom-space,.xlarge-half-bottom-space{margin-bottom:1em}.half-bottom-padding,.xlarge-half-bottom-padding{padding-bottom:1em}.quarter-bottom-space,.xlarge-quarter-bottom-space{margin-bottom:.5em}.quarter-bottom-padding,.xlarge-quarter-bottom-padding{padding-bottom:.5em}.left-space,.xlarge-left-space{margin-left:2em}.left-padding,.xlarge-left-padding{padding-left:2em}.double-left-space,.xlarge-double-left-space{margin-left:4em}.double-left-padding,.xlarge-double-left-padding{padding-left:4em}.half-left-space,.xlarge-half-left-space{margin-left:1em}.half-left-padding,.xlarge-half-left-padding{padding-left:1em}.quarter-left-space,.xlarge-quarter-left-space{margin-left:.5em}.quarter-left-padding,.xlarge-quarter-left-padding{padding-left:.5em}.hide-xlarge{display:none!important}.show-xlarge{display:inherit!important}table.show-xlarge{display:table}thead.show-xlarge{display:table-header-group}tbody.show-xlarge{display:table-row-group}tfoot.show-xlarge{display:table-footer-group}tr.show-xlarge{display:table-row}td.show-xlarge,th.show-xlarge{display:table-cell}}@media screen and (min-width:961px) and (max-width:1260px){.ink-grid{padding:0 1.75em}.column-group.gutters{margin-left:-1.75em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.horizontal-gutters{margin-left:-1.75em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.double-gutters{margin-left:-3.5em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.double-horizontal-gutters{margin-left:-3.5em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.half-gutters{margin-left:-.875em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.half-horizontal-gutters{margin-left:-.875em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.quarter-gutters{margin-left:-.4375em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.quarter-horizontal-gutters{margin-left:-.4375em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-gutters{margin-left:-1.75em}.column-group.large-gutters>.all-auto,.column-group.large-gutters>[class*=all-],.column-group.large-gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.large-horizontal-gutters{margin-left:-1.75em}.column-group.large-horizontal-gutters>.all-auto,.column-group.large-horizontal-gutters>[class*=all-],.column-group.large-horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.large-vertical-gutters>.all-auto,.column-group.large-vertical-gutters>[class*=all-],.column-group.large-vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.large-double-gutters{margin-left:-3.5em}.column-group.large-double-gutters>.all-auto,.column-group.large-double-gutters>[class*=all-],.column-group.large-double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.large-double-horizontal-gutters{margin-left:-3.5em}.column-group.large-double-horizontal-gutters>.all-auto,.column-group.large-double-horizontal-gutters>[class*=all-],.column-group.large-double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.large-double-vertical-gutters>.all-auto,.column-group.large-double-vertical-gutters>[class*=all-],.column-group.large-double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.large-half-gutters{margin-left:-.875em}.column-group.large-half-gutters>.all-auto,.column-group.large-half-gutters>[class*=all-],.column-group.large-half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.large-half-horizontal-gutters{margin-left:-.875em}.column-group.large-half-horizontal-gutters>.all-auto,.column-group.large-half-horizontal-gutters>[class*=all-],.column-group.large-half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.large-half-vertical-gutters>.all-auto,.column-group.large-half-vertical-gutters>[class*=all-],.column-group.large-half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.large-quarter-gutters{margin-left:-.4375em}.column-group.large-quarter-gutters>.all-auto,.column-group.large-quarter-gutters>[class*=all-],.column-group.large-quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.large-quarter-horizontal-gutters{margin-left:-.4375em}.column-group.large-quarter-horizontal-gutters>.all-auto,.column-group.large-quarter-horizontal-gutters>[class*=all-],.column-group.large-quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.large-quarter-vertical-gutters>.all-auto,.column-group.large-quarter-vertical-gutters>[class*=all-],.column-group.large-quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-no-gutters{margin-left:0}.column-group.large-no-gutters>.all-auto,.column-group.large-no-gutters>[class*=all-],.column-group.large-no-gutters>[class*=large-]{padding-left:0;margin-bottom:0}.large-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.large-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.large-reverse,.column-group.reverse,.ink-flex.large-reverse,.ink-flex.reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.large-vertical,.column-group.vertical,.ink-flex.large-vertical,.ink-flex.vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.large-vertical.large-reverse,.column-group.vertical.reverse,.ink-flex.large-vertical.large-reverse,.ink-flex.vertical.reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.large-order-1{order:1;-ms-flex-order:1}.large-order-2{order:2;-ms-flex-order:2}.large-order-3{order:3;-ms-flex-order:3}.large-order-4{order:4;-ms-flex-order:4}.large-order-5{order:5;-ms-flex-order:5}.large-order-6{order:6;-ms-flex-order:6}.large-order-7{order:7;-ms-flex-order:7}.large-order-8{order:8;-ms-flex-order:8}.large-order-9{order:9;-ms-flex-order:9}.large-order-10{order:10;-ms-flex-order:10}.column-group .large-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.large-push-top,.push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.large-push-bottom,.push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.large-push-middle,.push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.large-push-left,.push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.large-push-center,.push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.large-push-right,.push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.large-align-left{text-align:left}.large-align-center{text-align:center}.large-align-right{text-align:right}.large-space,.space{margin:1.75em}.large-padding,.padding{padding:1.75em}.double-space,.large-double-space{margin:3.5em}.double-padding,.large-double-padding{padding:3.5em}.half-space,.large-half-space{margin:.875em}.half-padding,.large-half-padding{padding:.875em}.large-quarter-space,.quarter-space{margin:.4375em}.large-quarter-padding,.quarter-padding{padding:.4375em}.large-vertical-space,.vertical-space{margin-top:1.75em;margin-bottom:1.75em}.large-vertical-padding,.vertical-padding{padding-top:1.75em;padding-bottom:1.75em}.double-vertical-space,.large-double-vertical-space{margin-top:3.5em;margin-bottom:3.5em}.double-vertical-padding,.large-double-vertical-padding{padding-top:3.5em;padding-bottom:3.5em}.half-vertical-space,.large-half-vertical-space{margin-top:.875em;margin-bottom:.875em}.half-vertical-padding,.large-half-vertical-padding{padding-top:.875em;padding-bottom:.875em}.large-quarter-vertical-space,.quarter-vertical-space{margin-top:.4375em;margin-bottom:.4375em}.large-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.4375em;padding-bottom:.4375em}.horizontal-space,.large-horizontal-space{margin-left:1.75em;margin-right:1.75em}.horizontal-padding,.large-horizontal-padding{padding-left:1.75em;padding-right:1.75em}.double-horizontal-space,.large-double-horizontal-space{margin-left:3.5em;margin-right:3.5em}.double-horizontal-padding,.large-double-horizontal-padding{padding-left:3.5em;padding-right:3.5em}.half-horizontal-space,.large-half-horizontal-space{margin-left:.875em;margin-right:.875em}.half-horizontal-padding,.large-half-horizontal-padding{padding-left:.875em;padding-right:.875em}.large-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.4375em;margin-right:.4375em}.large-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.4375em;padding-right:.4375em}.large-top-space,.top-space{margin-top:1.75em}.large-top-padding,.top-padding{padding-top:1.75em}.double-top-space,.large-double-top-space{margin-top:3.5em}.double-top-padding,.large-double-top-padding{padding-top:3.5em}.half-top-space,.large-half-top-space{margin-top:.875em}.half-top-padding,.large-half-top-padding{padding-top:.875em}.large-quarter-top-space,.quarter-top-space{margin-top:.4375em}.large-quarter-top-padding,.quarter-top-padding{padding-top:.4375em}.large-right-space,.right-space{margin-right:1.75em}.large-right-padding,.right-padding{padding-right:1.75em}.double-right-space,.large-double-right-space{margin-right:3.5em}.double-right-padding,.large-double-right-padding{padding-right:3.5em}.half-right-space,.large-half-right-space{margin-right:.875em}.half-right-padding,.large-half-right-padding{padding-right:.875em}.large-quarter-right-space,.quarter-right-space{margin-right:.4375em}.large-quarter-right-padding,.quarter-right-padding{padding-right:.4375em}.bottom-space,.large-bottom-space{margin-bottom:1.75em}.bottom-padding,.large-bottom-padding{padding-bottom:1.75em}.double-bottom-space,.large-double-bottom-space{margin-bottom:3.5em}.double-bottom-padding,.large-double-bottom-padding{padding-bottom:3.5em}.half-bottom-space,.large-half-bottom-space{margin-bottom:.875em}.half-bottom-padding,.large-half-bottom-padding{padding-bottom:.875em}.large-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.4375em}.large-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.4375em}.large-left-space,.left-space{margin-left:1.75em}.large-left-padding,.left-padding{padding-left:1.75em}.double-left-space,.large-double-left-space{margin-left:3.5em}.double-left-padding,.large-double-left-padding{padding-left:3.5em}.half-left-space,.large-half-left-space{margin-left:.875em}.half-left-padding,.large-half-left-padding{padding-left:.875em}.large-quarter-left-space,.quarter-left-space{margin-left:.4375em}.large-quarter-left-padding,.quarter-left-padding{padding-left:.4375em}.hide-large{display:none!important}.show-large{display:inherit!important}table.show-large{display:table}thead.show-large{display:table-header-group}tbody.show-large{display:table-row-group}tfoot.show-large{display:table-footer-group}tr.show-large{display:table-row}td.show-large,th.show-large{display:table-cell}}@media screen and (min-width:641px) and (max-width:960px){.ink-grid{padding:0 1.5em}.column-group.gutters{margin-left:-1.5em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}.column-group.horizontal-gutters{margin-left:-1.5em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=medium-]{padding-left:1.5em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=medium-]{margin-bottom:1.5em}.column-group.double-gutters{margin-left:-3em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}.column-group.double-horizontal-gutters{margin-left:-3em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=medium-]{padding-left:3em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=medium-]{margin-bottom:3em}.column-group.half-gutters{margin-left:-.75em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}.column-group.half-horizontal-gutters{margin-left:-.75em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=medium-]{padding-left:.75em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}.column-group.quarter-gutters{margin-left:-.375em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}.column-group.quarter-horizontal-gutters{margin-left:-.375em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}.column-group.medium-gutters{margin-left:-1.5em}.column-group.medium-gutters>.all-auto,.column-group.medium-gutters>[class*=all-],.column-group.medium-gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}.column-group.medium-horizontal-gutters{margin-left:-1.5em}.column-group.medium-horizontal-gutters>.all-auto,.column-group.medium-horizontal-gutters>[class*=all-],.column-group.medium-horizontal-gutters>[class*=medium-]{padding-left:1.5em}.column-group.medium-vertical-gutters>.all-auto,.column-group.medium-vertical-gutters>[class*=all-],.column-group.medium-vertical-gutters>[class*=medium-]{margin-bottom:1.5em}.column-group.medium-double-gutters{margin-left:-3em}.column-group.medium-double-gutters>.all-auto,.column-group.medium-double-gutters>[class*=all-],.column-group.medium-double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}.column-group.medium-double-horizontal-gutters{margin-left:-3em}.column-group.medium-double-horizontal-gutters>.all-auto,.column-group.medium-double-horizontal-gutters>[class*=all-],.column-group.medium-double-horizontal-gutters>[class*=medium-]{padding-left:3em}.column-group.medium-double-vertical-gutters>.all-auto,.column-group.medium-double-vertical-gutters>[class*=all-],.column-group.medium-double-vertical-gutters>[class*=medium-]{margin-bottom:3em}.column-group.medium-half-gutters{margin-left:-.75em}.column-group.medium-half-gutters>.all-auto,.column-group.medium-half-gutters>[class*=all-],.column-group.medium-half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}.column-group.medium-half-horizontal-gutters{margin-left:-.75em}.column-group.medium-half-horizontal-gutters>.all-auto,.column-group.medium-half-horizontal-gutters>[class*=all-],.column-group.medium-half-horizontal-gutters>[class*=medium-]{padding-left:.75em}.column-group.medium-half-vertical-gutters>.all-auto,.column-group.medium-half-vertical-gutters>[class*=all-],.column-group.medium-half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}.column-group.medium-quarter-gutters{margin-left:-.375em}.column-group.medium-quarter-gutters>.all-auto,.column-group.medium-quarter-gutters>[class*=all-],.column-group.medium-quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}.column-group.medium-quarter-horizontal-gutters{margin-left:-.375em}.column-group.medium-quarter-horizontal-gutters>.all-auto,.column-group.medium-quarter-horizontal-gutters>[class*=all-],.column-group.medium-quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}.column-group.medium-quarter-vertical-gutters>.all-auto,.column-group.medium-quarter-vertical-gutters>[class*=all-],.column-group.medium-quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}.column-group.medium-no-gutters{margin-left:0}.column-group.medium-no-gutters>.all-auto,.column-group.medium-no-gutters>[class*=all-],.column-group.medium-no-gutters>[class*=medium-]{padding-left:0;margin-bottom:0}.medium-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.medium-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.medium-reverse,.column-group.reverse,.ink-flex.medium-reverse,.ink-flex.reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.medium-vertical,.column-group.vertical,.ink-flex.medium-vertical,.ink-flex.vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.medium-vertical.medium-reverse,.column-group.vertical.reverse,.ink-flex.medium-vertical.medium-reverse,.ink-flex.vertical.reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.medium-order-1{order:1;-ms-flex-order:1}.medium-order-2{order:2;-ms-flex-order:2}.medium-order-3{order:3;-ms-flex-order:3}.medium-order-4{order:4;-ms-flex-order:4}.medium-order-5{order:5;-ms-flex-order:5}.medium-order-6{order:6;-ms-flex-order:6}.medium-order-7{order:7;-ms-flex-order:7}.medium-order-8{order:8;-ms-flex-order:8}.medium-order-9{order:9;-ms-flex-order:9}.medium-order-10{order:10;-ms-flex-order:10}.column-group .medium-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.medium-push-top,.push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.medium-push-bottom,.push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.medium-push-middle,.push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.medium-push-left,.push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.medium-push-center,.push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.medium-push-right,.push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.medium-align-left{text-align:left}.medium-align-center{text-align:center}.medium-align-right{text-align:right}.medium-space,.space{margin:1.5em}.medium-padding,.padding{padding:1.5em}.double-space,.medium-double-space{margin:3em}.double-padding,.medium-double-padding{padding:3em}.half-space,.medium-half-space{margin:.75em}.half-padding,.medium-half-padding{padding:.75em}.medium-quarter-space,.quarter-space{margin:.375em}.medium-quarter-padding,.quarter-padding{padding:.375em}.medium-vertical-space,.vertical-space{margin-top:1.5em;margin-bottom:1.5em}.medium-vertical-padding,.vertical-padding{padding-top:1.5em;padding-bottom:1.5em}.double-vertical-space,.medium-double-vertical-space{margin-top:3em;margin-bottom:3em}.double-vertical-padding,.medium-double-vertical-padding{padding-top:3em;padding-bottom:3em}.half-vertical-space,.medium-half-vertical-space{margin-top:.75em;margin-bottom:.75em}.half-vertical-padding,.medium-half-vertical-padding{padding-top:.75em;padding-bottom:.75em}.medium-quarter-vertical-space,.quarter-vertical-space{margin-top:.375em;margin-bottom:.375em}.medium-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.375em;padding-bottom:.375em}.horizontal-space,.medium-horizontal-space{margin-left:1.5em;margin-right:1.5em}.horizontal-padding,.medium-horizontal-padding{padding-left:1.5em;padding-right:1.5em}.double-horizontal-space,.medium-double-horizontal-space{margin-left:3em;margin-right:3em}.double-horizontal-padding,.medium-double-horizontal-padding{padding-left:3em;padding-right:3em}.half-horizontal-space,.medium-half-horizontal-space{margin-left:.75em;margin-right:.75em}.half-horizontal-padding,.medium-half-horizontal-padding{padding-left:.75em;padding-right:.75em}.medium-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.375em;margin-right:.375em}.medium-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.375em;padding-right:.375em}.medium-top-space,.top-space{margin-top:1.5em}.medium-top-padding,.top-padding{padding-top:1.5em}.double-top-space,.medium-double-top-space{margin-top:3em}.double-top-padding,.medium-double-top-padding{padding-top:3em}.half-top-space,.medium-half-top-space{margin-top:.75em}.half-top-padding,.medium-half-top-padding{padding-top:.75em}.medium-quarter-top-space,.quarter-top-space{margin-top:.375em}.medium-quarter-top-padding,.quarter-top-padding{padding-top:.375em}.medium-right-space,.right-space{margin-right:1.5em}.medium-right-padding,.right-padding{padding-right:1.5em}.double-right-space,.medium-double-right-space{margin-right:3em}.double-right-padding,.medium-double-right-padding{padding-right:3em}.half-right-space,.medium-half-right-space{margin-right:.75em}.half-right-padding,.medium-half-right-padding{padding-right:.75em}.medium-quarter-right-space,.quarter-right-space{margin-right:.375em}.medium-quarter-right-padding,.quarter-right-padding{padding-right:.375em}.bottom-space,.medium-bottom-space{margin-bottom:1.5em}.bottom-padding,.medium-bottom-padding{padding-bottom:1.5em}.double-bottom-space,.medium-double-bottom-space{margin-bottom:3em}.double-bottom-padding,.medium-double-bottom-padding{padding-bottom:3em}.half-bottom-space,.medium-half-bottom-space{margin-bottom:.75em}.half-bottom-padding,.medium-half-bottom-padding{padding-bottom:.75em}.medium-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.375em}.medium-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.375em}.left-space,.medium-left-space{margin-left:1.5em}.left-padding,.medium-left-padding{padding-left:1.5em}.double-left-space,.medium-double-left-space{margin-left:3em}.double-left-padding,.medium-double-left-padding{padding-left:3em}.half-left-space,.medium-half-left-space{margin-left:.75em}.half-left-padding,.medium-half-left-padding{padding-left:.75em}.medium-quarter-left-space,.quarter-left-space{margin-left:.375em}.medium-quarter-left-padding,.quarter-left-padding{padding-left:.375em}.hide-medium{display:none!important}.show-medium{display:inherit!important}table.show-medium{display:table}thead.show-medium{display:table-header-group}tbody.show-medium{display:table-row-group}tfoot.show-medium{display:table-footer-group}tr.show-medium{display:table-row}td.show-medium,th.show-medium{display:table-cell}}@media screen and (min-width:321px) and (max-width:640px){.ink-grid{padding:0 1.25em}.column-group.gutters{margin-left:-1.25em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}.column-group.horizontal-gutters{margin-left:-1.25em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=small-]{padding-left:1.25em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=small-]{margin-bottom:1.25em}.column-group.double-gutters{margin-left:-2.5em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}.column-group.double-horizontal-gutters{margin-left:-2.5em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=small-]{padding-left:2.5em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}.column-group.half-gutters{margin-left:-.625em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}.column-group.half-horizontal-gutters{margin-left:-.625em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=small-]{padding-left:.625em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=small-]{margin-bottom:.625em}.column-group.quarter-gutters{margin-left:-.3125em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}.column-group.quarter-horizontal-gutters{margin-left:-.3125em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}.column-group.small-gutters{margin-left:-1.25em}.column-group.small-gutters>.all-auto,.column-group.small-gutters>[class*=all-],.column-group.small-gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}.column-group.small-horizontal-gutters{margin-left:-1.25em}.column-group.small-horizontal-gutters>.all-auto,.column-group.small-horizontal-gutters>[class*=all-],.column-group.small-horizontal-gutters>[class*=small-]{padding-left:1.25em}.column-group.small-vertical-gutters>.all-auto,.column-group.small-vertical-gutters>[class*=all-],.column-group.small-vertical-gutters>[class*=small-]{margin-bottom:1.25em}.column-group.small-double-gutters{margin-left:-2.5em}.column-group.small-double-gutters>.all-auto,.column-group.small-double-gutters>[class*=all-],.column-group.small-double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}.column-group.small-double-horizontal-gutters{margin-left:-2.5em}.column-group.small-double-horizontal-gutters>.all-auto,.column-group.small-double-horizontal-gutters>[class*=all-],.column-group.small-double-horizontal-gutters>[class*=small-]{padding-left:2.5em}.column-group.small-double-vertical-gutters>.all-auto,.column-group.small-double-vertical-gutters>[class*=all-],.column-group.small-double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}.column-group.small-half-gutters{margin-left:-.625em}.column-group.small-half-gutters>.all-auto,.column-group.small-half-gutters>[class*=all-],.column-group.small-half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}.column-group.small-half-horizontal-gutters{margin-left:-.625em}.column-group.small-half-horizontal-gutters>.all-auto,.column-group.small-half-horizontal-gutters>[class*=all-],.column-group.small-half-horizontal-gutters>[class*=small-]{padding-left:.625em}.column-group.small-half-vertical-gutters>.all-auto,.column-group.small-half-vertical-gutters>[class*=all-],.column-group.small-half-vertical-gutters>[class*=small-]{margin-bottom:.625em}.column-group.small-quarter-gutters{margin-left:-.3125em}.column-group.small-quarter-gutters>.all-auto,.column-group.small-quarter-gutters>[class*=all-],.column-group.small-quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}.column-group.small-quarter-horizontal-gutters{margin-left:-.3125em}.column-group.small-quarter-horizontal-gutters>.all-auto,.column-group.small-quarter-horizontal-gutters>[class*=all-],.column-group.small-quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}.column-group.small-quarter-vertical-gutters>.all-auto,.column-group.small-quarter-vertical-gutters>[class*=all-],.column-group.small-quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}.column-group.small-no-gutters{margin-left:0}.column-group.small-no-gutters>.all-auto,.column-group.small-no-gutters>[class*=all-],.column-group.small-no-gutters>[class*=small-]{padding-left:0;margin-bottom:0}.small-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.small-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.reverse,.column-group.small-reverse,.ink-flex.reverse,.ink-flex.small-reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.small-vertical,.column-group.vertical,.ink-flex.small-vertical,.ink-flex.vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.small-vertical.small-reverse,.column-group.vertical.reverse,.ink-flex.small-vertical.small-reverse,.ink-flex.vertical.reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.small-order-1{order:1;-ms-flex-order:1}.small-order-2{order:2;-ms-flex-order:2}.small-order-3{order:3;-ms-flex-order:3}.small-order-4{order:4;-ms-flex-order:4}.small-order-5{order:5;-ms-flex-order:5}.small-order-6{order:6;-ms-flex-order:6}.small-order-7{order:7;-ms-flex-order:7}.small-order-8{order:8;-ms-flex-order:8}.small-order-9{order:9;-ms-flex-order:9}.small-order-10{order:10;-ms-flex-order:10}.column-group .small-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.push-top,.small-push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.push-bottom,.small-push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.push-middle,.small-push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.push-left,.small-push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.push-center,.small-push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.push-right,.small-push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.small-align-left{text-align:left}.small-align-center{text-align:center}.small-align-right{text-align:right}.small-space,.space{margin:1.25em}.padding,.small-padding{padding:1.25em}.double-space,.small-double-space{margin:2.5em}.double-padding,.small-double-padding{padding:2.5em}.half-space,.small-half-space{margin:.625em}.half-padding,.small-half-padding{padding:.625em}.quarter-space,.small-quarter-space{margin:.3125em}.quarter-padding,.small-quarter-padding{padding:.3125em}.small-vertical-space,.vertical-space{margin-top:1.25em;margin-bottom:1.25em}.small-vertical-padding,.vertical-padding{padding-top:1.25em;padding-bottom:1.25em}.double-vertical-space,.small-double-vertical-space{margin-top:2.5em;margin-bottom:2.5em}.double-vertical-padding,.small-double-vertical-padding{padding-top:2.5em;padding-bottom:2.5em}.half-vertical-space,.small-half-vertical-space{margin-top:.625em;margin-bottom:.625em}.half-vertical-padding,.small-half-vertical-padding{padding-top:.625em;padding-bottom:.625em}.quarter-vertical-space,.small-quarter-vertical-space{margin-top:.3125em;margin-bottom:.3125em}.quarter-vertical-padding,.small-quarter-vertical-padding{padding-top:.3125em;padding-bottom:.3125em}.horizontal-space,.small-horizontal-space{margin-left:1.25em;margin-right:1.25em}.horizontal-padding,.small-horizontal-padding{padding-left:1.25em;padding-right:1.25em}.double-horizontal-space,.small-double-horizontal-space{margin-left:2.5em;margin-right:2.5em}.double-horizontal-padding,.small-double-horizontal-padding{padding-left:2.5em;padding-right:2.5em}.half-horizontal-space,.small-half-horizontal-space{margin-left:.625em;margin-right:.625em}.half-horizontal-padding,.small-half-horizontal-padding{padding-left:.625em;padding-right:.625em}.quarter-horizontal-space,.small-quarter-horizontal-space{margin-left:.3125em;margin-right:.3125em}.quarter-horizontal-padding,.small-quarter-horizontal-padding{padding-left:.3125em;padding-right:.3125em}.small-top-space,.top-space{margin-top:1.25em}.small-top-padding,.top-padding{padding-top:1.25em}.double-top-space,.small-double-top-space{margin-top:2.5em}.double-top-padding,.small-double-top-padding{padding-top:2.5em}.half-top-space,.small-half-top-space{margin-top:.625em}.half-top-padding,.small-half-top-padding{padding-top:.625em}.quarter-top-space,.small-quarter-top-space{margin-top:.3125em}.quarter-top-padding,.small-quarter-top-padding{padding-top:.3125em}.right-space,.small-right-space{margin-right:1.25em}.right-padding,.small-right-padding{padding-right:1.25em}.double-right-space,.small-double-right-space{margin-right:2.5em}.double-right-padding,.small-double-right-padding{padding-right:2.5em}.half-right-space,.small-half-right-space{margin-right:.625em}.half-right-padding,.small-half-right-padding{padding-right:.625em}.quarter-right-space,.small-quarter-right-space{margin-right:.3125em}.quarter-right-padding,.small-quarter-right-padding{padding-right:.3125em}.bottom-space,.small-bottom-space{margin-bottom:1.25em}.bottom-padding,.small-bottom-padding{padding-bottom:1.25em}.double-bottom-space,.small-double-bottom-space{margin-bottom:2.5em}.double-bottom-padding,.small-double-bottom-padding{padding-bottom:2.5em}.half-bottom-space,.small-half-bottom-space{margin-bottom:.625em}.half-bottom-padding,.small-half-bottom-padding{padding-bottom:.625em}.quarter-bottom-space,.small-quarter-bottom-space{margin-bottom:.3125em}.quarter-bottom-padding,.small-quarter-bottom-padding{padding-bottom:.3125em}.left-space,.small-left-space{margin-left:1.25em}.left-padding,.small-left-padding{padding-left:1.25em}.double-left-space,.small-double-left-space{margin-left:2.5em}.double-left-padding,.small-double-left-padding{padding-left:2.5em}.half-left-space,.small-half-left-space{margin-left:.625em}.half-left-padding,.small-half-left-padding{padding-left:.625em}.quarter-left-space,.small-quarter-left-space{margin-left:.3125em}.quarter-left-padding,.small-quarter-left-padding{padding-left:.3125em}.hide-small{display:none!important}.show-small{display:inherit!important}table.show-small{display:table}thead.show-small{display:table-header-group}tbody.show-small{display:table-row-group}tfoot.show-small{display:table-footer-group}tr.show-small{display:table-row}td.show-small,th.show-small{display:table-cell}}@media screen and (max-width:320px){.ink-grid{padding:0 1em}.column-group.gutters{margin-left:-1em}.column-group.gutters>.all-auto,.column-group.gutters>[class*=all-],.column-group.gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}.column-group.horizontal-gutters{margin-left:-1em}.column-group.horizontal-gutters>.all-auto,.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=tiny-]{padding-left:1em}.column-group.vertical-gutters>.all-auto,.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=tiny-]{margin-bottom:1em}.column-group.double-gutters{margin-left:-2em}.column-group.double-gutters>.all-auto,.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}.column-group.double-horizontal-gutters{margin-left:-2em}.column-group.double-horizontal-gutters>.all-auto,.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=tiny-]{padding-left:2em}.column-group.double-vertical-gutters>.all-auto,.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}.column-group.half-gutters{margin-left:-.5em}.column-group.half-gutters>.all-auto,.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}.column-group.half-horizontal-gutters{margin-left:-.5em}.column-group.half-horizontal-gutters>.all-auto,.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}.column-group.half-vertical-gutters>.all-auto,.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}.column-group.quarter-gutters{margin-left:-.25em}.column-group.quarter-gutters>.all-auto,.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}.column-group.quarter-horizontal-gutters{margin-left:-.25em}.column-group.quarter-horizontal-gutters>.all-auto,.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}.column-group.quarter-vertical-gutters>.all-auto,.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}.column-group.tiny-gutters{margin-left:-1em}.column-group.tiny-gutters>.all-auto,.column-group.tiny-gutters>[class*=all-],.column-group.tiny-gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}.column-group.tiny-horizontal-gutters{margin-left:-1em}.column-group.tiny-horizontal-gutters>.all-auto,.column-group.tiny-horizontal-gutters>[class*=all-],.column-group.tiny-horizontal-gutters>[class*=tiny-]{padding-left:1em}.column-group.tiny-vertical-gutters>.all-auto,.column-group.tiny-vertical-gutters>[class*=all-],.column-group.tiny-vertical-gutters>[class*=tiny-]{margin-bottom:1em}.column-group.tiny-double-gutters{margin-left:-2em}.column-group.tiny-double-gutters>.all-auto,.column-group.tiny-double-gutters>[class*=all-],.column-group.tiny-double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}.column-group.tiny-double-horizontal-gutters{margin-left:-2em}.column-group.tiny-double-horizontal-gutters>.all-auto,.column-group.tiny-double-horizontal-gutters>[class*=all-],.column-group.tiny-double-horizontal-gutters>[class*=tiny-]{padding-left:2em}.column-group.tiny-double-vertical-gutters>.all-auto,.column-group.tiny-double-vertical-gutters>[class*=all-],.column-group.tiny-double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}.column-group.tiny-half-gutters{margin-left:-.5em}.column-group.tiny-half-gutters>.all-auto,.column-group.tiny-half-gutters>[class*=all-],.column-group.tiny-half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}.column-group.tiny-half-horizontal-gutters{margin-left:-.5em}.column-group.tiny-half-horizontal-gutters>.all-auto,.column-group.tiny-half-horizontal-gutters>[class*=all-],.column-group.tiny-half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}.column-group.tiny-half-vertical-gutters>.all-auto,.column-group.tiny-half-vertical-gutters>[class*=all-],.column-group.tiny-half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}.column-group.tiny-quarter-gutters{margin-left:-.25em}.column-group.tiny-quarter-gutters>.all-auto,.column-group.tiny-quarter-gutters>[class*=all-],.column-group.tiny-quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}.column-group.tiny-quarter-horizontal-gutters{margin-left:-.25em}.column-group.tiny-quarter-horizontal-gutters>.all-auto,.column-group.tiny-quarter-horizontal-gutters>[class*=all-],.column-group.tiny-quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}.column-group.tiny-quarter-vertical-gutters>.all-auto,.column-group.tiny-quarter-vertical-gutters>[class*=all-],.column-group.tiny-quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}.column-group.tiny-no-gutters{margin-left:0}.column-group.tiny-no-gutters>.all-auto,.column-group.tiny-no-gutters>[class*=all-],.column-group.tiny-no-gutters>[class*=tiny-]{padding-left:0;margin-bottom:0}.tiny-5{width:5%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-10{width:10%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-15{width:15%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-16{width:16.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-20{width:20%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-25{width:25%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-30{width:30%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-33{width:33.33333%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-35{width:35%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-40{width:40%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-45{width:45%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-50{width:50%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-55{width:55%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-60{width:60%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-65{width:65%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-66{width:66.66666%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-70{width:70%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-75{width:75%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-80{width:80%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-85{width:85%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-90{width:90%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-95{width:95%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-100{width:100%;-webkit-flex-grow:0;-ms-flex-grow:0;flex-grow:0}.tiny-auto{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-ms-flex:1;flex:1}.column-group,.ink-flex{display:-webkit-flex;display:flex;display:-ms-flexbox;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;list-style:none}.column-group.reverse,.column-group.tiny-reverse,.ink-flex.reverse,.ink-flex.tiny-reverse{-webkit-flex-direction:row-reverse;-moz-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.column-group.tiny-vertical,.column-group.vertical,.ink-flex.tiny-vertical,.ink-flex.vertical{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.column-group.tiny-vertical.tiny-reverse,.column-group.vertical.reverse,.ink-flex.tiny-vertical.tiny-reverse,.ink-flex.vertical.reverse{-webkit-flex-direction:column-reverse;-moz-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.tiny-order-1{order:1;-ms-flex-order:1}.tiny-order-2{order:2;-ms-flex-order:2}.tiny-order-3{order:3;-ms-flex-order:3}.tiny-order-4{order:4;-ms-flex-order:4}.tiny-order-5{order:5;-ms-flex-order:5}.tiny-order-6{order:6;-ms-flex-order:6}.tiny-order-7{order:7;-ms-flex-order:7}.tiny-order-8{order:8;-ms-flex-order:8}.tiny-order-9{order:9;-ms-flex-order:9}.tiny-order-10{order:10;-ms-flex-order:10}.column-group .tiny-auto{-webkit-flex-basis:auto;-ms-flex-basis:auto;flex-basis:auto;-webkit-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.push-top,.tiny-push-top{-webkit-box-align:start;-webkit-align-items:flex-start;-moz-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.push-bottom,.tiny-push-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-moz-box-align:end;-ms-flex-align:end;align-items:flex-end;-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.push-middle,.tiny-push-middle{-webkit-box-align:center;-webkit-align-items:center;-moz-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-self:flex-center;-ms-flex-item-align:center;align-self:center}.push-left,.tiny-push-left{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:start;float:left}.push-center,.tiny-push-center{float:none!important;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;margin-left:auto;margin-right:auto}.push-right,.tiny-push-right{-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:end;float:right}.tiny-align-left{text-align:left}.tiny-align-center{text-align:center}.tiny-align-right{text-align:right}.space,.tiny-space{margin:1em}.padding,.tiny-padding{padding:1em}.double-space,.tiny-double-space{margin:2em}.double-padding,.tiny-double-padding{padding:2em}.half-space,.tiny-half-space{margin:.5em}.half-padding,.tiny-half-padding{padding:.5em}.quarter-space,.tiny-quarter-space{margin:.25em}.quarter-padding,.tiny-quarter-padding{padding:.25em}.tiny-vertical-space,.vertical-space{margin-top:1em;margin-bottom:1em}.tiny-vertical-padding,.vertical-padding{padding-top:1em;padding-bottom:1em}.double-vertical-space,.tiny-double-vertical-space{margin-top:2em;margin-bottom:2em}.double-vertical-padding,.tiny-double-vertical-padding{padding-top:2em;padding-bottom:2em}.half-vertical-space,.tiny-half-vertical-space{margin-top:.5em;margin-bottom:.5em}.half-vertical-padding,.tiny-half-vertical-padding{padding-top:.5em;padding-bottom:.5em}.quarter-vertical-space,.tiny-quarter-vertical-space{margin-top:.25em;margin-bottom:.25em}.quarter-vertical-padding,.tiny-quarter-vertical-padding{padding-top:.25em;padding-bottom:.25em}.horizontal-space,.tiny-horizontal-space{margin-left:1em;margin-right:1em}.horizontal-padding,.tiny-horizontal-padding{padding-left:1em;padding-right:1em}.double-horizontal-space,.tiny-double-horizontal-space{margin-left:2em;margin-right:2em}.double-horizontal-padding,.tiny-double-horizontal-padding{padding-left:2em;padding-right:2em}.half-horizontal-space,.tiny-half-horizontal-space{margin-left:.5em;margin-right:.5em}.half-horizontal-padding,.tiny-half-horizontal-padding{padding-left:.5em;padding-right:.5em}.quarter-horizontal-space,.tiny-quarter-horizontal-space{margin-left:.25em;margin-right:.25em}.quarter-horizontal-padding,.tiny-quarter-horizontal-padding{padding-left:.25em;padding-right:.25em}.tiny-top-space,.top-space{margin-top:1em}.tiny-top-padding,.top-padding{padding-top:1em}.double-top-space,.tiny-double-top-space{margin-top:2em}.double-top-padding,.tiny-double-top-padding{padding-top:2em}.half-top-space,.tiny-half-top-space{margin-top:.5em}.half-top-padding,.tiny-half-top-padding{padding-top:.5em}.quarter-top-space,.tiny-quarter-top-space{margin-top:.25em}.quarter-top-padding,.tiny-quarter-top-padding{padding-top:.25em}.right-space,.tiny-right-space{margin-right:1em}.right-padding,.tiny-right-padding{padding-right:1em}.double-right-space,.tiny-double-right-space{margin-right:2em}.double-right-padding,.tiny-double-right-padding{padding-right:2em}.half-right-space,.tiny-half-right-space{margin-right:.5em}.half-right-padding,.tiny-half-right-padding{padding-right:.5em}.quarter-right-space,.tiny-quarter-right-space{margin-right:.25em}.quarter-right-padding,.tiny-quarter-right-padding{padding-right:.25em}.bottom-space,.tiny-bottom-space{margin-bottom:1em}.bottom-padding,.tiny-bottom-padding{padding-bottom:1em}.double-bottom-space,.tiny-double-bottom-space{margin-bottom:2em}.double-bottom-padding,.tiny-double-bottom-padding{padding-bottom:2em}.half-bottom-space,.tiny-half-bottom-space{margin-bottom:.5em}.half-bottom-padding,.tiny-half-bottom-padding{padding-bottom:.5em}.quarter-bottom-space,.tiny-quarter-bottom-space{margin-bottom:.25em}.quarter-bottom-padding,.tiny-quarter-bottom-padding{padding-bottom:.25em}.left-space,.tiny-left-space{margin-left:1em}.left-padding,.tiny-left-padding{padding-left:1em}.double-left-space,.tiny-double-left-space{margin-left:2em}.double-left-padding,.tiny-double-left-padding{padding-left:2em}.half-left-space,.tiny-half-left-space{margin-left:.5em}.half-left-padding,.tiny-half-left-padding{padding-left:.5em}.quarter-left-space,.tiny-quarter-left-space{margin-left:.25em}.quarter-left-padding,.tiny-quarter-left-padding{padding-left:.25em}.hide-tiny{display:none!important}.show-tiny{display:inherit!important}table.show-tiny{display:table}thead.show-tiny{display:table-header-group}tbody.show-tiny{display:table-row-group}tfoot.show-tiny{display:table-footer-group}tr.show-tiny{display:table-row}td.show-tiny,th.show-tiny{display:table-cell}}@media screen and (min-width:1261px){html{font-size:1.08em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:961px) and (max-width:1260px){html{font-size:1.05em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:641px) and (max-width:960px){html{font-size:1em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:321px) and (max-width:640px){html{font-size:.98em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (max-width:320px){html{font-size:.97em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-thin-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-thin-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-thin-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-thin-webfont.ttf?1423657803) format('truetype');font-weight:100;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-thinitalic-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-thinitalic-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-thinitalic-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-thinitalic-webfont.ttf?1423657803) format('truetype');font-weight:100;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-light-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-light-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-light-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-light-webfont.ttf?1423657803) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-lightitalic-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-lightitalic-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-lightitalic-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-lightitalic-webfont.ttf?1423657803) format('truetype');font-weight:300;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-regular-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-regular-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-regular-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-regular-webfont.ttf?1423657803) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-italic-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-italic-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-italic-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-italic-webfont.ttf?1423657803) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-medium-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-medium-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-medium-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-medium-webfont.ttf?1423657803) format('truetype');font-weight:500;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-mediumitalic-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-mediumitalic-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-mediumitalic-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-mediumitalic-webfont.ttf?1423657803) format('truetype');font-weight:500;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-bold-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-bold-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-bold-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-bold-webfont.ttf?1423657803) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-bolditalic-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-bolditalic-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-bolditalic-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-bolditalic-webfont.ttf?1423657803) format('truetype');font-weight:700;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-black-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-black-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-black-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-black-webfont.ttf?1423657803) format('truetype');font-weight:900;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-blackitalic-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-blackitalic-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-blackitalic-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-blackitalic-webfont.ttf?1423657803) format('truetype');font-weight:900;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-light-webfont.eot?1423657803);src:url(../fonts/Roboto_condensed/robotocondensed-light-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-light-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-light-webfont.ttf?1423657803) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot?1423657803);src:url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.ttf?1423657803) format('truetype');font-weight:300;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot?1423657803);src:url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.ttf?1423657803) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot?1423657803);src:url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.ttf?1423657803) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot?1423657803);src:url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.ttf?1423657803) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot?1423657803);src:url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.ttf?1423657803) format('truetype');font-weight:700;font-style:italic}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-thin-webfont.eot?1408628222);src:url(../fonts/Roboto_slab/robotoslab-thin-webfont.eot?&1408628222#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-thin-webfont.woff?1408628222) format('woff'),url(../fonts/Roboto_slab/robotoslab-thin-webfont.ttf?1408628222) format('truetype');font-weight:100;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-light-webfont.eot?1408628222);src:url(../fonts/Roboto_slab/robotoslab-light-webfont.eot?&1408628222#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-light-webfont.woff?1408628222) format('woff'),url(../fonts/Roboto_slab/robotoslab-light-webfont.ttf?1408628222) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-regular-webfont.eot?1408628222);src:url(../fonts/Roboto_slab/robotoslab-regular-webfont.eot?&1408628222#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-regular-webfont.woff?1408628222) format('woff'),url(../fonts/Roboto_slab/robotoslab-regular-webfont.ttf?1408628222) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-bold-webfont.eot?1408628222);src:url(../fonts/Roboto_slab/robotoslab-bold-webfont.eot?&1408628222#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-bold-webfont.woff?1408628222) format('woff'),url(../fonts/Roboto_slab/robotoslab-bold-webfont.ttf?1408628222) format('truetype');font-weight:700;font-style:normal}.ink-label{padding:0 .35em;white-space:nowrap}.ink-navigation{overflow:visible}.ink-navigation ul{list-style-type:none;padding:0;margin:0}.ink-navigation ul li{margin:0}.ink-navigation .breadcrumbs li{line-height:2.7em;display:inline}.ink-navigation .breadcrumbs li a{display:inline;padding:0}.ink-navigation .breadcrumbs li a:hover{background:0 0}.ink-navigation .breadcrumbs li.active a{cursor:default;text-decoration:none}.ink-navigation .breadcrumbs li:first-child a{padding-left:1.2em}.ink-navigation .breadcrumbs li:after{content:'/';display:inline;margin:0 .7em}.ink-navigation .breadcrumbs li:last-child:after{content:'';display:none}.ink-dropdown,.ink-navigation{position:relative}.ink-dropdown ul.dropdown,.ink-dropdown ul.dropdown-menu,.ink-navigation ul.dropdown,.ink-navigation ul.dropdown-menu{position:absolute;top:110%;background:#fff;z-index:30;border:1px solid #d9d9d9;height:auto;width:auto;min-width:10em;max-width:12em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:rgba(100,100,100,.3) 0 0 1px 0;-moz-box-shadow:rgba(100,100,100,.3) 0 0 1px 0;box-shadow:rgba(100,100,100,.3) 0 0 1px 0;margin-left:0;padding:.35em 0;font-size:.85em}.ink-dropdown ul.dropdown li,.ink-dropdown ul.dropdown-menu li,.ink-navigation ul.dropdown li,.ink-navigation ul.dropdown-menu li{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-border-radius:none;-moz-border-radius:none;-ms-border-radius:none;-o-border-radius:none;border-radius:none;width:auto;height:auto;min-height:auto;display:list-item;float:none;margin:0;text-align:left;text-transform:none;padding:0;position:relative;list-style-type:none}.ink-dropdown ul.dropdown li.separator-above,.ink-dropdown ul.dropdown-menu li.separator-above,.ink-navigation ul.dropdown li.separator-above,.ink-navigation ul.dropdown-menu li.separator-above{padding-top:.35em;margin-top:.35em;border-top:1px solid #d9d9d9}.ink-dropdown ul.dropdown li.separator-below,.ink-dropdown ul.dropdown-menu li.separator-below,.ink-navigation ul.dropdown li.separator-below,.ink-navigation ul.dropdown-menu li.separator-below{padding-bottom:.35em;margin-bottom:.35em;border-bottom:1px solid #d9d9d9}.ink-dropdown ul.dropdown li.heading,.ink-dropdown ul.dropdown-menu li.heading,.ink-navigation ul.dropdown li.heading,.ink-navigation ul.dropdown-menu li.heading{font-weight:700;margin-bottom:.35em;padding:.5em .8em;color:#333}.ink-dropdown ul.dropdown li a,.ink-dropdown ul.dropdown-menu li a,.ink-navigation ul.dropdown li a,.ink-navigation ul.dropdown-menu li a{color:#444;padding:.5em .8em;display:block;clear:both}.ink-dropdown ul.dropdown li a:hover,.ink-dropdown ul.dropdown-menu li a:hover,.ink-navigation ul.dropdown li a:hover,.ink-navigation ul.dropdown-menu li a:hover{background:#f2f2f2;text-decoration:none}.ink-dropdown ul.dropdown li.active a,.ink-dropdown ul.dropdown-menu li.active a,.ink-navigation ul.dropdown li.active a,.ink-navigation ul.dropdown-menu li.active a{background:#999;color:#fff}.ink-dropdown ul.dropdown li.disabled a,.ink-dropdown ul.dropdown-menu li.disabled a,.ink-navigation ul.dropdown li.disabled a,.ink-navigation ul.dropdown-menu li.disabled a{color:#b3b3b3}.ink-dropdown ul.dropdown li.disabled a:hover,.ink-dropdown ul.dropdown-menu li.disabled a:hover,.ink-navigation ul.dropdown li.disabled a:hover,.ink-navigation ul.dropdown-menu li.disabled a:hover{background:0 0;cursor:default}.ink-dropdown ul.dropdown li.submenu,.ink-dropdown ul.dropdown-menu li.submenu,.ink-navigation ul.dropdown li.submenu,.ink-navigation ul.dropdown-menu li.submenu{overflow:visible}.ink-dropdown ul.dropdown li.submenu>a,.ink-dropdown ul.dropdown-menu li.submenu>a,.ink-navigation ul.dropdown li.submenu>a,.ink-navigation ul.dropdown-menu li.submenu>a{white-space:nowrap}.ink-dropdown ul.dropdown li.submenu>a:after,.ink-dropdown ul.dropdown-menu li.submenu>a:after,.ink-navigation ul.dropdown li.submenu>a:after,.ink-navigation ul.dropdown-menu li.submenu>a:after{content:"\f0da";width:auto;margin-left:.8em;font-family:FontAwesome;color:#b3b3b3}.ink-dropdown ul.dropdown li.submenu:hover>a,.ink-dropdown ul.dropdown-menu li.submenu:hover>a,.ink-navigation ul.dropdown li.submenu:hover>a,.ink-navigation ul.dropdown-menu li.submenu:hover>a{background:#f2f2f2;text-decoration:none}.ink-dropdown ul.dropdown li.submenu:hover:hover>ul.dropdown,.ink-dropdown ul.dropdown li.submenu:hover:hover>ul.dropdown-menu,.ink-dropdown ul.dropdown-menu li.submenu:hover:hover>ul.dropdown,.ink-dropdown ul.dropdown-menu li.submenu:hover:hover>ul.dropdown-menu,.ink-navigation ul.dropdown li.submenu:hover:hover>ul.dropdown,.ink-navigation ul.dropdown li.submenu:hover:hover>ul.dropdown-menu,.ink-navigation ul.dropdown-menu li.submenu:hover:hover>ul.dropdown,.ink-navigation ul.dropdown-menu li.submenu:hover:hover>ul.dropdown-menu{display:block}.ink-dropdown ul.dropdown li.submenu>ul.dropdown,.ink-dropdown ul.dropdown li.submenu>ul.dropdown-menu,.ink-dropdown ul.dropdown-menu li.submenu>ul.dropdown,.ink-dropdown ul.dropdown-menu li.submenu>ul.dropdown-menu,.ink-navigation ul.dropdown li.submenu>ul.dropdown,.ink-navigation ul.dropdown li.submenu>ul.dropdown-menu,.ink-navigation ul.dropdown-menu li.submenu>ul.dropdown,.ink-navigation ul.dropdown-menu li.submenu>ul.dropdown-menu{font-size:inherit;position:absolute;top:-.36em;left:100%;display:none}.ink-navigation ul.pagination{overflow:hidden}.ink-navigation ul.pagination li{line-height:1.7;float:left}.ink-navigation ul.pagination li a{padding:.5em 1em;display:block;float:left}.ink-navigation ul.pagination.dotted li a{display:block;height:1em;width:1em;margin-right:.6em;padding:0;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%;text-indent:99999px}.ink-navigation ul.pagination.dotted li a:first-child,.ink-navigation ul.pagination.dotted li a:last-child{-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%}.ink-navigation ul.pagination.chevron li{display:none}.ink-navigation ul.pagination.chevron li.next,.ink-navigation ul.pagination.chevron li.previous{display:block}.ink-navigation ul.pagination.chevron li.next a,.ink-navigation ul.pagination.chevron li.previous a{display:block;position:absolute;top:35%;padding:0 .5em;margin:0;font-family:FontAwesome;font-size:4em}.ink-navigation ul.pagination.chevron li.next a span,.ink-navigation ul.pagination.chevron li.previous a span{text-indent:-99999px;display:inline-block}.ink-navigation ul.pagination.chevron li.previous a{left:0}.ink-navigation ul.pagination.chevron li.previous a:after{content:"\f137"}.ink-navigation ul.pagination.chevron li.next a{right:0}.ink-navigation ul.pagination.chevron li.next a:after{content:"\f138"}.ink-navigation .pills{overflow:hidden}.ink-navigation .pills li{overflow:hidden;display:block;float:left;margin:0 .5em .5em 0;line-height:1.7}.ink-navigation .pills li a{display:block;padding:.5em 1em}.ink-navigation .pills li a:hover{text-decoration:none}.ink-navigation .pills li.active a,.ink-navigation .pills li.disabled a{cursor:default}.ink-navigation ul.menu:after{content:"";display:table;clear:both}.ink-navigation ul.menu li:hover>ul.submenu{display:block}.ink-navigation ul.menu li ul.submenu{display:none;position:absolute;z-index:10}.ink-navigation ul.menu li ul.submenu li a{padding:.5em 1em;display:block;float:none}.ink-navigation ul.menu.horizontal.scrollable{font-size:0;white-space:nowrap;overflow-x:scroll;overflow-y:hidden;-webkit-overflow-scrolling:touch;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}.ink-navigation ul.menu.horizontal.scrollable li{display:inline-block;float:none}.ink-navigation ul.menu.horizontal.scrollable li a{border-right:rgba(10,10,10,.3) 1px solid;font-size:initial}.ink-navigation ul.menu.horizontal.scrollable li:last-child a{border-right:none}.ink-navigation ul.menu.horizontal li{float:left;position:relative}.ink-navigation ul.menu.horizontal li a{padding:.5em 1em;display:block;line-height:1.7}.ink-navigation ul.menu.horizontal li .control{margin-top:.3em}.ink-navigation ul.menu.horizontal li ul.submenu{min-width:100%;z-index:50;top:auto;left:auto}.ink-navigation ul.menu.horizontal li ul.submenu li{float:none}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout{position:absolute;top:0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout.left{right:100%}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout.right{left:100%}.ink-navigation ul.menu.vertical li{line-height:1.7;position:relative}.ink-navigation ul.menu.vertical li a{padding:.5em 1em;display:block}.ink-navigation ul.menu.vertical li ul.submenu{position:relative;top:auto;left:auto}.ink-navigation ul.menu.vertical li ul.submenu.flyout{position:absolute;min-width:8em;top:0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.vertical li ul.submenu.flyout.left{right:100%}.ink-navigation ul.menu.vertical li ul.submenu.flyout.right{left:100%}@media print{*{background:0 0!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.ink-navigation{display:none}.ink-table{border-collapse:collapse}.ink-label{border:1px solid #000}}table.ink-table{width:100%;border-collapse:collapse;border-spacing:0}table.ink-table tr th{padding:5px 10px;line-height:1.3}table.ink-table tr th[data-sortable=true]:hover{cursor:pointer;text-decoration:underline}table.ink-table tr th[data-sortable=true]:hover i{text-decoration:none}table.ink-table tr th[data-sortable=true] i{padding-left:.5em}table.ink-table tr td{padding:5px 10px;line-height:1.3}table.ink-table.hover tbody tr:hover{cursor:pointer}table.ink-table.bordered{border-collapse:separate}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{color:#555;font-family:Roboto,Arial,Helvetica,sans-serif;line-height:1.45}.fw-100,.fw-light{font-weight:100}.fw-300,.fw-thin{font-weight:300}.fw-400,.fw-regular{font-weight:400}.fw-500,.fw-medium{font-weight:500}.fw-700,.fw-bold{font-weight:700}.fw-900,.fw-black{font-weight:900}.condensed-300,.condensed-thin{font-weight:200;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.condensed-400,.condensed-regular{font-weight:400;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.condensed-700,.condensed-bold{font-weight:700;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.slab-100,.slab-light{font-weight:100;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-300,.slab-thin{font-weight:300;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-400,.slab-regular{font-weight:400;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-700,.slab-bold{font-weight:700;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.sans{font-family:Roboto,Arial,Helvetica,sans-serif}.serif{font-family:Times,"Times New Roman",serif}.monospace{font-family:Monaco,"Andale Mono","Courier New",monospace}.condensed{font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.slab{font-family:Roboto_slab,Arial,Helvetica,sans-serif}.italic{font-style:italic}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalizer{text-transform:capitalize}.fa{font-size:14px}a{color:#6998C9;text-decoration:none;cursor:pointer}a:hover{color:#007ED5;text-decoration:underline}h1{font-size:2.2em;margin-top:0;margin-bottom:.59318em}h2{font-size:1.75em;margin-top:0;margin-bottom:.74571em}h3{font-size:1.5em;margin-top:0;margin-bottom:.87em}h4{font-size:1.25em;margin-top:0;margin-bottom:1.044em}h5,h6{font-size:1.1em;margin-top:0;margin-bottom:1.18636em}p,table{font-size:1em;margin-top:0;margin-bottom:1.305em}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,h6:first-child,p:first-child{margin-top:0}h1,h2,h3,h4,h5,h6{color:#404040;font-weight:700;line-height:1.16}small{color:#888}input,textarea{color:#666}h1 small,h2 small,h3 small,h4 small{color:#bbb;font-size:.6em;font-weight:100;line-height:1}mark{background:#dae5f2}address{color:#777;font-size:1em;line-height:1.4}address p{margin-top:0}address h6{color:#555}abbr:hover{cursor:help}blockquote{border-left:4px solid #ddd;padding-left:25px;margin:1em 0;font-weight:200;font-size:1.1em}blockquote small{font-size:.9em}blockquote small::after,blockquote small::before{content:' — '}.note{font-size:.9em;color:#777}.note strong{color:#555}.small{font-size:.75em}.medium{font-size:.85em}.large{font-size:1.2em}.extralarge{font-size:1.45em!important}hr{border:0;border-top:1px solid #ddd;margin:1em 0}.lead{font-size:1.1em;font-weight:700}ol,ul{line-height:1.4;padding:0 0 0 1.45em;margin:1em 0}ol li,ul li{margin:.5em 0}ul.unstyled{list-style:none;padding-left:0}ul.unstyled ul{list-style:disc}ul.unstyled ul.unstyled{list-style:none;padding-left:0}ul.inline{list-style:none}ul.inline li{display:inline-block;padding:0 .5em}ul.inline li:first-child{padding:0 .5em 0 0}dl{margin:1em 0}dl dt{font-weight:700;margin:.5em 0}dl dd{margin:.5em 0 .5em 25px}dl.inline dt{float:left;clear:left;text-align:right;width:180px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;margin:0}dl.inline dd{margin:.5em 0 .5em 200px}figure.ink-image{position:relative;border:1px solid #555}figure.ink-image>img{width:100%}figure.ink-image>figcaption{padding:1em;background:#fff;line-height:1.3}figure.ink-image>figcaption.over-bottom,figure.ink-image>figcaption.over-top{position:absolute;width:100%;left:0;border:none}figure.ink-image>figcaption.over-bottom.dark,figure.ink-image>figcaption.over-top.dark{color:#fff;background:rgba(0,0,0,.6)}figure.ink-image>figcaption.over-top{top:0;background:rgba(255,255,255,.7)}figure.ink-image>figcaption.over-bottom{bottom:0;background:rgba(255,255,255,.7)}figure.ink-image>figcaption.dark{color:#fff;background:#222}img{border:0;width:auto;max-width:100%;vertical-align:top}.ink-alert.basic,.ink-alert.block{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-alert.basic{background:rgba(255,156,0,.25);color:#b87814;border:1px solid #b87814}.ink-alert.basic .ink-dismiss{color:#b87814}.ink-alert.basic.success{background:rgba(74,155,23,.25);color:#38621d;border:1px solid #38621d}.ink-alert.basic.success .ink-dismiss{color:#38621d}.ink-alert.basic.error{background:rgba(201,17,17,.25);color:#891e1e;border:1px solid #891e1e}.ink-alert.basic.error .ink-dismiss{color:#891e1e}.ink-alert.basic.info{background:rgba(15,117,218,.25);color:#1e5b98;border:1px solid #1e5b98}.ink-alert.basic.info .ink-dismiss{color:#1e5b98}.ink-alert.block{border:1px solid #b87814;background:#fff}.ink-alert.block>h4{background:rgba(255,156,0,.3);color:#b87814}.ink-alert.block .ink-dismiss{color:#b87814}.ink-alert.block.success{border:1px solid #38621d;background:#fff}.ink-alert.block.success>h4{background:rgba(74,155,23,.3);color:#38621d}.ink-alert.block.success .ink-dismiss{color:#38621d}.ink-alert.block.error{border:1px solid #891e1e;background:#fff}.ink-alert.block.error>h4{background:rgba(201,17,17,.3);color:#891e1e}.ink-alert.block.error .ink-dismiss{color:#891e1e}.ink-alert.block.info{border:1px solid #1e5b98;background:#fff}.ink-alert.block.info>h4{background:rgba(15,117,218,.3);color:#1e5b98}.ink-alert.block.info .ink-dismiss{color:#1e5b98}.ink-alert .ink-dismiss{font-family:Arial,sans-serif;font-weight:700;text-shadow:#fff 0 1px 0;filter:alpha(Opacity=25);opacity:.25}.ink-alert .ink-dismiss:hover{filter:alpha(Opacity=60);opacity:.6}.ink-badge{-webkit-border-radius:8em;-moz-border-radius:8em;-ms-border-radius:8em;-o-border-radius:8em;border-radius:8em;color:#fff}.ink-badge.white{background:#fff;color:#555}.ink-badge.black{background:#000}.ink-badge.orange{background:#ff9c00}.ink-badge.red{background:#c91111}.ink-badge.green{background:#4a9b17}.ink-badge.blue{background:#0f75da}.ink-badge.yellow{background:#ffd500;color:#555}.ink-badge.grey{background:gray}.ink-badge+.ink-badge{margin-left:.2em}.ink-button{background:#d9d9d9;color:#000;border:1px solid #bfbfbf;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;font-weight:300}.ink-button:active,.ink-button:hover{text-decoration:none;color:#000;background:#ccc;border:1px solid #b3b3b3;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px;box-shadow:rgba(0,0,0,.2) 0 1px 1px}.ink-button:focus{outline:0;background:#ccc;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset}.ink-button[disabled]{background:#e6e6e6;border:1px solid #e6e6e6;color:#999}.ink-button[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.blue{color:#fff;background:#0f75da;border:1px solid #0c63b9}.ink-button.blue:active,.ink-button.blue:hover{background:#0d68c2;border:1px solid #0a56a1;color:#fff;text-decoration:none}.ink-button.blue:focus{background:#0d68c2}.ink-button.blue[disabled]{background:rgba(15,117,218,.6);border:1px solid rgba(15,117,218,0);color:#0c5baa}.ink-button.blue[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.green{color:#fff;background:#4a9b17;border:1px solid #3e8313}.ink-button.green:active,.ink-button.green:hover{background:#3f8514;border:1px solid #336d10;color:#fff;text-decoration:none}.ink-button.green:focus{background:#3f8514}.ink-button.green[disabled]{background:rgba(74,155,23,.6);border:1px solid rgba(74,155,23,0);color:#356f10}.ink-button.green[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.orange{color:#fff;background:#ff9c00;border:1px solid #d88400}.ink-button.orange:active,.ink-button.orange:hover{background:#e68c00;border:1px solid #bf7400;color:#fff;text-decoration:none}.ink-button.orange:focus{background:#e68c00}.ink-button.orange[disabled]{background:rgba(255,156,0,.6);border:1px solid rgba(255,156,0,0);color:#cc7d00}.ink-button.orange[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.red{color:#fff;background:#c91111;border:1px solid #aa0e0e}.ink-button.red:active,.ink-button.red:hover{background:#b10f0f;border:1px solid #920c0c;color:#fff;text-decoration:none}.ink-button.red:focus{background:#b10f0f}.ink-button.red[disabled]{background:rgba(201,17,17,.6);border:1px solid rgba(201,17,17,0);color:#9a0d0d}.ink-button.red[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.black{color:#fff;background:#1a1a1a;border:1px solid #161616}.ink-button.black:active,.ink-button.black:hover{background:#0d0d0d;border:1px solid #090909;color:#fff;text-decoration:none}.ink-button.black:focus{background:#0d0d0d}.ink-button.black[disabled]{background:rgba(26,26,26,.6);border:1px solid rgba(26,26,26,0);color:#000}.ink-button.black[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.white{color:#555;background:#fff;border:1px solid #d8d8d8}.ink-button.white:active,.ink-button.white:hover{background:#f2f2f2;border:1px solid #cbcbcb;color:#555;text-decoration:none}.ink-button.white:focus{background:#f2f2f2}.ink-button.white[disabled]{background:rgba(255,255,255,.6);border:1px solid rgba(255,255,255,0);color:#e6e6e6}.ink-button.white[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.button-group>.ink-button[disabled]{background:#e6e6e6;border:1px solid rgba(217,217,217,.6)}.button-group>.ink-button[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.button-group>.ink-button.blue:first-child{border-left:#0c63b9}.button-group>.ink-button.blue[disabled]{background:rgba(15,117,218,.6);border:1px solid rgba(15,117,218,.3)}.button-group>.ink-button.green:first-child{border-left:#3e8313}.button-group>.ink-button.green[disabled]{background:rgba(74,155,23,.6);border:1px solid rgba(74,155,23,.3)}.button-group>.ink-button.orange:first-child{border-left:#d88400}.button-group>.ink-button.orange[disabled]{background:rgba(255,156,0,.6);border:1px solid rgba(255,156,0,.3)}.button-group>.ink-button.red:first-child{border-left:#aa0e0e}.button-group>.ink-button.red[disabled]{background:rgba(201,17,17,.6);border:1px solid rgba(201,17,17,.3)}.button-group>.ink-button.black:first-child{border-left:#161616}.button-group>.ink-button.black[disabled]{background:rgba(26,26,26,.6);border:1px solid rgba(26,26,26,.3)}.button-group>.ink-button.white:first-child{border-left:#d8d8d8}.button-group>.ink-button.white[disabled]{background:rgba(255,255,255,.6);border:1px solid rgba(255,255,255,.3)}.ink-label{color:#fff;font-weight:300;font-size:.938em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-label.white{background:#fff;color:#555}.ink-label.black{background:#000}.ink-label.orange{background:#ff9c00}.ink-label.red{background:#c91111}.ink-label.green{background:#4a9b17}.ink-label.blue{background:#0f75da}.ink-label.yellow{background:#ffd500;color:#555}.ink-label.grey{background:gray}.ink-label+.ink-label{margin-left:.2em}.ink-navigation ul.breadcrumbs{font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.breadcrumbs li.active a{background:0 0;color:#999}.ink-navigation ul.breadcrumbs li.active a:hover{cursor:default;text-decoration:none}.ink-navigation ul.breadcrumbs li a:hover{background:0 0;text-decoration:underline}.ink-navigation ul.breadcrumbs.white{background:#fff}.ink-navigation ul.breadcrumbs.white li a,.ink-navigation ul.breadcrumbs.white li:after{color:#555}.ink-navigation ul.breadcrumbs.white li.active a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.breadcrumbs.grey{background:#d9d9d9}.ink-navigation ul.breadcrumbs.grey li a,.ink-navigation ul.breadcrumbs.grey li:after{color:#555}.ink-navigation ul.breadcrumbs.grey li.active a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.breadcrumbs.black{background:#1a1a1a}.ink-navigation ul.breadcrumbs.black li a,.ink-navigation ul.breadcrumbs.black li:after{color:#fff}.ink-navigation ul.breadcrumbs.black li.active a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.breadcrumbs.blue{background:#1b75ce}.ink-navigation ul.breadcrumbs.blue li a,.ink-navigation ul.breadcrumbs.blue li:after{color:#fff}.ink-navigation ul.breadcrumbs.blue li.active a{color:#08427b;text-shadow:#1884ef 0 1px 0}.ink-navigation ul.breadcrumbs.orange{background:#f2990d}.ink-navigation ul.breadcrumbs.orange li a,.ink-navigation ul.breadcrumbs.orange li:after{color:#fff}.ink-navigation ul.breadcrumbs.orange li.active a{color:#995e00;text-shadow:#ffa81f 0 1px 0}.ink-navigation ul.breadcrumbs.green{background:#4c9220}.ink-navigation ul.breadcrumbs.green li a,.ink-navigation ul.breadcrumbs.green li:after{color:#fff}.ink-navigation ul.breadcrumbs.green li.active a{color:#20420a;text-shadow:#57b61b 0 1px 0}.ink-navigation ul.breadcrumbs.red{background:#be1c1c}.ink-navigation ul.breadcrumbs.red li a,.ink-navigation ul.breadcrumbs.red li:after{color:#fff}.ink-navigation ul.breadcrumbs.red li.active a{color:#6b0909;text-shadow:#e51313 0 1px 0}.ink-dropdown.green ul.dropdown-menu li.active a{background:#4a9b17;color:#fff}.ink-dropdown.orange ul.dropdown-menu li.active a{background:#ff9c00;color:#fff}.ink-dropdown.red ul.dropdown-menu li.active a{background:#c91111;color:#fff}.ink-dropdown.black ul.dropdown-menu li.active a{background:#1a1a1a;color:#fff}.ink-dropdown.blue ul.dropdown-menu li.active a{background:#0f75da;color:#fff}.ink-navigation ul.menu{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu>li{font-weight:300}.ink-navigation ul.menu>li.active a{text-decoration:underline}.ink-navigation ul.menu>li.heading{font-weight:500}.ink-navigation ul.menu>li.disabled a{color:#b3b3b3;text-shadow:#fff 0 1px 0}.ink-navigation ul.menu>li.disabled a:hover{cursor:default;background:0 0;text-decoration:none}.ink-navigation ul.menu>li ul.submenu li{font-size:.875em}.ink-navigation ul.menu>li ul.submenu li a{border-bottom:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.vertical li a{border-bottom:1px solid rgba(0,0,0,.15)}.ink-navigation ul.menu.vertical li:first-child,.ink-navigation ul.menu.vertical li:first-child>a{-webkit-border-radius:2px 2px 0 0;-moz-border-radius:2px 2px 0 0;-ms-border-radius:2px 2px 0 0;-o-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0}.ink-navigation ul.menu.vertical li:last-child{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child>a{border-bottom:none;-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child .submenu{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child .submenu.flyout{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.vertical li:last-child .submenu li:last-child,.ink-navigation ul.menu.vertical li:last-child .submenu li:last-child a{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.horizontal>li:first-child,.ink-navigation ul.menu.horizontal>li:first-child a{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-navigation ul.menu.horizontal>li:last-child,.ink-navigation ul.menu.horizontal>li:last-child a{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-navigation ul.menu.horizontal>li ul.submenu{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#fff}.ink-navigation ul.menu.horizontal>li ul.submenu li:last-child{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.horizontal>li ul.submenu li:last-child a{border-bottom:none}.ink-navigation ul.menu.white{background:#fff}.ink-navigation ul.menu.white li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.white li ul.submenu li a{color:#555}.ink-navigation ul.menu.white li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.white li.disabled a:hover{background:0 0}.ink-navigation ul.menu.white li.active{background:#e6e6e6}.ink-navigation ul.menu.white li.disabled a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.menu.white li a{color:#555;text-decoration:none}.ink-navigation ul.menu.white li a:hover{background:#f2f2f2}.ink-navigation ul.menu.grey{background:#d9d9d9}.ink-navigation ul.menu.grey li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.grey li ul.submenu li a{color:#555}.ink-navigation ul.menu.grey li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.grey li.disabled a:hover{background:0 0}.ink-navigation ul.menu.grey li.active{background:#bfbfbf}.ink-navigation ul.menu.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.menu.grey li a{color:#555;text-decoration:none}.ink-navigation ul.menu.grey li a:hover{background:#ccc}.ink-navigation ul.menu.black{background:#1a1a1a}.ink-navigation ul.menu.black li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.black li ul.submenu li a{color:#555}.ink-navigation ul.menu.black li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.black li.disabled a:hover{background:0 0}.ink-navigation ul.menu.black li.active{background:#333}.ink-navigation ul.menu.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.menu.black li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.black li a:hover{background:#404040}.ink-navigation ul.menu.blue{background:#1b75ce}.ink-navigation ul.menu.blue li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.blue li ul.submenu li a{color:#555}.ink-navigation ul.menu.blue li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.blue li.disabled a:hover{background:0 0}.ink-navigation ul.menu.blue li.active{background:#0c5baa}.ink-navigation ul.menu.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.menu.blue li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.blue li a:hover{background:#0d68c2}.ink-navigation ul.menu.green{background:#4c9220}.ink-navigation ul.menu.green li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.green li ul.submenu li a{color:#555}.ink-navigation ul.menu.green li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.green li.disabled a:hover{background:0 0}.ink-navigation ul.menu.green li.active{background:#356f10}.ink-navigation ul.menu.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.menu.green li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.green li a:hover{background:#3f8514}.ink-navigation ul.menu.orange{background:#f2990d}.ink-navigation ul.menu.orange li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.orange li ul.submenu li a{color:#555}.ink-navigation ul.menu.orange li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.orange li.disabled a:hover{background:0 0}.ink-navigation ul.menu.orange li.active{background:#cc7d00}.ink-navigation ul.menu.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.menu.orange li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.orange li a:hover{background:#e68c00}.ink-navigation ul.menu.red{background:#be1c1c}.ink-navigation ul.menu.red li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.red li ul.submenu li a{color:#555}.ink-navigation ul.menu.red li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.red li.disabled a:hover{background:0 0}.ink-navigation ul.menu.red li.active{background:#9a0d0d}.ink-navigation ul.menu.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.menu.red li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.red li a:hover{background:#b10f0f}.ink-navigation ul.pagination{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.pagination li{font-weight:300}.ink-navigation ul.pagination li.active a{text-decoration:underline}.ink-navigation ul.pagination li.disabled a{color:#b3b3b3;text-shadow:#fff 0 1px 0}.ink-navigation ul.pagination li.disabled a:hover{cursor:default;background:0 0;text-decoration:none}.ink-navigation ul.pagination li:first-child,.ink-navigation ul.pagination li:first-child a{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-navigation ul.pagination li:last-child,.ink-navigation ul.pagination li:last-child a{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-navigation ul.pagination.white li{background:#fff}.ink-navigation ul.pagination.white li.active a{background:#e6e6e6}.ink-navigation ul.pagination.white li.disabled a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.pagination.white li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.white li a{color:#555;text-decoration:none}.ink-navigation ul.pagination.white li a:hover{background:#f2f2f2}.ink-navigation ul.pagination.grey li{background:#d9d9d9}.ink-navigation ul.pagination.grey li.active a{background:#bfbfbf}.ink-navigation ul.pagination.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.pagination.grey li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.grey li a{color:#555;text-decoration:none}.ink-navigation ul.pagination.grey li a:hover{background:#ccc}.ink-navigation ul.pagination.black li{background:#1a1a1a}.ink-navigation ul.pagination.black li.active a{background:#333}.ink-navigation ul.pagination.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.pagination.black li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.black li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.black li a:hover{background:#292929}.ink-navigation ul.pagination.orange li{background:#f2990d}.ink-navigation ul.pagination.orange li.active a{background:#cc7d00}.ink-navigation ul.pagination.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.pagination.orange li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.orange li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.orange li a:hover{background:#e68c00}.ink-navigation ul.pagination.blue li{background:#1b75ce}.ink-navigation ul.pagination.blue li.active a{background:#0c5baa}.ink-navigation ul.pagination.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.pagination.blue li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.blue li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.blue li a:hover{background:#0d68c2}.ink-navigation ul.pagination.green li{background:#4c9220}.ink-navigation ul.pagination.green li.active a{background:#356f10}.ink-navigation ul.pagination.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.pagination.green li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.green li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.green li a:hover{background:#3f8514}.ink-navigation ul.pagination.red li{background:#be1c1c}.ink-navigation ul.pagination.red li.active a{background:#9a0d0d}.ink-navigation ul.pagination.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.pagination.red li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.red li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.red li a:hover{background:#b10f0f}.ink-navigation ul.pagination.dotted li{background:0 0}.ink-navigation ul.pagination.dotted li a{background:#999;filter:alpha(Opacity=50);opacity:.5}.ink-navigation ul.pagination.dotted li.active a,.ink-navigation ul.pagination.dotted li:hover a{filter:alpha(Opacity=100);opacity:1}.ink-navigation ul.pagination.dotted.black li a{background:#1a1a1a}.ink-navigation ul.pagination.dotted.white li a{background:#fff}.ink-navigation ul.pagination.dotted.blue li a{background:#1b75ce}.ink-navigation ul.pagination.dotted.green li a{background:#4c9220}.ink-navigation ul.pagination.dotted.orange li a{background:#f2990d}.ink-navigation ul.pagination.dotted.red li a{background:#be1c1c}.ink-navigation ul.pagination.chevron li.next a,.ink-navigation ul.pagination.chevron li.previous a{color:#fff;filter:alpha(Opacity=60);opacity:.6}.ink-navigation ul.pagination.chevron li.next a.active,.ink-navigation ul.pagination.chevron li.next a:focus,.ink-navigation ul.pagination.chevron li.next a:hover,.ink-navigation ul.pagination.chevron li.previous a.active,.ink-navigation ul.pagination.chevron li.previous a:focus,.ink-navigation ul.pagination.chevron li.previous a:hover{filter:alpha(Opacity=70);opacity:.7;text-decoration:none;background:0 0}.ink-navigation ul.pagination.chevron li.disabled a{color:#fff;filter:alpha(Opacity=40);opacity:.4;text-shadow:none}.ink-navigation ul.pagination.chevron li.disabled a:focus,.ink-navigation ul.pagination.chevron li.disabled a:hover{color:#fff;filter:alpha(Opacity=40);opacity:.4}.ink-navigation ul.pagination.chevron.black li.disabled a,.ink-navigation ul.pagination.chevron.black li.next a,.ink-navigation ul.pagination.chevron.black li.previous a{color:#1a1a1a}.ink-navigation ul.pagination.chevron.grey li.disabled a,.ink-navigation ul.pagination.chevron.grey li.next a,.ink-navigation ul.pagination.chevron.grey li.previous a{color:#d9d9d9}.ink-navigation ul.pagination.chevron.blue li.disabled a,.ink-navigation ul.pagination.chevron.blue li.next a,.ink-navigation ul.pagination.chevron.blue li.previous a{color:#1b75ce}.ink-navigation ul.pagination.chevron.green li.disabled a,.ink-navigation ul.pagination.chevron.green li.next a,.ink-navigation ul.pagination.chevron.green li.previous a{color:#4c9220}.ink-navigation ul.pagination.chevron.orange li.disabled a,.ink-navigation ul.pagination.chevron.orange li.next a,.ink-navigation ul.pagination.chevron.orange li.previous a{color:#f2990d}.ink-navigation ul.pagination.chevron.red li.disabled a,.ink-navigation ul.pagination.chevron.red li.next a,.ink-navigation ul.pagination.chevron.red li.previous a{color:#be1c1c}.ink-navigation ul.pills li{background:#fff;font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.pills li a{color:#555;background:0 0}.ink-navigation ul.pills li a:hover,.ink-navigation ul.pills li.active a{background:#e6e6e6}.ink-navigation ul.pills li.disabled a{color:#999;text-shadow:#fff 0 1px 0}.ink-navigation ul.pills li.disabled a:hover{background:0 0}.ink-navigation ul.pills.grey li{background:#d9d9d9}.ink-navigation ul.pills.grey li.active a{background:#bfbfbf}.ink-navigation ul.pills.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.pills.grey li.disabled a:hover{background:0 0}.ink-navigation ul.pills.grey li a{color:#555}.ink-navigation ul.pills.grey li a:hover{background:#ccc}.ink-navigation ul.pills.black li{background:#1a1a1a}.ink-navigation ul.pills.black li.active a{background:#333}.ink-navigation ul.pills.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.pills.black li.disabled a:hover{background:0 0}.ink-navigation ul.pills.black li a{color:#fff}.ink-navigation ul.pills.black li a:hover{background:#292929}.ink-navigation ul.pills.blue li{background:#1b75ce}.ink-navigation ul.pills.blue li.active a{background:#0c5baa}.ink-navigation ul.pills.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.pills.blue li.disabled a:hover{background:0 0}.ink-navigation ul.pills.blue li a{color:#fff}.ink-navigation ul.pills.blue li a:hover{background:#0d68c2}.ink-navigation ul.pills.green li{background:#4c9220}.ink-navigation ul.pills.green li.active a{background:#356f10}.ink-navigation ul.pills.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.pills.green li.disabled a:hover{background:0 0}.ink-navigation ul.pills.green li a{color:#fff}.ink-navigation ul.pills.green li a:hover{background:#3f8514}.ink-navigation ul.pills.orange li{background:#f2990d}.ink-navigation ul.pills.orange li.active a{background:#cc7d00}.ink-navigation ul.pills.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.pills.orange li.disabled a:hover{background:0 0}.ink-navigation ul.pills.orange li a{color:#fff}.ink-navigation ul.pills.orange li a:hover{background:#e68c00}.ink-navigation ul.pills.red li{background:#be1c1c}.ink-navigation ul.pills.red li.active a{background:#9a0d0d}.ink-navigation ul.pills.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.pills.red li.disabled a:hover{background:0 0}.ink-navigation ul.pills.red li a{color:#fff}.ink-navigation ul.pills.red li a:hover{background:#b10f0f}table.ink-table{background:#fff}table.ink-table tr td,table.ink-table tr th{border-bottom:#bbb 1px solid;background:0 0}table.ink-table tr:last-child td{border-bottom:none}table.ink-table tfoot tr td,table.ink-table tfoot tr th{border-top:#bbb 1px solid}table.ink-table.alternating tbody tr:nth-child(odd){background-color:#f5f5f5}table.ink-table.hover tbody tr:hover{background:#fefbd6;color:#555}table.ink-table.bordered{border:1px solid #bbb;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}table.ink-table.bordered tr th{border-left:#bbb 1px solid}table.ink-table.bordered tr th:first-child{border-left:none}table.ink-table.bordered tr:last-child td{border-bottom:none}table.ink-table.bordered tr td{border-left:#bbb 1px solid}table.ink-table.bordered tr td:first-child{border-left:none}table.ink-table tbody>tr.red td{background:#c91111;color:#fff}table.ink-table tbody>tr.green td{background:#4a9b17;color:#fff}table.ink-table tbody>tr.blue td{background:#0f75da;color:#fff}table.ink-table tbody>tr.orange td{background:#ff9c00;color:#fff}table.ink-table tbody>tr.black td{background:#000;color:#ccc}table.ink-table tbody>tr.yellow td{background:#ffd500;color:#000}.animated.slow{animation-duration:1s}.animated.medium{animation-duration:.5s}.animated.fast{animation-duration:.2s}.ink-carousel .stage{width:100%}.ink-carousel .ink-navigation{position:static}.ink-carousel{width:100%;position:relative;overflow:hidden;display:block}.ink-carousel .stage{left:0;height:auto!important;margin-top:0;margin-bottom:0;padding-left:0;list-style-type:none;white-space:nowrap;position:relative;overflow:visible;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}.ink-carousel .stage.column-group{display:-webkit-block;display:-moz-block;display:block;-webkit-flex-flow:none;-moz-flex-flow:none;flex-flow:none}.ink-carousel .stage .slide{position:relative;display:inline-block;vertical-align:top;white-space:normal;margin:0;float:none;zoom:1}.ink-datepicker-wrapper{position:relative}.ink-datepicker-calendar{margin-top:0;position:absolute}.ink-datepicker-calendar.right{left:100%;top:0}.ink-datepicker-calendar.left{right:100%;top:0}.ink-datepicker-calendar.bottom{top:100%;left:0}.ink-datepicker-calendar.top{bottom:100%;left:0}.ink-datepicker-calendar,.ink-datepicker-wrapper{display:inline;display:inline-block}.ink-calendar{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;text-align:center;padding:.3em;min-width:17.4em;font-size:13px;-webkit-box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;-moz-box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;background:#fff;z-index:10}.ink-calendar a{text-decoration:none}.ink-calendar li{list-style:none inside}html.ink-modal-is-open .ink-calendar{z-index:101}.ink-calendar-top-options{padding:5px;font-size:.813em;cursor:pointer}.ink-calendar-top-options .clean{float:left}.ink-calendar-top-options .close{float:right}.ink-calendar-top{line-height:2em;background:#e6e6e6;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-calendar-top div{float:left}.ink-calendar-top .ink-calendar-next,.ink-calendar-top .ink-calendar-prev{width:10%}.ink-calendar-top .ink-calendar-next a,.ink-calendar-top .ink-calendar-prev a{display:block}.ink-calendar-top .ink-calendar-month_desc{width:80%}.ink-calendar-month,.ink-calendar-month-selector,.ink-calendar-year-selector{margin-top:.5em;padding-left:0}.ink-calendar-month li a,.ink-calendar-month-selector li a,.ink-calendar-year-selector li a{margin:0;line-height:2em;vertical-align:middle;display:block;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;color:#444}.ink-calendar-month li a:hover,.ink-calendar-month-selector li a:hover,.ink-calendar-year-selector li a:hover{background:#e6e6e6}.ink-calendar-month li a.ink-calendar-on,.ink-calendar-month li a.ink-calendar-on:hover,.ink-calendar-month-selector li a.ink-calendar-on,.ink-calendar-month-selector li a.ink-calendar-on:hover,.ink-calendar-year-selector li a.ink-calendar-on,.ink-calendar-year-selector li a.ink-calendar-on:hover{background:#0069d6;color:#fff}.ink-calendar-month li a.ink-calendar-off,.ink-calendar-month li a.ink-calendar-off:hover,.ink-calendar-month-selector li a.ink-calendar-off,.ink-calendar-month-selector li a.ink-calendar-off:hover,.ink-calendar-year-selector li a.ink-calendar-off,.ink-calendar-year-selector li a.ink-calendar-off:hover{background:#fff;color:#aaa;cursor:default}.ink-calendar-month ul,.ink-calendar-month-selector ul,.ink-calendar-year-selector ul{clear:both;padding-left:0}.ink-calendar-month ul li,.ink-calendar-month-selector ul li,.ink-calendar-year-selector ul li{width:2.4em;float:left;text-align:center;padding:0;margin:0}.ink-calendar-month-selector ul li,.ink-calendar-year-selector ul li{width:25%}.ink-calendar-month-selector,.ink-calendar-year-selector{display:none}.action_inactive,.ink-calendar-off{color:#ddd!important}.ink-calendar-month .ink-calendar-header{border-bottom:1px solid rgba(0,0,0,.1);padding-bottom:.5em;margin-bottom:.5em;color:#aaa}.ink-calendar-middle:after,.ink-calendar-month .ink-calendar-header:after,.ink-calendar-month .ink-calendar-middle ul:after,.ink-calendar-top-options:after,.ink-calendar-top:after{content:"";display:table;clear:both}body.ink-drawer{max-width:100%}body.ink-drawer .content-drawer,body.ink-drawer .left-drawer,body.ink-drawer .right-drawer{-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;transition-property:transform;-webkit-transition-duration:300ms;-moz-transition-duration:300ms;-o-transition-duration:300ms;transition-duration:300ms;-webkit-transition-timing-function:cubic-bezier(0.86,0,.07,1);-moz-transition-timing-function:cubic-bezier(0.86,0,.07,1);-o-transition-timing-function:cubic-bezier(0.86,0,.07,1);transition-timing-function:cubic-bezier(0.86,0,.07,1)}body.ink-drawer .left-drawer{left:-220px}body.ink-drawer .right-drawer{right:-220px}body.ink-drawer .content-drawer{width:100%}body.ink-drawer .left-drawer,body.ink-drawer .right-drawer{position:absolute;top:0;z-index:0;display:none;overflow-x:hidden;overflow-y:auto;width:220px;height:100%;-webkit-overflow-scrolling:touch}body.ink-drawer .left-drawer.show,body.ink-drawer .right-drawer.show{display:block;position:fixed}body.ink-drawer.push{overflow:hidden;width:100%;height:100%}body.ink-drawer.push .content-drawer{overflow:hidden}body.ink-drawer.push.left .content-drawer,body.ink-drawer.push.left .left-drawer{-webkit-transform:translate(220px,0);-moz-transform:translate(220px,0);-ms-transform:translate(220px,0);-o-transform:translate(220px,0);transform:translate(220px,0)}body.ink-drawer.push.right .content-drawer,body.ink-drawer.push.right .right-drawer{-webkit-transform:translate(-220px,0);-moz-transform:translate(-220px,0);-ms-transform:translate(-220px,0);-o-transform:translate(-220px,0);transform:translate(-220px,0)}body.ink-drawer.over{overflow:hidden;-webkit-user-drag:none}body.ink-drawer.over.left .left-drawer{-webkit-transform:translate(220px,0);-moz-transform:translate(220px,0);-ms-transform:translate(220px,0);-o-transform:translate(220px,0);transform:translate(220px,0)}body.ink-drawer.over.right .right-drawer{-webkit-transform:translate(-220px,0);-moz-transform:translate(-220px,0);-ms-transform:translate(-220px,0);-o-transform:translate(-220px,0);transform:translate(-220px,0)}.ink-shade{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgOAMAAM8AzbfAeUUAAAAASUVORK5CYII=);background:rgba(0,0,0,.8);width:100%;height:100%;top:0;right:0;bottom:0;left:0;margin-top:0;position:fixed;z-index:100;display:none;filter:alpha(Opacity=0);opacity:0}.ink-shade.fade{-webkit-transition:opacity 300ms;-moz-transition:opacity 300ms;-o-transition:opacity 300ms;transition:opacity 300ms}.ink-shade.visible{filter:alpha(Opacity=100);opacity:1}.ink-modal{top:50%;left:50%;width:90%;height:90%;background:#fff;z-index:100;position:absolute;overflow:hidden;filter:alpha(Opacity=100);opacity:1;-webkit-box-shadow:rgba(0,0,0,.8) 0 0 15px 0;-moz-box-shadow:rgba(0,0,0,.8) 0 0 15px 0;box-shadow:rgba(0,0,0,.8) 0 0 15px 0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-modal:after{content:"";display:table;clear:both}.ink-modal>.modal-body{padding:1em;overflow-y:auto;overflow-x:hidden;height:auto}.ink-modal>.modal-body .ink-grid{padding-left:0;padding-right:0;width:100%;min-width:100%}.ink-modal>.modal-header,.ink-modal>header{border-bottom:1px #e6e6e6 solid;overflow:hidden;-webkit-box-shadow:rgba(175,175,175,.2) 0 1px 2px 0;-moz-box-shadow:rgba(175,175,175,.2) 0 1px 2px 0;box-shadow:rgba(175,175,175,.2) 0 1px 2px 0}.ink-modal>.modal-header>.modal-close,.ink-modal>header>.modal-close{padding-top:2px;text-align:center;color:#fff;width:26px;height:26px;line-height:1.2em;border:0;background:#bfbfbf;font-size:0;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%;text-shadow:rgba(0,0,0,.6) 0 -1px 0;filter:alpha(Opacity=60);opacity:.6;float:right}.ink-modal>.modal-header>.modal-close:after,.ink-modal>header>.modal-close:after{content:"\f00d";font-family:FontAwesome;font-size:medium;line-height:22px}.ink-modal>.modal-header>.modal-close:hover,.ink-modal>header>.modal-close:hover{filter:alpha(Opacity=100);opacity:1}.ink-modal>.modal-footer,.ink-modal>footer{background:#e6e6e6;margin-bottom:0;zoom:1;-webkit-box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0;-moz-box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0;box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0}.ink-modal>.modal-footer,.ink-modal>.modal-header,.ink-modal>footer,.ink-modal>header{padding:.8em 1em .65em}.ink-modal>.modal-footer:after,.ink-modal>.modal-footer:before,.ink-modal>.modal-header:after,.ink-modal>.modal-header:before,.ink-modal>footer:after,.ink-modal>footer:before,.ink-modal>header:after,.ink-modal>header:before{content:".";display:block;height:0;clear:both;visibility:hidden}.ink-modal-open{overflow:hidden}.ink-progress-bar{margin-bottom:1em;overflow:hidden;background:#f2f2f2;position:relative;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset;-moz-box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset;box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset}.ink-progress-bar .caption{position:absolute;top:0;left:0;width:100%;height:100%;line-height:1.7;text-align:center;color:#000;font-size:.813em;z-index:10}.ink-progress-bar .bar{height:1.3em;text-shadow:rgba(0,0,0,.25),0,1px,0;-webkit-box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;-moz-box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;-webkit-transition-property:width;-moz-transition-property:width;-o-transition-property:width;transition-property:width;-webkit-transition-duration:.6s;-moz-transition-duration:.6s;-o-transition-duration:.6s;transition-duration:.6s;-webkit-transition-timing-function:ease;-moz-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.ink-progress-bar .bar.grey{background:#ccc;color:#555}.ink-progress-bar .bar.green{background:#4a9b17;color:#fff}.ink-progress-bar .bar.blue{background:#0f75da;color:#fff}.ink-progress-bar .bar.red{background:#c91111;color:#fff}.ink-progress-bar .bar.orange{background:#ff9c00;color:#555}.ink-progress-bar .bar.black{background:#000;color:#fff}.dragging,.ink-sortable-list li{cursor:move;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;-ms-user-select:none;user-select:none;-ms-user-drag:none;-moz-user-drag:none;-khtml-user-drag:none;-webkit-user-drag:none;-o-user-drag:none;user-drag:none}.drag,.ink-sortable-list li.placeholder{-webkit-box-shadow:0,0,10px,0,rgba(0,0,0,.3);-moz-box-shadow:0,0,10px,0,rgba(0,0,0,.3);box-shadow:0,0,10px,0,rgba(0,0,0,.3)}.ink-sortable-list li{margin:0;border-bottom:1px solid #ccc;line-height:40px}.ink-sortable-list li.placeholder,.ink-sortable-list li:hover{background:#ccc;background:rgba(204,204,204,.2)}.ink-sortable-list li .ink-label{margin:0 .8em}.ink-sticky-stuck{position:fixed}.ink-tabs .tabs-nav{list-style:none;padding:0}.ink-tabs .tabs-nav li{line-height:1.7;position:relative;margin:0}.ink-tabs .tabs-nav li a{padding:.5em 1em;display:block;border:1px solid transparent}.ink-tabs .tabs-nav li a:hover{background:#f0f0f0}.ink-tabs .tabs-nav li.active a{color:#555;cursor:default;text-decoration:none;background:#fff;border:1px solid #ccc}.ink-tabs .tabs-nav:after{content:"";display:table;clear:both}.ink-tabs .tabs-content{margin-top:1.5em;overflow:auto}.ink-tabs.top>.tabs-nav{border-bottom:1px solid #ccc}.ink-tabs.top>.tabs-nav li{float:left}.ink-tabs.top>.tabs-nav li a{margin-right:.4em;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;-ms-border-radius:4px 4px 0 0;-o-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.ink-tabs.top>.tabs-nav li.active{margin:0 0 -2px}.ink-tabs.top>.tabs-nav li.active a{border-bottom-color:transparent}.ink-tabs.bottom>.tabs-nav{border-top:1px solid #ccc}.ink-tabs.bottom>.tabs-nav li{float:left}.ink-tabs.bottom>.tabs-nav li a{margin-right:.4em;-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;-ms-border-radius:0 0 4px 4px;-o-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.ink-tabs.bottom>.tabs-nav li.active{margin:-2px 0 0}.ink-tabs.bottom>.tabs-nav li.active a{border-top-color:transparent}.ink-tabs.left>.tabs-nav{border-right:1px solid #ccc;float:left;margin-right:2em}.ink-tabs.left>.tabs-nav li{float:none;text-align:right}.ink-tabs.left>.tabs-nav li a{margin-bottom:.4em;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;-ms-border-radius:4px 0 0 4px;-o-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.ink-tabs.left>.tabs-nav li.active{margin:0 -2px 0 0}.ink-tabs.left>.tabs-nav li.active a{border-right-color:transparent}.ink-tabs.right>.tabs-nav{border-left:1px solid #ccc;float:right;margin-left:2em}.ink-tabs.right>.tabs-nav li{float:none}.ink-tabs.right>.tabs-nav li a{margin-bottom:.4em;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;-ms-border-radius:0 4px 4px 0;-o-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.ink-tabs.right>.tabs-nav li.active{margin:0 0 0 -2px}.ink-tabs.right>.tabs-nav li.active a{border-left-color:transparent}.ink-tagfield input[type=text].new-tag-input{background-color:#fff;border:1px solid #ccc;line-height:1em;margin:0;padding:5px;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-tagfield input[type=text].new-tag-input:focus{-webkit-box-shadow:0,0,0,3px,#eaeaea;-moz-box-shadow:0,0,0,3px,#eaeaea;box-shadow:0,0,0,3px,#eaeaea;border:1px solid #c3c3c3}.ink-tagfield span.ink-tag{background-color:#1b1b1b;color:#eaeaea;text-shadow:none;font-size:.9em;font-weight:400;border:1px solid #000;padding:4px 6px}.ink-tagfield span.ink-tag i.icon-remove{color:#ccc;font-size:.9em;font-weight:400;margin-left:4px}.ink-tagfield span.ink-tag i.icon-remove:hover{cursor:pointer;color:red}.ink-tooltip{display:inline-block;position:relative}.ink-tooltip>.content{background:#f0f0f0;padding:.5em .6em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;font-size:.8em;color:#8c8c8c}.ink-tooltip>.arrow{position:absolute}.ink-tooltip>.arrow.down,.ink-tooltip>.arrow.left,.ink-tooltip>.arrow.right,.ink-tooltip>.arrow.up{width:0;height:0}.ink-tooltip>.arrow.up{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #f0f0f0;top:-6px;left:50%;margin-left:-3px}.ink-tooltip>.arrow.down{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #f0f0f0;bottom:-5.45px;left:50%;margin-left:-3px}.ink-tooltip>.arrow.right{border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:6px solid #f0f0f0;top:50%;right:-5.45px;margin-top:-6px}.ink-tooltip>.arrow.left{border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:6px solid #f0f0f0;top:50%;left:-5.45px;margin-top:-6px}.ink-tooltip.blue>.content{background:#0f75da;color:#fff}.ink-tooltip.blue>.arrow.up{border-bottom-color:#0f75da}.ink-tooltip.blue>.arrow.down{border-top-color:#0f75da}.ink-tooltip.blue>.arrow.left{border-right-color:#0f75da}.ink-tooltip.blue>.arrow.right{border-left-color:#0f75da}.ink-tooltip.red>.content{background:#c91111;color:#fff}.ink-tooltip.red>.arrow.up{border-bottom-color:#c91111}.ink-tooltip.red>.arrow.down{border-top-color:#c91111}.ink-tooltip.red>.arrow.left{border-right-color:#c91111}.ink-tooltip.red>.arrow.right{border-left-color:#c91111}.ink-tooltip.orange>.content{background:#ff9c00;color:#fff}.ink-tooltip.orange>.arrow.up{border-bottom-color:#ff9c00}.ink-tooltip.orange>.arrow.down{border-top-color:#ff9c00}.ink-tooltip.orange>.arrow.left{border-right-color:#ff9c00}.ink-tooltip.orange>.arrow.right{border-left-color:#ff9c00}.ink-tooltip.green>.content{background:#4a9b17;color:#fff}.ink-tooltip.green>.arrow.up{border-bottom-color:#4a9b17}.ink-tooltip.green>.arrow.down{border-top-color:#4a9b17}.ink-tooltip.green>.arrow.left{border-right-color:#4a9b17}.ink-tooltip.green>.arrow.right{border-left-color:#4a9b17}.ink-tooltip.black>.content{background:#000;color:#fff}.ink-tooltip.black>.arrow.up{border-bottom-color:#000}.ink-tooltip.black>.arrow.down{border-top-color:#000}.ink-tooltip.black>.arrow.left{border-right-color:#000}.ink-tooltip.black>.arrow.right{border-left-color:#000}.ink-tooltip.grey>.content{background:#ccc;color:#333}.ink-tooltip.grey>.arrow.up{border-bottom-color:#ccc}.ink-tooltip.grey>.arrow.down{border-top-color:#ccc}.ink-tooltip.grey>.arrow.left{border-right-color:#ccc}.ink-tooltip.grey>.arrow.right{border-left-color:#ccc}.ink-tree-view li{list-style-type:none}.ink-tree-view [data-open]>:before{margin-left:-1.3em;margin-right:.4em;text-decoration:none} \ No newline at end of file diff --git a/dist/css/ink-ie.min.css b/dist/css/ink-ie.min.css index 35f757d3a..56c983ae8 100644 --- a/dist/css/ink-ie.min.css +++ b/dist/css/ink-ie.min.css @@ -1 +1 @@ -.ink-grid{width:auto;max-width:1440px;margin:0 auto;padding:0 1.75em}.column-group>[class*=large-]{float:left;clear:none}.large-5{width:5%}.large-10{width:10%}.large-15{width:15%}.large-16{width:16.66%}.large-20{width:20%}.large-25{width:25%}.large-30{width:30%}.large-33{width:33.33%}.large-35{width:35%}.large-40{width:40%}.large-45{width:45%}.large-50{width:50%}.large-55{width:55%}.large-60{width:60%}.large-65{width:65%}.large-66{width:66.66%}.large-70{width:70%}.large-75{width:75%}.large-80{width:80%}.large-85{width:85%}.large-90{width:90%}.large-95{width:95%}.large-100{width:100%}[class*=large-100]{float:none;clear:both}.column-group{*zoom:1}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1.75em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.horizontal-gutters{margin-left:-1.75em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.double-gutters{margin-left:-3.5em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.double-horizontal-gutters{margin-left:-3.5em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.half-gutters{margin-left:-.875em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.half-horizontal-gutters{margin-left:-.875em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.quarter-gutters{margin-left:-.4375em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.quarter-horizontal-gutters{margin-left:-.4375em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-gutters{margin-left:-1.75em}.column-group.large-gutters>[class*=all-],.column-group.large-gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.large-horizontal-gutters{margin-left:-1.75em}.column-group.large-horizontal-gutters>[class*=all-],.column-group.large-horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.large-vertical-gutters>[class*=all-],.column-group.large-vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.large-double-gutters{margin-left:-3.5em}.column-group.large-double-gutters>[class*=all-],.column-group.large-double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.large-double-horizontal-gutters{margin-left:-3.5em}.column-group.large-double-horizontal-gutters>[class*=all-],.column-group.large-double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.large-double-vertical-gutters>[class*=all-],.column-group.large-double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.large-half-gutters{margin-left:-.875em}.column-group.large-half-gutters>[class*=all-],.column-group.large-half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.large-half-horizontal-gutters{margin-left:-.875em}.column-group.large-half-horizontal-gutters>[class*=all-],.column-group.large-half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.large-half-vertical-gutters>[class*=all-],.column-group.large-half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.large-quarter-gutters{margin-left:-.4375em}.column-group.large-quarter-gutters>[class*=all-],.column-group.large-quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.large-quarter-horizontal-gutters{margin-left:-.4375em}.column-group.large-quarter-horizontal-gutters>[class*=all-],.column-group.large-quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.large-quarter-vertical-gutters>[class*=all-],.column-group.large-quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-no-gutters{margin-left:0}.column-group.large-no-gutters>[class*=all-],.column-group.large-no-gutters>[class*=large-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=large-],.ink-table td[class*=large-],.ink-table tfoot[class*=large-],.ink-table th[class*=large-],.ink-table thead[class*=large-],.ink-table tr[class*=large-]{float:none}.large-push-left{float:left}.large-push-center{float:none;margin-left:auto;margin-right:auto}.large-push-right{float:right}.large-align-left{text-align:left}.large-align-center{text-align:center}.large-align-right{text-align:right}.large-no-margin{margin:0!important}.large-space,.space{margin:1.75em}.large-padding,.padding{padding:1.75em}.double-space,.large-double-space{margin:3.5em}.double-padding,.large-double-padding{padding:3.5em}.half-space,.large-half-space{margin:.875em}.half-padding,.large-half-padding{padding:.875em}.large-quarter-space,.quarter-space{margin:.4375em}.large-quarter-padding,.quarter-padding{padding:.4375em}.large-vertical-space,.vertical-space{margin-top:1.75em;margin-bottom:1.75em}.large-vertical-padding,.vertical-padding{padding-top:1.75em;padding-bottom:1.75em}.double-vertical-space,.large-double-vertical-space{margin-top:3.5em;margin-bottom:3.5em}.double-vertical-padding,.large-double-vertical-padding{padding-top:3.5em;padding-bottom:3.5em}.half-vertical-space,.large-half-vertical-space{margin-top:.875em;margin-bottom:.875em}.half-vertical-padding,.large-half-vertical-padding{padding-top:.875em;padding-bottom:.875em}.large-quarter-vertical-space,.quarter-vertical-space{margin-top:.4375em;margin-bottom:.4375em}.large-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.4375em;padding-bottom:.4375em}.horizontal-space,.large-horizontal-space{margin-left:1.75em;margin-right:1.75em}.horizontal-padding,.large-horizontal-padding{padding-left:1.75em;padding-right:1.75em}.double-horizontal-space,.large-double-horizontal-space{margin-left:3.5em;margin-right:3.5em}.double-horizontal-padding,.large-double-horizontal-padding{padding-left:3.5em;padding-right:3.5em}.half-horizontal-space,.large-half-horizontal-space{margin-left:.875em;margin-right:.875em}.half-horizontal-padding,.large-half-horizontal-padding{padding-left:.875em;padding-right:.875em}.large-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.4375em;margin-right:.4375em}.large-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.4375em;padding-right:.4375em}.large-top-space,.top-space{margin-top:1.75em}.large-top-padding,.top-padding{padding-top:1.75em}.double-top-space,.large-double-top-space{margin-top:3.5em}.double-top-padding,.large-double-top-padding{padding-top:3.5em}.half-top-space,.large-half-top-space{margin-top:.875em}.half-top-padding,.large-half-top-padding{padding-top:.875em}.large-quarter-top-space,.quarter-top-space{margin-top:.4375em}.large-quarter-top-padding,.quarter-top-padding{padding-top:.4375em}.large-right-space,.right-space{margin-right:1.75em}.large-right-padding,.right-padding{padding-right:1.75em}.double-right-space,.large-double-right-space{margin-right:3.5em}.double-right-padding,.large-double-right-padding{padding-right:3.5em}.half-right-space,.large-half-right-space{margin-right:.875em}.half-right-padding,.large-half-right-padding{padding-right:.875em}.large-quarter-right-space,.quarter-right-space{margin-right:.4375em}.large-quarter-right-padding,.quarter-right-padding{padding-right:.4375em}.bottom-space,.large-bottom-space{margin-bottom:1.75em}.bottom-padding,.large-bottom-padding{padding-bottom:1.75em}.double-bottom-space,.large-double-bottom-space{margin-bottom:3.5em}.double-bottom-padding,.large-double-bottom-padding{padding-bottom:3.5em}.half-bottom-space,.large-half-bottom-space{margin-bottom:.875em}.half-bottom-padding,.large-half-bottom-padding{padding-bottom:.875em}.large-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.4375em}.large-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.4375em}.large-left-space,.left-space{margin-left:1.75em}.large-left-padding,.left-padding{padding-left:1.75em}.double-left-space,.large-double-left-space{margin-left:3.5em}.double-left-padding,.large-double-left-padding{padding-left:3.5em}.half-left-space,.large-half-left-space{margin-left:.875em}.half-left-padding,.large-half-left-padding{padding-left:.875em}.large-quarter-left-space,.quarter-left-space{margin-left:.4375em}.large-quarter-left-padding,.quarter-left-padding{padding-left:.4375em}.hide-large{display:none!important}.show-large{display:inherit!important}table.show-large{display:table}thead.show-large{display:table-header-group}tbody.show-large{display:table-row-group}tfoot.show-large{display:table-footer-group}tr.show-large{display:table-row}td.show-large,th.show-large{display:table-cell}@media print{*{background:transparent!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.ink-navigation{display:none}.ink-table{border-collapse:collapse}.ink-label{border:1px solid #000}} \ No newline at end of file +.ink-grid{width:auto;max-width:1440px;margin:0 auto;padding:0 1.75em}.column-group>[class*=large-]{float:left;clear:none}.large-5{width:5%}.large-10{width:10%}.large-15{width:15%}.large-16{width:16.66%}.large-20{width:20%}.large-25{width:25%}.large-30{width:30%}.large-33{width:33.33%}.large-35{width:35%}.large-40{width:40%}.large-45{width:45%}.large-50{width:50%}.large-55{width:55%}.large-60{width:60%}.large-65{width:65%}.large-66{width:66.66%}.large-70{width:70%}.large-75{width:75%}.large-80{width:80%}.large-85{width:85%}.large-90{width:90%}.large-95{width:95%}.large-100{width:100%}[class*=large-100]{float:none;clear:both}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1.75em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.horizontal-gutters{margin-left:-1.75em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.double-gutters{margin-left:-3.5em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.double-horizontal-gutters{margin-left:-3.5em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.half-gutters{margin-left:-.875em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.half-horizontal-gutters{margin-left:-.875em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.quarter-gutters{margin-left:-.4375em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.quarter-horizontal-gutters{margin-left:-.4375em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-gutters{margin-left:-1.75em}.column-group.large-gutters>[class*=all-],.column-group.large-gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.large-horizontal-gutters{margin-left:-1.75em}.column-group.large-horizontal-gutters>[class*=all-],.column-group.large-horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.large-vertical-gutters>[class*=all-],.column-group.large-vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.large-double-gutters{margin-left:-3.5em}.column-group.large-double-gutters>[class*=all-],.column-group.large-double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.large-double-horizontal-gutters{margin-left:-3.5em}.column-group.large-double-horizontal-gutters>[class*=all-],.column-group.large-double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.large-double-vertical-gutters>[class*=all-],.column-group.large-double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.large-half-gutters{margin-left:-.875em}.column-group.large-half-gutters>[class*=all-],.column-group.large-half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.large-half-horizontal-gutters{margin-left:-.875em}.column-group.large-half-horizontal-gutters>[class*=all-],.column-group.large-half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.large-half-vertical-gutters>[class*=all-],.column-group.large-half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.large-quarter-gutters{margin-left:-.4375em}.column-group.large-quarter-gutters>[class*=all-],.column-group.large-quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.large-quarter-horizontal-gutters{margin-left:-.4375em}.column-group.large-quarter-horizontal-gutters>[class*=all-],.column-group.large-quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.large-quarter-vertical-gutters>[class*=all-],.column-group.large-quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-no-gutters{margin-left:0}.column-group.large-no-gutters>[class*=all-],.column-group.large-no-gutters>[class*=large-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=large-],.ink-table td[class*=large-],.ink-table tfoot[class*=large-],.ink-table th[class*=large-],.ink-table thead[class*=large-],.ink-table tr[class*=large-]{float:none}.large-push-left{float:left}.large-push-center{float:none;margin-left:auto;margin-right:auto}.large-push-right{float:right}.large-align-left{text-align:left}.large-align-center{text-align:center}.large-align-right{text-align:right}.large-no-margin{margin:0!important}.large-space,.space{margin:1.75em}.large-padding,.padding{padding:1.75em}.double-space,.large-double-space{margin:3.5em}.double-padding,.large-double-padding{padding:3.5em}.half-space,.large-half-space{margin:.875em}.half-padding,.large-half-padding{padding:.875em}.large-quarter-space,.quarter-space{margin:.4375em}.large-quarter-padding,.quarter-padding{padding:.4375em}.large-vertical-space,.vertical-space{margin-top:1.75em;margin-bottom:1.75em}.large-vertical-padding,.vertical-padding{padding-top:1.75em;padding-bottom:1.75em}.double-vertical-space,.large-double-vertical-space{margin-top:3.5em;margin-bottom:3.5em}.double-vertical-padding,.large-double-vertical-padding{padding-top:3.5em;padding-bottom:3.5em}.half-vertical-space,.large-half-vertical-space{margin-top:.875em;margin-bottom:.875em}.half-vertical-padding,.large-half-vertical-padding{padding-top:.875em;padding-bottom:.875em}.large-quarter-vertical-space,.quarter-vertical-space{margin-top:.4375em;margin-bottom:.4375em}.large-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.4375em;padding-bottom:.4375em}.horizontal-space,.large-horizontal-space{margin-left:1.75em;margin-right:1.75em}.horizontal-padding,.large-horizontal-padding{padding-left:1.75em;padding-right:1.75em}.double-horizontal-space,.large-double-horizontal-space{margin-left:3.5em;margin-right:3.5em}.double-horizontal-padding,.large-double-horizontal-padding{padding-left:3.5em;padding-right:3.5em}.half-horizontal-space,.large-half-horizontal-space{margin-left:.875em;margin-right:.875em}.half-horizontal-padding,.large-half-horizontal-padding{padding-left:.875em;padding-right:.875em}.large-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.4375em;margin-right:.4375em}.large-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.4375em;padding-right:.4375em}.large-top-space,.top-space{margin-top:1.75em}.large-top-padding,.top-padding{padding-top:1.75em}.double-top-space,.large-double-top-space{margin-top:3.5em}.double-top-padding,.large-double-top-padding{padding-top:3.5em}.half-top-space,.large-half-top-space{margin-top:.875em}.half-top-padding,.large-half-top-padding{padding-top:.875em}.large-quarter-top-space,.quarter-top-space{margin-top:.4375em}.large-quarter-top-padding,.quarter-top-padding{padding-top:.4375em}.large-right-space,.right-space{margin-right:1.75em}.large-right-padding,.right-padding{padding-right:1.75em}.double-right-space,.large-double-right-space{margin-right:3.5em}.double-right-padding,.large-double-right-padding{padding-right:3.5em}.half-right-space,.large-half-right-space{margin-right:.875em}.half-right-padding,.large-half-right-padding{padding-right:.875em}.large-quarter-right-space,.quarter-right-space{margin-right:.4375em}.large-quarter-right-padding,.quarter-right-padding{padding-right:.4375em}.bottom-space,.large-bottom-space{margin-bottom:1.75em}.bottom-padding,.large-bottom-padding{padding-bottom:1.75em}.double-bottom-space,.large-double-bottom-space{margin-bottom:3.5em}.double-bottom-padding,.large-double-bottom-padding{padding-bottom:3.5em}.half-bottom-space,.large-half-bottom-space{margin-bottom:.875em}.half-bottom-padding,.large-half-bottom-padding{padding-bottom:.875em}.large-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.4375em}.large-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.4375em}.large-left-space,.left-space{margin-left:1.75em}.large-left-padding,.left-padding{padding-left:1.75em}.double-left-space,.large-double-left-space{margin-left:3.5em}.double-left-padding,.large-double-left-padding{padding-left:3.5em}.half-left-space,.large-half-left-space{margin-left:.875em}.half-left-padding,.large-half-left-padding{padding-left:.875em}.large-quarter-left-space,.quarter-left-space{margin-left:.4375em}.large-quarter-left-padding,.quarter-left-padding{padding-left:.4375em}.hide-large{display:none!important}.show-large{display:inherit!important}table.show-large{display:table}thead.show-large{display:table-header-group}tbody.show-large{display:table-row-group}tfoot.show-large{display:table-footer-group}tr.show-large{display:table-row}td.show-large,th.show-large{display:table-cell}@media print{*{background:0 0!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.ink-navigation{display:none}.ink-table{border-collapse:collapse}.ink-label{border:1px solid #000}} \ No newline at end of file diff --git a/dist/css/ink-legacy.css b/dist/css/ink-legacy.css index 740ea2dcf..afc1fc302 100644 --- a/dist/css/ink-legacy.css +++ b/dist/css/ink-legacy.css @@ -133,7 +133,7 @@ html.no-flexbox, html.no-flexboxlegacy { - font-size: 0.97em; + font-size: 1em; } html.no-flexbox .ink-grid, html.no-flexboxlegacy .ink-grid { diff --git a/dist/css/ink-legacy.min.css b/dist/css/ink-legacy.min.css index 3ce514f7b..b2f3413f1 100644 --- a/dist/css/ink-legacy.min.css +++ b/dist/css/ink-legacy.min.css @@ -1 +1 @@ -.show-all{display:inherit}.hide-all{display:none!important}.no-margin{margin:0!important}.no-margin-top{margin-top:0!important}.no-margin-bottom{margin-bottom:0!important}.no-padding{padding:0!important}.push-left{float:left}.push-center{float:none!important;margin-left:auto;margin-right:auto}.push-right{float:right;-webkit-justify-content:flex-end;-moz-justify-content:flex-end;justify-content:flex-end}.align-left{text-align:left}.align-center{text-align:center}.align-right{text-align:right}.clearfix{overflow:hidden;*zoom:1}.clearfix:after{content:"";display:table;clear:both}html.no-flexbox,html.no-flexboxlegacy{font-size:.97em}html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{width:auto;max-width:1440px;margin:0 auto}html.no-flexbox .all-5,html.no-flexboxlegacy .all-5{width:5%;float:left;clear:none}html.no-flexbox .all-10,html.no-flexboxlegacy .all-10{width:10%;float:left;clear:none}html.no-flexbox .all-15,html.no-flexboxlegacy .all-15{width:15%;float:left;clear:none}html.no-flexbox .all-16,html.no-flexboxlegacy .all-16{width:16.66%;float:left;clear:none}html.no-flexbox .all-20,html.no-flexboxlegacy .all-20{width:20%;float:left;clear:none}html.no-flexbox .all-25,html.no-flexboxlegacy .all-25{width:25%;float:left;clear:none}html.no-flexbox .all-30,html.no-flexboxlegacy .all-30{width:30%;float:left;clear:none}html.no-flexbox .all-33,html.no-flexboxlegacy .all-33{width:33.33%;float:left;clear:none}html.no-flexbox .all-35,html.no-flexboxlegacy .all-35{width:35%;float:left;clear:none}html.no-flexbox .all-40,html.no-flexboxlegacy .all-40{width:40%;float:left;clear:none}html.no-flexbox .all-45,html.no-flexboxlegacy .all-45{width:45%;float:left;clear:none}html.no-flexbox .all-50,html.no-flexboxlegacy .all-50{width:50%;float:left;clear:none}html.no-flexbox .all-55,html.no-flexboxlegacy .all-55{width:55%;float:left;clear:none}html.no-flexbox .all-60,html.no-flexboxlegacy .all-60{width:60%;float:left;clear:none}html.no-flexbox .all-65,html.no-flexboxlegacy .all-65{width:65%;float:left;clear:none}html.no-flexbox .all-66,html.no-flexboxlegacy .all-66{width:66.66%;float:left;clear:none}html.no-flexbox .all-70,html.no-flexboxlegacy .all-70{width:70%;float:left;clear:none}html.no-flexbox .all-75,html.no-flexboxlegacy .all-75{width:75%;float:left;clear:none}html.no-flexbox .all-80,html.no-flexboxlegacy .all-80{width:80%;float:left;clear:none}html.no-flexbox .all-85,html.no-flexboxlegacy .all-85{width:85%;float:left;clear:none}html.no-flexbox .all-90,html.no-flexboxlegacy .all-90{width:90%;float:left;clear:none}html.no-flexbox .all-95,html.no-flexboxlegacy .all-95{width:95%;float:left;clear:none}html.no-flexbox .all-100,html.no-flexboxlegacy .all-100{width:100%;float:left;clear:none}html.no-flexbox [class~=all-100],html.no-flexboxlegacy [class~=all-100]{float:none;clear:both}@media screen and (min-width:1261px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 2em}html.no-flexbox .column-group>[class*=xlarge-],html.no-flexboxlegacy .column-group>[class*=xlarge-]{float:left;clear:none}html.no-flexbox .xlarge-5,html.no-flexboxlegacy .xlarge-5{width:5%}html.no-flexbox .xlarge-10,html.no-flexboxlegacy .xlarge-10{width:10%}html.no-flexbox .xlarge-15,html.no-flexboxlegacy .xlarge-15{width:15%}html.no-flexbox .xlarge-16,html.no-flexboxlegacy .xlarge-16{width:16.66%}html.no-flexbox .xlarge-20,html.no-flexboxlegacy .xlarge-20{width:20%}html.no-flexbox .xlarge-25,html.no-flexboxlegacy .xlarge-25{width:25%}html.no-flexbox .xlarge-30,html.no-flexboxlegacy .xlarge-30{width:30%}html.no-flexbox .xlarge-33,html.no-flexboxlegacy .xlarge-33{width:33.33%}html.no-flexbox .xlarge-35,html.no-flexboxlegacy .xlarge-35{width:35%}html.no-flexbox .xlarge-40,html.no-flexboxlegacy .xlarge-40{width:40%}html.no-flexbox .xlarge-45,html.no-flexboxlegacy .xlarge-45{width:45%}html.no-flexbox .xlarge-50,html.no-flexboxlegacy .xlarge-50{width:50%}html.no-flexbox .xlarge-55,html.no-flexboxlegacy .xlarge-55{width:55%}html.no-flexbox .xlarge-60,html.no-flexboxlegacy .xlarge-60{width:60%}html.no-flexbox .xlarge-65,html.no-flexboxlegacy .xlarge-65{width:65%}html.no-flexbox .xlarge-66,html.no-flexboxlegacy .xlarge-66{width:66.66%}html.no-flexbox .xlarge-70,html.no-flexboxlegacy .xlarge-70{width:70%}html.no-flexbox .xlarge-75,html.no-flexboxlegacy .xlarge-75{width:75%}html.no-flexbox .xlarge-80,html.no-flexboxlegacy .xlarge-80{width:80%}html.no-flexbox .xlarge-85,html.no-flexboxlegacy .xlarge-85{width:85%}html.no-flexbox .xlarge-90,html.no-flexboxlegacy .xlarge-90{width:90%}html.no-flexbox .xlarge-95,html.no-flexboxlegacy .xlarge-95{width:95%}html.no-flexbox .xlarge-100,html.no-flexboxlegacy .xlarge-100{width:100%}html.no-flexbox [class*=xlarge-100],html.no-flexboxlegacy [class*=xlarge-100]{float:none;clear:both}html.no-flexbox .column-group,html.no-flexboxlegacy .column-group{*zoom:1}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-2em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-2em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=xlarge-]{padding-left:2em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=xlarge-]{margin-bottom:2em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-4em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-4em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-1em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-1em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.5em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.5em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}html.no-flexbox .column-group.xlarge-gutters,html.no-flexboxlegacy .column-group.xlarge-gutters{margin-left:-2em}html.no-flexbox .column-group.xlarge-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}html.no-flexbox .column-group.xlarge-horizontal-gutters,html.no-flexboxlegacy .column-group.xlarge-horizontal-gutters{margin-left:-2em}html.no-flexbox .column-group.xlarge-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-horizontal-gutters>[class*=xlarge-]{padding-left:2em}html.no-flexbox .column-group.xlarge-vertical-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-vertical-gutters>[class*=xlarge-]{margin-bottom:2em}html.no-flexbox .column-group.xlarge-double-gutters,html.no-flexboxlegacy .column-group.xlarge-double-gutters{margin-left:-4em}html.no-flexbox .column-group.xlarge-double-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-double-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}html.no-flexbox .column-group.xlarge-double-horizontal-gutters,html.no-flexboxlegacy .column-group.xlarge-double-horizontal-gutters{margin-left:-4em}html.no-flexbox .column-group.xlarge-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-double-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}html.no-flexbox .column-group.xlarge-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-double-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}html.no-flexbox .column-group.xlarge-half-gutters,html.no-flexboxlegacy .column-group.xlarge-half-gutters{margin-left:-1em}html.no-flexbox .column-group.xlarge-half-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-half-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}html.no-flexbox .column-group.xlarge-half-horizontal-gutters,html.no-flexboxlegacy .column-group.xlarge-half-horizontal-gutters{margin-left:-1em}html.no-flexbox .column-group.xlarge-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-half-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}html.no-flexbox .column-group.xlarge-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-half-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}html.no-flexbox .column-group.xlarge-quarter-gutters,html.no-flexboxlegacy .column-group.xlarge-quarter-gutters{margin-left:-.5em}html.no-flexbox .column-group.xlarge-quarter-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-quarter-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}html.no-flexbox .column-group.xlarge-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.xlarge-quarter-horizontal-gutters{margin-left:-.5em}html.no-flexbox .column-group.xlarge-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-quarter-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}html.no-flexbox .column-group.xlarge-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-quarter-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}html.no-flexbox .column-group.xlarge-no-gutters,html.no-flexboxlegacy .column-group.xlarge-no-gutters{margin-left:0}html.no-flexbox .column-group.xlarge-no-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-no-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-no-gutters>[class*=xlarge-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=xlarge-],html.no-flexbox .ink-table td[class*=xlarge-],html.no-flexbox .ink-table tfoot[class*=xlarge-],html.no-flexbox .ink-table th[class*=xlarge-],html.no-flexbox .ink-table thead[class*=xlarge-],html.no-flexbox .ink-table tr[class*=xlarge-],html.no-flexboxlegacy .ink-table tbody[class*=xlarge-],html.no-flexboxlegacy .ink-table td[class*=xlarge-],html.no-flexboxlegacy .ink-table tfoot[class*=xlarge-],html.no-flexboxlegacy .ink-table th[class*=xlarge-],html.no-flexboxlegacy .ink-table thead[class*=xlarge-],html.no-flexboxlegacy .ink-table tr[class*=xlarge-]{float:none}html.no-flexbox .xlarge-push-left,html.no-flexboxlegacy .xlarge-push-left{float:left}html.no-flexbox .xlarge-push-center,html.no-flexboxlegacy .xlarge-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .xlarge-push-right,html.no-flexboxlegacy .xlarge-push-right{float:right}html.no-flexbox .xlarge-align-left,html.no-flexboxlegacy .xlarge-align-left{text-align:left}html.no-flexbox .xlarge-align-center,html.no-flexboxlegacy .xlarge-align-center{text-align:center}html.no-flexbox .xlarge-align-right,html.no-flexboxlegacy .xlarge-align-right{text-align:right}html.no-flexbox .xlarge-no-margin,html.no-flexboxlegacy .xlarge-no-margin{margin:0!important}html.no-flexbox .space,html.no-flexbox .xlarge-space,html.no-flexboxlegacy .space,html.no-flexboxlegacy .xlarge-space{margin:2em}html.no-flexbox .padding,html.no-flexbox .xlarge-padding,html.no-flexboxlegacy .padding,html.no-flexboxlegacy .xlarge-padding{padding:2em}html.no-flexbox .double-space,html.no-flexbox .xlarge-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .xlarge-double-space{margin:4em}html.no-flexbox .double-padding,html.no-flexbox .xlarge-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .xlarge-double-padding{padding:4em}html.no-flexbox .half-space,html.no-flexbox .xlarge-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .xlarge-half-space{margin:1em}html.no-flexbox .half-padding,html.no-flexbox .xlarge-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .xlarge-half-padding{padding:1em}html.no-flexbox .quarter-space,html.no-flexbox .xlarge-quarter-space,html.no-flexboxlegacy .quarter-space,html.no-flexboxlegacy .xlarge-quarter-space{margin:.5em}html.no-flexbox .quarter-padding,html.no-flexbox .xlarge-quarter-padding,html.no-flexboxlegacy .quarter-padding,html.no-flexboxlegacy .xlarge-quarter-padding{padding:.5em}html.no-flexbox .vertical-space,html.no-flexbox .xlarge-vertical-space,html.no-flexboxlegacy .vertical-space,html.no-flexboxlegacy .xlarge-vertical-space{margin-top:2em;margin-bottom:2em}html.no-flexbox .vertical-padding,html.no-flexbox .xlarge-vertical-padding,html.no-flexboxlegacy .vertical-padding,html.no-flexboxlegacy .xlarge-vertical-padding{padding-top:2em;padding-bottom:2em}html.no-flexbox .double-vertical-space,html.no-flexbox .xlarge-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .xlarge-double-vertical-space{margin-top:4em;margin-bottom:4em}html.no-flexbox .double-vertical-padding,html.no-flexbox .xlarge-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .xlarge-double-vertical-padding{padding-top:4em;padding-bottom:4em}html.no-flexbox .half-vertical-space,html.no-flexbox .xlarge-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .xlarge-half-vertical-space{margin-top:1em;margin-bottom:1em}html.no-flexbox .half-vertical-padding,html.no-flexbox .xlarge-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .xlarge-half-vertical-padding{padding-top:1em;padding-bottom:1em}html.no-flexbox .quarter-vertical-space,html.no-flexbox .xlarge-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space,html.no-flexboxlegacy .xlarge-quarter-vertical-space{margin-top:.5em;margin-bottom:.5em}html.no-flexbox .quarter-vertical-padding,html.no-flexbox .xlarge-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding,html.no-flexboxlegacy .xlarge-quarter-vertical-padding{padding-top:.5em;padding-bottom:.5em}html.no-flexbox .horizontal-space,html.no-flexbox .xlarge-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .xlarge-horizontal-space{margin-left:2em;margin-right:2em}html.no-flexbox .horizontal-padding,html.no-flexbox .xlarge-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .xlarge-horizontal-padding{padding-left:2em;padding-right:2em}html.no-flexbox .double-horizontal-space,html.no-flexbox .xlarge-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .xlarge-double-horizontal-space{margin-left:4em;margin-right:4em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .xlarge-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .xlarge-double-horizontal-padding{padding-left:4em;padding-right:4em}html.no-flexbox .half-horizontal-space,html.no-flexbox .xlarge-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .xlarge-half-horizontal-space{margin-left:1em;margin-right:1em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .xlarge-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .xlarge-half-horizontal-padding{padding-left:1em;padding-right:1em}html.no-flexbox .quarter-horizontal-space,html.no-flexbox .xlarge-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space,html.no-flexboxlegacy .xlarge-quarter-horizontal-space{margin-left:.5em;margin-right:.5em}html.no-flexbox .quarter-horizontal-padding,html.no-flexbox .xlarge-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding,html.no-flexboxlegacy .xlarge-quarter-horizontal-padding{padding-left:.5em;padding-right:.5em}html.no-flexbox .top-space,html.no-flexbox .xlarge-top-space,html.no-flexboxlegacy .top-space,html.no-flexboxlegacy .xlarge-top-space{margin-top:2em}html.no-flexbox .top-padding,html.no-flexbox .xlarge-top-padding,html.no-flexboxlegacy .top-padding,html.no-flexboxlegacy .xlarge-top-padding{padding-top:2em}html.no-flexbox .double-top-space,html.no-flexbox .xlarge-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .xlarge-double-top-space{margin-top:4em}html.no-flexbox .double-top-padding,html.no-flexbox .xlarge-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .xlarge-double-top-padding{padding-top:4em}html.no-flexbox .half-top-space,html.no-flexbox .xlarge-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .xlarge-half-top-space{margin-top:1em}html.no-flexbox .half-top-padding,html.no-flexbox .xlarge-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .xlarge-half-top-padding{padding-top:1em}html.no-flexbox .quarter-top-space,html.no-flexbox .xlarge-quarter-top-space,html.no-flexboxlegacy .quarter-top-space,html.no-flexboxlegacy .xlarge-quarter-top-space{margin-top:.5em}html.no-flexbox .quarter-top-padding,html.no-flexbox .xlarge-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding,html.no-flexboxlegacy .xlarge-quarter-top-padding{padding-top:.5em}html.no-flexbox .right-space,html.no-flexbox .xlarge-right-space,html.no-flexboxlegacy .right-space,html.no-flexboxlegacy .xlarge-right-space{margin-right:2em}html.no-flexbox .right-padding,html.no-flexbox .xlarge-right-padding,html.no-flexboxlegacy .right-padding,html.no-flexboxlegacy .xlarge-right-padding{padding-right:2em}html.no-flexbox .double-right-space,html.no-flexbox .xlarge-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .xlarge-double-right-space{margin-right:4em}html.no-flexbox .double-right-padding,html.no-flexbox .xlarge-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .xlarge-double-right-padding{padding-right:4em}html.no-flexbox .half-right-space,html.no-flexbox .xlarge-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .xlarge-half-right-space{margin-right:1em}html.no-flexbox .half-right-padding,html.no-flexbox .xlarge-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .xlarge-half-right-padding{padding-right:1em}html.no-flexbox .quarter-right-space,html.no-flexbox .xlarge-quarter-right-space,html.no-flexboxlegacy .quarter-right-space,html.no-flexboxlegacy .xlarge-quarter-right-space{margin-right:.5em}html.no-flexbox .quarter-right-padding,html.no-flexbox .xlarge-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding,html.no-flexboxlegacy .xlarge-quarter-right-padding{padding-right:.5em}html.no-flexbox .bottom-space,html.no-flexbox .xlarge-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .xlarge-bottom-space{margin-bottom:2em}html.no-flexbox .bottom-padding,html.no-flexbox .xlarge-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .xlarge-bottom-padding{padding-bottom:2em}html.no-flexbox .double-bottom-space,html.no-flexbox .xlarge-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .xlarge-double-bottom-space{margin-bottom:4em}html.no-flexbox .double-bottom-padding,html.no-flexbox .xlarge-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .xlarge-double-bottom-padding{padding-bottom:4em}html.no-flexbox .half-bottom-space,html.no-flexbox .xlarge-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .xlarge-half-bottom-space{margin-bottom:1em}html.no-flexbox .half-bottom-padding,html.no-flexbox .xlarge-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .xlarge-half-bottom-padding{padding-bottom:1em}html.no-flexbox .quarter-bottom-space,html.no-flexbox .xlarge-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space,html.no-flexboxlegacy .xlarge-quarter-bottom-space{margin-bottom:.5em}html.no-flexbox .quarter-bottom-padding,html.no-flexbox .xlarge-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding,html.no-flexboxlegacy .xlarge-quarter-bottom-padding{padding-bottom:.5em}html.no-flexbox .left-space,html.no-flexbox .xlarge-left-space,html.no-flexboxlegacy .left-space,html.no-flexboxlegacy .xlarge-left-space{margin-left:2em}html.no-flexbox .left-padding,html.no-flexbox .xlarge-left-padding,html.no-flexboxlegacy .left-padding,html.no-flexboxlegacy .xlarge-left-padding{padding-left:2em}html.no-flexbox .double-left-space,html.no-flexbox .xlarge-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .xlarge-double-left-space{margin-left:4em}html.no-flexbox .double-left-padding,html.no-flexbox .xlarge-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .xlarge-double-left-padding{padding-left:4em}html.no-flexbox .half-left-space,html.no-flexbox .xlarge-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .xlarge-half-left-space{margin-left:1em}html.no-flexbox .half-left-padding,html.no-flexbox .xlarge-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .xlarge-half-left-padding{padding-left:1em}html.no-flexbox .quarter-left-space,html.no-flexbox .xlarge-quarter-left-space,html.no-flexboxlegacy .quarter-left-space,html.no-flexboxlegacy .xlarge-quarter-left-space{margin-left:.5em}html.no-flexbox .quarter-left-padding,html.no-flexbox .xlarge-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding,html.no-flexboxlegacy .xlarge-quarter-left-padding{padding-left:.5em}html.no-flexbox .hide-xlarge,html.no-flexboxlegacy .hide-xlarge{display:none!important}html.no-flexbox .show-xlarge,html.no-flexboxlegacy .show-xlarge{display:inherit!important}html.no-flexbox table.show-xlarge,html.no-flexboxlegacy table.show-xlarge{display:table}html.no-flexbox thead.show-xlarge,html.no-flexboxlegacy thead.show-xlarge{display:table-header-group}html.no-flexbox tbody.show-xlarge,html.no-flexboxlegacy tbody.show-xlarge{display:table-row-group}html.no-flexbox tfoot.show-xlarge,html.no-flexboxlegacy tfoot.show-xlarge{display:table-footer-group}html.no-flexbox tr.show-xlarge,html.no-flexboxlegacy tr.show-xlarge{display:table-row}html.no-flexbox td.show-xlarge,html.no-flexbox th.show-xlarge,html.no-flexboxlegacy td.show-xlarge,html.no-flexboxlegacy th.show-xlarge{display:table-cell}}@media screen and (min-width:961px) and (max-width:1260px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 1.75em}html.no-flexbox .column-group>[class*=large-],html.no-flexboxlegacy .column-group>[class*=large-]{float:left;clear:none}html.no-flexbox .large-5,html.no-flexboxlegacy .large-5{width:5%}html.no-flexbox .large-10,html.no-flexboxlegacy .large-10{width:10%}html.no-flexbox .large-15,html.no-flexboxlegacy .large-15{width:15%}html.no-flexbox .large-16,html.no-flexboxlegacy .large-16{width:16.66%}html.no-flexbox .large-20,html.no-flexboxlegacy .large-20{width:20%}html.no-flexbox .large-25,html.no-flexboxlegacy .large-25{width:25%}html.no-flexbox .large-30,html.no-flexboxlegacy .large-30{width:30%}html.no-flexbox .large-33,html.no-flexboxlegacy .large-33{width:33.33%}html.no-flexbox .large-35,html.no-flexboxlegacy .large-35{width:35%}html.no-flexbox .large-40,html.no-flexboxlegacy .large-40{width:40%}html.no-flexbox .large-45,html.no-flexboxlegacy .large-45{width:45%}html.no-flexbox .large-50,html.no-flexboxlegacy .large-50{width:50%}html.no-flexbox .large-55,html.no-flexboxlegacy .large-55{width:55%}html.no-flexbox .large-60,html.no-flexboxlegacy .large-60{width:60%}html.no-flexbox .large-65,html.no-flexboxlegacy .large-65{width:65%}html.no-flexbox .large-66,html.no-flexboxlegacy .large-66{width:66.66%}html.no-flexbox .large-70,html.no-flexboxlegacy .large-70{width:70%}html.no-flexbox .large-75,html.no-flexboxlegacy .large-75{width:75%}html.no-flexbox .large-80,html.no-flexboxlegacy .large-80{width:80%}html.no-flexbox .large-85,html.no-flexboxlegacy .large-85{width:85%}html.no-flexbox .large-90,html.no-flexboxlegacy .large-90{width:90%}html.no-flexbox .large-95,html.no-flexboxlegacy .large-95{width:95%}html.no-flexbox .large-100,html.no-flexboxlegacy .large-100{width:100%}html.no-flexbox [class*=large-100],html.no-flexboxlegacy [class*=large-100]{float:none;clear:both}html.no-flexbox .column-group,html.no-flexboxlegacy .column-group{*zoom:1}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-1.75em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=large-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-1.75em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=large-]{padding-left:1.75em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=large-]{margin-bottom:1.75em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-3.5em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=large-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-3.5em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=large-]{padding-left:3.5em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-.875em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=large-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-.875em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=large-]{padding-left:.875em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=large-]{margin-bottom:.875em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.4375em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=large-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.4375em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}html.no-flexbox .column-group.large-gutters,html.no-flexboxlegacy .column-group.large-gutters{margin-left:-1.75em}html.no-flexbox .column-group.large-gutters>[class*=all-],html.no-flexbox .column-group.large-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}html.no-flexbox .column-group.large-horizontal-gutters,html.no-flexboxlegacy .column-group.large-horizontal-gutters{margin-left:-1.75em}html.no-flexbox .column-group.large-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.large-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-horizontal-gutters>[class*=large-]{padding-left:1.75em}html.no-flexbox .column-group.large-vertical-gutters>[class*=all-],html.no-flexbox .column-group.large-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-vertical-gutters>[class*=large-]{margin-bottom:1.75em}html.no-flexbox .column-group.large-double-gutters,html.no-flexboxlegacy .column-group.large-double-gutters{margin-left:-3.5em}html.no-flexbox .column-group.large-double-gutters>[class*=all-],html.no-flexbox .column-group.large-double-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}html.no-flexbox .column-group.large-double-horizontal-gutters,html.no-flexboxlegacy .column-group.large-double-horizontal-gutters{margin-left:-3.5em}html.no-flexbox .column-group.large-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.large-double-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-double-horizontal-gutters>[class*=large-]{padding-left:3.5em}html.no-flexbox .column-group.large-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.large-double-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}html.no-flexbox .column-group.large-half-gutters,html.no-flexboxlegacy .column-group.large-half-gutters{margin-left:-.875em}html.no-flexbox .column-group.large-half-gutters>[class*=all-],html.no-flexbox .column-group.large-half-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}html.no-flexbox .column-group.large-half-horizontal-gutters,html.no-flexboxlegacy .column-group.large-half-horizontal-gutters{margin-left:-.875em}html.no-flexbox .column-group.large-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.large-half-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-half-horizontal-gutters>[class*=large-]{padding-left:.875em}html.no-flexbox .column-group.large-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.large-half-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-half-vertical-gutters>[class*=large-]{margin-bottom:.875em}html.no-flexbox .column-group.large-quarter-gutters,html.no-flexboxlegacy .column-group.large-quarter-gutters{margin-left:-.4375em}html.no-flexbox .column-group.large-quarter-gutters>[class*=all-],html.no-flexbox .column-group.large-quarter-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}html.no-flexbox .column-group.large-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.large-quarter-horizontal-gutters{margin-left:-.4375em}html.no-flexbox .column-group.large-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.large-quarter-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}html.no-flexbox .column-group.large-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.large-quarter-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}html.no-flexbox .column-group.large-no-gutters,html.no-flexboxlegacy .column-group.large-no-gutters{margin-left:0}html.no-flexbox .column-group.large-no-gutters>[class*=all-],html.no-flexbox .column-group.large-no-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-no-gutters>[class*=large-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=large-],html.no-flexbox .ink-table td[class*=large-],html.no-flexbox .ink-table tfoot[class*=large-],html.no-flexbox .ink-table th[class*=large-],html.no-flexbox .ink-table thead[class*=large-],html.no-flexbox .ink-table tr[class*=large-],html.no-flexboxlegacy .ink-table tbody[class*=large-],html.no-flexboxlegacy .ink-table td[class*=large-],html.no-flexboxlegacy .ink-table tfoot[class*=large-],html.no-flexboxlegacy .ink-table th[class*=large-],html.no-flexboxlegacy .ink-table thead[class*=large-],html.no-flexboxlegacy .ink-table tr[class*=large-]{float:none}html.no-flexbox .large-push-left,html.no-flexboxlegacy .large-push-left{float:left}html.no-flexbox .large-push-center,html.no-flexboxlegacy .large-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .large-push-right,html.no-flexboxlegacy .large-push-right{float:right}html.no-flexbox .large-align-left,html.no-flexboxlegacy .large-align-left{text-align:left}html.no-flexbox .large-align-center,html.no-flexboxlegacy .large-align-center{text-align:center}html.no-flexbox .large-align-right,html.no-flexboxlegacy .large-align-right{text-align:right}html.no-flexbox .large-no-margin,html.no-flexboxlegacy .large-no-margin{margin:0!important}html.no-flexbox .large-space,html.no-flexbox .space,html.no-flexboxlegacy .large-space,html.no-flexboxlegacy .space{margin:1.75em}html.no-flexbox .large-padding,html.no-flexbox .padding,html.no-flexboxlegacy .large-padding,html.no-flexboxlegacy .padding{padding:1.75em}html.no-flexbox .double-space,html.no-flexbox .large-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .large-double-space{margin:3.5em}html.no-flexbox .double-padding,html.no-flexbox .large-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .large-double-padding{padding:3.5em}html.no-flexbox .half-space,html.no-flexbox .large-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .large-half-space{margin:.875em}html.no-flexbox .half-padding,html.no-flexbox .large-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .large-half-padding{padding:.875em}html.no-flexbox .large-quarter-space,html.no-flexbox .quarter-space,html.no-flexboxlegacy .large-quarter-space,html.no-flexboxlegacy .quarter-space{margin:.4375em}html.no-flexbox .large-quarter-padding,html.no-flexbox .quarter-padding,html.no-flexboxlegacy .large-quarter-padding,html.no-flexboxlegacy .quarter-padding{padding:.4375em}html.no-flexbox .large-vertical-space,html.no-flexbox .vertical-space,html.no-flexboxlegacy .large-vertical-space,html.no-flexboxlegacy .vertical-space{margin-top:1.75em;margin-bottom:1.75em}html.no-flexbox .large-vertical-padding,html.no-flexbox .vertical-padding,html.no-flexboxlegacy .large-vertical-padding,html.no-flexboxlegacy .vertical-padding{padding-top:1.75em;padding-bottom:1.75em}html.no-flexbox .double-vertical-space,html.no-flexbox .large-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .large-double-vertical-space{margin-top:3.5em;margin-bottom:3.5em}html.no-flexbox .double-vertical-padding,html.no-flexbox .large-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .large-double-vertical-padding{padding-top:3.5em;padding-bottom:3.5em}html.no-flexbox .half-vertical-space,html.no-flexbox .large-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .large-half-vertical-space{margin-top:.875em;margin-bottom:.875em}html.no-flexbox .half-vertical-padding,html.no-flexbox .large-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .large-half-vertical-padding{padding-top:.875em;padding-bottom:.875em}html.no-flexbox .large-quarter-vertical-space,html.no-flexbox .quarter-vertical-space,html.no-flexboxlegacy .large-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space{margin-top:.4375em;margin-bottom:.4375em}html.no-flexbox .large-quarter-vertical-padding,html.no-flexbox .quarter-vertical-padding,html.no-flexboxlegacy .large-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding{padding-top:.4375em;padding-bottom:.4375em}html.no-flexbox .horizontal-space,html.no-flexbox .large-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .large-horizontal-space{margin-left:1.75em;margin-right:1.75em}html.no-flexbox .horizontal-padding,html.no-flexbox .large-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .large-horizontal-padding{padding-left:1.75em;padding-right:1.75em}html.no-flexbox .double-horizontal-space,html.no-flexbox .large-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .large-double-horizontal-space{margin-left:3.5em;margin-right:3.5em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .large-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .large-double-horizontal-padding{padding-left:3.5em;padding-right:3.5em}html.no-flexbox .half-horizontal-space,html.no-flexbox .large-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .large-half-horizontal-space{margin-left:.875em;margin-right:.875em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .large-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .large-half-horizontal-padding{padding-left:.875em;padding-right:.875em}html.no-flexbox .large-quarter-horizontal-space,html.no-flexbox .quarter-horizontal-space,html.no-flexboxlegacy .large-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space{margin-left:.4375em;margin-right:.4375em}html.no-flexbox .large-quarter-horizontal-padding,html.no-flexbox .quarter-horizontal-padding,html.no-flexboxlegacy .large-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding{padding-left:.4375em;padding-right:.4375em}html.no-flexbox .large-top-space,html.no-flexbox .top-space,html.no-flexboxlegacy .large-top-space,html.no-flexboxlegacy .top-space{margin-top:1.75em}html.no-flexbox .large-top-padding,html.no-flexbox .top-padding,html.no-flexboxlegacy .large-top-padding,html.no-flexboxlegacy .top-padding{padding-top:1.75em}html.no-flexbox .double-top-space,html.no-flexbox .large-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .large-double-top-space{margin-top:3.5em}html.no-flexbox .double-top-padding,html.no-flexbox .large-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .large-double-top-padding{padding-top:3.5em}html.no-flexbox .half-top-space,html.no-flexbox .large-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .large-half-top-space{margin-top:.875em}html.no-flexbox .half-top-padding,html.no-flexbox .large-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .large-half-top-padding{padding-top:.875em}html.no-flexbox .large-quarter-top-space,html.no-flexbox .quarter-top-space,html.no-flexboxlegacy .large-quarter-top-space,html.no-flexboxlegacy .quarter-top-space{margin-top:.4375em}html.no-flexbox .large-quarter-top-padding,html.no-flexbox .quarter-top-padding,html.no-flexboxlegacy .large-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding{padding-top:.4375em}html.no-flexbox .large-right-space,html.no-flexbox .right-space,html.no-flexboxlegacy .large-right-space,html.no-flexboxlegacy .right-space{margin-right:1.75em}html.no-flexbox .large-right-padding,html.no-flexbox .right-padding,html.no-flexboxlegacy .large-right-padding,html.no-flexboxlegacy .right-padding{padding-right:1.75em}html.no-flexbox .double-right-space,html.no-flexbox .large-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .large-double-right-space{margin-right:3.5em}html.no-flexbox .double-right-padding,html.no-flexbox .large-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .large-double-right-padding{padding-right:3.5em}html.no-flexbox .half-right-space,html.no-flexbox .large-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .large-half-right-space{margin-right:.875em}html.no-flexbox .half-right-padding,html.no-flexbox .large-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .large-half-right-padding{padding-right:.875em}html.no-flexbox .large-quarter-right-space,html.no-flexbox .quarter-right-space,html.no-flexboxlegacy .large-quarter-right-space,html.no-flexboxlegacy .quarter-right-space{margin-right:.4375em}html.no-flexbox .large-quarter-right-padding,html.no-flexbox .quarter-right-padding,html.no-flexboxlegacy .large-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding{padding-right:.4375em}html.no-flexbox .bottom-space,html.no-flexbox .large-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .large-bottom-space{margin-bottom:1.75em}html.no-flexbox .bottom-padding,html.no-flexbox .large-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .large-bottom-padding{padding-bottom:1.75em}html.no-flexbox .double-bottom-space,html.no-flexbox .large-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .large-double-bottom-space{margin-bottom:3.5em}html.no-flexbox .double-bottom-padding,html.no-flexbox .large-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .large-double-bottom-padding{padding-bottom:3.5em}html.no-flexbox .half-bottom-space,html.no-flexbox .large-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .large-half-bottom-space{margin-bottom:.875em}html.no-flexbox .half-bottom-padding,html.no-flexbox .large-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .large-half-bottom-padding{padding-bottom:.875em}html.no-flexbox .large-quarter-bottom-space,html.no-flexbox .quarter-bottom-space,html.no-flexboxlegacy .large-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space{margin-bottom:.4375em}html.no-flexbox .large-quarter-bottom-padding,html.no-flexbox .quarter-bottom-padding,html.no-flexboxlegacy .large-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding{padding-bottom:.4375em}html.no-flexbox .large-left-space,html.no-flexbox .left-space,html.no-flexboxlegacy .large-left-space,html.no-flexboxlegacy .left-space{margin-left:1.75em}html.no-flexbox .large-left-padding,html.no-flexbox .left-padding,html.no-flexboxlegacy .large-left-padding,html.no-flexboxlegacy .left-padding{padding-left:1.75em}html.no-flexbox .double-left-space,html.no-flexbox .large-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .large-double-left-space{margin-left:3.5em}html.no-flexbox .double-left-padding,html.no-flexbox .large-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .large-double-left-padding{padding-left:3.5em}html.no-flexbox .half-left-space,html.no-flexbox .large-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .large-half-left-space{margin-left:.875em}html.no-flexbox .half-left-padding,html.no-flexbox .large-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .large-half-left-padding{padding-left:.875em}html.no-flexbox .large-quarter-left-space,html.no-flexbox .quarter-left-space,html.no-flexboxlegacy .large-quarter-left-space,html.no-flexboxlegacy .quarter-left-space{margin-left:.4375em}html.no-flexbox .large-quarter-left-padding,html.no-flexbox .quarter-left-padding,html.no-flexboxlegacy .large-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding{padding-left:.4375em}html.no-flexbox .hide-large,html.no-flexboxlegacy .hide-large{display:none!important}html.no-flexbox .show-large,html.no-flexboxlegacy .show-large{display:inherit!important}html.no-flexbox table.show-large,html.no-flexboxlegacy table.show-large{display:table}html.no-flexbox thead.show-large,html.no-flexboxlegacy thead.show-large{display:table-header-group}html.no-flexbox tbody.show-large,html.no-flexboxlegacy tbody.show-large{display:table-row-group}html.no-flexbox tfoot.show-large,html.no-flexboxlegacy tfoot.show-large{display:table-footer-group}html.no-flexbox tr.show-large,html.no-flexboxlegacy tr.show-large{display:table-row}html.no-flexbox td.show-large,html.no-flexbox th.show-large,html.no-flexboxlegacy td.show-large,html.no-flexboxlegacy th.show-large{display:table-cell}}@media screen and (min-width:641px) and (max-width:960px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 1.5em}html.no-flexbox .column-group>[class*=medium-],html.no-flexboxlegacy .column-group>[class*=medium-]{float:left;clear:none}html.no-flexbox .medium-5,html.no-flexboxlegacy .medium-5{width:5%}html.no-flexbox .medium-10,html.no-flexboxlegacy .medium-10{width:10%}html.no-flexbox .medium-15,html.no-flexboxlegacy .medium-15{width:15%}html.no-flexbox .medium-16,html.no-flexboxlegacy .medium-16{width:16.66%}html.no-flexbox .medium-20,html.no-flexboxlegacy .medium-20{width:20%}html.no-flexbox .medium-25,html.no-flexboxlegacy .medium-25{width:25%}html.no-flexbox .medium-30,html.no-flexboxlegacy .medium-30{width:30%}html.no-flexbox .medium-33,html.no-flexboxlegacy .medium-33{width:33.33%}html.no-flexbox .medium-35,html.no-flexboxlegacy .medium-35{width:35%}html.no-flexbox .medium-40,html.no-flexboxlegacy .medium-40{width:40%}html.no-flexbox .medium-45,html.no-flexboxlegacy .medium-45{width:45%}html.no-flexbox .medium-50,html.no-flexboxlegacy .medium-50{width:50%}html.no-flexbox .medium-55,html.no-flexboxlegacy .medium-55{width:55%}html.no-flexbox .medium-60,html.no-flexboxlegacy .medium-60{width:60%}html.no-flexbox .medium-65,html.no-flexboxlegacy .medium-65{width:65%}html.no-flexbox .medium-66,html.no-flexboxlegacy .medium-66{width:66.66%}html.no-flexbox .medium-70,html.no-flexboxlegacy .medium-70{width:70%}html.no-flexbox .medium-75,html.no-flexboxlegacy .medium-75{width:75%}html.no-flexbox .medium-80,html.no-flexboxlegacy .medium-80{width:80%}html.no-flexbox .medium-85,html.no-flexboxlegacy .medium-85{width:85%}html.no-flexbox .medium-90,html.no-flexboxlegacy .medium-90{width:90%}html.no-flexbox .medium-95,html.no-flexboxlegacy .medium-95{width:95%}html.no-flexbox .medium-100,html.no-flexboxlegacy .medium-100{width:100%}html.no-flexbox [class*=medium-100],html.no-flexboxlegacy [class*=medium-100]{float:none;clear:both}html.no-flexbox .column-group,html.no-flexboxlegacy .column-group{*zoom:1}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-1.5em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=medium-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-1.5em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=medium-]{padding-left:1.5em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=medium-]{margin-bottom:1.5em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-3em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-3em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=medium-]{padding-left:3em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=medium-]{margin-bottom:3em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-.75em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-.75em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=medium-]{padding-left:.75em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.375em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.375em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}html.no-flexbox .column-group.medium-gutters,html.no-flexboxlegacy .column-group.medium-gutters{margin-left:-1.5em}html.no-flexbox .column-group.medium-gutters>[class*=all-],html.no-flexbox .column-group.medium-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}html.no-flexbox .column-group.medium-horizontal-gutters,html.no-flexboxlegacy .column-group.medium-horizontal-gutters{margin-left:-1.5em}html.no-flexbox .column-group.medium-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.medium-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-horizontal-gutters>[class*=medium-]{padding-left:1.5em}html.no-flexbox .column-group.medium-vertical-gutters>[class*=all-],html.no-flexbox .column-group.medium-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-vertical-gutters>[class*=medium-]{margin-bottom:1.5em}html.no-flexbox .column-group.medium-double-gutters,html.no-flexboxlegacy .column-group.medium-double-gutters{margin-left:-3em}html.no-flexbox .column-group.medium-double-gutters>[class*=all-],html.no-flexbox .column-group.medium-double-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}html.no-flexbox .column-group.medium-double-horizontal-gutters,html.no-flexboxlegacy .column-group.medium-double-horizontal-gutters{margin-left:-3em}html.no-flexbox .column-group.medium-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.medium-double-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-double-horizontal-gutters>[class*=medium-]{padding-left:3em}html.no-flexbox .column-group.medium-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.medium-double-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-double-vertical-gutters>[class*=medium-]{margin-bottom:3em}html.no-flexbox .column-group.medium-half-gutters,html.no-flexboxlegacy .column-group.medium-half-gutters{margin-left:-.75em}html.no-flexbox .column-group.medium-half-gutters>[class*=all-],html.no-flexbox .column-group.medium-half-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}html.no-flexbox .column-group.medium-half-horizontal-gutters,html.no-flexboxlegacy .column-group.medium-half-horizontal-gutters{margin-left:-.75em}html.no-flexbox .column-group.medium-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.medium-half-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-half-horizontal-gutters>[class*=medium-]{padding-left:.75em}html.no-flexbox .column-group.medium-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.medium-half-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}html.no-flexbox .column-group.medium-quarter-gutters,html.no-flexboxlegacy .column-group.medium-quarter-gutters{margin-left:-.375em}html.no-flexbox .column-group.medium-quarter-gutters>[class*=all-],html.no-flexbox .column-group.medium-quarter-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}html.no-flexbox .column-group.medium-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.medium-quarter-horizontal-gutters{margin-left:-.375em}html.no-flexbox .column-group.medium-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.medium-quarter-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}html.no-flexbox .column-group.medium-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.medium-quarter-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}html.no-flexbox .column-group.medium-no-gutters,html.no-flexboxlegacy .column-group.medium-no-gutters{margin-left:0}html.no-flexbox .column-group.medium-no-gutters>[class*=all-],html.no-flexbox .column-group.medium-no-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-no-gutters>[class*=medium-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=medium-],html.no-flexbox .ink-table td[class*=medium-],html.no-flexbox .ink-table tfoot[class*=medium-],html.no-flexbox .ink-table th[class*=medium-],html.no-flexbox .ink-table thead[class*=medium-],html.no-flexbox .ink-table tr[class*=medium-],html.no-flexboxlegacy .ink-table tbody[class*=medium-],html.no-flexboxlegacy .ink-table td[class*=medium-],html.no-flexboxlegacy .ink-table tfoot[class*=medium-],html.no-flexboxlegacy .ink-table th[class*=medium-],html.no-flexboxlegacy .ink-table thead[class*=medium-],html.no-flexboxlegacy .ink-table tr[class*=medium-]{float:none}html.no-flexbox .medium-push-left,html.no-flexboxlegacy .medium-push-left{float:left}html.no-flexbox .medium-push-center,html.no-flexboxlegacy .medium-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .medium-push-right,html.no-flexboxlegacy .medium-push-right{float:right}html.no-flexbox .medium-align-left,html.no-flexboxlegacy .medium-align-left{text-align:left}html.no-flexbox .medium-align-center,html.no-flexboxlegacy .medium-align-center{text-align:center}html.no-flexbox .medium-align-right,html.no-flexboxlegacy .medium-align-right{text-align:right}html.no-flexbox .medium-no-margin,html.no-flexboxlegacy .medium-no-margin{margin:0!important}html.no-flexbox .medium-space,html.no-flexbox .space,html.no-flexboxlegacy .medium-space,html.no-flexboxlegacy .space{margin:1.5em}html.no-flexbox .medium-padding,html.no-flexbox .padding,html.no-flexboxlegacy .medium-padding,html.no-flexboxlegacy .padding{padding:1.5em}html.no-flexbox .double-space,html.no-flexbox .medium-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .medium-double-space{margin:3em}html.no-flexbox .double-padding,html.no-flexbox .medium-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .medium-double-padding{padding:3em}html.no-flexbox .half-space,html.no-flexbox .medium-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .medium-half-space{margin:.75em}html.no-flexbox .half-padding,html.no-flexbox .medium-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .medium-half-padding{padding:.75em}html.no-flexbox .medium-quarter-space,html.no-flexbox .quarter-space,html.no-flexboxlegacy .medium-quarter-space,html.no-flexboxlegacy .quarter-space{margin:.375em}html.no-flexbox .medium-quarter-padding,html.no-flexbox .quarter-padding,html.no-flexboxlegacy .medium-quarter-padding,html.no-flexboxlegacy .quarter-padding{padding:.375em}html.no-flexbox .medium-vertical-space,html.no-flexbox .vertical-space,html.no-flexboxlegacy .medium-vertical-space,html.no-flexboxlegacy .vertical-space{margin-top:1.5em;margin-bottom:1.5em}html.no-flexbox .medium-vertical-padding,html.no-flexbox .vertical-padding,html.no-flexboxlegacy .medium-vertical-padding,html.no-flexboxlegacy .vertical-padding{padding-top:1.5em;padding-bottom:1.5em}html.no-flexbox .double-vertical-space,html.no-flexbox .medium-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .medium-double-vertical-space{margin-top:3em;margin-bottom:3em}html.no-flexbox .double-vertical-padding,html.no-flexbox .medium-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .medium-double-vertical-padding{padding-top:3em;padding-bottom:3em}html.no-flexbox .half-vertical-space,html.no-flexbox .medium-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .medium-half-vertical-space{margin-top:.75em;margin-bottom:.75em}html.no-flexbox .half-vertical-padding,html.no-flexbox .medium-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .medium-half-vertical-padding{padding-top:.75em;padding-bottom:.75em}html.no-flexbox .medium-quarter-vertical-space,html.no-flexbox .quarter-vertical-space,html.no-flexboxlegacy .medium-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space{margin-top:.375em;margin-bottom:.375em}html.no-flexbox .medium-quarter-vertical-padding,html.no-flexbox .quarter-vertical-padding,html.no-flexboxlegacy .medium-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding{padding-top:.375em;padding-bottom:.375em}html.no-flexbox .horizontal-space,html.no-flexbox .medium-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .medium-horizontal-space{margin-left:1.5em;margin-right:1.5em}html.no-flexbox .horizontal-padding,html.no-flexbox .medium-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .medium-horizontal-padding{padding-left:1.5em;padding-right:1.5em}html.no-flexbox .double-horizontal-space,html.no-flexbox .medium-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .medium-double-horizontal-space{margin-left:3em;margin-right:3em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .medium-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .medium-double-horizontal-padding{padding-left:3em;padding-right:3em}html.no-flexbox .half-horizontal-space,html.no-flexbox .medium-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .medium-half-horizontal-space{margin-left:.75em;margin-right:.75em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .medium-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .medium-half-horizontal-padding{padding-left:.75em;padding-right:.75em}html.no-flexbox .medium-quarter-horizontal-space,html.no-flexbox .quarter-horizontal-space,html.no-flexboxlegacy .medium-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space{margin-left:.375em;margin-right:.375em}html.no-flexbox .medium-quarter-horizontal-padding,html.no-flexbox .quarter-horizontal-padding,html.no-flexboxlegacy .medium-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding{padding-left:.375em;padding-right:.375em}html.no-flexbox .medium-top-space,html.no-flexbox .top-space,html.no-flexboxlegacy .medium-top-space,html.no-flexboxlegacy .top-space{margin-top:1.5em}html.no-flexbox .medium-top-padding,html.no-flexbox .top-padding,html.no-flexboxlegacy .medium-top-padding,html.no-flexboxlegacy .top-padding{padding-top:1.5em}html.no-flexbox .double-top-space,html.no-flexbox .medium-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .medium-double-top-space{margin-top:3em}html.no-flexbox .double-top-padding,html.no-flexbox .medium-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .medium-double-top-padding{padding-top:3em}html.no-flexbox .half-top-space,html.no-flexbox .medium-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .medium-half-top-space{margin-top:.75em}html.no-flexbox .half-top-padding,html.no-flexbox .medium-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .medium-half-top-padding{padding-top:.75em}html.no-flexbox .medium-quarter-top-space,html.no-flexbox .quarter-top-space,html.no-flexboxlegacy .medium-quarter-top-space,html.no-flexboxlegacy .quarter-top-space{margin-top:.375em}html.no-flexbox .medium-quarter-top-padding,html.no-flexbox .quarter-top-padding,html.no-flexboxlegacy .medium-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding{padding-top:.375em}html.no-flexbox .medium-right-space,html.no-flexbox .right-space,html.no-flexboxlegacy .medium-right-space,html.no-flexboxlegacy .right-space{margin-right:1.5em}html.no-flexbox .medium-right-padding,html.no-flexbox .right-padding,html.no-flexboxlegacy .medium-right-padding,html.no-flexboxlegacy .right-padding{padding-right:1.5em}html.no-flexbox .double-right-space,html.no-flexbox .medium-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .medium-double-right-space{margin-right:3em}html.no-flexbox .double-right-padding,html.no-flexbox .medium-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .medium-double-right-padding{padding-right:3em}html.no-flexbox .half-right-space,html.no-flexbox .medium-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .medium-half-right-space{margin-right:.75em}html.no-flexbox .half-right-padding,html.no-flexbox .medium-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .medium-half-right-padding{padding-right:.75em}html.no-flexbox .medium-quarter-right-space,html.no-flexbox .quarter-right-space,html.no-flexboxlegacy .medium-quarter-right-space,html.no-flexboxlegacy .quarter-right-space{margin-right:.375em}html.no-flexbox .medium-quarter-right-padding,html.no-flexbox .quarter-right-padding,html.no-flexboxlegacy .medium-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding{padding-right:.375em}html.no-flexbox .bottom-space,html.no-flexbox .medium-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .medium-bottom-space{margin-bottom:1.5em}html.no-flexbox .bottom-padding,html.no-flexbox .medium-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .medium-bottom-padding{padding-bottom:1.5em}html.no-flexbox .double-bottom-space,html.no-flexbox .medium-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .medium-double-bottom-space{margin-bottom:3em}html.no-flexbox .double-bottom-padding,html.no-flexbox .medium-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .medium-double-bottom-padding{padding-bottom:3em}html.no-flexbox .half-bottom-space,html.no-flexbox .medium-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .medium-half-bottom-space{margin-bottom:.75em}html.no-flexbox .half-bottom-padding,html.no-flexbox .medium-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .medium-half-bottom-padding{padding-bottom:.75em}html.no-flexbox .medium-quarter-bottom-space,html.no-flexbox .quarter-bottom-space,html.no-flexboxlegacy .medium-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space{margin-bottom:.375em}html.no-flexbox .medium-quarter-bottom-padding,html.no-flexbox .quarter-bottom-padding,html.no-flexboxlegacy .medium-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding{padding-bottom:.375em}html.no-flexbox .left-space,html.no-flexbox .medium-left-space,html.no-flexboxlegacy .left-space,html.no-flexboxlegacy .medium-left-space{margin-left:1.5em}html.no-flexbox .left-padding,html.no-flexbox .medium-left-padding,html.no-flexboxlegacy .left-padding,html.no-flexboxlegacy .medium-left-padding{padding-left:1.5em}html.no-flexbox .double-left-space,html.no-flexbox .medium-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .medium-double-left-space{margin-left:3em}html.no-flexbox .double-left-padding,html.no-flexbox .medium-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .medium-double-left-padding{padding-left:3em}html.no-flexbox .half-left-space,html.no-flexbox .medium-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .medium-half-left-space{margin-left:.75em}html.no-flexbox .half-left-padding,html.no-flexbox .medium-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .medium-half-left-padding{padding-left:.75em}html.no-flexbox .medium-quarter-left-space,html.no-flexbox .quarter-left-space,html.no-flexboxlegacy .medium-quarter-left-space,html.no-flexboxlegacy .quarter-left-space{margin-left:.375em}html.no-flexbox .medium-quarter-left-padding,html.no-flexbox .quarter-left-padding,html.no-flexboxlegacy .medium-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding{padding-left:.375em}html.no-flexbox .hide-medium,html.no-flexboxlegacy .hide-medium{display:none!important}html.no-flexbox .show-medium,html.no-flexboxlegacy .show-medium{display:inherit!important}html.no-flexbox table.show-medium,html.no-flexboxlegacy table.show-medium{display:table}html.no-flexbox thead.show-medium,html.no-flexboxlegacy thead.show-medium{display:table-header-group}html.no-flexbox tbody.show-medium,html.no-flexboxlegacy tbody.show-medium{display:table-row-group}html.no-flexbox tfoot.show-medium,html.no-flexboxlegacy tfoot.show-medium{display:table-footer-group}html.no-flexbox tr.show-medium,html.no-flexboxlegacy tr.show-medium{display:table-row}html.no-flexbox td.show-medium,html.no-flexbox th.show-medium,html.no-flexboxlegacy td.show-medium,html.no-flexboxlegacy th.show-medium{display:table-cell}}@media screen and (min-width:321px) and (max-width:640px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 1.25em}html.no-flexbox .column-group>[class*=small-],html.no-flexboxlegacy .column-group>[class*=small-]{float:left;clear:none}html.no-flexbox .small-5,html.no-flexboxlegacy .small-5{width:5%}html.no-flexbox .small-10,html.no-flexboxlegacy .small-10{width:10%}html.no-flexbox .small-15,html.no-flexboxlegacy .small-15{width:15%}html.no-flexbox .small-16,html.no-flexboxlegacy .small-16{width:16.66%}html.no-flexbox .small-20,html.no-flexboxlegacy .small-20{width:20%}html.no-flexbox .small-25,html.no-flexboxlegacy .small-25{width:25%}html.no-flexbox .small-30,html.no-flexboxlegacy .small-30{width:30%}html.no-flexbox .small-33,html.no-flexboxlegacy .small-33{width:33.33%}html.no-flexbox .small-35,html.no-flexboxlegacy .small-35{width:35%}html.no-flexbox .small-40,html.no-flexboxlegacy .small-40{width:40%}html.no-flexbox .small-45,html.no-flexboxlegacy .small-45{width:45%}html.no-flexbox .small-50,html.no-flexboxlegacy .small-50{width:50%}html.no-flexbox .small-55,html.no-flexboxlegacy .small-55{width:55%}html.no-flexbox .small-60,html.no-flexboxlegacy .small-60{width:60%}html.no-flexbox .small-65,html.no-flexboxlegacy .small-65{width:65%}html.no-flexbox .small-66,html.no-flexboxlegacy .small-66{width:66.66%}html.no-flexbox .small-70,html.no-flexboxlegacy .small-70{width:70%}html.no-flexbox .small-75,html.no-flexboxlegacy .small-75{width:75%}html.no-flexbox .small-80,html.no-flexboxlegacy .small-80{width:80%}html.no-flexbox .small-85,html.no-flexboxlegacy .small-85{width:85%}html.no-flexbox .small-90,html.no-flexboxlegacy .small-90{width:90%}html.no-flexbox .small-95,html.no-flexboxlegacy .small-95{width:95%}html.no-flexbox .small-100,html.no-flexboxlegacy .small-100{width:100%}html.no-flexbox [class*=small-100],html.no-flexboxlegacy [class*=small-100]{float:none;clear:both}html.no-flexbox .column-group,html.no-flexboxlegacy .column-group{*zoom:1}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-1.25em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=small-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-1.25em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=small-]{padding-left:1.25em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=small-]{margin-bottom:1.25em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-2.5em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=small-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-2.5em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=small-]{padding-left:2.5em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-.625em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=small-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-.625em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=small-]{padding-left:.625em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=small-]{margin-bottom:.625em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.3125em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=small-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.3125em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}html.no-flexbox .column-group.small-gutters,html.no-flexboxlegacy .column-group.small-gutters{margin-left:-1.25em}html.no-flexbox .column-group.small-gutters>[class*=all-],html.no-flexbox .column-group.small-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}html.no-flexbox .column-group.small-horizontal-gutters,html.no-flexboxlegacy .column-group.small-horizontal-gutters{margin-left:-1.25em}html.no-flexbox .column-group.small-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.small-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-horizontal-gutters>[class*=small-]{padding-left:1.25em}html.no-flexbox .column-group.small-vertical-gutters>[class*=all-],html.no-flexbox .column-group.small-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-vertical-gutters>[class*=small-]{margin-bottom:1.25em}html.no-flexbox .column-group.small-double-gutters,html.no-flexboxlegacy .column-group.small-double-gutters{margin-left:-2.5em}html.no-flexbox .column-group.small-double-gutters>[class*=all-],html.no-flexbox .column-group.small-double-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}html.no-flexbox .column-group.small-double-horizontal-gutters,html.no-flexboxlegacy .column-group.small-double-horizontal-gutters{margin-left:-2.5em}html.no-flexbox .column-group.small-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.small-double-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-double-horizontal-gutters>[class*=small-]{padding-left:2.5em}html.no-flexbox .column-group.small-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.small-double-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}html.no-flexbox .column-group.small-half-gutters,html.no-flexboxlegacy .column-group.small-half-gutters{margin-left:-.625em}html.no-flexbox .column-group.small-half-gutters>[class*=all-],html.no-flexbox .column-group.small-half-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}html.no-flexbox .column-group.small-half-horizontal-gutters,html.no-flexboxlegacy .column-group.small-half-horizontal-gutters{margin-left:-.625em}html.no-flexbox .column-group.small-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.small-half-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-half-horizontal-gutters>[class*=small-]{padding-left:.625em}html.no-flexbox .column-group.small-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.small-half-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-half-vertical-gutters>[class*=small-]{margin-bottom:.625em}html.no-flexbox .column-group.small-quarter-gutters,html.no-flexboxlegacy .column-group.small-quarter-gutters{margin-left:-.3125em}html.no-flexbox .column-group.small-quarter-gutters>[class*=all-],html.no-flexbox .column-group.small-quarter-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}html.no-flexbox .column-group.small-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.small-quarter-horizontal-gutters{margin-left:-.3125em}html.no-flexbox .column-group.small-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.small-quarter-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}html.no-flexbox .column-group.small-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.small-quarter-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}html.no-flexbox .column-group.small-no-gutters,html.no-flexboxlegacy .column-group.small-no-gutters{margin-left:0}html.no-flexbox .column-group.small-no-gutters>[class*=all-],html.no-flexbox .column-group.small-no-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-no-gutters>[class*=small-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=small-],html.no-flexbox .ink-table td[class*=small-],html.no-flexbox .ink-table tfoot[class*=small-],html.no-flexbox .ink-table th[class*=small-],html.no-flexbox .ink-table thead[class*=small-],html.no-flexbox .ink-table tr[class*=small-],html.no-flexboxlegacy .ink-table tbody[class*=small-],html.no-flexboxlegacy .ink-table td[class*=small-],html.no-flexboxlegacy .ink-table tfoot[class*=small-],html.no-flexboxlegacy .ink-table th[class*=small-],html.no-flexboxlegacy .ink-table thead[class*=small-],html.no-flexboxlegacy .ink-table tr[class*=small-]{float:none}html.no-flexbox .small-push-left,html.no-flexboxlegacy .small-push-left{float:left}html.no-flexbox .small-push-center,html.no-flexboxlegacy .small-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .small-push-right,html.no-flexboxlegacy .small-push-right{float:right}html.no-flexbox .small-align-left,html.no-flexboxlegacy .small-align-left{text-align:left}html.no-flexbox .small-align-center,html.no-flexboxlegacy .small-align-center{text-align:center}html.no-flexbox .small-align-right,html.no-flexboxlegacy .small-align-right{text-align:right}html.no-flexbox .small-no-margin,html.no-flexboxlegacy .small-no-margin{margin:0!important}html.no-flexbox .small-space,html.no-flexbox .space,html.no-flexboxlegacy .small-space,html.no-flexboxlegacy .space{margin:1.25em}html.no-flexbox .padding,html.no-flexbox .small-padding,html.no-flexboxlegacy .padding,html.no-flexboxlegacy .small-padding{padding:1.25em}html.no-flexbox .double-space,html.no-flexbox .small-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .small-double-space{margin:2.5em}html.no-flexbox .double-padding,html.no-flexbox .small-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .small-double-padding{padding:2.5em}html.no-flexbox .half-space,html.no-flexbox .small-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .small-half-space{margin:.625em}html.no-flexbox .half-padding,html.no-flexbox .small-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .small-half-padding{padding:.625em}html.no-flexbox .quarter-space,html.no-flexbox .small-quarter-space,html.no-flexboxlegacy .quarter-space,html.no-flexboxlegacy .small-quarter-space{margin:.3125em}html.no-flexbox .quarter-padding,html.no-flexbox .small-quarter-padding,html.no-flexboxlegacy .quarter-padding,html.no-flexboxlegacy .small-quarter-padding{padding:.3125em}html.no-flexbox .small-vertical-space,html.no-flexbox .vertical-space,html.no-flexboxlegacy .small-vertical-space,html.no-flexboxlegacy .vertical-space{margin-top:1.25em;margin-bottom:1.25em}html.no-flexbox .small-vertical-padding,html.no-flexbox .vertical-padding,html.no-flexboxlegacy .small-vertical-padding,html.no-flexboxlegacy .vertical-padding{padding-top:1.25em;padding-bottom:1.25em}html.no-flexbox .double-vertical-space,html.no-flexbox .small-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .small-double-vertical-space{margin-top:2.5em;margin-bottom:2.5em}html.no-flexbox .double-vertical-padding,html.no-flexbox .small-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .small-double-vertical-padding{padding-top:2.5em;padding-bottom:2.5em}html.no-flexbox .half-vertical-space,html.no-flexbox .small-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .small-half-vertical-space{margin-top:.625em;margin-bottom:.625em}html.no-flexbox .half-vertical-padding,html.no-flexbox .small-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .small-half-vertical-padding{padding-top:.625em;padding-bottom:.625em}html.no-flexbox .quarter-vertical-space,html.no-flexbox .small-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space,html.no-flexboxlegacy .small-quarter-vertical-space{margin-top:.3125em;margin-bottom:.3125em}html.no-flexbox .quarter-vertical-padding,html.no-flexbox .small-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding,html.no-flexboxlegacy .small-quarter-vertical-padding{padding-top:.3125em;padding-bottom:.3125em}html.no-flexbox .horizontal-space,html.no-flexbox .small-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .small-horizontal-space{margin-left:1.25em;margin-right:1.25em}html.no-flexbox .horizontal-padding,html.no-flexbox .small-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .small-horizontal-padding{padding-left:1.25em;padding-right:1.25em}html.no-flexbox .double-horizontal-space,html.no-flexbox .small-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .small-double-horizontal-space{margin-left:2.5em;margin-right:2.5em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .small-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .small-double-horizontal-padding{padding-left:2.5em;padding-right:2.5em}html.no-flexbox .half-horizontal-space,html.no-flexbox .small-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .small-half-horizontal-space{margin-left:.625em;margin-right:.625em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .small-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .small-half-horizontal-padding{padding-left:.625em;padding-right:.625em}html.no-flexbox .quarter-horizontal-space,html.no-flexbox .small-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space,html.no-flexboxlegacy .small-quarter-horizontal-space{margin-left:.3125em;margin-right:.3125em}html.no-flexbox .quarter-horizontal-padding,html.no-flexbox .small-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding,html.no-flexboxlegacy .small-quarter-horizontal-padding{padding-left:.3125em;padding-right:.3125em}html.no-flexbox .small-top-space,html.no-flexbox .top-space,html.no-flexboxlegacy .small-top-space,html.no-flexboxlegacy .top-space{margin-top:1.25em}html.no-flexbox .small-top-padding,html.no-flexbox .top-padding,html.no-flexboxlegacy .small-top-padding,html.no-flexboxlegacy .top-padding{padding-top:1.25em}html.no-flexbox .double-top-space,html.no-flexbox .small-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .small-double-top-space{margin-top:2.5em}html.no-flexbox .double-top-padding,html.no-flexbox .small-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .small-double-top-padding{padding-top:2.5em}html.no-flexbox .half-top-space,html.no-flexbox .small-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .small-half-top-space{margin-top:.625em}html.no-flexbox .half-top-padding,html.no-flexbox .small-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .small-half-top-padding{padding-top:.625em}html.no-flexbox .quarter-top-space,html.no-flexbox .small-quarter-top-space,html.no-flexboxlegacy .quarter-top-space,html.no-flexboxlegacy .small-quarter-top-space{margin-top:.3125em}html.no-flexbox .quarter-top-padding,html.no-flexbox .small-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding,html.no-flexboxlegacy .small-quarter-top-padding{padding-top:.3125em}html.no-flexbox .right-space,html.no-flexbox .small-right-space,html.no-flexboxlegacy .right-space,html.no-flexboxlegacy .small-right-space{margin-right:1.25em}html.no-flexbox .right-padding,html.no-flexbox .small-right-padding,html.no-flexboxlegacy .right-padding,html.no-flexboxlegacy .small-right-padding{padding-right:1.25em}html.no-flexbox .double-right-space,html.no-flexbox .small-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .small-double-right-space{margin-right:2.5em}html.no-flexbox .double-right-padding,html.no-flexbox .small-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .small-double-right-padding{padding-right:2.5em}html.no-flexbox .half-right-space,html.no-flexbox .small-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .small-half-right-space{margin-right:.625em}html.no-flexbox .half-right-padding,html.no-flexbox .small-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .small-half-right-padding{padding-right:.625em}html.no-flexbox .quarter-right-space,html.no-flexbox .small-quarter-right-space,html.no-flexboxlegacy .quarter-right-space,html.no-flexboxlegacy .small-quarter-right-space{margin-right:.3125em}html.no-flexbox .quarter-right-padding,html.no-flexbox .small-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding,html.no-flexboxlegacy .small-quarter-right-padding{padding-right:.3125em}html.no-flexbox .bottom-space,html.no-flexbox .small-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .small-bottom-space{margin-bottom:1.25em}html.no-flexbox .bottom-padding,html.no-flexbox .small-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .small-bottom-padding{padding-bottom:1.25em}html.no-flexbox .double-bottom-space,html.no-flexbox .small-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .small-double-bottom-space{margin-bottom:2.5em}html.no-flexbox .double-bottom-padding,html.no-flexbox .small-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .small-double-bottom-padding{padding-bottom:2.5em}html.no-flexbox .half-bottom-space,html.no-flexbox .small-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .small-half-bottom-space{margin-bottom:.625em}html.no-flexbox .half-bottom-padding,html.no-flexbox .small-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .small-half-bottom-padding{padding-bottom:.625em}html.no-flexbox .quarter-bottom-space,html.no-flexbox .small-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space,html.no-flexboxlegacy .small-quarter-bottom-space{margin-bottom:.3125em}html.no-flexbox .quarter-bottom-padding,html.no-flexbox .small-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding,html.no-flexboxlegacy .small-quarter-bottom-padding{padding-bottom:.3125em}html.no-flexbox .left-space,html.no-flexbox .small-left-space,html.no-flexboxlegacy .left-space,html.no-flexboxlegacy .small-left-space{margin-left:1.25em}html.no-flexbox .left-padding,html.no-flexbox .small-left-padding,html.no-flexboxlegacy .left-padding,html.no-flexboxlegacy .small-left-padding{padding-left:1.25em}html.no-flexbox .double-left-space,html.no-flexbox .small-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .small-double-left-space{margin-left:2.5em}html.no-flexbox .double-left-padding,html.no-flexbox .small-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .small-double-left-padding{padding-left:2.5em}html.no-flexbox .half-left-space,html.no-flexbox .small-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .small-half-left-space{margin-left:.625em}html.no-flexbox .half-left-padding,html.no-flexbox .small-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .small-half-left-padding{padding-left:.625em}html.no-flexbox .quarter-left-space,html.no-flexbox .small-quarter-left-space,html.no-flexboxlegacy .quarter-left-space,html.no-flexboxlegacy .small-quarter-left-space{margin-left:.3125em}html.no-flexbox .quarter-left-padding,html.no-flexbox .small-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding,html.no-flexboxlegacy .small-quarter-left-padding{padding-left:.3125em}html.no-flexbox .hide-small,html.no-flexboxlegacy .hide-small{display:none!important}html.no-flexbox .show-small,html.no-flexboxlegacy .show-small{display:inherit!important}html.no-flexbox table.show-small,html.no-flexboxlegacy table.show-small{display:table}html.no-flexbox thead.show-small,html.no-flexboxlegacy thead.show-small{display:table-header-group}html.no-flexbox tbody.show-small,html.no-flexboxlegacy tbody.show-small{display:table-row-group}html.no-flexbox tfoot.show-small,html.no-flexboxlegacy tfoot.show-small{display:table-footer-group}html.no-flexbox tr.show-small,html.no-flexboxlegacy tr.show-small{display:table-row}html.no-flexbox td.show-small,html.no-flexbox th.show-small,html.no-flexboxlegacy td.show-small,html.no-flexboxlegacy th.show-small{display:table-cell}}@media screen and (max-width:320px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 1em}html.no-flexbox .column-group>[class*=tiny-],html.no-flexboxlegacy .column-group>[class*=tiny-]{float:left;clear:none}html.no-flexbox .tiny-5,html.no-flexboxlegacy .tiny-5{width:5%}html.no-flexbox .tiny-10,html.no-flexboxlegacy .tiny-10{width:10%}html.no-flexbox .tiny-15,html.no-flexboxlegacy .tiny-15{width:15%}html.no-flexbox .tiny-16,html.no-flexboxlegacy .tiny-16{width:16.66%}html.no-flexbox .tiny-20,html.no-flexboxlegacy .tiny-20{width:20%}html.no-flexbox .tiny-25,html.no-flexboxlegacy .tiny-25{width:25%}html.no-flexbox .tiny-30,html.no-flexboxlegacy .tiny-30{width:30%}html.no-flexbox .tiny-33,html.no-flexboxlegacy .tiny-33{width:33.33%}html.no-flexbox .tiny-35,html.no-flexboxlegacy .tiny-35{width:35%}html.no-flexbox .tiny-40,html.no-flexboxlegacy .tiny-40{width:40%}html.no-flexbox .tiny-45,html.no-flexboxlegacy .tiny-45{width:45%}html.no-flexbox .tiny-50,html.no-flexboxlegacy .tiny-50{width:50%}html.no-flexbox .tiny-55,html.no-flexboxlegacy .tiny-55{width:55%}html.no-flexbox .tiny-60,html.no-flexboxlegacy .tiny-60{width:60%}html.no-flexbox .tiny-65,html.no-flexboxlegacy .tiny-65{width:65%}html.no-flexbox .tiny-66,html.no-flexboxlegacy .tiny-66{width:66.66%}html.no-flexbox .tiny-70,html.no-flexboxlegacy .tiny-70{width:70%}html.no-flexbox .tiny-75,html.no-flexboxlegacy .tiny-75{width:75%}html.no-flexbox .tiny-80,html.no-flexboxlegacy .tiny-80{width:80%}html.no-flexbox .tiny-85,html.no-flexboxlegacy .tiny-85{width:85%}html.no-flexbox .tiny-90,html.no-flexboxlegacy .tiny-90{width:90%}html.no-flexbox .tiny-95,html.no-flexboxlegacy .tiny-95{width:95%}html.no-flexbox .tiny-100,html.no-flexboxlegacy .tiny-100{width:100%}html.no-flexbox [class*=tiny-100],html.no-flexboxlegacy [class*=tiny-100]{float:none;clear:both}html.no-flexbox .column-group,html.no-flexboxlegacy .column-group{*zoom:1}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-1em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-1em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=tiny-]{padding-left:1em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=tiny-]{margin-bottom:1em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-2em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-2em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=tiny-]{padding-left:2em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-.5em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-.5em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.25em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.25em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}html.no-flexbox .column-group.tiny-gutters,html.no-flexboxlegacy .column-group.tiny-gutters{margin-left:-1em}html.no-flexbox .column-group.tiny-gutters>[class*=all-],html.no-flexbox .column-group.tiny-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}html.no-flexbox .column-group.tiny-horizontal-gutters,html.no-flexboxlegacy .column-group.tiny-horizontal-gutters{margin-left:-1em}html.no-flexbox .column-group.tiny-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.tiny-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-horizontal-gutters>[class*=tiny-]{padding-left:1em}html.no-flexbox .column-group.tiny-vertical-gutters>[class*=all-],html.no-flexbox .column-group.tiny-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-vertical-gutters>[class*=tiny-]{margin-bottom:1em}html.no-flexbox .column-group.tiny-double-gutters,html.no-flexboxlegacy .column-group.tiny-double-gutters{margin-left:-2em}html.no-flexbox .column-group.tiny-double-gutters>[class*=all-],html.no-flexbox .column-group.tiny-double-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}html.no-flexbox .column-group.tiny-double-horizontal-gutters,html.no-flexboxlegacy .column-group.tiny-double-horizontal-gutters{margin-left:-2em}html.no-flexbox .column-group.tiny-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.tiny-double-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-double-horizontal-gutters>[class*=tiny-]{padding-left:2em}html.no-flexbox .column-group.tiny-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.tiny-double-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}html.no-flexbox .column-group.tiny-half-gutters,html.no-flexboxlegacy .column-group.tiny-half-gutters{margin-left:-.5em}html.no-flexbox .column-group.tiny-half-gutters>[class*=all-],html.no-flexbox .column-group.tiny-half-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}html.no-flexbox .column-group.tiny-half-horizontal-gutters,html.no-flexboxlegacy .column-group.tiny-half-horizontal-gutters{margin-left:-.5em}html.no-flexbox .column-group.tiny-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.tiny-half-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}html.no-flexbox .column-group.tiny-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.tiny-half-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}html.no-flexbox .column-group.tiny-quarter-gutters,html.no-flexboxlegacy .column-group.tiny-quarter-gutters{margin-left:-.25em}html.no-flexbox .column-group.tiny-quarter-gutters>[class*=all-],html.no-flexbox .column-group.tiny-quarter-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}html.no-flexbox .column-group.tiny-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.tiny-quarter-horizontal-gutters{margin-left:-.25em}html.no-flexbox .column-group.tiny-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.tiny-quarter-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}html.no-flexbox .column-group.tiny-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.tiny-quarter-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}html.no-flexbox .column-group.tiny-no-gutters,html.no-flexboxlegacy .column-group.tiny-no-gutters{margin-left:0}html.no-flexbox .column-group.tiny-no-gutters>[class*=all-],html.no-flexbox .column-group.tiny-no-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-no-gutters>[class*=tiny-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=tiny-],html.no-flexbox .ink-table td[class*=tiny-],html.no-flexbox .ink-table tfoot[class*=tiny-],html.no-flexbox .ink-table th[class*=tiny-],html.no-flexbox .ink-table thead[class*=tiny-],html.no-flexbox .ink-table tr[class*=tiny-],html.no-flexboxlegacy .ink-table tbody[class*=tiny-],html.no-flexboxlegacy .ink-table td[class*=tiny-],html.no-flexboxlegacy .ink-table tfoot[class*=tiny-],html.no-flexboxlegacy .ink-table th[class*=tiny-],html.no-flexboxlegacy .ink-table thead[class*=tiny-],html.no-flexboxlegacy .ink-table tr[class*=tiny-]{float:none}html.no-flexbox .tiny-push-left,html.no-flexboxlegacy .tiny-push-left{float:left}html.no-flexbox .tiny-push-center,html.no-flexboxlegacy .tiny-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .tiny-push-right,html.no-flexboxlegacy .tiny-push-right{float:right}html.no-flexbox .tiny-align-left,html.no-flexboxlegacy .tiny-align-left{text-align:left}html.no-flexbox .tiny-align-center,html.no-flexboxlegacy .tiny-align-center{text-align:center}html.no-flexbox .tiny-align-right,html.no-flexboxlegacy .tiny-align-right{text-align:right}html.no-flexbox .tiny-no-margin,html.no-flexboxlegacy .tiny-no-margin{margin:0!important}html.no-flexbox .space,html.no-flexbox .tiny-space,html.no-flexboxlegacy .space,html.no-flexboxlegacy .tiny-space{margin:1em}html.no-flexbox .padding,html.no-flexbox .tiny-padding,html.no-flexboxlegacy .padding,html.no-flexboxlegacy .tiny-padding{padding:1em}html.no-flexbox .double-space,html.no-flexbox .tiny-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .tiny-double-space{margin:2em}html.no-flexbox .double-padding,html.no-flexbox .tiny-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .tiny-double-padding{padding:2em}html.no-flexbox .half-space,html.no-flexbox .tiny-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .tiny-half-space{margin:.5em}html.no-flexbox .half-padding,html.no-flexbox .tiny-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .tiny-half-padding{padding:.5em}html.no-flexbox .quarter-space,html.no-flexbox .tiny-quarter-space,html.no-flexboxlegacy .quarter-space,html.no-flexboxlegacy .tiny-quarter-space{margin:.25em}html.no-flexbox .quarter-padding,html.no-flexbox .tiny-quarter-padding,html.no-flexboxlegacy .quarter-padding,html.no-flexboxlegacy .tiny-quarter-padding{padding:.25em}html.no-flexbox .tiny-vertical-space,html.no-flexbox .vertical-space,html.no-flexboxlegacy .tiny-vertical-space,html.no-flexboxlegacy .vertical-space{margin-top:1em;margin-bottom:1em}html.no-flexbox .tiny-vertical-padding,html.no-flexbox .vertical-padding,html.no-flexboxlegacy .tiny-vertical-padding,html.no-flexboxlegacy .vertical-padding{padding-top:1em;padding-bottom:1em}html.no-flexbox .double-vertical-space,html.no-flexbox .tiny-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .tiny-double-vertical-space{margin-top:2em;margin-bottom:2em}html.no-flexbox .double-vertical-padding,html.no-flexbox .tiny-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .tiny-double-vertical-padding{padding-top:2em;padding-bottom:2em}html.no-flexbox .half-vertical-space,html.no-flexbox .tiny-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .tiny-half-vertical-space{margin-top:.5em;margin-bottom:.5em}html.no-flexbox .half-vertical-padding,html.no-flexbox .tiny-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .tiny-half-vertical-padding{padding-top:.5em;padding-bottom:.5em}html.no-flexbox .quarter-vertical-space,html.no-flexbox .tiny-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space,html.no-flexboxlegacy .tiny-quarter-vertical-space{margin-top:.25em;margin-bottom:.25em}html.no-flexbox .quarter-vertical-padding,html.no-flexbox .tiny-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding,html.no-flexboxlegacy .tiny-quarter-vertical-padding{padding-top:.25em;padding-bottom:.25em}html.no-flexbox .horizontal-space,html.no-flexbox .tiny-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .tiny-horizontal-space{margin-left:1em;margin-right:1em}html.no-flexbox .horizontal-padding,html.no-flexbox .tiny-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .tiny-horizontal-padding{padding-left:1em;padding-right:1em}html.no-flexbox .double-horizontal-space,html.no-flexbox .tiny-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .tiny-double-horizontal-space{margin-left:2em;margin-right:2em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .tiny-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .tiny-double-horizontal-padding{padding-left:2em;padding-right:2em}html.no-flexbox .half-horizontal-space,html.no-flexbox .tiny-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .tiny-half-horizontal-space{margin-left:.5em;margin-right:.5em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .tiny-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .tiny-half-horizontal-padding{padding-left:.5em;padding-right:.5em}html.no-flexbox .quarter-horizontal-space,html.no-flexbox .tiny-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space,html.no-flexboxlegacy .tiny-quarter-horizontal-space{margin-left:.25em;margin-right:.25em}html.no-flexbox .quarter-horizontal-padding,html.no-flexbox .tiny-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding,html.no-flexboxlegacy .tiny-quarter-horizontal-padding{padding-left:.25em;padding-right:.25em}html.no-flexbox .tiny-top-space,html.no-flexbox .top-space,html.no-flexboxlegacy .tiny-top-space,html.no-flexboxlegacy .top-space{margin-top:1em}html.no-flexbox .tiny-top-padding,html.no-flexbox .top-padding,html.no-flexboxlegacy .tiny-top-padding,html.no-flexboxlegacy .top-padding{padding-top:1em}html.no-flexbox .double-top-space,html.no-flexbox .tiny-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .tiny-double-top-space{margin-top:2em}html.no-flexbox .double-top-padding,html.no-flexbox .tiny-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .tiny-double-top-padding{padding-top:2em}html.no-flexbox .half-top-space,html.no-flexbox .tiny-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .tiny-half-top-space{margin-top:.5em}html.no-flexbox .half-top-padding,html.no-flexbox .tiny-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .tiny-half-top-padding{padding-top:.5em}html.no-flexbox .quarter-top-space,html.no-flexbox .tiny-quarter-top-space,html.no-flexboxlegacy .quarter-top-space,html.no-flexboxlegacy .tiny-quarter-top-space{margin-top:.25em}html.no-flexbox .quarter-top-padding,html.no-flexbox .tiny-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding,html.no-flexboxlegacy .tiny-quarter-top-padding{padding-top:.25em}html.no-flexbox .right-space,html.no-flexbox .tiny-right-space,html.no-flexboxlegacy .right-space,html.no-flexboxlegacy .tiny-right-space{margin-right:1em}html.no-flexbox .right-padding,html.no-flexbox .tiny-right-padding,html.no-flexboxlegacy .right-padding,html.no-flexboxlegacy .tiny-right-padding{padding-right:1em}html.no-flexbox .double-right-space,html.no-flexbox .tiny-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .tiny-double-right-space{margin-right:2em}html.no-flexbox .double-right-padding,html.no-flexbox .tiny-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .tiny-double-right-padding{padding-right:2em}html.no-flexbox .half-right-space,html.no-flexbox .tiny-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .tiny-half-right-space{margin-right:.5em}html.no-flexbox .half-right-padding,html.no-flexbox .tiny-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .tiny-half-right-padding{padding-right:.5em}html.no-flexbox .quarter-right-space,html.no-flexbox .tiny-quarter-right-space,html.no-flexboxlegacy .quarter-right-space,html.no-flexboxlegacy .tiny-quarter-right-space{margin-right:.25em}html.no-flexbox .quarter-right-padding,html.no-flexbox .tiny-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding,html.no-flexboxlegacy .tiny-quarter-right-padding{padding-right:.25em}html.no-flexbox .bottom-space,html.no-flexbox .tiny-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .tiny-bottom-space{margin-bottom:1em}html.no-flexbox .bottom-padding,html.no-flexbox .tiny-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .tiny-bottom-padding{padding-bottom:1em}html.no-flexbox .double-bottom-space,html.no-flexbox .tiny-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .tiny-double-bottom-space{margin-bottom:2em}html.no-flexbox .double-bottom-padding,html.no-flexbox .tiny-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .tiny-double-bottom-padding{padding-bottom:2em}html.no-flexbox .half-bottom-space,html.no-flexbox .tiny-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .tiny-half-bottom-space{margin-bottom:.5em}html.no-flexbox .half-bottom-padding,html.no-flexbox .tiny-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .tiny-half-bottom-padding{padding-bottom:.5em}html.no-flexbox .quarter-bottom-space,html.no-flexbox .tiny-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space,html.no-flexboxlegacy .tiny-quarter-bottom-space{margin-bottom:.25em}html.no-flexbox .quarter-bottom-padding,html.no-flexbox .tiny-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding,html.no-flexboxlegacy .tiny-quarter-bottom-padding{padding-bottom:.25em}html.no-flexbox .left-space,html.no-flexbox .tiny-left-space,html.no-flexboxlegacy .left-space,html.no-flexboxlegacy .tiny-left-space{margin-left:1em}html.no-flexbox .left-padding,html.no-flexbox .tiny-left-padding,html.no-flexboxlegacy .left-padding,html.no-flexboxlegacy .tiny-left-padding{padding-left:1em}html.no-flexbox .double-left-space,html.no-flexbox .tiny-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .tiny-double-left-space{margin-left:2em}html.no-flexbox .double-left-padding,html.no-flexbox .tiny-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .tiny-double-left-padding{padding-left:2em}html.no-flexbox .half-left-space,html.no-flexbox .tiny-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .tiny-half-left-space{margin-left:.5em}html.no-flexbox .half-left-padding,html.no-flexbox .tiny-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .tiny-half-left-padding{padding-left:.5em}html.no-flexbox .quarter-left-space,html.no-flexbox .tiny-quarter-left-space,html.no-flexboxlegacy .quarter-left-space,html.no-flexboxlegacy .tiny-quarter-left-space{margin-left:.25em}html.no-flexbox .quarter-left-padding,html.no-flexbox .tiny-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding,html.no-flexboxlegacy .tiny-quarter-left-padding{padding-left:.25em}html.no-flexbox .hide-tiny,html.no-flexboxlegacy .hide-tiny{display:none!important}html.no-flexbox .show-tiny,html.no-flexboxlegacy .show-tiny{display:inherit!important}html.no-flexbox table.show-tiny,html.no-flexboxlegacy table.show-tiny{display:table}html.no-flexbox thead.show-tiny,html.no-flexboxlegacy thead.show-tiny{display:table-header-group}html.no-flexbox tbody.show-tiny,html.no-flexboxlegacy tbody.show-tiny{display:table-row-group}html.no-flexbox tfoot.show-tiny,html.no-flexboxlegacy tfoot.show-tiny{display:table-footer-group}html.no-flexbox tr.show-tiny,html.no-flexboxlegacy tr.show-tiny{display:table-row}html.no-flexbox td.show-tiny,html.no-flexbox th.show-tiny,html.no-flexboxlegacy td.show-tiny,html.no-flexboxlegacy th.show-tiny{display:table-cell}}html.no-flexbox:after,html.no-flexboxlegacy:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}html.no-flexbox .ink-carousel,html.no-flexboxlegacy .ink-carousel{width:100%;position:relative;overflow:hidden;display:block}html.no-flexbox .ink-carousel .stage,html.no-flexboxlegacy .ink-carousel .stage{width:100%;left:0;height:auto!important;margin-top:0;margin-bottom:0;padding-left:0;list-style-type:none;white-space:nowrap;position:relative;-webkit-transition:left .5s ease;-moz-transition:left .5s ease;-o-transition:left .5s ease;transition:left .5s ease}html.no-flexbox .ink-carousel .stage .slide,html.no-flexboxlegacy .ink-carousel .stage .slide{position:relative;display:inline-block;vertical-align:top;white-space:normal;margin:0;float:none;zoom:1;*display:inline}html.no-flexbox .ink-carousel .ink-navigation,html.no-flexboxlegacy .ink-carousel .ink-navigation{position:static}@media print{*{background:transparent!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.ink-navigation{display:none}.ink-table{border-collapse:collapse}.ink-label{border:1px solid #000}} \ No newline at end of file +.show-all{display:inherit}.hide-all{display:none!important}.no-margin{margin:0!important}.no-margin-top{margin-top:0!important}.no-margin-bottom{margin-bottom:0!important}.no-padding{padding:0!important}.push-left{float:left}.push-center{float:none!important;margin-left:auto;margin-right:auto}.push-right{float:right;-webkit-justify-content:flex-end;-moz-justify-content:flex-end;justify-content:flex-end}.align-left{text-align:left}.align-center{text-align:center}.align-right{text-align:right}.clearfix{overflow:hidden}.clearfix:after{content:"";display:table;clear:both}html.no-flexbox,html.no-flexboxlegacy{font-size:1em}html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{width:auto;max-width:1440px;margin:0 auto}html.no-flexbox .all-5,html.no-flexboxlegacy .all-5{width:5%;float:left;clear:none}html.no-flexbox .all-10,html.no-flexboxlegacy .all-10{width:10%;float:left;clear:none}html.no-flexbox .all-15,html.no-flexboxlegacy .all-15{width:15%;float:left;clear:none}html.no-flexbox .all-16,html.no-flexboxlegacy .all-16{width:16.66%;float:left;clear:none}html.no-flexbox .all-20,html.no-flexboxlegacy .all-20{width:20%;float:left;clear:none}html.no-flexbox .all-25,html.no-flexboxlegacy .all-25{width:25%;float:left;clear:none}html.no-flexbox .all-30,html.no-flexboxlegacy .all-30{width:30%;float:left;clear:none}html.no-flexbox .all-33,html.no-flexboxlegacy .all-33{width:33.33%;float:left;clear:none}html.no-flexbox .all-35,html.no-flexboxlegacy .all-35{width:35%;float:left;clear:none}html.no-flexbox .all-40,html.no-flexboxlegacy .all-40{width:40%;float:left;clear:none}html.no-flexbox .all-45,html.no-flexboxlegacy .all-45{width:45%;float:left;clear:none}html.no-flexbox .all-50,html.no-flexboxlegacy .all-50{width:50%;float:left;clear:none}html.no-flexbox .all-55,html.no-flexboxlegacy .all-55{width:55%;float:left;clear:none}html.no-flexbox .all-60,html.no-flexboxlegacy .all-60{width:60%;float:left;clear:none}html.no-flexbox .all-65,html.no-flexboxlegacy .all-65{width:65%;float:left;clear:none}html.no-flexbox .all-66,html.no-flexboxlegacy .all-66{width:66.66%;float:left;clear:none}html.no-flexbox .all-70,html.no-flexboxlegacy .all-70{width:70%;float:left;clear:none}html.no-flexbox .all-75,html.no-flexboxlegacy .all-75{width:75%;float:left;clear:none}html.no-flexbox .all-80,html.no-flexboxlegacy .all-80{width:80%;float:left;clear:none}html.no-flexbox .all-85,html.no-flexboxlegacy .all-85{width:85%;float:left;clear:none}html.no-flexbox .all-90,html.no-flexboxlegacy .all-90{width:90%;float:left;clear:none}html.no-flexbox .all-95,html.no-flexboxlegacy .all-95{width:95%;float:left;clear:none}html.no-flexbox .all-100,html.no-flexboxlegacy .all-100{width:100%;float:left;clear:none}html.no-flexbox [class~=all-100],html.no-flexboxlegacy [class~=all-100]{float:none;clear:both}@media screen and (min-width:1261px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 2em}html.no-flexbox .column-group>[class*=xlarge-],html.no-flexboxlegacy .column-group>[class*=xlarge-]{float:left;clear:none}html.no-flexbox .xlarge-5,html.no-flexboxlegacy .xlarge-5{width:5%}html.no-flexbox .xlarge-10,html.no-flexboxlegacy .xlarge-10{width:10%}html.no-flexbox .xlarge-15,html.no-flexboxlegacy .xlarge-15{width:15%}html.no-flexbox .xlarge-16,html.no-flexboxlegacy .xlarge-16{width:16.66%}html.no-flexbox .xlarge-20,html.no-flexboxlegacy .xlarge-20{width:20%}html.no-flexbox .xlarge-25,html.no-flexboxlegacy .xlarge-25{width:25%}html.no-flexbox .xlarge-30,html.no-flexboxlegacy .xlarge-30{width:30%}html.no-flexbox .xlarge-33,html.no-flexboxlegacy .xlarge-33{width:33.33%}html.no-flexbox .xlarge-35,html.no-flexboxlegacy .xlarge-35{width:35%}html.no-flexbox .xlarge-40,html.no-flexboxlegacy .xlarge-40{width:40%}html.no-flexbox .xlarge-45,html.no-flexboxlegacy .xlarge-45{width:45%}html.no-flexbox .xlarge-50,html.no-flexboxlegacy .xlarge-50{width:50%}html.no-flexbox .xlarge-55,html.no-flexboxlegacy .xlarge-55{width:55%}html.no-flexbox .xlarge-60,html.no-flexboxlegacy .xlarge-60{width:60%}html.no-flexbox .xlarge-65,html.no-flexboxlegacy .xlarge-65{width:65%}html.no-flexbox .xlarge-66,html.no-flexboxlegacy .xlarge-66{width:66.66%}html.no-flexbox .xlarge-70,html.no-flexboxlegacy .xlarge-70{width:70%}html.no-flexbox .xlarge-75,html.no-flexboxlegacy .xlarge-75{width:75%}html.no-flexbox .xlarge-80,html.no-flexboxlegacy .xlarge-80{width:80%}html.no-flexbox .xlarge-85,html.no-flexboxlegacy .xlarge-85{width:85%}html.no-flexbox .xlarge-90,html.no-flexboxlegacy .xlarge-90{width:90%}html.no-flexbox .xlarge-95,html.no-flexboxlegacy .xlarge-95{width:95%}html.no-flexbox .xlarge-100,html.no-flexboxlegacy .xlarge-100{width:100%}html.no-flexbox [class*=xlarge-100],html.no-flexboxlegacy [class*=xlarge-100]{float:none;clear:both}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-2em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-2em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=xlarge-]{padding-left:2em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=xlarge-]{margin-bottom:2em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-4em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-4em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-1em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-1em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.5em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.5em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}html.no-flexbox .column-group.xlarge-gutters,html.no-flexboxlegacy .column-group.xlarge-gutters{margin-left:-2em}html.no-flexbox .column-group.xlarge-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}html.no-flexbox .column-group.xlarge-horizontal-gutters,html.no-flexboxlegacy .column-group.xlarge-horizontal-gutters{margin-left:-2em}html.no-flexbox .column-group.xlarge-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-horizontal-gutters>[class*=xlarge-]{padding-left:2em}html.no-flexbox .column-group.xlarge-vertical-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-vertical-gutters>[class*=xlarge-]{margin-bottom:2em}html.no-flexbox .column-group.xlarge-double-gutters,html.no-flexboxlegacy .column-group.xlarge-double-gutters{margin-left:-4em}html.no-flexbox .column-group.xlarge-double-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-double-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}html.no-flexbox .column-group.xlarge-double-horizontal-gutters,html.no-flexboxlegacy .column-group.xlarge-double-horizontal-gutters{margin-left:-4em}html.no-flexbox .column-group.xlarge-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-double-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}html.no-flexbox .column-group.xlarge-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-double-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}html.no-flexbox .column-group.xlarge-half-gutters,html.no-flexboxlegacy .column-group.xlarge-half-gutters{margin-left:-1em}html.no-flexbox .column-group.xlarge-half-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-half-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}html.no-flexbox .column-group.xlarge-half-horizontal-gutters,html.no-flexboxlegacy .column-group.xlarge-half-horizontal-gutters{margin-left:-1em}html.no-flexbox .column-group.xlarge-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-half-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}html.no-flexbox .column-group.xlarge-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-half-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}html.no-flexbox .column-group.xlarge-quarter-gutters,html.no-flexboxlegacy .column-group.xlarge-quarter-gutters{margin-left:-.5em}html.no-flexbox .column-group.xlarge-quarter-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-quarter-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}html.no-flexbox .column-group.xlarge-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.xlarge-quarter-horizontal-gutters{margin-left:-.5em}html.no-flexbox .column-group.xlarge-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-quarter-horizontal-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}html.no-flexbox .column-group.xlarge-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-quarter-vertical-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}html.no-flexbox .column-group.xlarge-no-gutters,html.no-flexboxlegacy .column-group.xlarge-no-gutters{margin-left:0}html.no-flexbox .column-group.xlarge-no-gutters>[class*=all-],html.no-flexbox .column-group.xlarge-no-gutters>[class*=xlarge-],html.no-flexboxlegacy .column-group.xlarge-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.xlarge-no-gutters>[class*=xlarge-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=xlarge-],html.no-flexbox .ink-table td[class*=xlarge-],html.no-flexbox .ink-table tfoot[class*=xlarge-],html.no-flexbox .ink-table th[class*=xlarge-],html.no-flexbox .ink-table thead[class*=xlarge-],html.no-flexbox .ink-table tr[class*=xlarge-],html.no-flexboxlegacy .ink-table tbody[class*=xlarge-],html.no-flexboxlegacy .ink-table td[class*=xlarge-],html.no-flexboxlegacy .ink-table tfoot[class*=xlarge-],html.no-flexboxlegacy .ink-table th[class*=xlarge-],html.no-flexboxlegacy .ink-table thead[class*=xlarge-],html.no-flexboxlegacy .ink-table tr[class*=xlarge-]{float:none}html.no-flexbox .xlarge-push-left,html.no-flexboxlegacy .xlarge-push-left{float:left}html.no-flexbox .xlarge-push-center,html.no-flexboxlegacy .xlarge-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .xlarge-push-right,html.no-flexboxlegacy .xlarge-push-right{float:right}html.no-flexbox .xlarge-align-left,html.no-flexboxlegacy .xlarge-align-left{text-align:left}html.no-flexbox .xlarge-align-center,html.no-flexboxlegacy .xlarge-align-center{text-align:center}html.no-flexbox .xlarge-align-right,html.no-flexboxlegacy .xlarge-align-right{text-align:right}html.no-flexbox .xlarge-no-margin,html.no-flexboxlegacy .xlarge-no-margin{margin:0!important}html.no-flexbox .space,html.no-flexbox .xlarge-space,html.no-flexboxlegacy .space,html.no-flexboxlegacy .xlarge-space{margin:2em}html.no-flexbox .padding,html.no-flexbox .xlarge-padding,html.no-flexboxlegacy .padding,html.no-flexboxlegacy .xlarge-padding{padding:2em}html.no-flexbox .double-space,html.no-flexbox .xlarge-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .xlarge-double-space{margin:4em}html.no-flexbox .double-padding,html.no-flexbox .xlarge-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .xlarge-double-padding{padding:4em}html.no-flexbox .half-space,html.no-flexbox .xlarge-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .xlarge-half-space{margin:1em}html.no-flexbox .half-padding,html.no-flexbox .xlarge-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .xlarge-half-padding{padding:1em}html.no-flexbox .quarter-space,html.no-flexbox .xlarge-quarter-space,html.no-flexboxlegacy .quarter-space,html.no-flexboxlegacy .xlarge-quarter-space{margin:.5em}html.no-flexbox .quarter-padding,html.no-flexbox .xlarge-quarter-padding,html.no-flexboxlegacy .quarter-padding,html.no-flexboxlegacy .xlarge-quarter-padding{padding:.5em}html.no-flexbox .vertical-space,html.no-flexbox .xlarge-vertical-space,html.no-flexboxlegacy .vertical-space,html.no-flexboxlegacy .xlarge-vertical-space{margin-top:2em;margin-bottom:2em}html.no-flexbox .vertical-padding,html.no-flexbox .xlarge-vertical-padding,html.no-flexboxlegacy .vertical-padding,html.no-flexboxlegacy .xlarge-vertical-padding{padding-top:2em;padding-bottom:2em}html.no-flexbox .double-vertical-space,html.no-flexbox .xlarge-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .xlarge-double-vertical-space{margin-top:4em;margin-bottom:4em}html.no-flexbox .double-vertical-padding,html.no-flexbox .xlarge-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .xlarge-double-vertical-padding{padding-top:4em;padding-bottom:4em}html.no-flexbox .half-vertical-space,html.no-flexbox .xlarge-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .xlarge-half-vertical-space{margin-top:1em;margin-bottom:1em}html.no-flexbox .half-vertical-padding,html.no-flexbox .xlarge-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .xlarge-half-vertical-padding{padding-top:1em;padding-bottom:1em}html.no-flexbox .quarter-vertical-space,html.no-flexbox .xlarge-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space,html.no-flexboxlegacy .xlarge-quarter-vertical-space{margin-top:.5em;margin-bottom:.5em}html.no-flexbox .quarter-vertical-padding,html.no-flexbox .xlarge-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding,html.no-flexboxlegacy .xlarge-quarter-vertical-padding{padding-top:.5em;padding-bottom:.5em}html.no-flexbox .horizontal-space,html.no-flexbox .xlarge-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .xlarge-horizontal-space{margin-left:2em;margin-right:2em}html.no-flexbox .horizontal-padding,html.no-flexbox .xlarge-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .xlarge-horizontal-padding{padding-left:2em;padding-right:2em}html.no-flexbox .double-horizontal-space,html.no-flexbox .xlarge-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .xlarge-double-horizontal-space{margin-left:4em;margin-right:4em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .xlarge-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .xlarge-double-horizontal-padding{padding-left:4em;padding-right:4em}html.no-flexbox .half-horizontal-space,html.no-flexbox .xlarge-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .xlarge-half-horizontal-space{margin-left:1em;margin-right:1em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .xlarge-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .xlarge-half-horizontal-padding{padding-left:1em;padding-right:1em}html.no-flexbox .quarter-horizontal-space,html.no-flexbox .xlarge-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space,html.no-flexboxlegacy .xlarge-quarter-horizontal-space{margin-left:.5em;margin-right:.5em}html.no-flexbox .quarter-horizontal-padding,html.no-flexbox .xlarge-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding,html.no-flexboxlegacy .xlarge-quarter-horizontal-padding{padding-left:.5em;padding-right:.5em}html.no-flexbox .top-space,html.no-flexbox .xlarge-top-space,html.no-flexboxlegacy .top-space,html.no-flexboxlegacy .xlarge-top-space{margin-top:2em}html.no-flexbox .top-padding,html.no-flexbox .xlarge-top-padding,html.no-flexboxlegacy .top-padding,html.no-flexboxlegacy .xlarge-top-padding{padding-top:2em}html.no-flexbox .double-top-space,html.no-flexbox .xlarge-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .xlarge-double-top-space{margin-top:4em}html.no-flexbox .double-top-padding,html.no-flexbox .xlarge-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .xlarge-double-top-padding{padding-top:4em}html.no-flexbox .half-top-space,html.no-flexbox .xlarge-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .xlarge-half-top-space{margin-top:1em}html.no-flexbox .half-top-padding,html.no-flexbox .xlarge-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .xlarge-half-top-padding{padding-top:1em}html.no-flexbox .quarter-top-space,html.no-flexbox .xlarge-quarter-top-space,html.no-flexboxlegacy .quarter-top-space,html.no-flexboxlegacy .xlarge-quarter-top-space{margin-top:.5em}html.no-flexbox .quarter-top-padding,html.no-flexbox .xlarge-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding,html.no-flexboxlegacy .xlarge-quarter-top-padding{padding-top:.5em}html.no-flexbox .right-space,html.no-flexbox .xlarge-right-space,html.no-flexboxlegacy .right-space,html.no-flexboxlegacy .xlarge-right-space{margin-right:2em}html.no-flexbox .right-padding,html.no-flexbox .xlarge-right-padding,html.no-flexboxlegacy .right-padding,html.no-flexboxlegacy .xlarge-right-padding{padding-right:2em}html.no-flexbox .double-right-space,html.no-flexbox .xlarge-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .xlarge-double-right-space{margin-right:4em}html.no-flexbox .double-right-padding,html.no-flexbox .xlarge-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .xlarge-double-right-padding{padding-right:4em}html.no-flexbox .half-right-space,html.no-flexbox .xlarge-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .xlarge-half-right-space{margin-right:1em}html.no-flexbox .half-right-padding,html.no-flexbox .xlarge-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .xlarge-half-right-padding{padding-right:1em}html.no-flexbox .quarter-right-space,html.no-flexbox .xlarge-quarter-right-space,html.no-flexboxlegacy .quarter-right-space,html.no-flexboxlegacy .xlarge-quarter-right-space{margin-right:.5em}html.no-flexbox .quarter-right-padding,html.no-flexbox .xlarge-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding,html.no-flexboxlegacy .xlarge-quarter-right-padding{padding-right:.5em}html.no-flexbox .bottom-space,html.no-flexbox .xlarge-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .xlarge-bottom-space{margin-bottom:2em}html.no-flexbox .bottom-padding,html.no-flexbox .xlarge-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .xlarge-bottom-padding{padding-bottom:2em}html.no-flexbox .double-bottom-space,html.no-flexbox .xlarge-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .xlarge-double-bottom-space{margin-bottom:4em}html.no-flexbox .double-bottom-padding,html.no-flexbox .xlarge-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .xlarge-double-bottom-padding{padding-bottom:4em}html.no-flexbox .half-bottom-space,html.no-flexbox .xlarge-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .xlarge-half-bottom-space{margin-bottom:1em}html.no-flexbox .half-bottom-padding,html.no-flexbox .xlarge-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .xlarge-half-bottom-padding{padding-bottom:1em}html.no-flexbox .quarter-bottom-space,html.no-flexbox .xlarge-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space,html.no-flexboxlegacy .xlarge-quarter-bottom-space{margin-bottom:.5em}html.no-flexbox .quarter-bottom-padding,html.no-flexbox .xlarge-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding,html.no-flexboxlegacy .xlarge-quarter-bottom-padding{padding-bottom:.5em}html.no-flexbox .left-space,html.no-flexbox .xlarge-left-space,html.no-flexboxlegacy .left-space,html.no-flexboxlegacy .xlarge-left-space{margin-left:2em}html.no-flexbox .left-padding,html.no-flexbox .xlarge-left-padding,html.no-flexboxlegacy .left-padding,html.no-flexboxlegacy .xlarge-left-padding{padding-left:2em}html.no-flexbox .double-left-space,html.no-flexbox .xlarge-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .xlarge-double-left-space{margin-left:4em}html.no-flexbox .double-left-padding,html.no-flexbox .xlarge-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .xlarge-double-left-padding{padding-left:4em}html.no-flexbox .half-left-space,html.no-flexbox .xlarge-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .xlarge-half-left-space{margin-left:1em}html.no-flexbox .half-left-padding,html.no-flexbox .xlarge-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .xlarge-half-left-padding{padding-left:1em}html.no-flexbox .quarter-left-space,html.no-flexbox .xlarge-quarter-left-space,html.no-flexboxlegacy .quarter-left-space,html.no-flexboxlegacy .xlarge-quarter-left-space{margin-left:.5em}html.no-flexbox .quarter-left-padding,html.no-flexbox .xlarge-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding,html.no-flexboxlegacy .xlarge-quarter-left-padding{padding-left:.5em}html.no-flexbox .hide-xlarge,html.no-flexboxlegacy .hide-xlarge{display:none!important}html.no-flexbox .show-xlarge,html.no-flexboxlegacy .show-xlarge{display:inherit!important}html.no-flexbox table.show-xlarge,html.no-flexboxlegacy table.show-xlarge{display:table}html.no-flexbox thead.show-xlarge,html.no-flexboxlegacy thead.show-xlarge{display:table-header-group}html.no-flexbox tbody.show-xlarge,html.no-flexboxlegacy tbody.show-xlarge{display:table-row-group}html.no-flexbox tfoot.show-xlarge,html.no-flexboxlegacy tfoot.show-xlarge{display:table-footer-group}html.no-flexbox tr.show-xlarge,html.no-flexboxlegacy tr.show-xlarge{display:table-row}html.no-flexbox td.show-xlarge,html.no-flexbox th.show-xlarge,html.no-flexboxlegacy td.show-xlarge,html.no-flexboxlegacy th.show-xlarge{display:table-cell}}@media screen and (min-width:961px) and (max-width:1260px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 1.75em}html.no-flexbox .column-group>[class*=large-],html.no-flexboxlegacy .column-group>[class*=large-]{float:left;clear:none}html.no-flexbox .large-5,html.no-flexboxlegacy .large-5{width:5%}html.no-flexbox .large-10,html.no-flexboxlegacy .large-10{width:10%}html.no-flexbox .large-15,html.no-flexboxlegacy .large-15{width:15%}html.no-flexbox .large-16,html.no-flexboxlegacy .large-16{width:16.66%}html.no-flexbox .large-20,html.no-flexboxlegacy .large-20{width:20%}html.no-flexbox .large-25,html.no-flexboxlegacy .large-25{width:25%}html.no-flexbox .large-30,html.no-flexboxlegacy .large-30{width:30%}html.no-flexbox .large-33,html.no-flexboxlegacy .large-33{width:33.33%}html.no-flexbox .large-35,html.no-flexboxlegacy .large-35{width:35%}html.no-flexbox .large-40,html.no-flexboxlegacy .large-40{width:40%}html.no-flexbox .large-45,html.no-flexboxlegacy .large-45{width:45%}html.no-flexbox .large-50,html.no-flexboxlegacy .large-50{width:50%}html.no-flexbox .large-55,html.no-flexboxlegacy .large-55{width:55%}html.no-flexbox .large-60,html.no-flexboxlegacy .large-60{width:60%}html.no-flexbox .large-65,html.no-flexboxlegacy .large-65{width:65%}html.no-flexbox .large-66,html.no-flexboxlegacy .large-66{width:66.66%}html.no-flexbox .large-70,html.no-flexboxlegacy .large-70{width:70%}html.no-flexbox .large-75,html.no-flexboxlegacy .large-75{width:75%}html.no-flexbox .large-80,html.no-flexboxlegacy .large-80{width:80%}html.no-flexbox .large-85,html.no-flexboxlegacy .large-85{width:85%}html.no-flexbox .large-90,html.no-flexboxlegacy .large-90{width:90%}html.no-flexbox .large-95,html.no-flexboxlegacy .large-95{width:95%}html.no-flexbox .large-100,html.no-flexboxlegacy .large-100{width:100%}html.no-flexbox [class*=large-100],html.no-flexboxlegacy [class*=large-100]{float:none;clear:both}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-1.75em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=large-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-1.75em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=large-]{padding-left:1.75em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=large-]{margin-bottom:1.75em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-3.5em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=large-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-3.5em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=large-]{padding-left:3.5em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-.875em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=large-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-.875em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=large-]{padding-left:.875em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=large-]{margin-bottom:.875em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.4375em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=large-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.4375em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}html.no-flexbox .column-group.large-gutters,html.no-flexboxlegacy .column-group.large-gutters{margin-left:-1.75em}html.no-flexbox .column-group.large-gutters>[class*=all-],html.no-flexbox .column-group.large-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}html.no-flexbox .column-group.large-horizontal-gutters,html.no-flexboxlegacy .column-group.large-horizontal-gutters{margin-left:-1.75em}html.no-flexbox .column-group.large-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.large-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-horizontal-gutters>[class*=large-]{padding-left:1.75em}html.no-flexbox .column-group.large-vertical-gutters>[class*=all-],html.no-flexbox .column-group.large-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-vertical-gutters>[class*=large-]{margin-bottom:1.75em}html.no-flexbox .column-group.large-double-gutters,html.no-flexboxlegacy .column-group.large-double-gutters{margin-left:-3.5em}html.no-flexbox .column-group.large-double-gutters>[class*=all-],html.no-flexbox .column-group.large-double-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}html.no-flexbox .column-group.large-double-horizontal-gutters,html.no-flexboxlegacy .column-group.large-double-horizontal-gutters{margin-left:-3.5em}html.no-flexbox .column-group.large-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.large-double-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-double-horizontal-gutters>[class*=large-]{padding-left:3.5em}html.no-flexbox .column-group.large-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.large-double-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}html.no-flexbox .column-group.large-half-gutters,html.no-flexboxlegacy .column-group.large-half-gutters{margin-left:-.875em}html.no-flexbox .column-group.large-half-gutters>[class*=all-],html.no-flexbox .column-group.large-half-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}html.no-flexbox .column-group.large-half-horizontal-gutters,html.no-flexboxlegacy .column-group.large-half-horizontal-gutters{margin-left:-.875em}html.no-flexbox .column-group.large-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.large-half-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-half-horizontal-gutters>[class*=large-]{padding-left:.875em}html.no-flexbox .column-group.large-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.large-half-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-half-vertical-gutters>[class*=large-]{margin-bottom:.875em}html.no-flexbox .column-group.large-quarter-gutters,html.no-flexboxlegacy .column-group.large-quarter-gutters{margin-left:-.4375em}html.no-flexbox .column-group.large-quarter-gutters>[class*=all-],html.no-flexbox .column-group.large-quarter-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}html.no-flexbox .column-group.large-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.large-quarter-horizontal-gutters{margin-left:-.4375em}html.no-flexbox .column-group.large-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.large-quarter-horizontal-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}html.no-flexbox .column-group.large-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.large-quarter-vertical-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}html.no-flexbox .column-group.large-no-gutters,html.no-flexboxlegacy .column-group.large-no-gutters{margin-left:0}html.no-flexbox .column-group.large-no-gutters>[class*=all-],html.no-flexbox .column-group.large-no-gutters>[class*=large-],html.no-flexboxlegacy .column-group.large-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.large-no-gutters>[class*=large-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=large-],html.no-flexbox .ink-table td[class*=large-],html.no-flexbox .ink-table tfoot[class*=large-],html.no-flexbox .ink-table th[class*=large-],html.no-flexbox .ink-table thead[class*=large-],html.no-flexbox .ink-table tr[class*=large-],html.no-flexboxlegacy .ink-table tbody[class*=large-],html.no-flexboxlegacy .ink-table td[class*=large-],html.no-flexboxlegacy .ink-table tfoot[class*=large-],html.no-flexboxlegacy .ink-table th[class*=large-],html.no-flexboxlegacy .ink-table thead[class*=large-],html.no-flexboxlegacy .ink-table tr[class*=large-]{float:none}html.no-flexbox .large-push-left,html.no-flexboxlegacy .large-push-left{float:left}html.no-flexbox .large-push-center,html.no-flexboxlegacy .large-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .large-push-right,html.no-flexboxlegacy .large-push-right{float:right}html.no-flexbox .large-align-left,html.no-flexboxlegacy .large-align-left{text-align:left}html.no-flexbox .large-align-center,html.no-flexboxlegacy .large-align-center{text-align:center}html.no-flexbox .large-align-right,html.no-flexboxlegacy .large-align-right{text-align:right}html.no-flexbox .large-no-margin,html.no-flexboxlegacy .large-no-margin{margin:0!important}html.no-flexbox .large-space,html.no-flexbox .space,html.no-flexboxlegacy .large-space,html.no-flexboxlegacy .space{margin:1.75em}html.no-flexbox .large-padding,html.no-flexbox .padding,html.no-flexboxlegacy .large-padding,html.no-flexboxlegacy .padding{padding:1.75em}html.no-flexbox .double-space,html.no-flexbox .large-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .large-double-space{margin:3.5em}html.no-flexbox .double-padding,html.no-flexbox .large-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .large-double-padding{padding:3.5em}html.no-flexbox .half-space,html.no-flexbox .large-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .large-half-space{margin:.875em}html.no-flexbox .half-padding,html.no-flexbox .large-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .large-half-padding{padding:.875em}html.no-flexbox .large-quarter-space,html.no-flexbox .quarter-space,html.no-flexboxlegacy .large-quarter-space,html.no-flexboxlegacy .quarter-space{margin:.4375em}html.no-flexbox .large-quarter-padding,html.no-flexbox .quarter-padding,html.no-flexboxlegacy .large-quarter-padding,html.no-flexboxlegacy .quarter-padding{padding:.4375em}html.no-flexbox .large-vertical-space,html.no-flexbox .vertical-space,html.no-flexboxlegacy .large-vertical-space,html.no-flexboxlegacy .vertical-space{margin-top:1.75em;margin-bottom:1.75em}html.no-flexbox .large-vertical-padding,html.no-flexbox .vertical-padding,html.no-flexboxlegacy .large-vertical-padding,html.no-flexboxlegacy .vertical-padding{padding-top:1.75em;padding-bottom:1.75em}html.no-flexbox .double-vertical-space,html.no-flexbox .large-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .large-double-vertical-space{margin-top:3.5em;margin-bottom:3.5em}html.no-flexbox .double-vertical-padding,html.no-flexbox .large-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .large-double-vertical-padding{padding-top:3.5em;padding-bottom:3.5em}html.no-flexbox .half-vertical-space,html.no-flexbox .large-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .large-half-vertical-space{margin-top:.875em;margin-bottom:.875em}html.no-flexbox .half-vertical-padding,html.no-flexbox .large-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .large-half-vertical-padding{padding-top:.875em;padding-bottom:.875em}html.no-flexbox .large-quarter-vertical-space,html.no-flexbox .quarter-vertical-space,html.no-flexboxlegacy .large-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space{margin-top:.4375em;margin-bottom:.4375em}html.no-flexbox .large-quarter-vertical-padding,html.no-flexbox .quarter-vertical-padding,html.no-flexboxlegacy .large-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding{padding-top:.4375em;padding-bottom:.4375em}html.no-flexbox .horizontal-space,html.no-flexbox .large-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .large-horizontal-space{margin-left:1.75em;margin-right:1.75em}html.no-flexbox .horizontal-padding,html.no-flexbox .large-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .large-horizontal-padding{padding-left:1.75em;padding-right:1.75em}html.no-flexbox .double-horizontal-space,html.no-flexbox .large-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .large-double-horizontal-space{margin-left:3.5em;margin-right:3.5em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .large-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .large-double-horizontal-padding{padding-left:3.5em;padding-right:3.5em}html.no-flexbox .half-horizontal-space,html.no-flexbox .large-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .large-half-horizontal-space{margin-left:.875em;margin-right:.875em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .large-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .large-half-horizontal-padding{padding-left:.875em;padding-right:.875em}html.no-flexbox .large-quarter-horizontal-space,html.no-flexbox .quarter-horizontal-space,html.no-flexboxlegacy .large-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space{margin-left:.4375em;margin-right:.4375em}html.no-flexbox .large-quarter-horizontal-padding,html.no-flexbox .quarter-horizontal-padding,html.no-flexboxlegacy .large-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding{padding-left:.4375em;padding-right:.4375em}html.no-flexbox .large-top-space,html.no-flexbox .top-space,html.no-flexboxlegacy .large-top-space,html.no-flexboxlegacy .top-space{margin-top:1.75em}html.no-flexbox .large-top-padding,html.no-flexbox .top-padding,html.no-flexboxlegacy .large-top-padding,html.no-flexboxlegacy .top-padding{padding-top:1.75em}html.no-flexbox .double-top-space,html.no-flexbox .large-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .large-double-top-space{margin-top:3.5em}html.no-flexbox .double-top-padding,html.no-flexbox .large-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .large-double-top-padding{padding-top:3.5em}html.no-flexbox .half-top-space,html.no-flexbox .large-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .large-half-top-space{margin-top:.875em}html.no-flexbox .half-top-padding,html.no-flexbox .large-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .large-half-top-padding{padding-top:.875em}html.no-flexbox .large-quarter-top-space,html.no-flexbox .quarter-top-space,html.no-flexboxlegacy .large-quarter-top-space,html.no-flexboxlegacy .quarter-top-space{margin-top:.4375em}html.no-flexbox .large-quarter-top-padding,html.no-flexbox .quarter-top-padding,html.no-flexboxlegacy .large-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding{padding-top:.4375em}html.no-flexbox .large-right-space,html.no-flexbox .right-space,html.no-flexboxlegacy .large-right-space,html.no-flexboxlegacy .right-space{margin-right:1.75em}html.no-flexbox .large-right-padding,html.no-flexbox .right-padding,html.no-flexboxlegacy .large-right-padding,html.no-flexboxlegacy .right-padding{padding-right:1.75em}html.no-flexbox .double-right-space,html.no-flexbox .large-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .large-double-right-space{margin-right:3.5em}html.no-flexbox .double-right-padding,html.no-flexbox .large-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .large-double-right-padding{padding-right:3.5em}html.no-flexbox .half-right-space,html.no-flexbox .large-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .large-half-right-space{margin-right:.875em}html.no-flexbox .half-right-padding,html.no-flexbox .large-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .large-half-right-padding{padding-right:.875em}html.no-flexbox .large-quarter-right-space,html.no-flexbox .quarter-right-space,html.no-flexboxlegacy .large-quarter-right-space,html.no-flexboxlegacy .quarter-right-space{margin-right:.4375em}html.no-flexbox .large-quarter-right-padding,html.no-flexbox .quarter-right-padding,html.no-flexboxlegacy .large-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding{padding-right:.4375em}html.no-flexbox .bottom-space,html.no-flexbox .large-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .large-bottom-space{margin-bottom:1.75em}html.no-flexbox .bottom-padding,html.no-flexbox .large-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .large-bottom-padding{padding-bottom:1.75em}html.no-flexbox .double-bottom-space,html.no-flexbox .large-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .large-double-bottom-space{margin-bottom:3.5em}html.no-flexbox .double-bottom-padding,html.no-flexbox .large-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .large-double-bottom-padding{padding-bottom:3.5em}html.no-flexbox .half-bottom-space,html.no-flexbox .large-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .large-half-bottom-space{margin-bottom:.875em}html.no-flexbox .half-bottom-padding,html.no-flexbox .large-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .large-half-bottom-padding{padding-bottom:.875em}html.no-flexbox .large-quarter-bottom-space,html.no-flexbox .quarter-bottom-space,html.no-flexboxlegacy .large-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space{margin-bottom:.4375em}html.no-flexbox .large-quarter-bottom-padding,html.no-flexbox .quarter-bottom-padding,html.no-flexboxlegacy .large-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding{padding-bottom:.4375em}html.no-flexbox .large-left-space,html.no-flexbox .left-space,html.no-flexboxlegacy .large-left-space,html.no-flexboxlegacy .left-space{margin-left:1.75em}html.no-flexbox .large-left-padding,html.no-flexbox .left-padding,html.no-flexboxlegacy .large-left-padding,html.no-flexboxlegacy .left-padding{padding-left:1.75em}html.no-flexbox .double-left-space,html.no-flexbox .large-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .large-double-left-space{margin-left:3.5em}html.no-flexbox .double-left-padding,html.no-flexbox .large-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .large-double-left-padding{padding-left:3.5em}html.no-flexbox .half-left-space,html.no-flexbox .large-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .large-half-left-space{margin-left:.875em}html.no-flexbox .half-left-padding,html.no-flexbox .large-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .large-half-left-padding{padding-left:.875em}html.no-flexbox .large-quarter-left-space,html.no-flexbox .quarter-left-space,html.no-flexboxlegacy .large-quarter-left-space,html.no-flexboxlegacy .quarter-left-space{margin-left:.4375em}html.no-flexbox .large-quarter-left-padding,html.no-flexbox .quarter-left-padding,html.no-flexboxlegacy .large-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding{padding-left:.4375em}html.no-flexbox .hide-large,html.no-flexboxlegacy .hide-large{display:none!important}html.no-flexbox .show-large,html.no-flexboxlegacy .show-large{display:inherit!important}html.no-flexbox table.show-large,html.no-flexboxlegacy table.show-large{display:table}html.no-flexbox thead.show-large,html.no-flexboxlegacy thead.show-large{display:table-header-group}html.no-flexbox tbody.show-large,html.no-flexboxlegacy tbody.show-large{display:table-row-group}html.no-flexbox tfoot.show-large,html.no-flexboxlegacy tfoot.show-large{display:table-footer-group}html.no-flexbox tr.show-large,html.no-flexboxlegacy tr.show-large{display:table-row}html.no-flexbox td.show-large,html.no-flexbox th.show-large,html.no-flexboxlegacy td.show-large,html.no-flexboxlegacy th.show-large{display:table-cell}}@media screen and (min-width:641px) and (max-width:960px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 1.5em}html.no-flexbox .column-group>[class*=medium-],html.no-flexboxlegacy .column-group>[class*=medium-]{float:left;clear:none}html.no-flexbox .medium-5,html.no-flexboxlegacy .medium-5{width:5%}html.no-flexbox .medium-10,html.no-flexboxlegacy .medium-10{width:10%}html.no-flexbox .medium-15,html.no-flexboxlegacy .medium-15{width:15%}html.no-flexbox .medium-16,html.no-flexboxlegacy .medium-16{width:16.66%}html.no-flexbox .medium-20,html.no-flexboxlegacy .medium-20{width:20%}html.no-flexbox .medium-25,html.no-flexboxlegacy .medium-25{width:25%}html.no-flexbox .medium-30,html.no-flexboxlegacy .medium-30{width:30%}html.no-flexbox .medium-33,html.no-flexboxlegacy .medium-33{width:33.33%}html.no-flexbox .medium-35,html.no-flexboxlegacy .medium-35{width:35%}html.no-flexbox .medium-40,html.no-flexboxlegacy .medium-40{width:40%}html.no-flexbox .medium-45,html.no-flexboxlegacy .medium-45{width:45%}html.no-flexbox .medium-50,html.no-flexboxlegacy .medium-50{width:50%}html.no-flexbox .medium-55,html.no-flexboxlegacy .medium-55{width:55%}html.no-flexbox .medium-60,html.no-flexboxlegacy .medium-60{width:60%}html.no-flexbox .medium-65,html.no-flexboxlegacy .medium-65{width:65%}html.no-flexbox .medium-66,html.no-flexboxlegacy .medium-66{width:66.66%}html.no-flexbox .medium-70,html.no-flexboxlegacy .medium-70{width:70%}html.no-flexbox .medium-75,html.no-flexboxlegacy .medium-75{width:75%}html.no-flexbox .medium-80,html.no-flexboxlegacy .medium-80{width:80%}html.no-flexbox .medium-85,html.no-flexboxlegacy .medium-85{width:85%}html.no-flexbox .medium-90,html.no-flexboxlegacy .medium-90{width:90%}html.no-flexbox .medium-95,html.no-flexboxlegacy .medium-95{width:95%}html.no-flexbox .medium-100,html.no-flexboxlegacy .medium-100{width:100%}html.no-flexbox [class*=medium-100],html.no-flexboxlegacy [class*=medium-100]{float:none;clear:both}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-1.5em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=medium-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-1.5em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=medium-]{padding-left:1.5em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=medium-]{margin-bottom:1.5em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-3em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-3em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=medium-]{padding-left:3em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=medium-]{margin-bottom:3em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-.75em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-.75em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=medium-]{padding-left:.75em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.375em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.375em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}html.no-flexbox .column-group.medium-gutters,html.no-flexboxlegacy .column-group.medium-gutters{margin-left:-1.5em}html.no-flexbox .column-group.medium-gutters>[class*=all-],html.no-flexbox .column-group.medium-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}html.no-flexbox .column-group.medium-horizontal-gutters,html.no-flexboxlegacy .column-group.medium-horizontal-gutters{margin-left:-1.5em}html.no-flexbox .column-group.medium-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.medium-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-horizontal-gutters>[class*=medium-]{padding-left:1.5em}html.no-flexbox .column-group.medium-vertical-gutters>[class*=all-],html.no-flexbox .column-group.medium-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-vertical-gutters>[class*=medium-]{margin-bottom:1.5em}html.no-flexbox .column-group.medium-double-gutters,html.no-flexboxlegacy .column-group.medium-double-gutters{margin-left:-3em}html.no-flexbox .column-group.medium-double-gutters>[class*=all-],html.no-flexbox .column-group.medium-double-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}html.no-flexbox .column-group.medium-double-horizontal-gutters,html.no-flexboxlegacy .column-group.medium-double-horizontal-gutters{margin-left:-3em}html.no-flexbox .column-group.medium-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.medium-double-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-double-horizontal-gutters>[class*=medium-]{padding-left:3em}html.no-flexbox .column-group.medium-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.medium-double-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-double-vertical-gutters>[class*=medium-]{margin-bottom:3em}html.no-flexbox .column-group.medium-half-gutters,html.no-flexboxlegacy .column-group.medium-half-gutters{margin-left:-.75em}html.no-flexbox .column-group.medium-half-gutters>[class*=all-],html.no-flexbox .column-group.medium-half-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}html.no-flexbox .column-group.medium-half-horizontal-gutters,html.no-flexboxlegacy .column-group.medium-half-horizontal-gutters{margin-left:-.75em}html.no-flexbox .column-group.medium-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.medium-half-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-half-horizontal-gutters>[class*=medium-]{padding-left:.75em}html.no-flexbox .column-group.medium-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.medium-half-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}html.no-flexbox .column-group.medium-quarter-gutters,html.no-flexboxlegacy .column-group.medium-quarter-gutters{margin-left:-.375em}html.no-flexbox .column-group.medium-quarter-gutters>[class*=all-],html.no-flexbox .column-group.medium-quarter-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}html.no-flexbox .column-group.medium-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.medium-quarter-horizontal-gutters{margin-left:-.375em}html.no-flexbox .column-group.medium-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.medium-quarter-horizontal-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}html.no-flexbox .column-group.medium-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.medium-quarter-vertical-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}html.no-flexbox .column-group.medium-no-gutters,html.no-flexboxlegacy .column-group.medium-no-gutters{margin-left:0}html.no-flexbox .column-group.medium-no-gutters>[class*=all-],html.no-flexbox .column-group.medium-no-gutters>[class*=medium-],html.no-flexboxlegacy .column-group.medium-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.medium-no-gutters>[class*=medium-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=medium-],html.no-flexbox .ink-table td[class*=medium-],html.no-flexbox .ink-table tfoot[class*=medium-],html.no-flexbox .ink-table th[class*=medium-],html.no-flexbox .ink-table thead[class*=medium-],html.no-flexbox .ink-table tr[class*=medium-],html.no-flexboxlegacy .ink-table tbody[class*=medium-],html.no-flexboxlegacy .ink-table td[class*=medium-],html.no-flexboxlegacy .ink-table tfoot[class*=medium-],html.no-flexboxlegacy .ink-table th[class*=medium-],html.no-flexboxlegacy .ink-table thead[class*=medium-],html.no-flexboxlegacy .ink-table tr[class*=medium-]{float:none}html.no-flexbox .medium-push-left,html.no-flexboxlegacy .medium-push-left{float:left}html.no-flexbox .medium-push-center,html.no-flexboxlegacy .medium-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .medium-push-right,html.no-flexboxlegacy .medium-push-right{float:right}html.no-flexbox .medium-align-left,html.no-flexboxlegacy .medium-align-left{text-align:left}html.no-flexbox .medium-align-center,html.no-flexboxlegacy .medium-align-center{text-align:center}html.no-flexbox .medium-align-right,html.no-flexboxlegacy .medium-align-right{text-align:right}html.no-flexbox .medium-no-margin,html.no-flexboxlegacy .medium-no-margin{margin:0!important}html.no-flexbox .medium-space,html.no-flexbox .space,html.no-flexboxlegacy .medium-space,html.no-flexboxlegacy .space{margin:1.5em}html.no-flexbox .medium-padding,html.no-flexbox .padding,html.no-flexboxlegacy .medium-padding,html.no-flexboxlegacy .padding{padding:1.5em}html.no-flexbox .double-space,html.no-flexbox .medium-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .medium-double-space{margin:3em}html.no-flexbox .double-padding,html.no-flexbox .medium-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .medium-double-padding{padding:3em}html.no-flexbox .half-space,html.no-flexbox .medium-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .medium-half-space{margin:.75em}html.no-flexbox .half-padding,html.no-flexbox .medium-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .medium-half-padding{padding:.75em}html.no-flexbox .medium-quarter-space,html.no-flexbox .quarter-space,html.no-flexboxlegacy .medium-quarter-space,html.no-flexboxlegacy .quarter-space{margin:.375em}html.no-flexbox .medium-quarter-padding,html.no-flexbox .quarter-padding,html.no-flexboxlegacy .medium-quarter-padding,html.no-flexboxlegacy .quarter-padding{padding:.375em}html.no-flexbox .medium-vertical-space,html.no-flexbox .vertical-space,html.no-flexboxlegacy .medium-vertical-space,html.no-flexboxlegacy .vertical-space{margin-top:1.5em;margin-bottom:1.5em}html.no-flexbox .medium-vertical-padding,html.no-flexbox .vertical-padding,html.no-flexboxlegacy .medium-vertical-padding,html.no-flexboxlegacy .vertical-padding{padding-top:1.5em;padding-bottom:1.5em}html.no-flexbox .double-vertical-space,html.no-flexbox .medium-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .medium-double-vertical-space{margin-top:3em;margin-bottom:3em}html.no-flexbox .double-vertical-padding,html.no-flexbox .medium-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .medium-double-vertical-padding{padding-top:3em;padding-bottom:3em}html.no-flexbox .half-vertical-space,html.no-flexbox .medium-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .medium-half-vertical-space{margin-top:.75em;margin-bottom:.75em}html.no-flexbox .half-vertical-padding,html.no-flexbox .medium-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .medium-half-vertical-padding{padding-top:.75em;padding-bottom:.75em}html.no-flexbox .medium-quarter-vertical-space,html.no-flexbox .quarter-vertical-space,html.no-flexboxlegacy .medium-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space{margin-top:.375em;margin-bottom:.375em}html.no-flexbox .medium-quarter-vertical-padding,html.no-flexbox .quarter-vertical-padding,html.no-flexboxlegacy .medium-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding{padding-top:.375em;padding-bottom:.375em}html.no-flexbox .horizontal-space,html.no-flexbox .medium-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .medium-horizontal-space{margin-left:1.5em;margin-right:1.5em}html.no-flexbox .horizontal-padding,html.no-flexbox .medium-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .medium-horizontal-padding{padding-left:1.5em;padding-right:1.5em}html.no-flexbox .double-horizontal-space,html.no-flexbox .medium-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .medium-double-horizontal-space{margin-left:3em;margin-right:3em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .medium-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .medium-double-horizontal-padding{padding-left:3em;padding-right:3em}html.no-flexbox .half-horizontal-space,html.no-flexbox .medium-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .medium-half-horizontal-space{margin-left:.75em;margin-right:.75em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .medium-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .medium-half-horizontal-padding{padding-left:.75em;padding-right:.75em}html.no-flexbox .medium-quarter-horizontal-space,html.no-flexbox .quarter-horizontal-space,html.no-flexboxlegacy .medium-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space{margin-left:.375em;margin-right:.375em}html.no-flexbox .medium-quarter-horizontal-padding,html.no-flexbox .quarter-horizontal-padding,html.no-flexboxlegacy .medium-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding{padding-left:.375em;padding-right:.375em}html.no-flexbox .medium-top-space,html.no-flexbox .top-space,html.no-flexboxlegacy .medium-top-space,html.no-flexboxlegacy .top-space{margin-top:1.5em}html.no-flexbox .medium-top-padding,html.no-flexbox .top-padding,html.no-flexboxlegacy .medium-top-padding,html.no-flexboxlegacy .top-padding{padding-top:1.5em}html.no-flexbox .double-top-space,html.no-flexbox .medium-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .medium-double-top-space{margin-top:3em}html.no-flexbox .double-top-padding,html.no-flexbox .medium-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .medium-double-top-padding{padding-top:3em}html.no-flexbox .half-top-space,html.no-flexbox .medium-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .medium-half-top-space{margin-top:.75em}html.no-flexbox .half-top-padding,html.no-flexbox .medium-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .medium-half-top-padding{padding-top:.75em}html.no-flexbox .medium-quarter-top-space,html.no-flexbox .quarter-top-space,html.no-flexboxlegacy .medium-quarter-top-space,html.no-flexboxlegacy .quarter-top-space{margin-top:.375em}html.no-flexbox .medium-quarter-top-padding,html.no-flexbox .quarter-top-padding,html.no-flexboxlegacy .medium-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding{padding-top:.375em}html.no-flexbox .medium-right-space,html.no-flexbox .right-space,html.no-flexboxlegacy .medium-right-space,html.no-flexboxlegacy .right-space{margin-right:1.5em}html.no-flexbox .medium-right-padding,html.no-flexbox .right-padding,html.no-flexboxlegacy .medium-right-padding,html.no-flexboxlegacy .right-padding{padding-right:1.5em}html.no-flexbox .double-right-space,html.no-flexbox .medium-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .medium-double-right-space{margin-right:3em}html.no-flexbox .double-right-padding,html.no-flexbox .medium-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .medium-double-right-padding{padding-right:3em}html.no-flexbox .half-right-space,html.no-flexbox .medium-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .medium-half-right-space{margin-right:.75em}html.no-flexbox .half-right-padding,html.no-flexbox .medium-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .medium-half-right-padding{padding-right:.75em}html.no-flexbox .medium-quarter-right-space,html.no-flexbox .quarter-right-space,html.no-flexboxlegacy .medium-quarter-right-space,html.no-flexboxlegacy .quarter-right-space{margin-right:.375em}html.no-flexbox .medium-quarter-right-padding,html.no-flexbox .quarter-right-padding,html.no-flexboxlegacy .medium-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding{padding-right:.375em}html.no-flexbox .bottom-space,html.no-flexbox .medium-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .medium-bottom-space{margin-bottom:1.5em}html.no-flexbox .bottom-padding,html.no-flexbox .medium-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .medium-bottom-padding{padding-bottom:1.5em}html.no-flexbox .double-bottom-space,html.no-flexbox .medium-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .medium-double-bottom-space{margin-bottom:3em}html.no-flexbox .double-bottom-padding,html.no-flexbox .medium-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .medium-double-bottom-padding{padding-bottom:3em}html.no-flexbox .half-bottom-space,html.no-flexbox .medium-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .medium-half-bottom-space{margin-bottom:.75em}html.no-flexbox .half-bottom-padding,html.no-flexbox .medium-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .medium-half-bottom-padding{padding-bottom:.75em}html.no-flexbox .medium-quarter-bottom-space,html.no-flexbox .quarter-bottom-space,html.no-flexboxlegacy .medium-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space{margin-bottom:.375em}html.no-flexbox .medium-quarter-bottom-padding,html.no-flexbox .quarter-bottom-padding,html.no-flexboxlegacy .medium-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding{padding-bottom:.375em}html.no-flexbox .left-space,html.no-flexbox .medium-left-space,html.no-flexboxlegacy .left-space,html.no-flexboxlegacy .medium-left-space{margin-left:1.5em}html.no-flexbox .left-padding,html.no-flexbox .medium-left-padding,html.no-flexboxlegacy .left-padding,html.no-flexboxlegacy .medium-left-padding{padding-left:1.5em}html.no-flexbox .double-left-space,html.no-flexbox .medium-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .medium-double-left-space{margin-left:3em}html.no-flexbox .double-left-padding,html.no-flexbox .medium-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .medium-double-left-padding{padding-left:3em}html.no-flexbox .half-left-space,html.no-flexbox .medium-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .medium-half-left-space{margin-left:.75em}html.no-flexbox .half-left-padding,html.no-flexbox .medium-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .medium-half-left-padding{padding-left:.75em}html.no-flexbox .medium-quarter-left-space,html.no-flexbox .quarter-left-space,html.no-flexboxlegacy .medium-quarter-left-space,html.no-flexboxlegacy .quarter-left-space{margin-left:.375em}html.no-flexbox .medium-quarter-left-padding,html.no-flexbox .quarter-left-padding,html.no-flexboxlegacy .medium-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding{padding-left:.375em}html.no-flexbox .hide-medium,html.no-flexboxlegacy .hide-medium{display:none!important}html.no-flexbox .show-medium,html.no-flexboxlegacy .show-medium{display:inherit!important}html.no-flexbox table.show-medium,html.no-flexboxlegacy table.show-medium{display:table}html.no-flexbox thead.show-medium,html.no-flexboxlegacy thead.show-medium{display:table-header-group}html.no-flexbox tbody.show-medium,html.no-flexboxlegacy tbody.show-medium{display:table-row-group}html.no-flexbox tfoot.show-medium,html.no-flexboxlegacy tfoot.show-medium{display:table-footer-group}html.no-flexbox tr.show-medium,html.no-flexboxlegacy tr.show-medium{display:table-row}html.no-flexbox td.show-medium,html.no-flexbox th.show-medium,html.no-flexboxlegacy td.show-medium,html.no-flexboxlegacy th.show-medium{display:table-cell}}@media screen and (min-width:321px) and (max-width:640px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 1.25em}html.no-flexbox .column-group>[class*=small-],html.no-flexboxlegacy .column-group>[class*=small-]{float:left;clear:none}html.no-flexbox .small-5,html.no-flexboxlegacy .small-5{width:5%}html.no-flexbox .small-10,html.no-flexboxlegacy .small-10{width:10%}html.no-flexbox .small-15,html.no-flexboxlegacy .small-15{width:15%}html.no-flexbox .small-16,html.no-flexboxlegacy .small-16{width:16.66%}html.no-flexbox .small-20,html.no-flexboxlegacy .small-20{width:20%}html.no-flexbox .small-25,html.no-flexboxlegacy .small-25{width:25%}html.no-flexbox .small-30,html.no-flexboxlegacy .small-30{width:30%}html.no-flexbox .small-33,html.no-flexboxlegacy .small-33{width:33.33%}html.no-flexbox .small-35,html.no-flexboxlegacy .small-35{width:35%}html.no-flexbox .small-40,html.no-flexboxlegacy .small-40{width:40%}html.no-flexbox .small-45,html.no-flexboxlegacy .small-45{width:45%}html.no-flexbox .small-50,html.no-flexboxlegacy .small-50{width:50%}html.no-flexbox .small-55,html.no-flexboxlegacy .small-55{width:55%}html.no-flexbox .small-60,html.no-flexboxlegacy .small-60{width:60%}html.no-flexbox .small-65,html.no-flexboxlegacy .small-65{width:65%}html.no-flexbox .small-66,html.no-flexboxlegacy .small-66{width:66.66%}html.no-flexbox .small-70,html.no-flexboxlegacy .small-70{width:70%}html.no-flexbox .small-75,html.no-flexboxlegacy .small-75{width:75%}html.no-flexbox .small-80,html.no-flexboxlegacy .small-80{width:80%}html.no-flexbox .small-85,html.no-flexboxlegacy .small-85{width:85%}html.no-flexbox .small-90,html.no-flexboxlegacy .small-90{width:90%}html.no-flexbox .small-95,html.no-flexboxlegacy .small-95{width:95%}html.no-flexbox .small-100,html.no-flexboxlegacy .small-100{width:100%}html.no-flexbox [class*=small-100],html.no-flexboxlegacy [class*=small-100]{float:none;clear:both}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-1.25em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=small-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-1.25em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=small-]{padding-left:1.25em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=small-]{margin-bottom:1.25em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-2.5em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=small-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-2.5em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=small-]{padding-left:2.5em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-.625em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=small-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-.625em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=small-]{padding-left:.625em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=small-]{margin-bottom:.625em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.3125em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=small-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.3125em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}html.no-flexbox .column-group.small-gutters,html.no-flexboxlegacy .column-group.small-gutters{margin-left:-1.25em}html.no-flexbox .column-group.small-gutters>[class*=all-],html.no-flexbox .column-group.small-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}html.no-flexbox .column-group.small-horizontal-gutters,html.no-flexboxlegacy .column-group.small-horizontal-gutters{margin-left:-1.25em}html.no-flexbox .column-group.small-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.small-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-horizontal-gutters>[class*=small-]{padding-left:1.25em}html.no-flexbox .column-group.small-vertical-gutters>[class*=all-],html.no-flexbox .column-group.small-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-vertical-gutters>[class*=small-]{margin-bottom:1.25em}html.no-flexbox .column-group.small-double-gutters,html.no-flexboxlegacy .column-group.small-double-gutters{margin-left:-2.5em}html.no-flexbox .column-group.small-double-gutters>[class*=all-],html.no-flexbox .column-group.small-double-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}html.no-flexbox .column-group.small-double-horizontal-gutters,html.no-flexboxlegacy .column-group.small-double-horizontal-gutters{margin-left:-2.5em}html.no-flexbox .column-group.small-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.small-double-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-double-horizontal-gutters>[class*=small-]{padding-left:2.5em}html.no-flexbox .column-group.small-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.small-double-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}html.no-flexbox .column-group.small-half-gutters,html.no-flexboxlegacy .column-group.small-half-gutters{margin-left:-.625em}html.no-flexbox .column-group.small-half-gutters>[class*=all-],html.no-flexbox .column-group.small-half-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}html.no-flexbox .column-group.small-half-horizontal-gutters,html.no-flexboxlegacy .column-group.small-half-horizontal-gutters{margin-left:-.625em}html.no-flexbox .column-group.small-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.small-half-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-half-horizontal-gutters>[class*=small-]{padding-left:.625em}html.no-flexbox .column-group.small-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.small-half-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-half-vertical-gutters>[class*=small-]{margin-bottom:.625em}html.no-flexbox .column-group.small-quarter-gutters,html.no-flexboxlegacy .column-group.small-quarter-gutters{margin-left:-.3125em}html.no-flexbox .column-group.small-quarter-gutters>[class*=all-],html.no-flexbox .column-group.small-quarter-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}html.no-flexbox .column-group.small-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.small-quarter-horizontal-gutters{margin-left:-.3125em}html.no-flexbox .column-group.small-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.small-quarter-horizontal-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}html.no-flexbox .column-group.small-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.small-quarter-vertical-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}html.no-flexbox .column-group.small-no-gutters,html.no-flexboxlegacy .column-group.small-no-gutters{margin-left:0}html.no-flexbox .column-group.small-no-gutters>[class*=all-],html.no-flexbox .column-group.small-no-gutters>[class*=small-],html.no-flexboxlegacy .column-group.small-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.small-no-gutters>[class*=small-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=small-],html.no-flexbox .ink-table td[class*=small-],html.no-flexbox .ink-table tfoot[class*=small-],html.no-flexbox .ink-table th[class*=small-],html.no-flexbox .ink-table thead[class*=small-],html.no-flexbox .ink-table tr[class*=small-],html.no-flexboxlegacy .ink-table tbody[class*=small-],html.no-flexboxlegacy .ink-table td[class*=small-],html.no-flexboxlegacy .ink-table tfoot[class*=small-],html.no-flexboxlegacy .ink-table th[class*=small-],html.no-flexboxlegacy .ink-table thead[class*=small-],html.no-flexboxlegacy .ink-table tr[class*=small-]{float:none}html.no-flexbox .small-push-left,html.no-flexboxlegacy .small-push-left{float:left}html.no-flexbox .small-push-center,html.no-flexboxlegacy .small-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .small-push-right,html.no-flexboxlegacy .small-push-right{float:right}html.no-flexbox .small-align-left,html.no-flexboxlegacy .small-align-left{text-align:left}html.no-flexbox .small-align-center,html.no-flexboxlegacy .small-align-center{text-align:center}html.no-flexbox .small-align-right,html.no-flexboxlegacy .small-align-right{text-align:right}html.no-flexbox .small-no-margin,html.no-flexboxlegacy .small-no-margin{margin:0!important}html.no-flexbox .small-space,html.no-flexbox .space,html.no-flexboxlegacy .small-space,html.no-flexboxlegacy .space{margin:1.25em}html.no-flexbox .padding,html.no-flexbox .small-padding,html.no-flexboxlegacy .padding,html.no-flexboxlegacy .small-padding{padding:1.25em}html.no-flexbox .double-space,html.no-flexbox .small-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .small-double-space{margin:2.5em}html.no-flexbox .double-padding,html.no-flexbox .small-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .small-double-padding{padding:2.5em}html.no-flexbox .half-space,html.no-flexbox .small-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .small-half-space{margin:.625em}html.no-flexbox .half-padding,html.no-flexbox .small-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .small-half-padding{padding:.625em}html.no-flexbox .quarter-space,html.no-flexbox .small-quarter-space,html.no-flexboxlegacy .quarter-space,html.no-flexboxlegacy .small-quarter-space{margin:.3125em}html.no-flexbox .quarter-padding,html.no-flexbox .small-quarter-padding,html.no-flexboxlegacy .quarter-padding,html.no-flexboxlegacy .small-quarter-padding{padding:.3125em}html.no-flexbox .small-vertical-space,html.no-flexbox .vertical-space,html.no-flexboxlegacy .small-vertical-space,html.no-flexboxlegacy .vertical-space{margin-top:1.25em;margin-bottom:1.25em}html.no-flexbox .small-vertical-padding,html.no-flexbox .vertical-padding,html.no-flexboxlegacy .small-vertical-padding,html.no-flexboxlegacy .vertical-padding{padding-top:1.25em;padding-bottom:1.25em}html.no-flexbox .double-vertical-space,html.no-flexbox .small-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .small-double-vertical-space{margin-top:2.5em;margin-bottom:2.5em}html.no-flexbox .double-vertical-padding,html.no-flexbox .small-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .small-double-vertical-padding{padding-top:2.5em;padding-bottom:2.5em}html.no-flexbox .half-vertical-space,html.no-flexbox .small-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .small-half-vertical-space{margin-top:.625em;margin-bottom:.625em}html.no-flexbox .half-vertical-padding,html.no-flexbox .small-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .small-half-vertical-padding{padding-top:.625em;padding-bottom:.625em}html.no-flexbox .quarter-vertical-space,html.no-flexbox .small-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space,html.no-flexboxlegacy .small-quarter-vertical-space{margin-top:.3125em;margin-bottom:.3125em}html.no-flexbox .quarter-vertical-padding,html.no-flexbox .small-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding,html.no-flexboxlegacy .small-quarter-vertical-padding{padding-top:.3125em;padding-bottom:.3125em}html.no-flexbox .horizontal-space,html.no-flexbox .small-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .small-horizontal-space{margin-left:1.25em;margin-right:1.25em}html.no-flexbox .horizontal-padding,html.no-flexbox .small-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .small-horizontal-padding{padding-left:1.25em;padding-right:1.25em}html.no-flexbox .double-horizontal-space,html.no-flexbox .small-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .small-double-horizontal-space{margin-left:2.5em;margin-right:2.5em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .small-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .small-double-horizontal-padding{padding-left:2.5em;padding-right:2.5em}html.no-flexbox .half-horizontal-space,html.no-flexbox .small-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .small-half-horizontal-space{margin-left:.625em;margin-right:.625em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .small-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .small-half-horizontal-padding{padding-left:.625em;padding-right:.625em}html.no-flexbox .quarter-horizontal-space,html.no-flexbox .small-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space,html.no-flexboxlegacy .small-quarter-horizontal-space{margin-left:.3125em;margin-right:.3125em}html.no-flexbox .quarter-horizontal-padding,html.no-flexbox .small-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding,html.no-flexboxlegacy .small-quarter-horizontal-padding{padding-left:.3125em;padding-right:.3125em}html.no-flexbox .small-top-space,html.no-flexbox .top-space,html.no-flexboxlegacy .small-top-space,html.no-flexboxlegacy .top-space{margin-top:1.25em}html.no-flexbox .small-top-padding,html.no-flexbox .top-padding,html.no-flexboxlegacy .small-top-padding,html.no-flexboxlegacy .top-padding{padding-top:1.25em}html.no-flexbox .double-top-space,html.no-flexbox .small-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .small-double-top-space{margin-top:2.5em}html.no-flexbox .double-top-padding,html.no-flexbox .small-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .small-double-top-padding{padding-top:2.5em}html.no-flexbox .half-top-space,html.no-flexbox .small-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .small-half-top-space{margin-top:.625em}html.no-flexbox .half-top-padding,html.no-flexbox .small-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .small-half-top-padding{padding-top:.625em}html.no-flexbox .quarter-top-space,html.no-flexbox .small-quarter-top-space,html.no-flexboxlegacy .quarter-top-space,html.no-flexboxlegacy .small-quarter-top-space{margin-top:.3125em}html.no-flexbox .quarter-top-padding,html.no-flexbox .small-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding,html.no-flexboxlegacy .small-quarter-top-padding{padding-top:.3125em}html.no-flexbox .right-space,html.no-flexbox .small-right-space,html.no-flexboxlegacy .right-space,html.no-flexboxlegacy .small-right-space{margin-right:1.25em}html.no-flexbox .right-padding,html.no-flexbox .small-right-padding,html.no-flexboxlegacy .right-padding,html.no-flexboxlegacy .small-right-padding{padding-right:1.25em}html.no-flexbox .double-right-space,html.no-flexbox .small-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .small-double-right-space{margin-right:2.5em}html.no-flexbox .double-right-padding,html.no-flexbox .small-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .small-double-right-padding{padding-right:2.5em}html.no-flexbox .half-right-space,html.no-flexbox .small-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .small-half-right-space{margin-right:.625em}html.no-flexbox .half-right-padding,html.no-flexbox .small-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .small-half-right-padding{padding-right:.625em}html.no-flexbox .quarter-right-space,html.no-flexbox .small-quarter-right-space,html.no-flexboxlegacy .quarter-right-space,html.no-flexboxlegacy .small-quarter-right-space{margin-right:.3125em}html.no-flexbox .quarter-right-padding,html.no-flexbox .small-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding,html.no-flexboxlegacy .small-quarter-right-padding{padding-right:.3125em}html.no-flexbox .bottom-space,html.no-flexbox .small-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .small-bottom-space{margin-bottom:1.25em}html.no-flexbox .bottom-padding,html.no-flexbox .small-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .small-bottom-padding{padding-bottom:1.25em}html.no-flexbox .double-bottom-space,html.no-flexbox .small-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .small-double-bottom-space{margin-bottom:2.5em}html.no-flexbox .double-bottom-padding,html.no-flexbox .small-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .small-double-bottom-padding{padding-bottom:2.5em}html.no-flexbox .half-bottom-space,html.no-flexbox .small-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .small-half-bottom-space{margin-bottom:.625em}html.no-flexbox .half-bottom-padding,html.no-flexbox .small-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .small-half-bottom-padding{padding-bottom:.625em}html.no-flexbox .quarter-bottom-space,html.no-flexbox .small-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space,html.no-flexboxlegacy .small-quarter-bottom-space{margin-bottom:.3125em}html.no-flexbox .quarter-bottom-padding,html.no-flexbox .small-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding,html.no-flexboxlegacy .small-quarter-bottom-padding{padding-bottom:.3125em}html.no-flexbox .left-space,html.no-flexbox .small-left-space,html.no-flexboxlegacy .left-space,html.no-flexboxlegacy .small-left-space{margin-left:1.25em}html.no-flexbox .left-padding,html.no-flexbox .small-left-padding,html.no-flexboxlegacy .left-padding,html.no-flexboxlegacy .small-left-padding{padding-left:1.25em}html.no-flexbox .double-left-space,html.no-flexbox .small-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .small-double-left-space{margin-left:2.5em}html.no-flexbox .double-left-padding,html.no-flexbox .small-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .small-double-left-padding{padding-left:2.5em}html.no-flexbox .half-left-space,html.no-flexbox .small-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .small-half-left-space{margin-left:.625em}html.no-flexbox .half-left-padding,html.no-flexbox .small-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .small-half-left-padding{padding-left:.625em}html.no-flexbox .quarter-left-space,html.no-flexbox .small-quarter-left-space,html.no-flexboxlegacy .quarter-left-space,html.no-flexboxlegacy .small-quarter-left-space{margin-left:.3125em}html.no-flexbox .quarter-left-padding,html.no-flexbox .small-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding,html.no-flexboxlegacy .small-quarter-left-padding{padding-left:.3125em}html.no-flexbox .hide-small,html.no-flexboxlegacy .hide-small{display:none!important}html.no-flexbox .show-small,html.no-flexboxlegacy .show-small{display:inherit!important}html.no-flexbox table.show-small,html.no-flexboxlegacy table.show-small{display:table}html.no-flexbox thead.show-small,html.no-flexboxlegacy thead.show-small{display:table-header-group}html.no-flexbox tbody.show-small,html.no-flexboxlegacy tbody.show-small{display:table-row-group}html.no-flexbox tfoot.show-small,html.no-flexboxlegacy tfoot.show-small{display:table-footer-group}html.no-flexbox tr.show-small,html.no-flexboxlegacy tr.show-small{display:table-row}html.no-flexbox td.show-small,html.no-flexbox th.show-small,html.no-flexboxlegacy td.show-small,html.no-flexboxlegacy th.show-small{display:table-cell}}@media screen and (max-width:320px){html.no-flexbox .ink-grid,html.no-flexboxlegacy .ink-grid{padding:0 1em}html.no-flexbox .column-group>[class*=tiny-],html.no-flexboxlegacy .column-group>[class*=tiny-]{float:left;clear:none}html.no-flexbox .tiny-5,html.no-flexboxlegacy .tiny-5{width:5%}html.no-flexbox .tiny-10,html.no-flexboxlegacy .tiny-10{width:10%}html.no-flexbox .tiny-15,html.no-flexboxlegacy .tiny-15{width:15%}html.no-flexbox .tiny-16,html.no-flexboxlegacy .tiny-16{width:16.66%}html.no-flexbox .tiny-20,html.no-flexboxlegacy .tiny-20{width:20%}html.no-flexbox .tiny-25,html.no-flexboxlegacy .tiny-25{width:25%}html.no-flexbox .tiny-30,html.no-flexboxlegacy .tiny-30{width:30%}html.no-flexbox .tiny-33,html.no-flexboxlegacy .tiny-33{width:33.33%}html.no-flexbox .tiny-35,html.no-flexboxlegacy .tiny-35{width:35%}html.no-flexbox .tiny-40,html.no-flexboxlegacy .tiny-40{width:40%}html.no-flexbox .tiny-45,html.no-flexboxlegacy .tiny-45{width:45%}html.no-flexbox .tiny-50,html.no-flexboxlegacy .tiny-50{width:50%}html.no-flexbox .tiny-55,html.no-flexboxlegacy .tiny-55{width:55%}html.no-flexbox .tiny-60,html.no-flexboxlegacy .tiny-60{width:60%}html.no-flexbox .tiny-65,html.no-flexboxlegacy .tiny-65{width:65%}html.no-flexbox .tiny-66,html.no-flexboxlegacy .tiny-66{width:66.66%}html.no-flexbox .tiny-70,html.no-flexboxlegacy .tiny-70{width:70%}html.no-flexbox .tiny-75,html.no-flexboxlegacy .tiny-75{width:75%}html.no-flexbox .tiny-80,html.no-flexboxlegacy .tiny-80{width:80%}html.no-flexbox .tiny-85,html.no-flexboxlegacy .tiny-85{width:85%}html.no-flexbox .tiny-90,html.no-flexboxlegacy .tiny-90{width:90%}html.no-flexbox .tiny-95,html.no-flexboxlegacy .tiny-95{width:95%}html.no-flexbox .tiny-100,html.no-flexboxlegacy .tiny-100{width:100%}html.no-flexbox [class*=tiny-100],html.no-flexboxlegacy [class*=tiny-100]{float:none;clear:both}html.no-flexbox .column-group:after,html.no-flexboxlegacy .column-group:after{content:"";display:table;clear:both}html.no-flexbox .column-group.gutters,html.no-flexboxlegacy .column-group.gutters{margin-left:-1em}html.no-flexbox .column-group.gutters>[class*=all-],html.no-flexbox .column-group.gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.gutters>[class*=all-],html.no-flexboxlegacy .column-group.gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}html.no-flexbox .column-group.horizontal-gutters,html.no-flexboxlegacy .column-group.horizontal-gutters{margin-left:-1em}html.no-flexbox .column-group.horizontal-gutters>[class*=all-],html.no-flexbox .column-group.horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.horizontal-gutters>[class*=tiny-]{padding-left:1em}html.no-flexbox .column-group.vertical-gutters>[class*=all-],html.no-flexbox .column-group.vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.vertical-gutters>[class*=tiny-]{margin-bottom:1em}html.no-flexbox .column-group.double-gutters,html.no-flexboxlegacy .column-group.double-gutters{margin-left:-2em}html.no-flexbox .column-group.double-gutters>[class*=all-],html.no-flexbox .column-group.double-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}html.no-flexbox .column-group.double-horizontal-gutters,html.no-flexboxlegacy .column-group.double-horizontal-gutters{margin-left:-2em}html.no-flexbox .column-group.double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.double-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-horizontal-gutters>[class*=tiny-]{padding-left:2em}html.no-flexbox .column-group.double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.double-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}html.no-flexbox .column-group.half-gutters,html.no-flexboxlegacy .column-group.half-gutters{margin-left:-.5em}html.no-flexbox .column-group.half-gutters>[class*=all-],html.no-flexbox .column-group.half-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}html.no-flexbox .column-group.half-horizontal-gutters,html.no-flexboxlegacy .column-group.half-horizontal-gutters{margin-left:-.5em}html.no-flexbox .column-group.half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.half-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}html.no-flexbox .column-group.half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.half-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}html.no-flexbox .column-group.quarter-gutters,html.no-flexboxlegacy .column-group.quarter-gutters{margin-left:-.25em}html.no-flexbox .column-group.quarter-gutters>[class*=all-],html.no-flexbox .column-group.quarter-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}html.no-flexbox .column-group.quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.quarter-horizontal-gutters{margin-left:-.25em}html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.quarter-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}html.no-flexbox .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.quarter-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}html.no-flexbox .column-group.tiny-gutters,html.no-flexboxlegacy .column-group.tiny-gutters{margin-left:-1em}html.no-flexbox .column-group.tiny-gutters>[class*=all-],html.no-flexbox .column-group.tiny-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}html.no-flexbox .column-group.tiny-horizontal-gutters,html.no-flexboxlegacy .column-group.tiny-horizontal-gutters{margin-left:-1em}html.no-flexbox .column-group.tiny-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.tiny-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-horizontal-gutters>[class*=tiny-]{padding-left:1em}html.no-flexbox .column-group.tiny-vertical-gutters>[class*=all-],html.no-flexbox .column-group.tiny-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-vertical-gutters>[class*=tiny-]{margin-bottom:1em}html.no-flexbox .column-group.tiny-double-gutters,html.no-flexboxlegacy .column-group.tiny-double-gutters{margin-left:-2em}html.no-flexbox .column-group.tiny-double-gutters>[class*=all-],html.no-flexbox .column-group.tiny-double-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-double-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}html.no-flexbox .column-group.tiny-double-horizontal-gutters,html.no-flexboxlegacy .column-group.tiny-double-horizontal-gutters{margin-left:-2em}html.no-flexbox .column-group.tiny-double-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.tiny-double-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-double-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-double-horizontal-gutters>[class*=tiny-]{padding-left:2em}html.no-flexbox .column-group.tiny-double-vertical-gutters>[class*=all-],html.no-flexbox .column-group.tiny-double-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-double-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}html.no-flexbox .column-group.tiny-half-gutters,html.no-flexboxlegacy .column-group.tiny-half-gutters{margin-left:-.5em}html.no-flexbox .column-group.tiny-half-gutters>[class*=all-],html.no-flexbox .column-group.tiny-half-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-half-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}html.no-flexbox .column-group.tiny-half-horizontal-gutters,html.no-flexboxlegacy .column-group.tiny-half-horizontal-gutters{margin-left:-.5em}html.no-flexbox .column-group.tiny-half-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.tiny-half-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-half-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}html.no-flexbox .column-group.tiny-half-vertical-gutters>[class*=all-],html.no-flexbox .column-group.tiny-half-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-half-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}html.no-flexbox .column-group.tiny-quarter-gutters,html.no-flexboxlegacy .column-group.tiny-quarter-gutters{margin-left:-.25em}html.no-flexbox .column-group.tiny-quarter-gutters>[class*=all-],html.no-flexbox .column-group.tiny-quarter-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-quarter-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}html.no-flexbox .column-group.tiny-quarter-horizontal-gutters,html.no-flexboxlegacy .column-group.tiny-quarter-horizontal-gutters{margin-left:-.25em}html.no-flexbox .column-group.tiny-quarter-horizontal-gutters>[class*=all-],html.no-flexbox .column-group.tiny-quarter-horizontal-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-quarter-horizontal-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}html.no-flexbox .column-group.tiny-quarter-vertical-gutters>[class*=all-],html.no-flexbox .column-group.tiny-quarter-vertical-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-quarter-vertical-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}html.no-flexbox .column-group.tiny-no-gutters,html.no-flexboxlegacy .column-group.tiny-no-gutters{margin-left:0}html.no-flexbox .column-group.tiny-no-gutters>[class*=all-],html.no-flexbox .column-group.tiny-no-gutters>[class*=tiny-],html.no-flexboxlegacy .column-group.tiny-no-gutters>[class*=all-],html.no-flexboxlegacy .column-group.tiny-no-gutters>[class*=tiny-]{padding-left:0;margin-bottom:0}html.no-flexbox .ink-table tbody[class*=tiny-],html.no-flexbox .ink-table td[class*=tiny-],html.no-flexbox .ink-table tfoot[class*=tiny-],html.no-flexbox .ink-table th[class*=tiny-],html.no-flexbox .ink-table thead[class*=tiny-],html.no-flexbox .ink-table tr[class*=tiny-],html.no-flexboxlegacy .ink-table tbody[class*=tiny-],html.no-flexboxlegacy .ink-table td[class*=tiny-],html.no-flexboxlegacy .ink-table tfoot[class*=tiny-],html.no-flexboxlegacy .ink-table th[class*=tiny-],html.no-flexboxlegacy .ink-table thead[class*=tiny-],html.no-flexboxlegacy .ink-table tr[class*=tiny-]{float:none}html.no-flexbox .tiny-push-left,html.no-flexboxlegacy .tiny-push-left{float:left}html.no-flexbox .tiny-push-center,html.no-flexboxlegacy .tiny-push-center{float:none;margin-left:auto;margin-right:auto}html.no-flexbox .tiny-push-right,html.no-flexboxlegacy .tiny-push-right{float:right}html.no-flexbox .tiny-align-left,html.no-flexboxlegacy .tiny-align-left{text-align:left}html.no-flexbox .tiny-align-center,html.no-flexboxlegacy .tiny-align-center{text-align:center}html.no-flexbox .tiny-align-right,html.no-flexboxlegacy .tiny-align-right{text-align:right}html.no-flexbox .tiny-no-margin,html.no-flexboxlegacy .tiny-no-margin{margin:0!important}html.no-flexbox .space,html.no-flexbox .tiny-space,html.no-flexboxlegacy .space,html.no-flexboxlegacy .tiny-space{margin:1em}html.no-flexbox .padding,html.no-flexbox .tiny-padding,html.no-flexboxlegacy .padding,html.no-flexboxlegacy .tiny-padding{padding:1em}html.no-flexbox .double-space,html.no-flexbox .tiny-double-space,html.no-flexboxlegacy .double-space,html.no-flexboxlegacy .tiny-double-space{margin:2em}html.no-flexbox .double-padding,html.no-flexbox .tiny-double-padding,html.no-flexboxlegacy .double-padding,html.no-flexboxlegacy .tiny-double-padding{padding:2em}html.no-flexbox .half-space,html.no-flexbox .tiny-half-space,html.no-flexboxlegacy .half-space,html.no-flexboxlegacy .tiny-half-space{margin:.5em}html.no-flexbox .half-padding,html.no-flexbox .tiny-half-padding,html.no-flexboxlegacy .half-padding,html.no-flexboxlegacy .tiny-half-padding{padding:.5em}html.no-flexbox .quarter-space,html.no-flexbox .tiny-quarter-space,html.no-flexboxlegacy .quarter-space,html.no-flexboxlegacy .tiny-quarter-space{margin:.25em}html.no-flexbox .quarter-padding,html.no-flexbox .tiny-quarter-padding,html.no-flexboxlegacy .quarter-padding,html.no-flexboxlegacy .tiny-quarter-padding{padding:.25em}html.no-flexbox .tiny-vertical-space,html.no-flexbox .vertical-space,html.no-flexboxlegacy .tiny-vertical-space,html.no-flexboxlegacy .vertical-space{margin-top:1em;margin-bottom:1em}html.no-flexbox .tiny-vertical-padding,html.no-flexbox .vertical-padding,html.no-flexboxlegacy .tiny-vertical-padding,html.no-flexboxlegacy .vertical-padding{padding-top:1em;padding-bottom:1em}html.no-flexbox .double-vertical-space,html.no-flexbox .tiny-double-vertical-space,html.no-flexboxlegacy .double-vertical-space,html.no-flexboxlegacy .tiny-double-vertical-space{margin-top:2em;margin-bottom:2em}html.no-flexbox .double-vertical-padding,html.no-flexbox .tiny-double-vertical-padding,html.no-flexboxlegacy .double-vertical-padding,html.no-flexboxlegacy .tiny-double-vertical-padding{padding-top:2em;padding-bottom:2em}html.no-flexbox .half-vertical-space,html.no-flexbox .tiny-half-vertical-space,html.no-flexboxlegacy .half-vertical-space,html.no-flexboxlegacy .tiny-half-vertical-space{margin-top:.5em;margin-bottom:.5em}html.no-flexbox .half-vertical-padding,html.no-flexbox .tiny-half-vertical-padding,html.no-flexboxlegacy .half-vertical-padding,html.no-flexboxlegacy .tiny-half-vertical-padding{padding-top:.5em;padding-bottom:.5em}html.no-flexbox .quarter-vertical-space,html.no-flexbox .tiny-quarter-vertical-space,html.no-flexboxlegacy .quarter-vertical-space,html.no-flexboxlegacy .tiny-quarter-vertical-space{margin-top:.25em;margin-bottom:.25em}html.no-flexbox .quarter-vertical-padding,html.no-flexbox .tiny-quarter-vertical-padding,html.no-flexboxlegacy .quarter-vertical-padding,html.no-flexboxlegacy .tiny-quarter-vertical-padding{padding-top:.25em;padding-bottom:.25em}html.no-flexbox .horizontal-space,html.no-flexbox .tiny-horizontal-space,html.no-flexboxlegacy .horizontal-space,html.no-flexboxlegacy .tiny-horizontal-space{margin-left:1em;margin-right:1em}html.no-flexbox .horizontal-padding,html.no-flexbox .tiny-horizontal-padding,html.no-flexboxlegacy .horizontal-padding,html.no-flexboxlegacy .tiny-horizontal-padding{padding-left:1em;padding-right:1em}html.no-flexbox .double-horizontal-space,html.no-flexbox .tiny-double-horizontal-space,html.no-flexboxlegacy .double-horizontal-space,html.no-flexboxlegacy .tiny-double-horizontal-space{margin-left:2em;margin-right:2em}html.no-flexbox .double-horizontal-padding,html.no-flexbox .tiny-double-horizontal-padding,html.no-flexboxlegacy .double-horizontal-padding,html.no-flexboxlegacy .tiny-double-horizontal-padding{padding-left:2em;padding-right:2em}html.no-flexbox .half-horizontal-space,html.no-flexbox .tiny-half-horizontal-space,html.no-flexboxlegacy .half-horizontal-space,html.no-flexboxlegacy .tiny-half-horizontal-space{margin-left:.5em;margin-right:.5em}html.no-flexbox .half-horizontal-padding,html.no-flexbox .tiny-half-horizontal-padding,html.no-flexboxlegacy .half-horizontal-padding,html.no-flexboxlegacy .tiny-half-horizontal-padding{padding-left:.5em;padding-right:.5em}html.no-flexbox .quarter-horizontal-space,html.no-flexbox .tiny-quarter-horizontal-space,html.no-flexboxlegacy .quarter-horizontal-space,html.no-flexboxlegacy .tiny-quarter-horizontal-space{margin-left:.25em;margin-right:.25em}html.no-flexbox .quarter-horizontal-padding,html.no-flexbox .tiny-quarter-horizontal-padding,html.no-flexboxlegacy .quarter-horizontal-padding,html.no-flexboxlegacy .tiny-quarter-horizontal-padding{padding-left:.25em;padding-right:.25em}html.no-flexbox .tiny-top-space,html.no-flexbox .top-space,html.no-flexboxlegacy .tiny-top-space,html.no-flexboxlegacy .top-space{margin-top:1em}html.no-flexbox .tiny-top-padding,html.no-flexbox .top-padding,html.no-flexboxlegacy .tiny-top-padding,html.no-flexboxlegacy .top-padding{padding-top:1em}html.no-flexbox .double-top-space,html.no-flexbox .tiny-double-top-space,html.no-flexboxlegacy .double-top-space,html.no-flexboxlegacy .tiny-double-top-space{margin-top:2em}html.no-flexbox .double-top-padding,html.no-flexbox .tiny-double-top-padding,html.no-flexboxlegacy .double-top-padding,html.no-flexboxlegacy .tiny-double-top-padding{padding-top:2em}html.no-flexbox .half-top-space,html.no-flexbox .tiny-half-top-space,html.no-flexboxlegacy .half-top-space,html.no-flexboxlegacy .tiny-half-top-space{margin-top:.5em}html.no-flexbox .half-top-padding,html.no-flexbox .tiny-half-top-padding,html.no-flexboxlegacy .half-top-padding,html.no-flexboxlegacy .tiny-half-top-padding{padding-top:.5em}html.no-flexbox .quarter-top-space,html.no-flexbox .tiny-quarter-top-space,html.no-flexboxlegacy .quarter-top-space,html.no-flexboxlegacy .tiny-quarter-top-space{margin-top:.25em}html.no-flexbox .quarter-top-padding,html.no-flexbox .tiny-quarter-top-padding,html.no-flexboxlegacy .quarter-top-padding,html.no-flexboxlegacy .tiny-quarter-top-padding{padding-top:.25em}html.no-flexbox .right-space,html.no-flexbox .tiny-right-space,html.no-flexboxlegacy .right-space,html.no-flexboxlegacy .tiny-right-space{margin-right:1em}html.no-flexbox .right-padding,html.no-flexbox .tiny-right-padding,html.no-flexboxlegacy .right-padding,html.no-flexboxlegacy .tiny-right-padding{padding-right:1em}html.no-flexbox .double-right-space,html.no-flexbox .tiny-double-right-space,html.no-flexboxlegacy .double-right-space,html.no-flexboxlegacy .tiny-double-right-space{margin-right:2em}html.no-flexbox .double-right-padding,html.no-flexbox .tiny-double-right-padding,html.no-flexboxlegacy .double-right-padding,html.no-flexboxlegacy .tiny-double-right-padding{padding-right:2em}html.no-flexbox .half-right-space,html.no-flexbox .tiny-half-right-space,html.no-flexboxlegacy .half-right-space,html.no-flexboxlegacy .tiny-half-right-space{margin-right:.5em}html.no-flexbox .half-right-padding,html.no-flexbox .tiny-half-right-padding,html.no-flexboxlegacy .half-right-padding,html.no-flexboxlegacy .tiny-half-right-padding{padding-right:.5em}html.no-flexbox .quarter-right-space,html.no-flexbox .tiny-quarter-right-space,html.no-flexboxlegacy .quarter-right-space,html.no-flexboxlegacy .tiny-quarter-right-space{margin-right:.25em}html.no-flexbox .quarter-right-padding,html.no-flexbox .tiny-quarter-right-padding,html.no-flexboxlegacy .quarter-right-padding,html.no-flexboxlegacy .tiny-quarter-right-padding{padding-right:.25em}html.no-flexbox .bottom-space,html.no-flexbox .tiny-bottom-space,html.no-flexboxlegacy .bottom-space,html.no-flexboxlegacy .tiny-bottom-space{margin-bottom:1em}html.no-flexbox .bottom-padding,html.no-flexbox .tiny-bottom-padding,html.no-flexboxlegacy .bottom-padding,html.no-flexboxlegacy .tiny-bottom-padding{padding-bottom:1em}html.no-flexbox .double-bottom-space,html.no-flexbox .tiny-double-bottom-space,html.no-flexboxlegacy .double-bottom-space,html.no-flexboxlegacy .tiny-double-bottom-space{margin-bottom:2em}html.no-flexbox .double-bottom-padding,html.no-flexbox .tiny-double-bottom-padding,html.no-flexboxlegacy .double-bottom-padding,html.no-flexboxlegacy .tiny-double-bottom-padding{padding-bottom:2em}html.no-flexbox .half-bottom-space,html.no-flexbox .tiny-half-bottom-space,html.no-flexboxlegacy .half-bottom-space,html.no-flexboxlegacy .tiny-half-bottom-space{margin-bottom:.5em}html.no-flexbox .half-bottom-padding,html.no-flexbox .tiny-half-bottom-padding,html.no-flexboxlegacy .half-bottom-padding,html.no-flexboxlegacy .tiny-half-bottom-padding{padding-bottom:.5em}html.no-flexbox .quarter-bottom-space,html.no-flexbox .tiny-quarter-bottom-space,html.no-flexboxlegacy .quarter-bottom-space,html.no-flexboxlegacy .tiny-quarter-bottom-space{margin-bottom:.25em}html.no-flexbox .quarter-bottom-padding,html.no-flexbox .tiny-quarter-bottom-padding,html.no-flexboxlegacy .quarter-bottom-padding,html.no-flexboxlegacy .tiny-quarter-bottom-padding{padding-bottom:.25em}html.no-flexbox .left-space,html.no-flexbox .tiny-left-space,html.no-flexboxlegacy .left-space,html.no-flexboxlegacy .tiny-left-space{margin-left:1em}html.no-flexbox .left-padding,html.no-flexbox .tiny-left-padding,html.no-flexboxlegacy .left-padding,html.no-flexboxlegacy .tiny-left-padding{padding-left:1em}html.no-flexbox .double-left-space,html.no-flexbox .tiny-double-left-space,html.no-flexboxlegacy .double-left-space,html.no-flexboxlegacy .tiny-double-left-space{margin-left:2em}html.no-flexbox .double-left-padding,html.no-flexbox .tiny-double-left-padding,html.no-flexboxlegacy .double-left-padding,html.no-flexboxlegacy .tiny-double-left-padding{padding-left:2em}html.no-flexbox .half-left-space,html.no-flexbox .tiny-half-left-space,html.no-flexboxlegacy .half-left-space,html.no-flexboxlegacy .tiny-half-left-space{margin-left:.5em}html.no-flexbox .half-left-padding,html.no-flexbox .tiny-half-left-padding,html.no-flexboxlegacy .half-left-padding,html.no-flexboxlegacy .tiny-half-left-padding{padding-left:.5em}html.no-flexbox .quarter-left-space,html.no-flexbox .tiny-quarter-left-space,html.no-flexboxlegacy .quarter-left-space,html.no-flexboxlegacy .tiny-quarter-left-space{margin-left:.25em}html.no-flexbox .quarter-left-padding,html.no-flexbox .tiny-quarter-left-padding,html.no-flexboxlegacy .quarter-left-padding,html.no-flexboxlegacy .tiny-quarter-left-padding{padding-left:.25em}html.no-flexbox .hide-tiny,html.no-flexboxlegacy .hide-tiny{display:none!important}html.no-flexbox .show-tiny,html.no-flexboxlegacy .show-tiny{display:inherit!important}html.no-flexbox table.show-tiny,html.no-flexboxlegacy table.show-tiny{display:table}html.no-flexbox thead.show-tiny,html.no-flexboxlegacy thead.show-tiny{display:table-header-group}html.no-flexbox tbody.show-tiny,html.no-flexboxlegacy tbody.show-tiny{display:table-row-group}html.no-flexbox tfoot.show-tiny,html.no-flexboxlegacy tfoot.show-tiny{display:table-footer-group}html.no-flexbox tr.show-tiny,html.no-flexboxlegacy tr.show-tiny{display:table-row}html.no-flexbox td.show-tiny,html.no-flexbox th.show-tiny,html.no-flexboxlegacy td.show-tiny,html.no-flexboxlegacy th.show-tiny{display:table-cell}}html.no-flexbox:after,html.no-flexboxlegacy:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}html.no-flexbox .ink-carousel,html.no-flexboxlegacy .ink-carousel{width:100%;position:relative;overflow:hidden;display:block}html.no-flexbox .ink-carousel .stage,html.no-flexboxlegacy .ink-carousel .stage{width:100%;left:0;height:auto!important;margin-top:0;margin-bottom:0;padding-left:0;list-style-type:none;white-space:nowrap;position:relative;-webkit-transition:left .5s ease;-moz-transition:left .5s ease;-o-transition:left .5s ease;transition:left .5s ease}html.no-flexbox .ink-carousel .stage .slide,html.no-flexboxlegacy .ink-carousel .stage .slide{position:relative;display:inline-block;vertical-align:top;white-space:normal;margin:0;float:none;zoom:1}html.no-flexbox .ink-carousel .ink-navigation,html.no-flexboxlegacy .ink-carousel .ink-navigation{position:static}@media print{*{background:0 0!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.ink-navigation{display:none}.ink-table{border-collapse:collapse}.ink-label{border:1px solid #000}} \ No newline at end of file diff --git a/dist/css/ink.css b/dist/css/ink.css index 4d897884b..75c8d80de 100644 --- a/dist/css/ink.css +++ b/dist/css/ink.css @@ -647,180 +647,158 @@ th { @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-thin-webfont.eot'); - src: url('../fonts/Roboto/roboto-thin-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-thin-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-thin-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-thin-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-thin-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-thin-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-thin-webfont.ttf?1423657803') format('truetype'); font-weight: 100; font-style: normal; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-thinitalic-webfont.eot'); - src: url('../fonts/Roboto/roboto-thinitalic-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-thinitalic-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-thinitalic-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-thinitalic-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-thinitalic-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-thinitalic-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-thinitalic-webfont.ttf?1423657803') format('truetype'); font-weight: 100; font-style: italic; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-light-webfont.eot'); - src: url('../fonts/Roboto/roboto-light-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-light-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-light-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-light-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-light-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-light-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-light-webfont.ttf?1423657803') format('truetype'); font-weight: 300; font-style: normal; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-lightitalic-webfont.eot'); - src: url('../fonts/Roboto/roboto-lightitalic-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-lightitalic-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-lightitalic-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-lightitalic-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-lightitalic-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-lightitalic-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-lightitalic-webfont.ttf?1423657803') format('truetype'); font-weight: 300; font-style: italic; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-regular-webfont.eot'); - src: url('../fonts/Roboto/roboto-regular-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-regular-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-regular-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-regular-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-regular-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-regular-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-regular-webfont.ttf?1423657803') format('truetype'); font-weight: 400; font-style: normal; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-italic-webfont.eot'); - src: url('../fonts/Roboto/roboto-italic-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-italic-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-italic-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-italic-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-italic-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-italic-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-italic-webfont.ttf?1423657803') format('truetype'); font-weight: 400; font-style: italic; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-medium-webfont.eot'); - src: url('../fonts/Roboto/roboto-medium-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-medium-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-medium-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-medium-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-medium-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-medium-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-medium-webfont.ttf?1423657803') format('truetype'); font-weight: 500; font-style: normal; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-mediumitalic-webfont.eot'); - src: url('../fonts/Roboto/roboto-mediumitalic-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-mediumitalic-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-mediumitalic-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-mediumitalic-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-mediumitalic-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-mediumitalic-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-mediumitalic-webfont.ttf?1423657803') format('truetype'); font-weight: 500; font-style: italic; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-bold-webfont.eot'); - src: url('../fonts/Roboto/roboto-bold-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-bold-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-bold-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-bold-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-bold-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-bold-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-bold-webfont.ttf?1423657803') format('truetype'); font-weight: 700; font-style: normal; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-bolditalic-webfont.eot'); - src: url('../fonts/Roboto/roboto-bolditalic-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-bolditalic-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-bolditalic-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-bolditalic-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-bolditalic-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-bolditalic-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-bolditalic-webfont.ttf?1423657803') format('truetype'); font-weight: 700; font-style: italic; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-black-webfont.eot'); - src: url('../fonts/Roboto/roboto-black-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-black-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-black-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-black-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-black-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-black-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-black-webfont.ttf?1423657803') format('truetype'); font-weight: 900; font-style: normal; } - @font-face { font-family: "Roboto"; - src: url('../fonts/Roboto/roboto-blackitalic-webfont.eot'); - src: url('../fonts/Roboto/roboto-blackitalic-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-blackitalic-webfont.woff') format('woff'), url('../fonts/Roboto/roboto-blackitalic-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto/roboto-blackitalic-webfont.eot?1423657803'); + src: url('../fonts/Roboto/roboto-blackitalic-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto/roboto-blackitalic-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto/roboto-blackitalic-webfont.ttf?1423657803') format('truetype'); font-weight: 900; font-style: italic; } - @font-face { font-family: "Roboto_condensed"; - src: url('../fonts/Roboto_condensed/robotocondensed-light-webfont.eot'); - src: url('../fonts/Roboto_condensed/robotocondensed-light-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-light-webfont.woff') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-light-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_condensed/robotocondensed-light-webfont.eot?1423657803'); + src: url('../fonts/Roboto_condensed/robotocondensed-light-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-light-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-light-webfont.ttf?1423657803') format('truetype'); font-weight: 300; font-style: normal; } - @font-face { font-family: "Roboto_condensed"; - src: url('../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot'); - src: url('../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.woff') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot?1423657803'); + src: url('../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.ttf?1423657803') format('truetype'); font-weight: 300; font-style: italic; } - @font-face { font-family: "Roboto_condensed"; - src: url('../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot'); - src: url('../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-regular-webfont.woff') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-regular-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot?1423657803'); + src: url('../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-regular-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-regular-webfont.ttf?1423657803') format('truetype'); font-weight: 400; font-style: normal; } - @font-face { font-family: "Roboto_condensed"; - src: url('../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot'); - src: url('../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-italic-webfont.woff') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-italic-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot?1423657803'); + src: url('../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-italic-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-italic-webfont.ttf?1423657803') format('truetype'); font-weight: 400; font-style: italic; } - @font-face { font-family: "Roboto_condensed"; - src: url('../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot'); - src: url('../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-bold-webfont.woff') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-bold-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot?1423657803'); + src: url('../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-bold-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-bold-webfont.ttf?1423657803') format('truetype'); font-weight: 700; font-style: normal; } - @font-face { font-family: "Roboto_condensed"; - src: url('../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot'); - src: url('../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.woff') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot?1423657803'); + src: url('../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot?&1423657803#iefix') format('embedded-opentype'), url('../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.woff?1423657803') format('woff'), url('../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.ttf?1423657803') format('truetype'); font-weight: 700; font-style: italic; } - @font-face { font-family: "Roboto_slab"; - src: url('../fonts/Roboto_slab/robotoslab-thin-webfont.eot'); - src: url('../fonts/Roboto_slab/robotoslab-thin-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_slab/robotoslab-thin-webfont.woff') format('woff'), url('../fonts/Roboto_slab/robotoslab-thin-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_slab/robotoslab-thin-webfont.eot?1408628222'); + src: url('../fonts/Roboto_slab/robotoslab-thin-webfont.eot?&1408628222#iefix') format('embedded-opentype'), url('../fonts/Roboto_slab/robotoslab-thin-webfont.woff?1408628222') format('woff'), url('../fonts/Roboto_slab/robotoslab-thin-webfont.ttf?1408628222') format('truetype'); font-weight: 100; font-style: normal; } - @font-face { font-family: "Roboto_slab"; - src: url('../fonts/Roboto_slab/robotoslab-light-webfont.eot'); - src: url('../fonts/Roboto_slab/robotoslab-light-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_slab/robotoslab-light-webfont.woff') format('woff'), url('../fonts/Roboto_slab/robotoslab-light-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_slab/robotoslab-light-webfont.eot?1408628222'); + src: url('../fonts/Roboto_slab/robotoslab-light-webfont.eot?&1408628222#iefix') format('embedded-opentype'), url('../fonts/Roboto_slab/robotoslab-light-webfont.woff?1408628222') format('woff'), url('../fonts/Roboto_slab/robotoslab-light-webfont.ttf?1408628222') format('truetype'); font-weight: 300; font-style: normal; } - @font-face { font-family: "Roboto_slab"; - src: url('../fonts/Roboto_slab/robotoslab-regular-webfont.eot'); - src: url('../fonts/Roboto_slab/robotoslab-regular-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_slab/robotoslab-regular-webfont.woff') format('woff'), url('../fonts/Roboto_slab/robotoslab-regular-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_slab/robotoslab-regular-webfont.eot?1408628222'); + src: url('../fonts/Roboto_slab/robotoslab-regular-webfont.eot?&1408628222#iefix') format('embedded-opentype'), url('../fonts/Roboto_slab/robotoslab-regular-webfont.woff?1408628222') format('woff'), url('../fonts/Roboto_slab/robotoslab-regular-webfont.ttf?1408628222') format('truetype'); font-weight: 400; font-style: normal; } - @font-face { font-family: "Roboto_slab"; - src: url('../fonts/Roboto_slab/robotoslab-bold-webfont.eot'); - src: url('../fonts/Roboto_slab/robotoslab-bold-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/Roboto_slab/robotoslab-bold-webfont.woff') format('woff'), url('../fonts/Roboto_slab/robotoslab-bold-webfont.ttf') format('truetype'); + src: url('../fonts/Roboto_slab/robotoslab-bold-webfont.eot?1408628222'); + src: url('../fonts/Roboto_slab/robotoslab-bold-webfont.eot?&1408628222#iefix') format('embedded-opentype'), url('../fonts/Roboto_slab/robotoslab-bold-webfont.woff?1408628222') format('woff'), url('../fonts/Roboto_slab/robotoslab-bold-webfont.ttf?1408628222') format('truetype'); font-weight: 700; font-style: normal; } - .ink-form fieldset { border: none; margin-bottom: 1.5em; @@ -846,7 +824,7 @@ th { .ink-form p.label { padding: 0; margin: 0; - color: #555555; + color: #555; white-space: normal; } .ink-form select, @@ -875,7 +853,7 @@ th { padding: 8px 6px; border: 1px solid #c6c6c6; resize: none; - background: white; + background: #FFF; vertical-align: middle; } .ink-form select:focus, @@ -928,7 +906,7 @@ th { border-radius: 2px; padding: 6px; border: 1px solid #c6c6c6; - background: white; + background: #FFF; vertical-align: middle; line-height: 1.2; } @@ -1110,7 +1088,7 @@ th { color: rgba(204, 125, 0, 0.6); } .ink-form .control-group.required label, .ink-form .control-group.required p.label { - color: #555555; + color: #555; } .ink-form .control-group.required label:after, .ink-form .control-group.required p.label:after { content: "\f069"; @@ -5488,7 +5466,7 @@ th { .ink-navigation ul.dropdown { position: absolute; top: 110%; - background: white; + background: #fff; z-index: 30; border: 1px solid #d9d9d9; height: auto; @@ -5579,7 +5557,7 @@ th { .ink-navigation ul.dropdown-menu li.active a, .ink-navigation ul.dropdown li.active a { background: #999999; - color: white; + color: #fff; } .ink-dropdown ul.dropdown-menu li.disabled a, .ink-dropdown ul.dropdown li.disabled a, @@ -5972,7 +5950,7 @@ html { } body { - color: #555555; + color: #555; font-family: "Roboto", Arial, Helvetica, sans-serif; line-height: 1.45; } @@ -6077,61 +6055,61 @@ body { } a { - color: #6998c9; + color: #6998C9; text-decoration: none; cursor: pointer; } a:hover { - color: #007ed5; + color: #007ED5; text-decoration: underline; } h1 { font-size: 2.2em; margin-top: 0; - margin-bottom: 0.57539em; + margin-bottom: 0.59318em; } h2 { font-size: 1.75em; margin-top: 0; - margin-bottom: 0.72334em; + margin-bottom: 0.74571em; } h3 { font-size: 1.5em; margin-top: 0; - margin-bottom: 0.8439em; + margin-bottom: 0.87em; } h4 { font-size: 1.25em; margin-top: 0; - margin-bottom: 1.01268em; + margin-bottom: 1.044em; } h5 { font-size: 1.1em; margin-top: 0; - margin-bottom: 1.15077em; + margin-bottom: 1.18636em; } h6 { font-size: 1.1em; margin-top: 0; - margin-bottom: 1.15077em; + margin-bottom: 1.18636em; } p { font-size: 1em; margin-top: 0; - margin-bottom: 1.26585em; + margin-bottom: 1.305em; } table { font-size: 1em; margin-top: 0; - margin-bottom: 1.26585em; + margin-bottom: 1.305em; } h1:first-child, h2:first-child, h3:first-child, h4:first-child, h5:first-child, h6:first-child, p:first-child { @@ -6173,7 +6151,7 @@ address p { margin-top: 0; } address h6 { - color: #555555; + color: #555; } abbr:hover { @@ -6199,7 +6177,7 @@ blockquote small::before, blockquote small::after { color: #777777; } .note strong { - color: #555555; + color: #555; } .small { @@ -6286,14 +6264,14 @@ dl.inline dd { figure.ink-image { position: relative; - border: 1px solid #555555; + border: 1px solid #555; } figure.ink-image > img { width: 100%; } figure.ink-image > figcaption { padding: 1em; - background: white; + background: #fff; line-height: 1.3; } figure.ink-image > figcaption.over-top, figure.ink-image > figcaption.over-bottom { @@ -6303,7 +6281,7 @@ figure.ink-image > figcaption.over-top, figure.ink-image > figcaption.over-botto border: none; } figure.ink-image > figcaption.over-top.dark, figure.ink-image > figcaption.over-bottom.dark { - color: white; + color: #fff; background: rgba(0, 0, 0, 0.6); } figure.ink-image > figcaption.over-top { @@ -6315,8 +6293,8 @@ figure.ink-image > figcaption.over-bottom { background: rgba(255, 255, 255, 0.7); } figure.ink-image > figcaption.dark { - color: white; - background: #222222; + color: #fff; + background: #222; } img { @@ -6367,7 +6345,7 @@ img { } .ink-alert.block { border: 1px solid #b87814; - background: white; + background: #fff; } .ink-alert.block > h4 { background: rgba(255, 156, 0, 0.3); @@ -6378,7 +6356,7 @@ img { } .ink-alert.block.success { border: 1px solid #38621d; - background: white; + background: #fff; } .ink-alert.block.success > h4 { background: rgba(74, 155, 23, 0.3); @@ -6389,7 +6367,7 @@ img { } .ink-alert.block.error { border: 1px solid #891e1e; - background: white; + background: #fff; } .ink-alert.block.error > h4 { background: rgba(201, 17, 17, 0.3); @@ -6400,7 +6378,7 @@ img { } .ink-alert.block.info { border: 1px solid #1e5b98; - background: white; + background: #fff; } .ink-alert.block.info > h4 { background: rgba(15, 117, 218, 0.3); @@ -6412,7 +6390,7 @@ img { .ink-alert .ink-dismiss { font-family: Arial, sans-serif; font-weight: bold; - text-shadow: white 0 1px 0; + text-shadow: #fff 0 1px 0; filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=25); opacity: 0.25; } @@ -6427,14 +6405,14 @@ img { -ms-border-radius: 8em; -o-border-radius: 8em; border-radius: 8em; - color: white; + color: #fff; } .ink-badge.white { - background: white; - color: #555555; + background: #fff; + color: #555; } .ink-badge.black { - background: black; + background: #000; } .ink-badge.orange { background: #ff9c00; @@ -6450,7 +6428,7 @@ img { } .ink-badge.yellow { background: #ffd500; - color: #555555; + color: #555; } .ink-badge.grey { background: gray; @@ -6461,7 +6439,7 @@ img { .ink-button { background: #d9d9d9; - color: black; + color: #000; border: 1px solid #bfbfbf; -webkit-border-radius: 2px; -moz-border-radius: 2px; @@ -6472,7 +6450,7 @@ img { } .ink-button:hover, .ink-button:active { text-decoration: none; - color: black; + color: #000; background: #cccccc; border: 1px solid #b3b3b3; -webkit-box-shadow: rgba(0, 0, 0, 0.2) 0 1px 1px; @@ -6497,14 +6475,14 @@ img { box-shadow: none; } .ink-button.blue { - color: white; + color: #fff; background: #0f75da; border: 1px solid #0c63b9; } .ink-button.blue:hover, .ink-button.blue:active { background: #0d68c2; border: 1px solid #0a56a1; - color: white; + color: #fff; text-decoration: none; } .ink-button.blue:focus { @@ -6521,14 +6499,14 @@ img { box-shadow: none; } .ink-button.green { - color: white; + color: #fff; background: #4a9b17; border: 1px solid #3e8313; } .ink-button.green:hover, .ink-button.green:active { background: #3f8514; border: 1px solid #336d10; - color: white; + color: #fff; text-decoration: none; } .ink-button.green:focus { @@ -6545,14 +6523,14 @@ img { box-shadow: none; } .ink-button.orange { - color: white; + color: #fff; background: #ff9c00; border: 1px solid #d88400; } .ink-button.orange:hover, .ink-button.orange:active { background: #e68c00; border: 1px solid #bf7400; - color: white; + color: #fff; text-decoration: none; } .ink-button.orange:focus { @@ -6569,14 +6547,14 @@ img { box-shadow: none; } .ink-button.red { - color: white; + color: #fff; background: #c91111; border: 1px solid #aa0e0e; } .ink-button.red:hover, .ink-button.red:active { background: #b10f0f; border: 1px solid #920c0c; - color: white; + color: #fff; text-decoration: none; } .ink-button.red:focus { @@ -6593,14 +6571,14 @@ img { box-shadow: none; } .ink-button.black { - color: white; + color: #fff; background: #1a1a1a; border: 1px solid #161616; } .ink-button.black:hover, .ink-button.black:active { background: #0d0d0d; border: 1px solid #090909; - color: white; + color: #fff; text-decoration: none; } .ink-button.black:focus { @@ -6617,14 +6595,14 @@ img { box-shadow: none; } .ink-button.white { - color: #555555; - background: white; + color: #555; + background: #fff; border: 1px solid #d8d8d8; } .ink-button.white:hover, .ink-button.white:active { background: #f2f2f2; border: 1px solid #cbcbcb; - color: #555555; + color: #555; text-decoration: none; } .ink-button.white:focus { @@ -6694,7 +6672,7 @@ img { } .ink-label { - color: white; + color: #fff; font-weight: 300; font-size: 0.938em; -webkit-border-radius: 2px; @@ -6704,11 +6682,11 @@ img { border-radius: 2px; } .ink-label.white { - background: white; - color: #555555; + background: #fff; + color: #555; } .ink-label.black { - background: black; + background: #000; } .ink-label.orange { background: #ff9c00; @@ -6724,7 +6702,7 @@ img { } .ink-label.yellow { background: #ffd500; - color: #555555; + color: #555; } .ink-label.grey { background: gray; @@ -6754,10 +6732,10 @@ img { text-decoration: underline; } .ink-navigation ul.breadcrumbs.white { - background: white; + background: #fff; } .ink-navigation ul.breadcrumbs.white li a, .ink-navigation ul.breadcrumbs.white li:after { - color: #555555; + color: #555; } .ink-navigation ul.breadcrumbs.white li.active a { color: #cccccc; @@ -6767,7 +6745,7 @@ img { background: #d9d9d9; } .ink-navigation ul.breadcrumbs.grey li a, .ink-navigation ul.breadcrumbs.grey li:after { - color: #555555; + color: #555; } .ink-navigation ul.breadcrumbs.grey li.active a { color: #a6a6a6; @@ -6777,7 +6755,7 @@ img { background: #1a1a1a; } .ink-navigation ul.breadcrumbs.black li a, .ink-navigation ul.breadcrumbs.black li:after { - color: white; + color: #fff; } .ink-navigation ul.breadcrumbs.black li.active a { color: #666666; @@ -6787,7 +6765,7 @@ img { background: #1b75ce; } .ink-navigation ul.breadcrumbs.blue li a, .ink-navigation ul.breadcrumbs.blue li:after { - color: white; + color: #fff; } .ink-navigation ul.breadcrumbs.blue li.active a { color: #08427b; @@ -6797,7 +6775,7 @@ img { background: #f2990d; } .ink-navigation ul.breadcrumbs.orange li a, .ink-navigation ul.breadcrumbs.orange li:after { - color: white; + color: #fff; } .ink-navigation ul.breadcrumbs.orange li.active a { color: #995e00; @@ -6807,7 +6785,7 @@ img { background: #4c9220; } .ink-navigation ul.breadcrumbs.green li a, .ink-navigation ul.breadcrumbs.green li:after { - color: white; + color: #fff; } .ink-navigation ul.breadcrumbs.green li.active a { color: #20420a; @@ -6817,7 +6795,7 @@ img { background: #be1c1c; } .ink-navigation ul.breadcrumbs.red li a, .ink-navigation ul.breadcrumbs.red li:after { - color: white; + color: #fff; } .ink-navigation ul.breadcrumbs.red li.active a { color: #6b0909; @@ -6826,27 +6804,27 @@ img { .ink-dropdown.blue ul.dropdown-menu li.active a { background: #0f75da; - color: white; + color: #fff; } .ink-dropdown.green ul.dropdown-menu li.active a { background: #4a9b17; - color: white; + color: #fff; } .ink-dropdown.orange ul.dropdown-menu li.active a { background: #ff9c00; - color: white; + color: #fff; } .ink-dropdown.red ul.dropdown-menu li.active a { background: #c91111; - color: white; + color: #fff; } .ink-dropdown.black ul.dropdown-menu li.active a { background: #1a1a1a; - color: white; + color: #fff; } .ink-dropdown.blue ul.dropdown-menu li.active a { background: #0f75da; - color: white; + color: #fff; } .ink-navigation ul.menu { @@ -6974,7 +6952,7 @@ img { -ms-border-radius: 0 0 2px 2px; -o-border-radius: 0 0 2px 2px; border-radius: 0 0 2px 2px; - background: white; + background: #fff; } .ink-navigation ul.menu.horizontal > li ul.submenu li:last-child { -webkit-border-radius: 0 0 2px 2px; @@ -6990,11 +6968,11 @@ img { background: white; } .ink-navigation ul.menu.white li ul.submenu { - background: white; + background: #fff; border: 1px solid rgba(0, 0, 0, 0.1); } .ink-navigation ul.menu.white li ul.submenu li a { - color: #555555; + color: #555; } .ink-navigation ul.menu.white li ul.submenu li a:hover { background: rgba(0, 0, 0, 0.05); @@ -7010,7 +6988,7 @@ img { text-shadow: white 0 1px 0; } .ink-navigation ul.menu.white li a { - color: #555555; + color: #555; text-decoration: none; } .ink-navigation ul.menu.white li a:hover { @@ -7020,11 +6998,11 @@ img { background: #d9d9d9; } .ink-navigation ul.menu.grey li ul.submenu { - background: white; + background: #fff; border: 1px solid rgba(0, 0, 0, 0.1); } .ink-navigation ul.menu.grey li ul.submenu li a { - color: #555555; + color: #555; } .ink-navigation ul.menu.grey li ul.submenu li a:hover { background: rgba(0, 0, 0, 0.05); @@ -7040,7 +7018,7 @@ img { text-shadow: #ededed 0 1px 0; } .ink-navigation ul.menu.grey li a { - color: #555555; + color: #555; text-decoration: none; } .ink-navigation ul.menu.grey li a:hover { @@ -7050,11 +7028,11 @@ img { background: #1a1a1a; } .ink-navigation ul.menu.black li ul.submenu { - background: white; + background: #fff; border: 1px solid rgba(0, 0, 0, 0.1); } .ink-navigation ul.menu.black li ul.submenu li a { - color: #555555; + color: #555; } .ink-navigation ul.menu.black li ul.submenu li a:hover { background: rgba(0, 0, 0, 0.05); @@ -7070,7 +7048,7 @@ img { text-shadow: black 0 -1px 0; } .ink-navigation ul.menu.black li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.menu.black li a:hover { @@ -7080,11 +7058,11 @@ img { background: #1b75ce; } .ink-navigation ul.menu.blue li ul.submenu { - background: white; + background: #fff; border: 1px solid rgba(0, 0, 0, 0.1); } .ink-navigation ul.menu.blue li ul.submenu li a { - color: #555555; + color: #555; } .ink-navigation ul.menu.blue li ul.submenu li a:hover { background: rgba(0, 0, 0, 0.05); @@ -7100,7 +7078,7 @@ img { text-shadow: #2289f0 0 1px 0; } .ink-navigation ul.menu.blue li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.menu.blue li a:hover { @@ -7110,11 +7088,11 @@ img { background: #4c9220; } .ink-navigation ul.menu.green li ul.submenu { - background: white; + background: #fff; border: 1px solid rgba(0, 0, 0, 0.1); } .ink-navigation ul.menu.green li ul.submenu li a { - color: #555555; + color: #555; } .ink-navigation ul.menu.green li ul.submenu li a:hover { background: rgba(0, 0, 0, 0.05); @@ -7130,7 +7108,7 @@ img { text-shadow: #5bbf1c 0 1px 0; } .ink-navigation ul.menu.green li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.menu.green li a:hover { @@ -7140,11 +7118,11 @@ img { background: #f2990d; } .ink-navigation ul.menu.orange li ul.submenu { - background: white; + background: #fff; border: 1px solid rgba(0, 0, 0, 0.1); } .ink-navigation ul.menu.orange li ul.submenu li a { - color: #555555; + color: #555; } .ink-navigation ul.menu.orange li ul.submenu li a:hover { background: rgba(0, 0, 0, 0.05); @@ -7160,7 +7138,7 @@ img { text-shadow: #ffac29 0 1px 0; } .ink-navigation ul.menu.orange li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.menu.orange li a:hover { @@ -7170,11 +7148,11 @@ img { background: #be1c1c; } .ink-navigation ul.menu.red li ul.submenu { - background: white; + background: #fff; border: 1px solid rgba(0, 0, 0, 0.1); } .ink-navigation ul.menu.red li ul.submenu li a { - color: #555555; + color: #555; } .ink-navigation ul.menu.red li ul.submenu li a:hover { background: rgba(0, 0, 0, 0.05); @@ -7190,7 +7168,7 @@ img { text-shadow: #eb1717 0 1px 0; } .ink-navigation ul.menu.red li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.menu.red li a:hover { @@ -7247,7 +7225,7 @@ img { background: none; } .ink-navigation ul.pagination.white li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.white li a:hover { @@ -7267,7 +7245,7 @@ img { background: none; } .ink-navigation ul.pagination.white li a { - color: #555555; + color: #555; text-decoration: none; } .ink-navigation ul.pagination.white li a:hover { @@ -7287,7 +7265,7 @@ img { background: none; } .ink-navigation ul.pagination.grey li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.grey li a:hover { @@ -7307,7 +7285,7 @@ img { background: none; } .ink-navigation ul.pagination.grey li a { - color: #555555; + color: #555; text-decoration: none; } .ink-navigation ul.pagination.grey li a:hover { @@ -7327,7 +7305,7 @@ img { background: none; } .ink-navigation ul.pagination.black li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.black li a:hover { @@ -7347,7 +7325,7 @@ img { background: none; } .ink-navigation ul.pagination.black li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.black li a:hover { @@ -7367,7 +7345,7 @@ img { background: none; } .ink-navigation ul.pagination.orange li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.orange li a:hover { @@ -7387,7 +7365,7 @@ img { background: none; } .ink-navigation ul.pagination.orange li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.orange li a:hover { @@ -7407,7 +7385,7 @@ img { background: none; } .ink-navigation ul.pagination.blue li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.blue li a:hover { @@ -7427,7 +7405,7 @@ img { background: none; } .ink-navigation ul.pagination.blue li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.blue li a:hover { @@ -7447,7 +7425,7 @@ img { background: none; } .ink-navigation ul.pagination.green li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.green li a:hover { @@ -7467,7 +7445,7 @@ img { background: none; } .ink-navigation ul.pagination.green li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.green li a:hover { @@ -7487,7 +7465,7 @@ img { background: none; } .ink-navigation ul.pagination.red li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.red li a:hover { @@ -7507,7 +7485,7 @@ img { background: none; } .ink-navigation ul.pagination.red li a { - color: white; + color: #fff; text-decoration: none; } .ink-navigation ul.pagination.red li a:hover { @@ -7529,7 +7507,7 @@ img { background: #1a1a1a; } .ink-navigation ul.pagination.dotted.white li a { - background: white; + background: #fff; } .ink-navigation ul.pagination.dotted.blue li a { background: #1b75ce; @@ -7544,7 +7522,7 @@ img { background: #be1c1c; } .ink-navigation ul.pagination.chevron li.next a, .ink-navigation ul.pagination.chevron li.previous a { - color: white; + color: #fff; filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=60); opacity: 0.6; } @@ -7555,13 +7533,13 @@ img { background: none; } .ink-navigation ul.pagination.chevron li.disabled a { - color: white; + color: #fff; filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40); opacity: 0.4; text-shadow: none; } .ink-navigation ul.pagination.chevron li.disabled a:hover, .ink-navigation ul.pagination.chevron li.disabled a:focus { - color: white; + color: #fff; filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=40); opacity: 0.4; } @@ -7585,7 +7563,7 @@ img { } .ink-navigation ul.pills li { - background: white; + background: #fff; font-weight: 300; -webkit-border-radius: 2px; -moz-border-radius: 2px; @@ -7594,7 +7572,7 @@ img { border-radius: 2px; } .ink-navigation ul.pills li a { - color: #555555; + color: #555; background: none; } .ink-navigation ul.pills li a:hover { @@ -7624,7 +7602,7 @@ img { background: none; } .ink-navigation ul.pills.grey li a { - color: #555555; + color: #555; } .ink-navigation ul.pills.grey li a:hover { background: #cccccc; @@ -7643,7 +7621,7 @@ img { background: none; } .ink-navigation ul.pills.black li a { - color: white; + color: #fff; } .ink-navigation ul.pills.black li a:hover { background: #292929; @@ -7662,7 +7640,7 @@ img { background: none; } .ink-navigation ul.pills.blue li a { - color: white; + color: #fff; } .ink-navigation ul.pills.blue li a:hover { background: #0d68c2; @@ -7681,7 +7659,7 @@ img { background: none; } .ink-navigation ul.pills.green li a { - color: white; + color: #fff; } .ink-navigation ul.pills.green li a:hover { background: #3f8514; @@ -7700,7 +7678,7 @@ img { background: none; } .ink-navigation ul.pills.orange li a { - color: white; + color: #fff; } .ink-navigation ul.pills.orange li a:hover { background: #e68c00; @@ -7719,34 +7697,34 @@ img { background: none; } .ink-navigation ul.pills.red li a { - color: white; + color: #fff; } .ink-navigation ul.pills.red li a:hover { background: #b10f0f; } table.ink-table { - background: white; + background: #fff; } table.ink-table tr th, table.ink-table tr td { - border-bottom: #bbbbbb 1px solid; + border-bottom: #bbb 1px solid; background: none; } table.ink-table tr:last-child td { border-bottom: none; } table.ink-table tfoot tr th, table.ink-table tfoot tr td { - border-top: #bbbbbb 1px solid; + border-top: #bbb 1px solid; } table.ink-table.alternating tbody tr:nth-child(odd) { background-color: whitesmoke; } table.ink-table.hover tbody tr:hover { background: #fefbd6; - color: #555555; + color: #555; } table.ink-table.bordered { - border: #bbbbbb 1px solid; + border: #bbb 1px solid; -webkit-border-radius: 2px; -moz-border-radius: 2px; -ms-border-radius: 2px; @@ -7754,7 +7732,7 @@ table.ink-table.bordered { border-radius: 2px; } table.ink-table.bordered tr th { - border-left: #bbbbbb 1px solid; + border-left: #bbb 1px solid; } table.ink-table.bordered tr th:first-child { border-left: none; @@ -7763,7 +7741,7 @@ table.ink-table.bordered tr:last-child td { border-bottom: none; } table.ink-table.bordered tr td { - border-left: #bbbbbb 1px solid; + border-left: #bbb 1px solid; } table.ink-table.bordered tr td:first-child { border-left: none; @@ -7785,7 +7763,7 @@ table.ink-table tbody > tr.orange td { color: white; } table.ink-table tbody > tr.black td { - background: black; + background: #000; color: #cccccc; } table.ink-table tbody > tr.yellow td { @@ -7881,7 +7859,7 @@ table.ink-table tbody > tr.yellow td { -webkit-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 2px 0; -moz-box-shadow: rgba(0, 0, 0, 0.4) 0 1px 2px 0; box-shadow: rgba(0, 0, 0, 0.4) 0 1px 2px 0; - background: white; + background: #fff; z-index: 10; } .ink-calendar a { @@ -7949,7 +7927,7 @@ html.ink-modal-is-open .ink-calendar { -ms-border-radius: 2px; -o-border-radius: 2px; border-radius: 2px; - color: #444444; + color: #444; } .ink-calendar-month li a:hover, .ink-calendar-year-selector li a:hover, @@ -7962,15 +7940,15 @@ html.ink-modal-is-open .ink-calendar { .ink-calendar-month-selector li a.ink-calendar-on, .ink-calendar-month-selector li a.ink-calendar-on:hover { background: #0069d6; - color: white; + color: #fff; } .ink-calendar-month li a.ink-calendar-off, .ink-calendar-month li a.ink-calendar-off:hover, .ink-calendar-year-selector li a.ink-calendar-off, .ink-calendar-year-selector li a.ink-calendar-off:hover, .ink-calendar-month-selector li a.ink-calendar-off, .ink-calendar-month-selector li a.ink-calendar-off:hover { - background: white; - color: #aaaaaa; + background: #fff; + color: #aaa; cursor: default; } .ink-calendar-month ul, @@ -8149,7 +8127,7 @@ body.ink-drawer.over.right .right-drawer { left: 50%; width: 90%; height: 90%; - background: white; + background: #fff; z-index: 100; position: absolute; overflow: hidden; @@ -8192,7 +8170,7 @@ body.ink-drawer.over.right .right-drawer { .ink-modal > .modal-header > .modal-close, .ink-modal > header > .modal-close { padding-top: 2px; text-align: center; - color: white; + color: #fff; width: 26px; height: 26px; line-height: 1.2em; @@ -8265,7 +8243,7 @@ body.ink-drawer.over.right .right-drawer { height: 100%; line-height: 1.7; text-align: center; - color: black; + color: #000; font-size: 0.813em; z-index: 10; } @@ -8290,27 +8268,27 @@ body.ink-drawer.over.right .right-drawer { } .ink-progress-bar .bar.grey { background: #cccccc; - color: #555555; + color: #555; } .ink-progress-bar .bar.green { background: #4a9b17; - color: white; + color: #fff; } .ink-progress-bar .bar.blue { background: #0f75da; - color: white; + color: #fff; } .ink-progress-bar .bar.red { background: #c91111; - color: white; + color: #fff; } .ink-progress-bar .bar.orange { background: #ff9c00; - color: #555555; + color: #555; } .ink-progress-bar .bar.black { - background: black; - color: white; + background: #000; + color: #fff; } .dragging, .ink-sortable-list li { @@ -8372,10 +8350,10 @@ body.ink-drawer.over.right .right-drawer { background: #f0f0f0; } .ink-tabs .tabs-nav li.active a { - color: #555555; + color: #555; cursor: default; text-decoration: none; - background: white; + background: #fff; border: 1px solid #cccccc; } .ink-tabs .tabs-nav:after { @@ -8567,7 +8545,7 @@ body.ink-drawer.over.right .right-drawer { } .ink-tooltip.blue > .content { background: #0f75da; - color: white; + color: #fff; } .ink-tooltip.blue > .arrow.up { border-bottom-color: #0f75da; @@ -8583,7 +8561,7 @@ body.ink-drawer.over.right .right-drawer { } .ink-tooltip.red > .content { background: #c91111; - color: white; + color: #fff; } .ink-tooltip.red > .arrow.up { border-bottom-color: #c91111; @@ -8599,7 +8577,7 @@ body.ink-drawer.over.right .right-drawer { } .ink-tooltip.orange > .content { background: #ff9c00; - color: white; + color: #fff; } .ink-tooltip.orange > .arrow.up { border-bottom-color: #ff9c00; @@ -8615,7 +8593,7 @@ body.ink-drawer.over.right .right-drawer { } .ink-tooltip.green > .content { background: #4a9b17; - color: white; + color: #fff; } .ink-tooltip.green > .arrow.up { border-bottom-color: #4a9b17; @@ -8630,20 +8608,20 @@ body.ink-drawer.over.right .right-drawer { border-left-color: #4a9b17; } .ink-tooltip.black > .content { - background: black; - color: white; + background: #000; + color: #fff; } .ink-tooltip.black > .arrow.up { - border-bottom-color: black; + border-bottom-color: #000; } .ink-tooltip.black > .arrow.down { - border-top-color: black; + border-top-color: #000; } .ink-tooltip.black > .arrow.left { - border-right-color: black; + border-right-color: #000; } .ink-tooltip.black > .arrow.right { - border-left-color: black; + border-left-color: #000; } .ink-tooltip.grey > .content { background: #cccccc; diff --git a/dist/css/ink.min.css b/dist/css/ink.min.css index fabc1c46f..d0607511c 100644 --- a/dist/css/ink.min.css +++ b/dist/css/ink.min.css @@ -1 +1 @@ -@charset "UTF-8";.show-all{display:inherit}.hide-all{display:none!important}.no-margin{margin:0!important}.no-margin-top{margin-top:0!important}.no-margin-bottom{margin-bottom:0!important}.no-padding{padding:0!important}.push-left{float:left}.push-center{float:none!important;margin-left:auto;margin-right:auto}.push-right{float:right;-webkit-justify-content:flex-end;-moz-justify-content:flex-end;justify-content:flex-end}.align-left{text-align:left}.align-center{text-align:center}.align-right{text-align:right}.clearfix{overflow:hidden;*zoom:1}.clearfix:after{content:"";display:table;clear:both}html{font-family:sans-serif}html *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}figure{margin:0}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.ink-alert.basic,.ink-alert.block{font-size:.938em;margin:1em 0;position:relative;overflow:hidden}.ink-alert.basic{padding:1em 3em 1em 1em}.ink-alert.basic p{margin:0}.ink-alert.basic .ink-close{top:.55em;*top:.2em}.ink-alert.block{font-size:1em}.ink-alert.block>h4{padding:1em 3em 1em 1em;font-size:.938em;line-height:1.5;margin:0}.ink-alert.block p{margin:1.5em 1em}.ink-alert.block ul{list-style:inside}.ink-alert .ink-dismiss{position:absolute;line-height:.56em;font-size:1.8em;padding:5px;border:0;background:0 0;top:.5em;*top:.2em;right:.4em}.ink-badge{padding:.2em .6em;font-size:.813em;margin-left:.6em}.ink-button{-webkit-appearance:menuitem;padding:8px 12px;cursor:pointer;text-decoration:none;text-align:center;display:inline-block;vertical-align:middle;white-space:nowrap;line-height:normal}.ink-button+.ink-button{margin-left:5px}.button-group{*zoom:1}.button-group>.ink-button{float:left;margin:5px 0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;border-left:0}.button-group>.ink-button:active,.button-group>.ink-button:hover{border-left:0}.button-group>.ink-button:first-child{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px;border-left:1px solid #bfbfbf}.button-group>.ink-button:last-child{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.button-group:after{content:"";display:table;clear:both}.button-toolbar{*zoom:1}.button-toolbar>.button-group{margin-right:10px;float:left}.button-toolbar:after{content:"";display:table;clear:both}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-thin-webfont.eot);src:url(../fonts/Roboto/roboto-thin-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-thin-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-thin-webfont.ttf) format('truetype');font-weight:100;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-thinitalic-webfont.eot);src:url(../fonts/Roboto/roboto-thinitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-thinitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-thinitalic-webfont.ttf) format('truetype');font-weight:100;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-light-webfont.eot);src:url(../fonts/Roboto/roboto-light-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-light-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-light-webfont.ttf) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-lightitalic-webfont.eot);src:url(../fonts/Roboto/roboto-lightitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-lightitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-lightitalic-webfont.ttf) format('truetype');font-weight:300;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-regular-webfont.eot);src:url(../fonts/Roboto/roboto-regular-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-regular-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-regular-webfont.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-italic-webfont.eot);src:url(../fonts/Roboto/roboto-italic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-italic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-italic-webfont.ttf) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-medium-webfont.eot);src:url(../fonts/Roboto/roboto-medium-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-medium-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-medium-webfont.ttf) format('truetype');font-weight:500;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-mediumitalic-webfont.eot);src:url(../fonts/Roboto/roboto-mediumitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-mediumitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-mediumitalic-webfont.ttf) format('truetype');font-weight:500;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-bold-webfont.eot);src:url(../fonts/Roboto/roboto-bold-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-bold-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-bold-webfont.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-bolditalic-webfont.eot);src:url(../fonts/Roboto/roboto-bolditalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-bolditalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-bolditalic-webfont.ttf) format('truetype');font-weight:700;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-black-webfont.eot);src:url(../fonts/Roboto/roboto-black-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-black-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-black-webfont.ttf) format('truetype');font-weight:900;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-blackitalic-webfont.eot);src:url(../fonts/Roboto/roboto-blackitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-blackitalic-webfont.woff) format('woff'),url(../fonts/Roboto/roboto-blackitalic-webfont.ttf) format('truetype');font-weight:900;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-light-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-light-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-light-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-light-webfont.ttf) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.ttf) format('truetype');font-weight:300;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.ttf) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.ttf) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot);src:url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.woff) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.ttf) format('truetype');font-weight:700;font-style:italic}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-thin-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-thin-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-thin-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-thin-webfont.ttf) format('truetype');font-weight:100;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-light-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-light-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-light-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-light-webfont.ttf) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-regular-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-regular-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-regular-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-regular-webfont.ttf) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-bold-webfont.eot);src:url(../fonts/Roboto_slab/robotoslab-bold-webfont.eot?#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-bold-webfont.woff) format('woff'),url(../fonts/Roboto_slab/robotoslab-bold-webfont.ttf) format('truetype');font-weight:700;font-style:normal}.ink-form fieldset{border:0;padding:0;margin:0}.ink-form fieldset legend{font-size:1.438em;font-weight:700;width:100%;border-bottom:1px solid #ddd}.ink-form fieldset legend+*{-webkit-margin-top-collapse:separate;margin:2em 0}.ink-form p.tip{font-size:.875em;color:#909090;position:relative;margin:.2em 0 0 .1em}.ink-form p.label{padding:0;margin:0;color:#555;white-space:normal}.ink-form input[type=color],.ink-form input[type=date],.ink-form input[type=datetime-local],.ink-form input[type=datetime],.ink-form input[type=email],.ink-form input[type=month],.ink-form input[type=number],.ink-form input[type=password],.ink-form input[type=search],.ink-form input[type=tel],.ink-form input[type=text],.ink-form input[type=time],.ink-form input[type=url],.ink-form input[type=week],.ink-form select,.ink-form textarea{font-family:Roboto,Arial,Helvetica,sans-serif;font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;padding:8px 6px;border:1px solid #c6c6c6;resize:none;background:#fff;vertical-align:middle}.ink-form input[type=color]:focus,.ink-form input[type=date]:focus,.ink-form input[type=datetime-local]:focus,.ink-form input[type=datetime]:focus,.ink-form input[type=email]:focus,.ink-form input[type=month]:focus,.ink-form input[type=number]:focus,.ink-form input[type=password]:focus,.ink-form input[type=search]:focus,.ink-form input[type=tel]:focus,.ink-form input[type=text]:focus,.ink-form input[type=time]:focus,.ink-form input[type=url]:focus,.ink-form input[type=week]:focus,.ink-form select:focus,.ink-form textarea:focus{border-color:rgba(153,153,153,.9);-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;outline:0 none}.ink-form input[type=color]:disabled,.ink-form input[type=date]:disabled,.ink-form input[type=datetime-local]:disabled,.ink-form input[type=datetime]:disabled,.ink-form input[type=email]:disabled,.ink-form input[type=month]:disabled,.ink-form input[type=number]:disabled,.ink-form input[type=password]:disabled,.ink-form input[type=search]:disabled,.ink-form input[type=tel]:disabled,.ink-form input[type=text]:disabled,.ink-form input[type=time]:disabled,.ink-form input[type=url]:disabled,.ink-form input[type=week]:disabled,.ink-form select:disabled,.ink-form textarea:disabled{background:#f2f2f2;cursor:not-allowed}.ink-form .input-file{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;padding:6px;border:1px solid #c6c6c6;background:#fff;vertical-align:middle;line-height:1.2}.ink-form .input-file input[type=file]{-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;border:0;padding:0;background:0 0;width:100%}.ink-form .ink-button{margin:0 5px}.ink-form label{cursor:pointer}.ink-form select{line-height:2;cursor:pointer}.ink-form textarea{min-height:5em}.ink-form .control-group{line-height:2;margin-bottom:1em;*zoom:1}.ink-form .control-group:after{content:"";display:table;clear:both}.ink-form .control-group .control{position:relative;*zoom:1}.ink-form .control-group .control:after{content:"";display:table;clear:both}.ink-form .control-group .control>li{position:relative;*zoom:1}.ink-form .control-group .control>li:after{content:"";display:table;clear:both}.ink-form .control-group .control>input,.ink-form .control-group .control>select,.ink-form .control-group .control>textarea{width:100%}.ink-form .control-group .control>input+.fa,.ink-form .control-group .control>select+.fa,.ink-form .control-group .control>textarea+.fa{display:none}.ink-form .control-group .control.append-button>span,.ink-form .control-group .control.append-symbol>span,.ink-form .control-group .control.prepend-button>span,.ink-form .control-group .control.prepend-symbol>span{width:100%;position:relative}.ink-form .control-group .control.append-button>span>input,.ink-form .control-group .control.append-button>span>select,.ink-form .control-group .control.append-button>span>textarea,.ink-form .control-group .control.append-symbol>span>input,.ink-form .control-group .control.append-symbol>span>select,.ink-form .control-group .control.append-symbol>span>textarea,.ink-form .control-group .control.prepend-button>span>input,.ink-form .control-group .control.prepend-button>span>select,.ink-form .control-group .control.prepend-button>span>textarea,.ink-form .control-group .control.prepend-symbol>span>input,.ink-form .control-group .control.prepend-symbol>span>select,.ink-form .control-group .control.prepend-symbol>span>textarea{width:100%}.ink-form .control-group .control.append-button>input[type=button],.ink-form .control-group .control.append-button>input[type=reset],.ink-form .control-group .control.append-button>input[type=submit],.ink-form .control-group .control.append-symbol>input[type=button],.ink-form .control-group .control.append-symbol>input[type=reset],.ink-form .control-group .control.append-symbol>input[type=submit],.ink-form .control-group .control.prepend-button>input[type=button],.ink-form .control-group .control.prepend-button>input[type=reset],.ink-form .control-group .control.prepend-button>input[type=submit],.ink-form .control-group .control.prepend-symbol>input[type=button],.ink-form .control-group .control.prepend-symbol>input[type=reset],.ink-form .control-group .control.prepend-symbol>input[type=submit]{width:auto}.ink-form .control-group .control.append-button{display:table}.ink-form .control-group .control.append-button>span{display:table-cell}.ink-form .control-group .control.append-button>span>input,.ink-form .control-group .control.append-button>span>select,.ink-form .control-group .control.append-button>span>textarea{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-form .control-group .control.append-button .ink-button{margin:0;-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0;border-left:0}.ink-form .control-group .control.prepend-button{display:table}.ink-form .control-group .control.prepend-button>span{display:table-cell}.ink-form .control-group .control.prepend-button>span>input,.ink-form .control-group .control.prepend-button>span>select,.ink-form .control-group .control.prepend-button>span>textarea{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-form .control-group .control.prepend-button .ink-button{margin:0;-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px;border-right:0}.ink-form .control-group .control.append-symbol>span{display:block}.ink-form .control-group .control.append-symbol>span>input,.ink-form .control-group .control.append-symbol>span>select,.ink-form .control-group .control.append-symbol>span>textarea{padding-right:2.5em}.ink-form .control-group .control.append-symbol>span>[class*=" fa-"],.ink-form .control-group .control.append-symbol>span>[class^=fa-]{position:absolute;right:1em;top:.86em;pointer-events:none}.ink-form .control-group .control.prepend-symbol>span{display:block}.ink-form .control-group .control.prepend-symbol>span>input,.ink-form .control-group .control.prepend-symbol>span>select,.ink-form .control-group .control.prepend-symbol>span>textarea{padding-left:2.5em}.ink-form .control-group .control.prepend-symbol>span>[class*=" fa-"],.ink-form .control-group .control.prepend-symbol>span>[class^=fa-]{position:absolute;left:1em;top:.86em;pointer-events:none}.ink-form .control-group input[type=checkbox],.ink-form .control-group input[type=radio]{position:absolute;border:0;cursor:pointer}.ink-form .control-group input[type=checkbox]+label,.ink-form .control-group input[type=radio]+label{margin-top:-.28em;padding-left:1.25em;vertical-align:super;display:inline-block}.ink-form .control-group .inline li{padding:0}.ink-form .control-group .inline li label{margin-right:1em}.ink-form .control-group.validation.error input,.ink-form .control-group.validation.error select,.ink-form .control-group.validation.error textarea{outline:0;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;border:1px solid rgba(200,10,16,.5)}.ink-form .control-group.validation.error p.tip{color:rgba(150,7,12,.55)}.ink-form .control-group.validation.warning input,.ink-form .control-group.validation.warning select,.ink-form .control-group.validation.warning textarea{outline:0;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;border:1px solid rgba(255,156,0,.6)}.ink-form .control-group.validation.warning p.tip{color:rgba(204,125,0,.6)}.ink-form .control-group.required label,.ink-form .control-group.required p.label{color:#555}.ink-form .control-group.required label:after,.ink-form .control-group.required p.label:after{content:"\f069";color:#c91111;margin-left:.6em;font-family:FontAwesome;font-size:.75em;width:1.25em}.ink-form .control-group.required ul.control label:after{content:""}.ink-grid{width:auto;max-width:1440px;margin:0 auto}.all-5{width:5%;float:left;clear:none}.all-10{width:10%;float:left;clear:none}.all-15{width:15%;float:left;clear:none}.all-16{width:16.66%;float:left;clear:none}.all-20{width:20%;float:left;clear:none}.all-25{width:25%;float:left;clear:none}.all-30{width:30%;float:left;clear:none}.all-33{width:33.33%;float:left;clear:none}.all-35{width:35%;float:left;clear:none}.all-40{width:40%;float:left;clear:none}.all-45{width:45%;float:left;clear:none}.all-50{width:50%;float:left;clear:none}.all-55{width:55%;float:left;clear:none}.all-60{width:60%;float:left;clear:none}.all-65{width:65%;float:left;clear:none}.all-66{width:66.66%;float:left;clear:none}.all-70{width:70%;float:left;clear:none}.all-75{width:75%;float:left;clear:none}.all-80{width:80%;float:left;clear:none}.all-85{width:85%;float:left;clear:none}.all-90{width:90%;float:left;clear:none}.all-95{width:95%;float:left;clear:none}.all-100{width:100%;float:left;clear:none}[class~=all-100]{float:none;clear:both}@media screen and (min-width:1261px){.ink-grid{padding:0 2em}.column-group>[class*=xlarge-]{float:left;clear:none}.xlarge-5{width:5%}.xlarge-10{width:10%}.xlarge-15{width:15%}.xlarge-16{width:16.66%}.xlarge-20{width:20%}.xlarge-25{width:25%}.xlarge-30{width:30%}.xlarge-33{width:33.33%}.xlarge-35{width:35%}.xlarge-40{width:40%}.xlarge-45{width:45%}.xlarge-50{width:50%}.xlarge-55{width:55%}.xlarge-60{width:60%}.xlarge-65{width:65%}.xlarge-66{width:66.66%}.xlarge-70{width:70%}.xlarge-75{width:75%}.xlarge-80{width:80%}.xlarge-85{width:85%}.xlarge-90{width:90%}.xlarge-95{width:95%}.xlarge-100{width:100%}[class*=xlarge-100]{float:none;clear:both}.column-group{*zoom:1}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-2em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}.column-group.horizontal-gutters{margin-left:-2em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=xlarge-]{padding-left:2em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=xlarge-]{margin-bottom:2em}.column-group.double-gutters{margin-left:-4em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}.column-group.double-horizontal-gutters{margin-left:-4em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}.column-group.half-gutters{margin-left:-1em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}.column-group.half-horizontal-gutters{margin-left:-1em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}.column-group.quarter-gutters{margin-left:-.5em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}.column-group.quarter-horizontal-gutters{margin-left:-.5em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}.column-group.xlarge-gutters{margin-left:-2em}.column-group.xlarge-gutters>[class*=all-],.column-group.xlarge-gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}.column-group.xlarge-horizontal-gutters{margin-left:-2em}.column-group.xlarge-horizontal-gutters>[class*=all-],.column-group.xlarge-horizontal-gutters>[class*=xlarge-]{padding-left:2em}.column-group.xlarge-vertical-gutters>[class*=all-],.column-group.xlarge-vertical-gutters>[class*=xlarge-]{margin-bottom:2em}.column-group.xlarge-double-gutters{margin-left:-4em}.column-group.xlarge-double-gutters>[class*=all-],.column-group.xlarge-double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}.column-group.xlarge-double-horizontal-gutters{margin-left:-4em}.column-group.xlarge-double-horizontal-gutters>[class*=all-],.column-group.xlarge-double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}.column-group.xlarge-double-vertical-gutters>[class*=all-],.column-group.xlarge-double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}.column-group.xlarge-half-gutters{margin-left:-1em}.column-group.xlarge-half-gutters>[class*=all-],.column-group.xlarge-half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}.column-group.xlarge-half-horizontal-gutters{margin-left:-1em}.column-group.xlarge-half-horizontal-gutters>[class*=all-],.column-group.xlarge-half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}.column-group.xlarge-half-vertical-gutters>[class*=all-],.column-group.xlarge-half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}.column-group.xlarge-quarter-gutters{margin-left:-.5em}.column-group.xlarge-quarter-gutters>[class*=all-],.column-group.xlarge-quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}.column-group.xlarge-quarter-horizontal-gutters{margin-left:-.5em}.column-group.xlarge-quarter-horizontal-gutters>[class*=all-],.column-group.xlarge-quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}.column-group.xlarge-quarter-vertical-gutters>[class*=all-],.column-group.xlarge-quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}.column-group.xlarge-no-gutters{margin-left:0}.column-group.xlarge-no-gutters>[class*=all-],.column-group.xlarge-no-gutters>[class*=xlarge-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=xlarge-],.ink-table td[class*=xlarge-],.ink-table tfoot[class*=xlarge-],.ink-table th[class*=xlarge-],.ink-table thead[class*=xlarge-],.ink-table tr[class*=xlarge-]{float:none}.xlarge-push-left{float:left}.xlarge-push-center{float:none;margin-left:auto;margin-right:auto}.xlarge-push-right{float:right}.xlarge-align-left{text-align:left}.xlarge-align-center{text-align:center}.xlarge-align-right{text-align:right}.xlarge-no-margin{margin:0!important}.space,.xlarge-space{margin:2em}.padding,.xlarge-padding{padding:2em}.double-space,.xlarge-double-space{margin:4em}.double-padding,.xlarge-double-padding{padding:4em}.half-space,.xlarge-half-space{margin:1em}.half-padding,.xlarge-half-padding{padding:1em}.quarter-space,.xlarge-quarter-space{margin:.5em}.quarter-padding,.xlarge-quarter-padding{padding:.5em}.vertical-space,.xlarge-vertical-space{margin-top:2em;margin-bottom:2em}.vertical-padding,.xlarge-vertical-padding{padding-top:2em;padding-bottom:2em}.double-vertical-space,.xlarge-double-vertical-space{margin-top:4em;margin-bottom:4em}.double-vertical-padding,.xlarge-double-vertical-padding{padding-top:4em;padding-bottom:4em}.half-vertical-space,.xlarge-half-vertical-space{margin-top:1em;margin-bottom:1em}.half-vertical-padding,.xlarge-half-vertical-padding{padding-top:1em;padding-bottom:1em}.quarter-vertical-space,.xlarge-quarter-vertical-space{margin-top:.5em;margin-bottom:.5em}.quarter-vertical-padding,.xlarge-quarter-vertical-padding{padding-top:.5em;padding-bottom:.5em}.horizontal-space,.xlarge-horizontal-space{margin-left:2em;margin-right:2em}.horizontal-padding,.xlarge-horizontal-padding{padding-left:2em;padding-right:2em}.double-horizontal-space,.xlarge-double-horizontal-space{margin-left:4em;margin-right:4em}.double-horizontal-padding,.xlarge-double-horizontal-padding{padding-left:4em;padding-right:4em}.half-horizontal-space,.xlarge-half-horizontal-space{margin-left:1em;margin-right:1em}.half-horizontal-padding,.xlarge-half-horizontal-padding{padding-left:1em;padding-right:1em}.quarter-horizontal-space,.xlarge-quarter-horizontal-space{margin-left:.5em;margin-right:.5em}.quarter-horizontal-padding,.xlarge-quarter-horizontal-padding{padding-left:.5em;padding-right:.5em}.top-space,.xlarge-top-space{margin-top:2em}.top-padding,.xlarge-top-padding{padding-top:2em}.double-top-space,.xlarge-double-top-space{margin-top:4em}.double-top-padding,.xlarge-double-top-padding{padding-top:4em}.half-top-space,.xlarge-half-top-space{margin-top:1em}.half-top-padding,.xlarge-half-top-padding{padding-top:1em}.quarter-top-space,.xlarge-quarter-top-space{margin-top:.5em}.quarter-top-padding,.xlarge-quarter-top-padding{padding-top:.5em}.right-space,.xlarge-right-space{margin-right:2em}.right-padding,.xlarge-right-padding{padding-right:2em}.double-right-space,.xlarge-double-right-space{margin-right:4em}.double-right-padding,.xlarge-double-right-padding{padding-right:4em}.half-right-space,.xlarge-half-right-space{margin-right:1em}.half-right-padding,.xlarge-half-right-padding{padding-right:1em}.quarter-right-space,.xlarge-quarter-right-space{margin-right:.5em}.quarter-right-padding,.xlarge-quarter-right-padding{padding-right:.5em}.bottom-space,.xlarge-bottom-space{margin-bottom:2em}.bottom-padding,.xlarge-bottom-padding{padding-bottom:2em}.double-bottom-space,.xlarge-double-bottom-space{margin-bottom:4em}.double-bottom-padding,.xlarge-double-bottom-padding{padding-bottom:4em}.half-bottom-space,.xlarge-half-bottom-space{margin-bottom:1em}.half-bottom-padding,.xlarge-half-bottom-padding{padding-bottom:1em}.quarter-bottom-space,.xlarge-quarter-bottom-space{margin-bottom:.5em}.quarter-bottom-padding,.xlarge-quarter-bottom-padding{padding-bottom:.5em}.left-space,.xlarge-left-space{margin-left:2em}.left-padding,.xlarge-left-padding{padding-left:2em}.double-left-space,.xlarge-double-left-space{margin-left:4em}.double-left-padding,.xlarge-double-left-padding{padding-left:4em}.half-left-space,.xlarge-half-left-space{margin-left:1em}.half-left-padding,.xlarge-half-left-padding{padding-left:1em}.quarter-left-space,.xlarge-quarter-left-space{margin-left:.5em}.quarter-left-padding,.xlarge-quarter-left-padding{padding-left:.5em}.hide-xlarge{display:none!important}.show-xlarge{display:inherit!important}table.show-xlarge{display:table}thead.show-xlarge{display:table-header-group}tbody.show-xlarge{display:table-row-group}tfoot.show-xlarge{display:table-footer-group}tr.show-xlarge{display:table-row}td.show-xlarge,th.show-xlarge{display:table-cell}}@media screen and (min-width:961px) and (max-width:1260px){.ink-grid{padding:0 1.75em}.column-group>[class*=large-]{float:left;clear:none}.large-5{width:5%}.large-10{width:10%}.large-15{width:15%}.large-16{width:16.66%}.large-20{width:20%}.large-25{width:25%}.large-30{width:30%}.large-33{width:33.33%}.large-35{width:35%}.large-40{width:40%}.large-45{width:45%}.large-50{width:50%}.large-55{width:55%}.large-60{width:60%}.large-65{width:65%}.large-66{width:66.66%}.large-70{width:70%}.large-75{width:75%}.large-80{width:80%}.large-85{width:85%}.large-90{width:90%}.large-95{width:95%}.large-100{width:100%}[class*=large-100]{float:none;clear:both}.column-group{*zoom:1}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1.75em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.horizontal-gutters{margin-left:-1.75em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.double-gutters{margin-left:-3.5em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.double-horizontal-gutters{margin-left:-3.5em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.half-gutters{margin-left:-.875em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.half-horizontal-gutters{margin-left:-.875em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.quarter-gutters{margin-left:-.4375em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.quarter-horizontal-gutters{margin-left:-.4375em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-gutters{margin-left:-1.75em}.column-group.large-gutters>[class*=all-],.column-group.large-gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.large-horizontal-gutters{margin-left:-1.75em}.column-group.large-horizontal-gutters>[class*=all-],.column-group.large-horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.large-vertical-gutters>[class*=all-],.column-group.large-vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.large-double-gutters{margin-left:-3.5em}.column-group.large-double-gutters>[class*=all-],.column-group.large-double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.large-double-horizontal-gutters{margin-left:-3.5em}.column-group.large-double-horizontal-gutters>[class*=all-],.column-group.large-double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.large-double-vertical-gutters>[class*=all-],.column-group.large-double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.large-half-gutters{margin-left:-.875em}.column-group.large-half-gutters>[class*=all-],.column-group.large-half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.large-half-horizontal-gutters{margin-left:-.875em}.column-group.large-half-horizontal-gutters>[class*=all-],.column-group.large-half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.large-half-vertical-gutters>[class*=all-],.column-group.large-half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.large-quarter-gutters{margin-left:-.4375em}.column-group.large-quarter-gutters>[class*=all-],.column-group.large-quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.large-quarter-horizontal-gutters{margin-left:-.4375em}.column-group.large-quarter-horizontal-gutters>[class*=all-],.column-group.large-quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.large-quarter-vertical-gutters>[class*=all-],.column-group.large-quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-no-gutters{margin-left:0}.column-group.large-no-gutters>[class*=all-],.column-group.large-no-gutters>[class*=large-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=large-],.ink-table td[class*=large-],.ink-table tfoot[class*=large-],.ink-table th[class*=large-],.ink-table thead[class*=large-],.ink-table tr[class*=large-]{float:none}.large-push-left{float:left}.large-push-center{float:none;margin-left:auto;margin-right:auto}.large-push-right{float:right}.large-align-left{text-align:left}.large-align-center{text-align:center}.large-align-right{text-align:right}.large-no-margin{margin:0!important}.large-space,.space{margin:1.75em}.large-padding,.padding{padding:1.75em}.double-space,.large-double-space{margin:3.5em}.double-padding,.large-double-padding{padding:3.5em}.half-space,.large-half-space{margin:.875em}.half-padding,.large-half-padding{padding:.875em}.large-quarter-space,.quarter-space{margin:.4375em}.large-quarter-padding,.quarter-padding{padding:.4375em}.large-vertical-space,.vertical-space{margin-top:1.75em;margin-bottom:1.75em}.large-vertical-padding,.vertical-padding{padding-top:1.75em;padding-bottom:1.75em}.double-vertical-space,.large-double-vertical-space{margin-top:3.5em;margin-bottom:3.5em}.double-vertical-padding,.large-double-vertical-padding{padding-top:3.5em;padding-bottom:3.5em}.half-vertical-space,.large-half-vertical-space{margin-top:.875em;margin-bottom:.875em}.half-vertical-padding,.large-half-vertical-padding{padding-top:.875em;padding-bottom:.875em}.large-quarter-vertical-space,.quarter-vertical-space{margin-top:.4375em;margin-bottom:.4375em}.large-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.4375em;padding-bottom:.4375em}.horizontal-space,.large-horizontal-space{margin-left:1.75em;margin-right:1.75em}.horizontal-padding,.large-horizontal-padding{padding-left:1.75em;padding-right:1.75em}.double-horizontal-space,.large-double-horizontal-space{margin-left:3.5em;margin-right:3.5em}.double-horizontal-padding,.large-double-horizontal-padding{padding-left:3.5em;padding-right:3.5em}.half-horizontal-space,.large-half-horizontal-space{margin-left:.875em;margin-right:.875em}.half-horizontal-padding,.large-half-horizontal-padding{padding-left:.875em;padding-right:.875em}.large-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.4375em;margin-right:.4375em}.large-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.4375em;padding-right:.4375em}.large-top-space,.top-space{margin-top:1.75em}.large-top-padding,.top-padding{padding-top:1.75em}.double-top-space,.large-double-top-space{margin-top:3.5em}.double-top-padding,.large-double-top-padding{padding-top:3.5em}.half-top-space,.large-half-top-space{margin-top:.875em}.half-top-padding,.large-half-top-padding{padding-top:.875em}.large-quarter-top-space,.quarter-top-space{margin-top:.4375em}.large-quarter-top-padding,.quarter-top-padding{padding-top:.4375em}.large-right-space,.right-space{margin-right:1.75em}.large-right-padding,.right-padding{padding-right:1.75em}.double-right-space,.large-double-right-space{margin-right:3.5em}.double-right-padding,.large-double-right-padding{padding-right:3.5em}.half-right-space,.large-half-right-space{margin-right:.875em}.half-right-padding,.large-half-right-padding{padding-right:.875em}.large-quarter-right-space,.quarter-right-space{margin-right:.4375em}.large-quarter-right-padding,.quarter-right-padding{padding-right:.4375em}.bottom-space,.large-bottom-space{margin-bottom:1.75em}.bottom-padding,.large-bottom-padding{padding-bottom:1.75em}.double-bottom-space,.large-double-bottom-space{margin-bottom:3.5em}.double-bottom-padding,.large-double-bottom-padding{padding-bottom:3.5em}.half-bottom-space,.large-half-bottom-space{margin-bottom:.875em}.half-bottom-padding,.large-half-bottom-padding{padding-bottom:.875em}.large-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.4375em}.large-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.4375em}.large-left-space,.left-space{margin-left:1.75em}.large-left-padding,.left-padding{padding-left:1.75em}.double-left-space,.large-double-left-space{margin-left:3.5em}.double-left-padding,.large-double-left-padding{padding-left:3.5em}.half-left-space,.large-half-left-space{margin-left:.875em}.half-left-padding,.large-half-left-padding{padding-left:.875em}.large-quarter-left-space,.quarter-left-space{margin-left:.4375em}.large-quarter-left-padding,.quarter-left-padding{padding-left:.4375em}.hide-large{display:none!important}.show-large{display:inherit!important}table.show-large{display:table}thead.show-large{display:table-header-group}tbody.show-large{display:table-row-group}tfoot.show-large{display:table-footer-group}tr.show-large{display:table-row}td.show-large,th.show-large{display:table-cell}}@media screen and (min-width:641px) and (max-width:960px){.ink-grid{padding:0 1.5em}.column-group>[class*=medium-]{float:left;clear:none}.medium-5{width:5%}.medium-10{width:10%}.medium-15{width:15%}.medium-16{width:16.66%}.medium-20{width:20%}.medium-25{width:25%}.medium-30{width:30%}.medium-33{width:33.33%}.medium-35{width:35%}.medium-40{width:40%}.medium-45{width:45%}.medium-50{width:50%}.medium-55{width:55%}.medium-60{width:60%}.medium-65{width:65%}.medium-66{width:66.66%}.medium-70{width:70%}.medium-75{width:75%}.medium-80{width:80%}.medium-85{width:85%}.medium-90{width:90%}.medium-95{width:95%}.medium-100{width:100%}[class*=medium-100]{float:none;clear:both}.column-group{*zoom:1}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1.5em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}.column-group.horizontal-gutters{margin-left:-1.5em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=medium-]{padding-left:1.5em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=medium-]{margin-bottom:1.5em}.column-group.double-gutters{margin-left:-3em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}.column-group.double-horizontal-gutters{margin-left:-3em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=medium-]{padding-left:3em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=medium-]{margin-bottom:3em}.column-group.half-gutters{margin-left:-.75em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}.column-group.half-horizontal-gutters{margin-left:-.75em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=medium-]{padding-left:.75em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}.column-group.quarter-gutters{margin-left:-.375em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}.column-group.quarter-horizontal-gutters{margin-left:-.375em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}.column-group.medium-gutters{margin-left:-1.5em}.column-group.medium-gutters>[class*=all-],.column-group.medium-gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}.column-group.medium-horizontal-gutters{margin-left:-1.5em}.column-group.medium-horizontal-gutters>[class*=all-],.column-group.medium-horizontal-gutters>[class*=medium-]{padding-left:1.5em}.column-group.medium-vertical-gutters>[class*=all-],.column-group.medium-vertical-gutters>[class*=medium-]{margin-bottom:1.5em}.column-group.medium-double-gutters{margin-left:-3em}.column-group.medium-double-gutters>[class*=all-],.column-group.medium-double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}.column-group.medium-double-horizontal-gutters{margin-left:-3em}.column-group.medium-double-horizontal-gutters>[class*=all-],.column-group.medium-double-horizontal-gutters>[class*=medium-]{padding-left:3em}.column-group.medium-double-vertical-gutters>[class*=all-],.column-group.medium-double-vertical-gutters>[class*=medium-]{margin-bottom:3em}.column-group.medium-half-gutters{margin-left:-.75em}.column-group.medium-half-gutters>[class*=all-],.column-group.medium-half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}.column-group.medium-half-horizontal-gutters{margin-left:-.75em}.column-group.medium-half-horizontal-gutters>[class*=all-],.column-group.medium-half-horizontal-gutters>[class*=medium-]{padding-left:.75em}.column-group.medium-half-vertical-gutters>[class*=all-],.column-group.medium-half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}.column-group.medium-quarter-gutters{margin-left:-.375em}.column-group.medium-quarter-gutters>[class*=all-],.column-group.medium-quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}.column-group.medium-quarter-horizontal-gutters{margin-left:-.375em}.column-group.medium-quarter-horizontal-gutters>[class*=all-],.column-group.medium-quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}.column-group.medium-quarter-vertical-gutters>[class*=all-],.column-group.medium-quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}.column-group.medium-no-gutters{margin-left:0}.column-group.medium-no-gutters>[class*=all-],.column-group.medium-no-gutters>[class*=medium-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=medium-],.ink-table td[class*=medium-],.ink-table tfoot[class*=medium-],.ink-table th[class*=medium-],.ink-table thead[class*=medium-],.ink-table tr[class*=medium-]{float:none}.medium-push-left{float:left}.medium-push-center{float:none;margin-left:auto;margin-right:auto}.medium-push-right{float:right}.medium-align-left{text-align:left}.medium-align-center{text-align:center}.medium-align-right{text-align:right}.medium-no-margin{margin:0!important}.medium-space,.space{margin:1.5em}.medium-padding,.padding{padding:1.5em}.double-space,.medium-double-space{margin:3em}.double-padding,.medium-double-padding{padding:3em}.half-space,.medium-half-space{margin:.75em}.half-padding,.medium-half-padding{padding:.75em}.medium-quarter-space,.quarter-space{margin:.375em}.medium-quarter-padding,.quarter-padding{padding:.375em}.medium-vertical-space,.vertical-space{margin-top:1.5em;margin-bottom:1.5em}.medium-vertical-padding,.vertical-padding{padding-top:1.5em;padding-bottom:1.5em}.double-vertical-space,.medium-double-vertical-space{margin-top:3em;margin-bottom:3em}.double-vertical-padding,.medium-double-vertical-padding{padding-top:3em;padding-bottom:3em}.half-vertical-space,.medium-half-vertical-space{margin-top:.75em;margin-bottom:.75em}.half-vertical-padding,.medium-half-vertical-padding{padding-top:.75em;padding-bottom:.75em}.medium-quarter-vertical-space,.quarter-vertical-space{margin-top:.375em;margin-bottom:.375em}.medium-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.375em;padding-bottom:.375em}.horizontal-space,.medium-horizontal-space{margin-left:1.5em;margin-right:1.5em}.horizontal-padding,.medium-horizontal-padding{padding-left:1.5em;padding-right:1.5em}.double-horizontal-space,.medium-double-horizontal-space{margin-left:3em;margin-right:3em}.double-horizontal-padding,.medium-double-horizontal-padding{padding-left:3em;padding-right:3em}.half-horizontal-space,.medium-half-horizontal-space{margin-left:.75em;margin-right:.75em}.half-horizontal-padding,.medium-half-horizontal-padding{padding-left:.75em;padding-right:.75em}.medium-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.375em;margin-right:.375em}.medium-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.375em;padding-right:.375em}.medium-top-space,.top-space{margin-top:1.5em}.medium-top-padding,.top-padding{padding-top:1.5em}.double-top-space,.medium-double-top-space{margin-top:3em}.double-top-padding,.medium-double-top-padding{padding-top:3em}.half-top-space,.medium-half-top-space{margin-top:.75em}.half-top-padding,.medium-half-top-padding{padding-top:.75em}.medium-quarter-top-space,.quarter-top-space{margin-top:.375em}.medium-quarter-top-padding,.quarter-top-padding{padding-top:.375em}.medium-right-space,.right-space{margin-right:1.5em}.medium-right-padding,.right-padding{padding-right:1.5em}.double-right-space,.medium-double-right-space{margin-right:3em}.double-right-padding,.medium-double-right-padding{padding-right:3em}.half-right-space,.medium-half-right-space{margin-right:.75em}.half-right-padding,.medium-half-right-padding{padding-right:.75em}.medium-quarter-right-space,.quarter-right-space{margin-right:.375em}.medium-quarter-right-padding,.quarter-right-padding{padding-right:.375em}.bottom-space,.medium-bottom-space{margin-bottom:1.5em}.bottom-padding,.medium-bottom-padding{padding-bottom:1.5em}.double-bottom-space,.medium-double-bottom-space{margin-bottom:3em}.double-bottom-padding,.medium-double-bottom-padding{padding-bottom:3em}.half-bottom-space,.medium-half-bottom-space{margin-bottom:.75em}.half-bottom-padding,.medium-half-bottom-padding{padding-bottom:.75em}.medium-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.375em}.medium-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.375em}.left-space,.medium-left-space{margin-left:1.5em}.left-padding,.medium-left-padding{padding-left:1.5em}.double-left-space,.medium-double-left-space{margin-left:3em}.double-left-padding,.medium-double-left-padding{padding-left:3em}.half-left-space,.medium-half-left-space{margin-left:.75em}.half-left-padding,.medium-half-left-padding{padding-left:.75em}.medium-quarter-left-space,.quarter-left-space{margin-left:.375em}.medium-quarter-left-padding,.quarter-left-padding{padding-left:.375em}.hide-medium{display:none!important}.show-medium{display:inherit!important}table.show-medium{display:table}thead.show-medium{display:table-header-group}tbody.show-medium{display:table-row-group}tfoot.show-medium{display:table-footer-group}tr.show-medium{display:table-row}td.show-medium,th.show-medium{display:table-cell}}@media screen and (min-width:321px) and (max-width:640px){.ink-grid{padding:0 1.25em}.column-group>[class*=small-]{float:left;clear:none}.small-5{width:5%}.small-10{width:10%}.small-15{width:15%}.small-16{width:16.66%}.small-20{width:20%}.small-25{width:25%}.small-30{width:30%}.small-33{width:33.33%}.small-35{width:35%}.small-40{width:40%}.small-45{width:45%}.small-50{width:50%}.small-55{width:55%}.small-60{width:60%}.small-65{width:65%}.small-66{width:66.66%}.small-70{width:70%}.small-75{width:75%}.small-80{width:80%}.small-85{width:85%}.small-90{width:90%}.small-95{width:95%}.small-100{width:100%}[class*=small-100]{float:none;clear:both}.column-group{*zoom:1}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1.25em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}.column-group.horizontal-gutters{margin-left:-1.25em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=small-]{padding-left:1.25em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=small-]{margin-bottom:1.25em}.column-group.double-gutters{margin-left:-2.5em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}.column-group.double-horizontal-gutters{margin-left:-2.5em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=small-]{padding-left:2.5em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}.column-group.half-gutters{margin-left:-.625em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}.column-group.half-horizontal-gutters{margin-left:-.625em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=small-]{padding-left:.625em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=small-]{margin-bottom:.625em}.column-group.quarter-gutters{margin-left:-.3125em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}.column-group.quarter-horizontal-gutters{margin-left:-.3125em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}.column-group.small-gutters{margin-left:-1.25em}.column-group.small-gutters>[class*=all-],.column-group.small-gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}.column-group.small-horizontal-gutters{margin-left:-1.25em}.column-group.small-horizontal-gutters>[class*=all-],.column-group.small-horizontal-gutters>[class*=small-]{padding-left:1.25em}.column-group.small-vertical-gutters>[class*=all-],.column-group.small-vertical-gutters>[class*=small-]{margin-bottom:1.25em}.column-group.small-double-gutters{margin-left:-2.5em}.column-group.small-double-gutters>[class*=all-],.column-group.small-double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}.column-group.small-double-horizontal-gutters{margin-left:-2.5em}.column-group.small-double-horizontal-gutters>[class*=all-],.column-group.small-double-horizontal-gutters>[class*=small-]{padding-left:2.5em}.column-group.small-double-vertical-gutters>[class*=all-],.column-group.small-double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}.column-group.small-half-gutters{margin-left:-.625em}.column-group.small-half-gutters>[class*=all-],.column-group.small-half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}.column-group.small-half-horizontal-gutters{margin-left:-.625em}.column-group.small-half-horizontal-gutters>[class*=all-],.column-group.small-half-horizontal-gutters>[class*=small-]{padding-left:.625em}.column-group.small-half-vertical-gutters>[class*=all-],.column-group.small-half-vertical-gutters>[class*=small-]{margin-bottom:.625em}.column-group.small-quarter-gutters{margin-left:-.3125em}.column-group.small-quarter-gutters>[class*=all-],.column-group.small-quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}.column-group.small-quarter-horizontal-gutters{margin-left:-.3125em}.column-group.small-quarter-horizontal-gutters>[class*=all-],.column-group.small-quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}.column-group.small-quarter-vertical-gutters>[class*=all-],.column-group.small-quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}.column-group.small-no-gutters{margin-left:0}.column-group.small-no-gutters>[class*=all-],.column-group.small-no-gutters>[class*=small-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=small-],.ink-table td[class*=small-],.ink-table tfoot[class*=small-],.ink-table th[class*=small-],.ink-table thead[class*=small-],.ink-table tr[class*=small-]{float:none}.small-push-left{float:left}.small-push-center{float:none;margin-left:auto;margin-right:auto}.small-push-right{float:right}.small-align-left{text-align:left}.small-align-center{text-align:center}.small-align-right{text-align:right}.small-no-margin{margin:0!important}.small-space,.space{margin:1.25em}.padding,.small-padding{padding:1.25em}.double-space,.small-double-space{margin:2.5em}.double-padding,.small-double-padding{padding:2.5em}.half-space,.small-half-space{margin:.625em}.half-padding,.small-half-padding{padding:.625em}.quarter-space,.small-quarter-space{margin:.3125em}.quarter-padding,.small-quarter-padding{padding:.3125em}.small-vertical-space,.vertical-space{margin-top:1.25em;margin-bottom:1.25em}.small-vertical-padding,.vertical-padding{padding-top:1.25em;padding-bottom:1.25em}.double-vertical-space,.small-double-vertical-space{margin-top:2.5em;margin-bottom:2.5em}.double-vertical-padding,.small-double-vertical-padding{padding-top:2.5em;padding-bottom:2.5em}.half-vertical-space,.small-half-vertical-space{margin-top:.625em;margin-bottom:.625em}.half-vertical-padding,.small-half-vertical-padding{padding-top:.625em;padding-bottom:.625em}.quarter-vertical-space,.small-quarter-vertical-space{margin-top:.3125em;margin-bottom:.3125em}.quarter-vertical-padding,.small-quarter-vertical-padding{padding-top:.3125em;padding-bottom:.3125em}.horizontal-space,.small-horizontal-space{margin-left:1.25em;margin-right:1.25em}.horizontal-padding,.small-horizontal-padding{padding-left:1.25em;padding-right:1.25em}.double-horizontal-space,.small-double-horizontal-space{margin-left:2.5em;margin-right:2.5em}.double-horizontal-padding,.small-double-horizontal-padding{padding-left:2.5em;padding-right:2.5em}.half-horizontal-space,.small-half-horizontal-space{margin-left:.625em;margin-right:.625em}.half-horizontal-padding,.small-half-horizontal-padding{padding-left:.625em;padding-right:.625em}.quarter-horizontal-space,.small-quarter-horizontal-space{margin-left:.3125em;margin-right:.3125em}.quarter-horizontal-padding,.small-quarter-horizontal-padding{padding-left:.3125em;padding-right:.3125em}.small-top-space,.top-space{margin-top:1.25em}.small-top-padding,.top-padding{padding-top:1.25em}.double-top-space,.small-double-top-space{margin-top:2.5em}.double-top-padding,.small-double-top-padding{padding-top:2.5em}.half-top-space,.small-half-top-space{margin-top:.625em}.half-top-padding,.small-half-top-padding{padding-top:.625em}.quarter-top-space,.small-quarter-top-space{margin-top:.3125em}.quarter-top-padding,.small-quarter-top-padding{padding-top:.3125em}.right-space,.small-right-space{margin-right:1.25em}.right-padding,.small-right-padding{padding-right:1.25em}.double-right-space,.small-double-right-space{margin-right:2.5em}.double-right-padding,.small-double-right-padding{padding-right:2.5em}.half-right-space,.small-half-right-space{margin-right:.625em}.half-right-padding,.small-half-right-padding{padding-right:.625em}.quarter-right-space,.small-quarter-right-space{margin-right:.3125em}.quarter-right-padding,.small-quarter-right-padding{padding-right:.3125em}.bottom-space,.small-bottom-space{margin-bottom:1.25em}.bottom-padding,.small-bottom-padding{padding-bottom:1.25em}.double-bottom-space,.small-double-bottom-space{margin-bottom:2.5em}.double-bottom-padding,.small-double-bottom-padding{padding-bottom:2.5em}.half-bottom-space,.small-half-bottom-space{margin-bottom:.625em}.half-bottom-padding,.small-half-bottom-padding{padding-bottom:.625em}.quarter-bottom-space,.small-quarter-bottom-space{margin-bottom:.3125em}.quarter-bottom-padding,.small-quarter-bottom-padding{padding-bottom:.3125em}.left-space,.small-left-space{margin-left:1.25em}.left-padding,.small-left-padding{padding-left:1.25em}.double-left-space,.small-double-left-space{margin-left:2.5em}.double-left-padding,.small-double-left-padding{padding-left:2.5em}.half-left-space,.small-half-left-space{margin-left:.625em}.half-left-padding,.small-half-left-padding{padding-left:.625em}.quarter-left-space,.small-quarter-left-space{margin-left:.3125em}.quarter-left-padding,.small-quarter-left-padding{padding-left:.3125em}.hide-small{display:none!important}.show-small{display:inherit!important}table.show-small{display:table}thead.show-small{display:table-header-group}tbody.show-small{display:table-row-group}tfoot.show-small{display:table-footer-group}tr.show-small{display:table-row}td.show-small,th.show-small{display:table-cell}}@media screen and (max-width:320px){.ink-grid{padding:0 1em}.column-group>[class*=tiny-]{float:left;clear:none}.tiny-5{width:5%}.tiny-10{width:10%}.tiny-15{width:15%}.tiny-16{width:16.66%}.tiny-20{width:20%}.tiny-25{width:25%}.tiny-30{width:30%}.tiny-33{width:33.33%}.tiny-35{width:35%}.tiny-40{width:40%}.tiny-45{width:45%}.tiny-50{width:50%}.tiny-55{width:55%}.tiny-60{width:60%}.tiny-65{width:65%}.tiny-66{width:66.66%}.tiny-70{width:70%}.tiny-75{width:75%}.tiny-80{width:80%}.tiny-85{width:85%}.tiny-90{width:90%}.tiny-95{width:95%}.tiny-100{width:100%}[class*=tiny-100]{float:none;clear:both}.column-group{*zoom:1}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}.column-group.horizontal-gutters{margin-left:-1em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=tiny-]{padding-left:1em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=tiny-]{margin-bottom:1em}.column-group.double-gutters{margin-left:-2em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}.column-group.double-horizontal-gutters{margin-left:-2em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=tiny-]{padding-left:2em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}.column-group.half-gutters{margin-left:-.5em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}.column-group.half-horizontal-gutters{margin-left:-.5em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}.column-group.quarter-gutters{margin-left:-.25em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}.column-group.quarter-horizontal-gutters{margin-left:-.25em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}.column-group.tiny-gutters{margin-left:-1em}.column-group.tiny-gutters>[class*=all-],.column-group.tiny-gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}.column-group.tiny-horizontal-gutters{margin-left:-1em}.column-group.tiny-horizontal-gutters>[class*=all-],.column-group.tiny-horizontal-gutters>[class*=tiny-]{padding-left:1em}.column-group.tiny-vertical-gutters>[class*=all-],.column-group.tiny-vertical-gutters>[class*=tiny-]{margin-bottom:1em}.column-group.tiny-double-gutters{margin-left:-2em}.column-group.tiny-double-gutters>[class*=all-],.column-group.tiny-double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}.column-group.tiny-double-horizontal-gutters{margin-left:-2em}.column-group.tiny-double-horizontal-gutters>[class*=all-],.column-group.tiny-double-horizontal-gutters>[class*=tiny-]{padding-left:2em}.column-group.tiny-double-vertical-gutters>[class*=all-],.column-group.tiny-double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}.column-group.tiny-half-gutters{margin-left:-.5em}.column-group.tiny-half-gutters>[class*=all-],.column-group.tiny-half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}.column-group.tiny-half-horizontal-gutters{margin-left:-.5em}.column-group.tiny-half-horizontal-gutters>[class*=all-],.column-group.tiny-half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}.column-group.tiny-half-vertical-gutters>[class*=all-],.column-group.tiny-half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}.column-group.tiny-quarter-gutters{margin-left:-.25em}.column-group.tiny-quarter-gutters>[class*=all-],.column-group.tiny-quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}.column-group.tiny-quarter-horizontal-gutters{margin-left:-.25em}.column-group.tiny-quarter-horizontal-gutters>[class*=all-],.column-group.tiny-quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}.column-group.tiny-quarter-vertical-gutters>[class*=all-],.column-group.tiny-quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}.column-group.tiny-no-gutters{margin-left:0}.column-group.tiny-no-gutters>[class*=all-],.column-group.tiny-no-gutters>[class*=tiny-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=tiny-],.ink-table td[class*=tiny-],.ink-table tfoot[class*=tiny-],.ink-table th[class*=tiny-],.ink-table thead[class*=tiny-],.ink-table tr[class*=tiny-]{float:none}.tiny-push-left{float:left}.tiny-push-center{float:none;margin-left:auto;margin-right:auto}.tiny-push-right{float:right}.tiny-align-left{text-align:left}.tiny-align-center{text-align:center}.tiny-align-right{text-align:right}.tiny-no-margin{margin:0!important}.space,.tiny-space{margin:1em}.padding,.tiny-padding{padding:1em}.double-space,.tiny-double-space{margin:2em}.double-padding,.tiny-double-padding{padding:2em}.half-space,.tiny-half-space{margin:.5em}.half-padding,.tiny-half-padding{padding:.5em}.quarter-space,.tiny-quarter-space{margin:.25em}.quarter-padding,.tiny-quarter-padding{padding:.25em}.tiny-vertical-space,.vertical-space{margin-top:1em;margin-bottom:1em}.tiny-vertical-padding,.vertical-padding{padding-top:1em;padding-bottom:1em}.double-vertical-space,.tiny-double-vertical-space{margin-top:2em;margin-bottom:2em}.double-vertical-padding,.tiny-double-vertical-padding{padding-top:2em;padding-bottom:2em}.half-vertical-space,.tiny-half-vertical-space{margin-top:.5em;margin-bottom:.5em}.half-vertical-padding,.tiny-half-vertical-padding{padding-top:.5em;padding-bottom:.5em}.quarter-vertical-space,.tiny-quarter-vertical-space{margin-top:.25em;margin-bottom:.25em}.quarter-vertical-padding,.tiny-quarter-vertical-padding{padding-top:.25em;padding-bottom:.25em}.horizontal-space,.tiny-horizontal-space{margin-left:1em;margin-right:1em}.horizontal-padding,.tiny-horizontal-padding{padding-left:1em;padding-right:1em}.double-horizontal-space,.tiny-double-horizontal-space{margin-left:2em;margin-right:2em}.double-horizontal-padding,.tiny-double-horizontal-padding{padding-left:2em;padding-right:2em}.half-horizontal-space,.tiny-half-horizontal-space{margin-left:.5em;margin-right:.5em}.half-horizontal-padding,.tiny-half-horizontal-padding{padding-left:.5em;padding-right:.5em}.quarter-horizontal-space,.tiny-quarter-horizontal-space{margin-left:.25em;margin-right:.25em}.quarter-horizontal-padding,.tiny-quarter-horizontal-padding{padding-left:.25em;padding-right:.25em}.tiny-top-space,.top-space{margin-top:1em}.tiny-top-padding,.top-padding{padding-top:1em}.double-top-space,.tiny-double-top-space{margin-top:2em}.double-top-padding,.tiny-double-top-padding{padding-top:2em}.half-top-space,.tiny-half-top-space{margin-top:.5em}.half-top-padding,.tiny-half-top-padding{padding-top:.5em}.quarter-top-space,.tiny-quarter-top-space{margin-top:.25em}.quarter-top-padding,.tiny-quarter-top-padding{padding-top:.25em}.right-space,.tiny-right-space{margin-right:1em}.right-padding,.tiny-right-padding{padding-right:1em}.double-right-space,.tiny-double-right-space{margin-right:2em}.double-right-padding,.tiny-double-right-padding{padding-right:2em}.half-right-space,.tiny-half-right-space{margin-right:.5em}.half-right-padding,.tiny-half-right-padding{padding-right:.5em}.quarter-right-space,.tiny-quarter-right-space{margin-right:.25em}.quarter-right-padding,.tiny-quarter-right-padding{padding-right:.25em}.bottom-space,.tiny-bottom-space{margin-bottom:1em}.bottom-padding,.tiny-bottom-padding{padding-bottom:1em}.double-bottom-space,.tiny-double-bottom-space{margin-bottom:2em}.double-bottom-padding,.tiny-double-bottom-padding{padding-bottom:2em}.half-bottom-space,.tiny-half-bottom-space{margin-bottom:.5em}.half-bottom-padding,.tiny-half-bottom-padding{padding-bottom:.5em}.quarter-bottom-space,.tiny-quarter-bottom-space{margin-bottom:.25em}.quarter-bottom-padding,.tiny-quarter-bottom-padding{padding-bottom:.25em}.left-space,.tiny-left-space{margin-left:1em}.left-padding,.tiny-left-padding{padding-left:1em}.double-left-space,.tiny-double-left-space{margin-left:2em}.double-left-padding,.tiny-double-left-padding{padding-left:2em}.half-left-space,.tiny-half-left-space{margin-left:.5em}.half-left-padding,.tiny-half-left-padding{padding-left:.5em}.quarter-left-space,.tiny-quarter-left-space{margin-left:.25em}.quarter-left-padding,.tiny-quarter-left-padding{padding-left:.25em}.hide-tiny{display:none!important}.show-tiny{display:inherit!important}table.show-tiny{display:table}thead.show-tiny{display:table-header-group}tbody.show-tiny{display:table-row-group}tfoot.show-tiny{display:table-footer-group}tr.show-tiny{display:table-row}td.show-tiny,th.show-tiny{display:table-cell}}@media screen and (min-width:1261px){html{font-size:1.08em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:961px) and (max-width:1260px){html{font-size:1.05em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:641px) and (max-width:960px){html{font-size:1em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:321px) and (max-width:640px){html{font-size:.98em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (max-width:320px){html{font-size:.97em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}.ink-label{padding:0 .35em;white-space:nowrap}.ink-navigation{overflow:visible}.ink-navigation ul{list-style-type:none;padding:0;margin:0}.ink-navigation ul li{margin:0}.ink-navigation .breadcrumbs li{line-height:2.7em;display:inline}.ink-navigation .breadcrumbs li a{display:inline;padding:0}.ink-navigation .breadcrumbs li a:hover{background:0 0}.ink-navigation .breadcrumbs li.active a{cursor:default;text-decoration:none}.ink-navigation .breadcrumbs li:first-child a{padding-left:1.2em}.ink-navigation .breadcrumbs li:after{content:'/';display:inline;margin:0 .7em}.ink-navigation .breadcrumbs li:last-child:after{content:'';display:none}.ink-dropdown,.ink-navigation{position:relative}.ink-dropdown ul.dropdown,.ink-dropdown ul.dropdown-menu,.ink-navigation ul.dropdown,.ink-navigation ul.dropdown-menu{position:absolute;top:110%;background:#fff;z-index:30;border:1px solid #d9d9d9;height:auto;width:auto;min-width:10em;max-width:12em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:rgba(100,100,100,.3) 0 0 1px 0;-moz-box-shadow:rgba(100,100,100,.3) 0 0 1px 0;box-shadow:rgba(100,100,100,.3) 0 0 1px 0;margin-left:0;padding:.35em 0;font-size:.85em}.ink-dropdown ul.dropdown li,.ink-dropdown ul.dropdown-menu li,.ink-navigation ul.dropdown li,.ink-navigation ul.dropdown-menu li{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-border-radius:none;-moz-border-radius:none;-ms-border-radius:none;-o-border-radius:none;border-radius:none;width:auto;height:auto;min-height:auto;display:list-item;float:none;margin:0;text-align:left;text-transform:none;padding:0;position:relative;list-style-type:none}.ink-dropdown ul.dropdown li.separator-above,.ink-dropdown ul.dropdown-menu li.separator-above,.ink-navigation ul.dropdown li.separator-above,.ink-navigation ul.dropdown-menu li.separator-above{padding-top:.35em;margin-top:.35em;border-top:1px solid #d9d9d9}.ink-dropdown ul.dropdown li.separator-below,.ink-dropdown ul.dropdown-menu li.separator-below,.ink-navigation ul.dropdown li.separator-below,.ink-navigation ul.dropdown-menu li.separator-below{padding-bottom:.35em;margin-bottom:.35em;border-bottom:1px solid #d9d9d9}.ink-dropdown ul.dropdown li.heading,.ink-dropdown ul.dropdown-menu li.heading,.ink-navigation ul.dropdown li.heading,.ink-navigation ul.dropdown-menu li.heading{font-weight:700;margin-bottom:.35em;padding:.5em .8em;color:#333}.ink-dropdown ul.dropdown li a,.ink-dropdown ul.dropdown-menu li a,.ink-navigation ul.dropdown li a,.ink-navigation ul.dropdown-menu li a{color:#444;padding:.5em .8em;display:block;clear:both}.ink-dropdown ul.dropdown li a:hover,.ink-dropdown ul.dropdown-menu li a:hover,.ink-navigation ul.dropdown li a:hover,.ink-navigation ul.dropdown-menu li a:hover{background:#f2f2f2;text-decoration:none}.ink-dropdown ul.dropdown li.active a,.ink-dropdown ul.dropdown-menu li.active a,.ink-navigation ul.dropdown li.active a,.ink-navigation ul.dropdown-menu li.active a{background:#999;color:#fff}.ink-dropdown ul.dropdown li.disabled a,.ink-dropdown ul.dropdown-menu li.disabled a,.ink-navigation ul.dropdown li.disabled a,.ink-navigation ul.dropdown-menu li.disabled a{color:#b3b3b3}.ink-dropdown ul.dropdown li.disabled a:hover,.ink-dropdown ul.dropdown-menu li.disabled a:hover,.ink-navigation ul.dropdown li.disabled a:hover,.ink-navigation ul.dropdown-menu li.disabled a:hover{background:0 0;cursor:default}.ink-dropdown ul.dropdown li.submenu,.ink-dropdown ul.dropdown-menu li.submenu,.ink-navigation ul.dropdown li.submenu,.ink-navigation ul.dropdown-menu li.submenu{overflow:visible}.ink-dropdown ul.dropdown li.submenu>a,.ink-dropdown ul.dropdown-menu li.submenu>a,.ink-navigation ul.dropdown li.submenu>a,.ink-navigation ul.dropdown-menu li.submenu>a{white-space:nowrap}.ink-dropdown ul.dropdown li.submenu>a:after,.ink-dropdown ul.dropdown-menu li.submenu>a:after,.ink-navigation ul.dropdown li.submenu>a:after,.ink-navigation ul.dropdown-menu li.submenu>a:after{content:"\f0da";width:auto;margin-left:.8em;font-family:FontAwesome;color:#b3b3b3}.ink-dropdown ul.dropdown li.submenu:hover>a,.ink-dropdown ul.dropdown-menu li.submenu:hover>a,.ink-navigation ul.dropdown li.submenu:hover>a,.ink-navigation ul.dropdown-menu li.submenu:hover>a{background:#f2f2f2;text-decoration:none}.ink-dropdown ul.dropdown li.submenu:hover:hover>ul.dropdown,.ink-dropdown ul.dropdown li.submenu:hover:hover>ul.dropdown-menu,.ink-dropdown ul.dropdown-menu li.submenu:hover:hover>ul.dropdown,.ink-dropdown ul.dropdown-menu li.submenu:hover:hover>ul.dropdown-menu,.ink-navigation ul.dropdown li.submenu:hover:hover>ul.dropdown,.ink-navigation ul.dropdown li.submenu:hover:hover>ul.dropdown-menu,.ink-navigation ul.dropdown-menu li.submenu:hover:hover>ul.dropdown,.ink-navigation ul.dropdown-menu li.submenu:hover:hover>ul.dropdown-menu{display:block}.ink-dropdown ul.dropdown li.submenu>ul.dropdown,.ink-dropdown ul.dropdown li.submenu>ul.dropdown-menu,.ink-dropdown ul.dropdown-menu li.submenu>ul.dropdown,.ink-dropdown ul.dropdown-menu li.submenu>ul.dropdown-menu,.ink-navigation ul.dropdown li.submenu>ul.dropdown,.ink-navigation ul.dropdown li.submenu>ul.dropdown-menu,.ink-navigation ul.dropdown-menu li.submenu>ul.dropdown,.ink-navigation ul.dropdown-menu li.submenu>ul.dropdown-menu{font-size:inherit;position:absolute;top:-.36em;left:100%;display:none}.ink-navigation ul.pagination{overflow:hidden;*zoom:1}.ink-navigation ul.pagination li{line-height:1.7;float:left}.ink-navigation ul.pagination li a{padding:.5em 1em;display:block;float:left}.ink-navigation ul.pagination.dotted li a{display:block;height:1em;width:1em;margin-right:.6em;padding:0;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%;text-indent:99999px}.ink-navigation ul.pagination.dotted li a:first-child,.ink-navigation ul.pagination.dotted li a:last-child{-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%}.ink-navigation ul.pagination.chevron li{display:none}.ink-navigation ul.pagination.chevron li.next,.ink-navigation ul.pagination.chevron li.previous{display:block}.ink-navigation ul.pagination.chevron li.next a,.ink-navigation ul.pagination.chevron li.previous a{display:block;position:absolute;top:35%;padding:0 .5em;margin:0;font-family:FontAwesome;font-size:4em}.ink-navigation ul.pagination.chevron li.next a span,.ink-navigation ul.pagination.chevron li.previous a span{text-indent:-99999px;display:inline-block}.ink-navigation ul.pagination.chevron li.previous a{left:0}.ink-navigation ul.pagination.chevron li.previous a:after{content:"\f137"}.ink-navigation ul.pagination.chevron li.next a{right:0}.ink-navigation ul.pagination.chevron li.next a:after{content:"\f138"}.ink-navigation .pills{overflow:hidden;*zoom:1}.ink-navigation .pills li{overflow:hidden;display:block;float:left;margin:0 .5em .5em 0;line-height:1.7}.ink-navigation .pills li a{display:block;padding:.5em 1em}.ink-navigation .pills li a:hover{text-decoration:none}.ink-navigation .pills li.active a,.ink-navigation .pills li.disabled a{cursor:default}.ink-navigation ul{*height:100%}.ink-navigation ul.menu{*zoom:1}.ink-navigation ul.menu:after{content:"";display:table;clear:both}.ink-navigation ul.menu li{*height:100%}.ink-navigation ul.menu li:hover>ul.submenu{display:block}.ink-navigation ul.menu li ul.submenu{display:none;position:absolute;z-index:10}.ink-navigation ul.menu li ul.submenu li a{padding:.5em 1em;display:block;float:none}.ink-navigation ul.menu.horizontal.scrollable{font-size:0;white-space:nowrap;overflow-x:scroll;overflow-y:hidden;-webkit-overflow-scrolling:touch;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}.ink-navigation ul.menu.horizontal.scrollable li{display:inline-block;float:none}.ink-navigation ul.menu.horizontal.scrollable li a{border-right:rgba(10,10,10,.3) 1px solid;font-size:initial}.ink-navigation ul.menu.horizontal.scrollable li:last-child a{border-right:0}.ink-navigation ul.menu.horizontal li{float:left;position:relative}.ink-navigation ul.menu.horizontal li a{padding:.5em 1em;display:block;line-height:1.7}.ink-navigation ul.menu.horizontal li .control{margin-top:.3em}.ink-navigation ul.menu.horizontal li ul.submenu{min-width:100%;z-index:50;top:auto;left:auto}.ink-navigation ul.menu.horizontal li ul.submenu li{float:none}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout{position:absolute;top:0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout.left{right:100%}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout.right{left:100%}.ink-navigation ul.menu.vertical li{line-height:1.7;position:relative}.ink-navigation ul.menu.vertical li a{padding:.5em 1em;display:block}.ink-navigation ul.menu.vertical li ul.submenu{position:relative;top:auto;left:auto}.ink-navigation ul.menu.vertical li ul.submenu.flyout{position:absolute;min-width:8em;top:0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.vertical li ul.submenu.flyout.left{right:100%}.ink-navigation ul.menu.vertical li ul.submenu.flyout.right{left:100%}@media print{*{background:transparent!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.ink-navigation{display:none}.ink-table{border-collapse:collapse}.ink-label{border:1px solid #000}}table.ink-table{width:100%;border-collapse:collapse;border-spacing:0}table.ink-table tr th{padding:5px 10px;line-height:1.3}table.ink-table tr th[data-sortable=true]:hover{cursor:pointer;text-decoration:underline}table.ink-table tr th[data-sortable=true]:hover i{text-decoration:none}table.ink-table tr th[data-sortable=true] i{padding-left:.5em}table.ink-table tr td{padding:5px 10px;line-height:1.3}table.ink-table.hover tbody tr:hover{cursor:pointer}table.ink-table.bordered{border-collapse:separate}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{color:#555;font-family:Roboto,Arial,Helvetica,sans-serif;line-height:1.45}.fw-100,.fw-light{font-weight:100}.fw-300,.fw-thin{font-weight:300}.fw-400,.fw-regular{font-weight:400}.fw-500,.fw-medium{font-weight:500}.fw-700,.fw-bold{font-weight:700}.fw-900,.fw-black{font-weight:900}.condensed-300,.condensed-thin{font-weight:200;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.condensed-400,.condensed-regular{font-weight:400;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.condensed-700,.condensed-bold{font-weight:700;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.slab-100,.slab-light{font-weight:100;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-300,.slab-thin{font-weight:300;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-400,.slab-regular{font-weight:400;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-700,.slab-bold{font-weight:700;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.sans{font-family:Roboto,Arial,Helvetica,sans-serif}.serif{font-family:Times,"Times New Roman",serif}.monospace{font-family:Monaco,"Andale Mono","Courier New",monospace}.condensed{font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.slab{font-family:Roboto_slab,Arial,Helvetica,sans-serif}.italic{font-style:italic}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalizer{text-transform:capitalize}.fa{font-size:14px}a{color:#6998c9;text-decoration:none;cursor:pointer}a:hover{color:#007ed5;text-decoration:underline}h1{font-size:2.2em;margin-top:0;margin-bottom:.57539em}h2{font-size:1.75em;margin-top:0;margin-bottom:.72334em}h3{font-size:1.5em;margin-top:0;margin-bottom:.8439em}h4{font-size:1.25em;margin-top:0;margin-bottom:1.01268em}h5,h6{font-size:1.1em;margin-top:0;margin-bottom:1.15077em}p,table{font-size:1em;margin-top:0;margin-bottom:1.26585em}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,h6:first-child,p:first-child{margin-top:0}h1,h2,h3,h4,h5,h6{color:#404040;font-weight:700;line-height:1.16}small{color:#888}input,textarea{color:#666}h1 small,h2 small,h3 small,h4 small{color:#bbb;font-size:.6em;font-weight:100;line-height:1}mark{background:#dae5f2}address{color:#777;font-size:1em;line-height:1.4}address p{margin-top:0}address h6{color:#555}abbr:hover{cursor:help}blockquote{border-left:4px solid #ddd;padding-left:25px;margin:1em 0;font-weight:200;font-size:1.1em}blockquote small{font-size:.9em}blockquote small::after,blockquote small::before{content:' — '}.note{font-size:.9em;color:#777}.note strong{color:#555}.small{font-size:.75em}.medium{font-size:.85em}.large{font-size:1.2em}.extralarge{font-size:1.45em!important}hr{border:0;border-top:1px solid #ddd;margin:1em 0}.lead{font-size:1.1em;font-weight:700}ol,ul{line-height:1.4;padding:0 0 0 1.45em;margin:1em 0}ol li,ul li{margin:.5em 0}ul.unstyled{list-style:none;padding-left:0}ul.unstyled ul{list-style:disc outside}ul.unstyled ul.unstyled{list-style:none;padding-left:0}ul.inline{list-style:none}ul.inline li{display:inline-block;padding:0 .5em}ul.inline li:first-child{padding:0 .5em 0 0}dl{margin:1em 0}dl dt{font-weight:700;margin:.5em 0}dl dd{margin:.5em 0 .5em 25px}dl.inline dt{float:left;clear:left;text-align:right;width:180px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;margin:0}dl.inline dd{margin:.5em 0 .5em 200px}figure.ink-image{position:relative;border:1px solid #555}figure.ink-image>img{width:100%}figure.ink-image>figcaption{padding:1em;background:#fff;line-height:1.3}figure.ink-image>figcaption.over-bottom,figure.ink-image>figcaption.over-top{position:absolute;width:100%;left:0;border:0}figure.ink-image>figcaption.over-bottom.dark,figure.ink-image>figcaption.over-top.dark{color:#fff;background:rgba(0,0,0,.6)}figure.ink-image>figcaption.over-top{top:0;background:rgba(255,255,255,.7)}figure.ink-image>figcaption.over-bottom{bottom:0;background:rgba(255,255,255,.7)}figure.ink-image>figcaption.dark{color:#fff;background:#222}img{border:0;width:auto;max-width:100%;vertical-align:top}.ink-alert.basic,.ink-alert.block{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-alert.basic{background:rgba(255,156,0,.25);color:#b87814;border:1px solid #b87814}.ink-alert.basic .ink-dismiss{color:#b87814}.ink-alert.basic.success{background:rgba(74,155,23,.25);color:#38621d;border:1px solid #38621d}.ink-alert.basic.success .ink-dismiss{color:#38621d}.ink-alert.basic.error{background:rgba(201,17,17,.25);color:#891e1e;border:1px solid #891e1e}.ink-alert.basic.error .ink-dismiss{color:#891e1e}.ink-alert.basic.info{background:rgba(15,117,218,.25);color:#1e5b98;border:1px solid #1e5b98}.ink-alert.basic.info .ink-dismiss{color:#1e5b98}.ink-alert.block{border:1px solid #b87814;background:#fff}.ink-alert.block>h4{background:rgba(255,156,0,.3);color:#b87814}.ink-alert.block .ink-dismiss{color:#b87814}.ink-alert.block.success{border:1px solid #38621d;background:#fff}.ink-alert.block.success>h4{background:rgba(74,155,23,.3);color:#38621d}.ink-alert.block.success .ink-dismiss{color:#38621d}.ink-alert.block.error{border:1px solid #891e1e;background:#fff}.ink-alert.block.error>h4{background:rgba(201,17,17,.3);color:#891e1e}.ink-alert.block.error .ink-dismiss{color:#891e1e}.ink-alert.block.info{border:1px solid #1e5b98;background:#fff}.ink-alert.block.info>h4{background:rgba(15,117,218,.3);color:#1e5b98}.ink-alert.block.info .ink-dismiss{color:#1e5b98}.ink-alert .ink-dismiss{font-family:Arial,sans-serif;font-weight:700;text-shadow:#fff 0 1px 0;filter:alpha(Opacity=25);opacity:.25}.ink-alert .ink-dismiss:hover{filter:alpha(Opacity=60);opacity:.6}.ink-badge{-webkit-border-radius:8em;-moz-border-radius:8em;-ms-border-radius:8em;-o-border-radius:8em;border-radius:8em;color:#fff}.ink-badge.white{background:#fff;color:#555}.ink-badge.black{background:#000}.ink-badge.orange{background:#ff9c00}.ink-badge.red{background:#c91111}.ink-badge.green{background:#4a9b17}.ink-badge.blue{background:#0f75da}.ink-badge.yellow{background:#ffd500;color:#555}.ink-badge.grey{background:gray}.ink-badge+.ink-badge{margin-left:.2em}.ink-button{background:#d9d9d9;color:#000;border:1px solid #bfbfbf;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;font-weight:300}.ink-button:active,.ink-button:hover{text-decoration:none;color:#000;background:#ccc;border:1px solid #b3b3b3;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px;box-shadow:rgba(0,0,0,.2) 0 1px 1px}.ink-button:focus{outline:0;background:#ccc;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset}.ink-button[disabled]{background:#e6e6e6;border:1px solid #e6e6e6;color:#999}.ink-button[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.blue{color:#fff;background:#0f75da;border:1px solid #0c63b9}.ink-button.blue:active,.ink-button.blue:hover{background:#0d68c2;border:1px solid #0a56a1;color:#fff;text-decoration:none}.ink-button.blue:focus{background:#0d68c2}.ink-button.blue[disabled]{background:rgba(15,117,218,.6);border:1px solid rgba(15,117,218,0);color:#0c5baa}.ink-button.blue[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.green{color:#fff;background:#4a9b17;border:1px solid #3e8313}.ink-button.green:active,.ink-button.green:hover{background:#3f8514;border:1px solid #336d10;color:#fff;text-decoration:none}.ink-button.green:focus{background:#3f8514}.ink-button.green[disabled]{background:rgba(74,155,23,.6);border:1px solid rgba(74,155,23,0);color:#356f10}.ink-button.green[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.orange{color:#fff;background:#ff9c00;border:1px solid #d88400}.ink-button.orange:active,.ink-button.orange:hover{background:#e68c00;border:1px solid #bf7400;color:#fff;text-decoration:none}.ink-button.orange:focus{background:#e68c00}.ink-button.orange[disabled]{background:rgba(255,156,0,.6);border:1px solid rgba(255,156,0,0);color:#cc7d00}.ink-button.orange[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.red{color:#fff;background:#c91111;border:1px solid #aa0e0e}.ink-button.red:active,.ink-button.red:hover{background:#b10f0f;border:1px solid #920c0c;color:#fff;text-decoration:none}.ink-button.red:focus{background:#b10f0f}.ink-button.red[disabled]{background:rgba(201,17,17,.6);border:1px solid rgba(201,17,17,0);color:#9a0d0d}.ink-button.red[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.black{color:#fff;background:#1a1a1a;border:1px solid #161616}.ink-button.black:active,.ink-button.black:hover{background:#0d0d0d;border:1px solid #090909;color:#fff;text-decoration:none}.ink-button.black:focus{background:#0d0d0d}.ink-button.black[disabled]{background:rgba(26,26,26,.6);border:1px solid rgba(26,26,26,0);color:#000}.ink-button.black[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.white{color:#555;background:#fff;border:1px solid #d8d8d8}.ink-button.white:active,.ink-button.white:hover{background:#f2f2f2;border:1px solid #cbcbcb;color:#555;text-decoration:none}.ink-button.white:focus{background:#f2f2f2}.ink-button.white[disabled]{background:rgba(255,255,255,.6);border:1px solid rgba(255,255,255,0);color:#e6e6e6}.ink-button.white[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.button-group>.ink-button[disabled]{background:#e6e6e6;border:1px solid rgba(217,217,217,.6)}.button-group>.ink-button[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.button-group>.ink-button.blue:first-child{border-left:#0c63b9}.button-group>.ink-button.blue[disabled]{background:rgba(15,117,218,.6);border:1px solid rgba(15,117,218,.3)}.button-group>.ink-button.green:first-child{border-left:#3e8313}.button-group>.ink-button.green[disabled]{background:rgba(74,155,23,.6);border:1px solid rgba(74,155,23,.3)}.button-group>.ink-button.orange:first-child{border-left:#d88400}.button-group>.ink-button.orange[disabled]{background:rgba(255,156,0,.6);border:1px solid rgba(255,156,0,.3)}.button-group>.ink-button.red:first-child{border-left:#aa0e0e}.button-group>.ink-button.red[disabled]{background:rgba(201,17,17,.6);border:1px solid rgba(201,17,17,.3)}.button-group>.ink-button.black:first-child{border-left:#161616}.button-group>.ink-button.black[disabled]{background:rgba(26,26,26,.6);border:1px solid rgba(26,26,26,.3)}.button-group>.ink-button.white:first-child{border-left:#d8d8d8}.button-group>.ink-button.white[disabled]{background:rgba(255,255,255,.6);border:1px solid rgba(255,255,255,.3)}.ink-label{color:#fff;font-weight:300;font-size:.938em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-label.white{background:#fff;color:#555}.ink-label.black{background:#000}.ink-label.orange{background:#ff9c00}.ink-label.red{background:#c91111}.ink-label.green{background:#4a9b17}.ink-label.blue{background:#0f75da}.ink-label.yellow{background:#ffd500;color:#555}.ink-label.grey{background:gray}.ink-label+.ink-label{margin-left:.2em}.ink-navigation ul.breadcrumbs{font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.breadcrumbs li.active a{background:0 0;color:#999}.ink-navigation ul.breadcrumbs li.active a:hover{cursor:default;text-decoration:none}.ink-navigation ul.breadcrumbs li a:hover{background:0 0;text-decoration:underline}.ink-navigation ul.breadcrumbs.white{background:#fff}.ink-navigation ul.breadcrumbs.white li a,.ink-navigation ul.breadcrumbs.white li:after{color:#555}.ink-navigation ul.breadcrumbs.white li.active a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.breadcrumbs.grey{background:#d9d9d9}.ink-navigation ul.breadcrumbs.grey li a,.ink-navigation ul.breadcrumbs.grey li:after{color:#555}.ink-navigation ul.breadcrumbs.grey li.active a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.breadcrumbs.black{background:#1a1a1a}.ink-navigation ul.breadcrumbs.black li a,.ink-navigation ul.breadcrumbs.black li:after{color:#fff}.ink-navigation ul.breadcrumbs.black li.active a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.breadcrumbs.blue{background:#1b75ce}.ink-navigation ul.breadcrumbs.blue li a,.ink-navigation ul.breadcrumbs.blue li:after{color:#fff}.ink-navigation ul.breadcrumbs.blue li.active a{color:#08427b;text-shadow:#1884ef 0 1px 0}.ink-navigation ul.breadcrumbs.orange{background:#f2990d}.ink-navigation ul.breadcrumbs.orange li a,.ink-navigation ul.breadcrumbs.orange li:after{color:#fff}.ink-navigation ul.breadcrumbs.orange li.active a{color:#995e00;text-shadow:#ffa81f 0 1px 0}.ink-navigation ul.breadcrumbs.green{background:#4c9220}.ink-navigation ul.breadcrumbs.green li a,.ink-navigation ul.breadcrumbs.green li:after{color:#fff}.ink-navigation ul.breadcrumbs.green li.active a{color:#20420a;text-shadow:#57b61b 0 1px 0}.ink-navigation ul.breadcrumbs.red{background:#be1c1c}.ink-navigation ul.breadcrumbs.red li a,.ink-navigation ul.breadcrumbs.red li:after{color:#fff}.ink-navigation ul.breadcrumbs.red li.active a{color:#6b0909;text-shadow:#e51313 0 1px 0}.ink-dropdown.green ul.dropdown-menu li.active a{background:#4a9b17;color:#fff}.ink-dropdown.orange ul.dropdown-menu li.active a{background:#ff9c00;color:#fff}.ink-dropdown.red ul.dropdown-menu li.active a{background:#c91111;color:#fff}.ink-dropdown.black ul.dropdown-menu li.active a{background:#1a1a1a;color:#fff}.ink-dropdown.blue ul.dropdown-menu li.active a{background:#0f75da;color:#fff}.ink-navigation ul.menu{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu>li{font-weight:300}.ink-navigation ul.menu>li.active a{text-decoration:underline}.ink-navigation ul.menu>li.heading{font-weight:500}.ink-navigation ul.menu>li.disabled a{color:#b3b3b3;text-shadow:#fff 0 1px 0}.ink-navigation ul.menu>li.disabled a:hover{cursor:default;background:0 0;text-decoration:none}.ink-navigation ul.menu>li ul.submenu li{font-size:.875em}.ink-navigation ul.menu>li ul.submenu li a{border-bottom:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.vertical li a{border-bottom:1px solid rgba(0,0,0,.15)}.ink-navigation ul.menu.vertical li:first-child,.ink-navigation ul.menu.vertical li:first-child>a{-webkit-border-radius:2px 2px 0 0;-moz-border-radius:2px 2px 0 0;-ms-border-radius:2px 2px 0 0;-o-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0}.ink-navigation ul.menu.vertical li:last-child{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child>a{border-bottom:0;-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child .submenu{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child .submenu.flyout{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.vertical li:last-child .submenu li:last-child,.ink-navigation ul.menu.vertical li:last-child .submenu li:last-child a{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.horizontal>li:first-child,.ink-navigation ul.menu.horizontal>li:first-child a{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-navigation ul.menu.horizontal>li:last-child,.ink-navigation ul.menu.horizontal>li:last-child a{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-navigation ul.menu.horizontal>li ul.submenu{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#fff}.ink-navigation ul.menu.horizontal>li ul.submenu li:last-child{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.horizontal>li ul.submenu li:last-child a{border-bottom:0}.ink-navigation ul.menu.white{background:#fff}.ink-navigation ul.menu.white li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.white li ul.submenu li a{color:#555}.ink-navigation ul.menu.white li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.white li.disabled a:hover{background:0 0}.ink-navigation ul.menu.white li.active{background:#e6e6e6}.ink-navigation ul.menu.white li.disabled a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.menu.white li a{color:#555;text-decoration:none}.ink-navigation ul.menu.white li a:hover{background:#f2f2f2}.ink-navigation ul.menu.grey{background:#d9d9d9}.ink-navigation ul.menu.grey li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.grey li ul.submenu li a{color:#555}.ink-navigation ul.menu.grey li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.grey li.disabled a:hover{background:0 0}.ink-navigation ul.menu.grey li.active{background:#bfbfbf}.ink-navigation ul.menu.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.menu.grey li a{color:#555;text-decoration:none}.ink-navigation ul.menu.grey li a:hover{background:#ccc}.ink-navigation ul.menu.black{background:#1a1a1a}.ink-navigation ul.menu.black li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.black li ul.submenu li a{color:#555}.ink-navigation ul.menu.black li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.black li.disabled a:hover{background:0 0}.ink-navigation ul.menu.black li.active{background:#333}.ink-navigation ul.menu.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.menu.black li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.black li a:hover{background:#404040}.ink-navigation ul.menu.blue{background:#1b75ce}.ink-navigation ul.menu.blue li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.blue li ul.submenu li a{color:#555}.ink-navigation ul.menu.blue li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.blue li.disabled a:hover{background:0 0}.ink-navigation ul.menu.blue li.active{background:#0c5baa}.ink-navigation ul.menu.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.menu.blue li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.blue li a:hover{background:#0d68c2}.ink-navigation ul.menu.green{background:#4c9220}.ink-navigation ul.menu.green li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.green li ul.submenu li a{color:#555}.ink-navigation ul.menu.green li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.green li.disabled a:hover{background:0 0}.ink-navigation ul.menu.green li.active{background:#356f10}.ink-navigation ul.menu.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.menu.green li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.green li a:hover{background:#3f8514}.ink-navigation ul.menu.orange{background:#f2990d}.ink-navigation ul.menu.orange li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.orange li ul.submenu li a{color:#555}.ink-navigation ul.menu.orange li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.orange li.disabled a:hover{background:0 0}.ink-navigation ul.menu.orange li.active{background:#cc7d00}.ink-navigation ul.menu.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.menu.orange li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.orange li a:hover{background:#e68c00}.ink-navigation ul.menu.red{background:#be1c1c}.ink-navigation ul.menu.red li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.red li ul.submenu li a{color:#555}.ink-navigation ul.menu.red li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.red li.disabled a:hover{background:0 0}.ink-navigation ul.menu.red li.active{background:#9a0d0d}.ink-navigation ul.menu.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.menu.red li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.red li a:hover{background:#b10f0f}.ink-navigation ul.pagination{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.pagination li{font-weight:300}.ink-navigation ul.pagination li.active a{text-decoration:underline}.ink-navigation ul.pagination li.disabled a{color:#b3b3b3;text-shadow:#fff 0 1px 0}.ink-navigation ul.pagination li.disabled a:hover{cursor:default;background:0 0;text-decoration:none}.ink-navigation ul.pagination li:first-child,.ink-navigation ul.pagination li:first-child a{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-navigation ul.pagination li:last-child,.ink-navigation ul.pagination li:last-child a{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-navigation ul.pagination.white li{background:#fff}.ink-navigation ul.pagination.white li.active a{background:#e6e6e6}.ink-navigation ul.pagination.white li.disabled a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.pagination.white li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.white li a{color:#555;text-decoration:none}.ink-navigation ul.pagination.white li a:hover{background:#f2f2f2}.ink-navigation ul.pagination.grey li{background:#d9d9d9}.ink-navigation ul.pagination.grey li.active a{background:#bfbfbf}.ink-navigation ul.pagination.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.pagination.grey li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.grey li a{color:#555;text-decoration:none}.ink-navigation ul.pagination.grey li a:hover{background:#ccc}.ink-navigation ul.pagination.black li{background:#1a1a1a}.ink-navigation ul.pagination.black li.active a{background:#333}.ink-navigation ul.pagination.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.pagination.black li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.black li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.black li a:hover{background:#292929}.ink-navigation ul.pagination.orange li{background:#f2990d}.ink-navigation ul.pagination.orange li.active a{background:#cc7d00}.ink-navigation ul.pagination.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.pagination.orange li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.orange li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.orange li a:hover{background:#e68c00}.ink-navigation ul.pagination.blue li{background:#1b75ce}.ink-navigation ul.pagination.blue li.active a{background:#0c5baa}.ink-navigation ul.pagination.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.pagination.blue li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.blue li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.blue li a:hover{background:#0d68c2}.ink-navigation ul.pagination.green li{background:#4c9220}.ink-navigation ul.pagination.green li.active a{background:#356f10}.ink-navigation ul.pagination.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.pagination.green li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.green li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.green li a:hover{background:#3f8514}.ink-navigation ul.pagination.red li{background:#be1c1c}.ink-navigation ul.pagination.red li.active a{background:#9a0d0d}.ink-navigation ul.pagination.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.pagination.red li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.red li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.red li a:hover{background:#b10f0f}.ink-navigation ul.pagination.dotted li{background:0 0}.ink-navigation ul.pagination.dotted li a{background:#999;filter:alpha(Opacity=50);opacity:.5}.ink-navigation ul.pagination.dotted li.active a,.ink-navigation ul.pagination.dotted li:hover a{filter:alpha(Opacity=100);opacity:1}.ink-navigation ul.pagination.dotted.black li a{background:#1a1a1a}.ink-navigation ul.pagination.dotted.white li a{background:#fff}.ink-navigation ul.pagination.dotted.blue li a{background:#1b75ce}.ink-navigation ul.pagination.dotted.green li a{background:#4c9220}.ink-navigation ul.pagination.dotted.orange li a{background:#f2990d}.ink-navigation ul.pagination.dotted.red li a{background:#be1c1c}.ink-navigation ul.pagination.chevron li.next a,.ink-navigation ul.pagination.chevron li.previous a{color:#fff;filter:alpha(Opacity=60);opacity:.6}.ink-navigation ul.pagination.chevron li.next a.active,.ink-navigation ul.pagination.chevron li.next a:focus,.ink-navigation ul.pagination.chevron li.next a:hover,.ink-navigation ul.pagination.chevron li.previous a.active,.ink-navigation ul.pagination.chevron li.previous a:focus,.ink-navigation ul.pagination.chevron li.previous a:hover{filter:alpha(Opacity=70);opacity:.7;text-decoration:none;background:0 0}.ink-navigation ul.pagination.chevron li.disabled a{color:#fff;filter:alpha(Opacity=40);opacity:.4;text-shadow:none}.ink-navigation ul.pagination.chevron li.disabled a:focus,.ink-navigation ul.pagination.chevron li.disabled a:hover{color:#fff;filter:alpha(Opacity=40);opacity:.4}.ink-navigation ul.pagination.chevron.black li.disabled a,.ink-navigation ul.pagination.chevron.black li.next a,.ink-navigation ul.pagination.chevron.black li.previous a{color:#1a1a1a}.ink-navigation ul.pagination.chevron.grey li.disabled a,.ink-navigation ul.pagination.chevron.grey li.next a,.ink-navigation ul.pagination.chevron.grey li.previous a{color:#d9d9d9}.ink-navigation ul.pagination.chevron.blue li.disabled a,.ink-navigation ul.pagination.chevron.blue li.next a,.ink-navigation ul.pagination.chevron.blue li.previous a{color:#1b75ce}.ink-navigation ul.pagination.chevron.green li.disabled a,.ink-navigation ul.pagination.chevron.green li.next a,.ink-navigation ul.pagination.chevron.green li.previous a{color:#4c9220}.ink-navigation ul.pagination.chevron.orange li.disabled a,.ink-navigation ul.pagination.chevron.orange li.next a,.ink-navigation ul.pagination.chevron.orange li.previous a{color:#f2990d}.ink-navigation ul.pagination.chevron.red li.disabled a,.ink-navigation ul.pagination.chevron.red li.next a,.ink-navigation ul.pagination.chevron.red li.previous a{color:#be1c1c}.ink-navigation ul.pills li{background:#fff;font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.pills li a{color:#555;background:0 0}.ink-navigation ul.pills li a:hover,.ink-navigation ul.pills li.active a{background:#e6e6e6}.ink-navigation ul.pills li.disabled a{color:#999;text-shadow:#fff 0 1px 0}.ink-navigation ul.pills li.disabled a:hover{background:0 0}.ink-navigation ul.pills.grey li{background:#d9d9d9}.ink-navigation ul.pills.grey li.active a{background:#bfbfbf}.ink-navigation ul.pills.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.pills.grey li.disabled a:hover{background:0 0}.ink-navigation ul.pills.grey li a{color:#555}.ink-navigation ul.pills.grey li a:hover{background:#ccc}.ink-navigation ul.pills.black li{background:#1a1a1a}.ink-navigation ul.pills.black li.active a{background:#333}.ink-navigation ul.pills.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.pills.black li.disabled a:hover{background:0 0}.ink-navigation ul.pills.black li a{color:#fff}.ink-navigation ul.pills.black li a:hover{background:#292929}.ink-navigation ul.pills.blue li{background:#1b75ce}.ink-navigation ul.pills.blue li.active a{background:#0c5baa}.ink-navigation ul.pills.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.pills.blue li.disabled a:hover{background:0 0}.ink-navigation ul.pills.blue li a{color:#fff}.ink-navigation ul.pills.blue li a:hover{background:#0d68c2}.ink-navigation ul.pills.green li{background:#4c9220}.ink-navigation ul.pills.green li.active a{background:#356f10}.ink-navigation ul.pills.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.pills.green li.disabled a:hover{background:0 0}.ink-navigation ul.pills.green li a{color:#fff}.ink-navigation ul.pills.green li a:hover{background:#3f8514}.ink-navigation ul.pills.orange li{background:#f2990d}.ink-navigation ul.pills.orange li.active a{background:#cc7d00}.ink-navigation ul.pills.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.pills.orange li.disabled a:hover{background:0 0}.ink-navigation ul.pills.orange li a{color:#fff}.ink-navigation ul.pills.orange li a:hover{background:#e68c00}.ink-navigation ul.pills.red li{background:#be1c1c}.ink-navigation ul.pills.red li.active a{background:#9a0d0d}.ink-navigation ul.pills.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.pills.red li.disabled a:hover{background:0 0}.ink-navigation ul.pills.red li a{color:#fff}.ink-navigation ul.pills.red li a:hover{background:#b10f0f}table.ink-table{background:#fff}table.ink-table tr td,table.ink-table tr th{border-bottom:#bbb 1px solid;background:0 0}table.ink-table tr:last-child td{border-bottom:0}table.ink-table tfoot tr td,table.ink-table tfoot tr th{border-top:#bbb 1px solid}table.ink-table.alternating tbody tr:nth-child(odd){background-color:#f5f5f5}table.ink-table.hover tbody tr:hover{background:#fefbd6;color:#555}table.ink-table.bordered{border:#bbb 1px solid;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}table.ink-table.bordered tr th{border-left:#bbb 1px solid}table.ink-table.bordered tr th:first-child{border-left:0}table.ink-table.bordered tr:last-child td{border-bottom:0}table.ink-table.bordered tr td{border-left:#bbb 1px solid}table.ink-table.bordered tr td:first-child{border-left:0}table.ink-table tbody>tr.red td{background:#c91111;color:#fff}table.ink-table tbody>tr.green td{background:#4a9b17;color:#fff}table.ink-table tbody>tr.blue td{background:#0f75da;color:#fff}table.ink-table tbody>tr.orange td{background:#ff9c00;color:#fff}table.ink-table tbody>tr.black td{background:#000;color:#ccc}table.ink-table tbody>tr.yellow td{background:#ffd500;color:#000}.animated.slow{animation-duration:1s}.animated.medium{animation-duration:.5s}.animated.fast{animation-duration:.2s}.ink-carousel{width:100%;position:relative;overflow:hidden;display:block}.ink-carousel .stage{width:100%;left:0;height:auto!important;margin-top:0;margin-bottom:0;padding-left:0;list-style-type:none;white-space:nowrap;position:relative;-webkit-transition:left .5s ease;-moz-transition:left .5s ease;-o-transition:left .5s ease;transition:left .5s ease}.ink-carousel .stage .slide{position:relative;display:inline-block;vertical-align:top;white-space:normal;margin:0;float:none;zoom:1;*display:inline}.ink-carousel .ink-navigation{position:static}.ink-datepicker-wrapper{position:relative}.ink-datepicker-calendar{margin-top:0;position:absolute}.ink-datepicker-calendar.right{left:100%;top:0}.ink-datepicker-calendar.left{right:100%;top:0}.ink-datepicker-calendar.bottom{top:100%;left:0}.ink-datepicker-calendar.top{bottom:100%;left:0}.ink-datepicker-calendar,.ink-datepicker-wrapper{display:inline;display:inline-block}.ink-calendar{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;text-align:center;padding:.3em;min-width:17.4em;font-size:13px;-webkit-box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;-moz-box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;background:#fff;z-index:10}.ink-calendar a{text-decoration:none}.ink-calendar li{list-style:none inside}html.ink-modal-is-open .ink-calendar{z-index:101}.ink-calendar-top-options{padding:5px;font-size:.813em;cursor:pointer}.ink-calendar-top-options .clean{float:left}.ink-calendar-top-options .close{float:right}.ink-calendar-top{line-height:2em;background:#e6e6e6;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-calendar-top div{float:left}.ink-calendar-top .ink-calendar-next,.ink-calendar-top .ink-calendar-prev{width:10%}.ink-calendar-top .ink-calendar-next a,.ink-calendar-top .ink-calendar-prev a{display:block}.ink-calendar-top .ink-calendar-month_desc{width:80%}.ink-calendar-month,.ink-calendar-month-selector,.ink-calendar-year-selector{margin-top:.5em;padding-left:0}.ink-calendar-month li a,.ink-calendar-month-selector li a,.ink-calendar-year-selector li a{margin:0;line-height:2em;vertical-align:middle;display:block;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;color:#444}.ink-calendar-month li a:hover,.ink-calendar-month-selector li a:hover,.ink-calendar-year-selector li a:hover{background:#e6e6e6}.ink-calendar-month li a.ink-calendar-on,.ink-calendar-month li a.ink-calendar-on:hover,.ink-calendar-month-selector li a.ink-calendar-on,.ink-calendar-month-selector li a.ink-calendar-on:hover,.ink-calendar-year-selector li a.ink-calendar-on,.ink-calendar-year-selector li a.ink-calendar-on:hover{background:#0069d6;color:#fff}.ink-calendar-month li a.ink-calendar-off,.ink-calendar-month li a.ink-calendar-off:hover,.ink-calendar-month-selector li a.ink-calendar-off,.ink-calendar-month-selector li a.ink-calendar-off:hover,.ink-calendar-year-selector li a.ink-calendar-off,.ink-calendar-year-selector li a.ink-calendar-off:hover{background:#fff;color:#aaa;cursor:default}.ink-calendar-month ul,.ink-calendar-month-selector ul,.ink-calendar-year-selector ul{clear:both;padding-left:0}.ink-calendar-month ul li,.ink-calendar-month-selector ul li,.ink-calendar-year-selector ul li{width:2.4em;float:left;text-align:center;padding:0;margin:0}.ink-calendar-month-selector ul li,.ink-calendar-year-selector ul li{width:25%}.ink-calendar-month-selector,.ink-calendar-year-selector{display:none}.action_inactive,.ink-calendar-off{color:#ddd!important}.ink-calendar-month .ink-calendar-header{border-bottom:1px solid rgba(0,0,0,.1);padding-bottom:.5em;margin-bottom:.5em;color:#aaa}.ink-calendar-middle,.ink-calendar-month .ink-calendar-header,.ink-calendar-month .ink-calendar-middle ul,.ink-calendar-top,.ink-calendar-top-options{*zoom:1}.ink-calendar-middle:after,.ink-calendar-month .ink-calendar-header:after,.ink-calendar-month .ink-calendar-middle ul:after,.ink-calendar-top-options:after,.ink-calendar-top:after{content:"";display:table;clear:both}body.ink-drawer{max-width:100%}body.ink-drawer .content-drawer,body.ink-drawer .left-drawer,body.ink-drawer .right-drawer{-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;transition-property:transform;-webkit-transition-duration:300ms;-moz-transition-duration:300ms;-o-transition-duration:300ms;transition-duration:300ms;-webkit-transition-timing-function:cubic-bezier(0.86,0,.07,1);-moz-transition-timing-function:cubic-bezier(0.86,0,.07,1);-o-transition-timing-function:cubic-bezier(0.86,0,.07,1);transition-timing-function:cubic-bezier(0.86,0,.07,1)}body.ink-drawer .left-drawer{left:-220px}body.ink-drawer .right-drawer{right:-220px}body.ink-drawer .content-drawer{width:100%}body.ink-drawer .left-drawer,body.ink-drawer .right-drawer{position:absolute;top:0;z-index:0;display:none;overflow-x:hidden;overflow-y:auto;width:220px;height:100%;-webkit-overflow-scrolling:touch}body.ink-drawer .left-drawer.show,body.ink-drawer .right-drawer.show{display:block;position:fixed}body.ink-drawer.push{overflow:hidden;width:100%;height:100%}body.ink-drawer.push .content-drawer{overflow:hidden}body.ink-drawer.push.left .content-drawer,body.ink-drawer.push.left .left-drawer{-webkit-transform:translate(220px,0);-moz-transform:translate(220px,0);-ms-transform:translate(220px,0);-o-transform:translate(220px,0);transform:translate(220px,0)}body.ink-drawer.push.right .content-drawer,body.ink-drawer.push.right .right-drawer{-webkit-transform:translate(-220px,0);-moz-transform:translate(-220px,0);-ms-transform:translate(-220px,0);-o-transform:translate(-220px,0);transform:translate(-220px,0)}body.ink-drawer.over{overflow:hidden;-webkit-user-drag:none}body.ink-drawer.over.left .left-drawer{-webkit-transform:translate(220px,0);-moz-transform:translate(220px,0);-ms-transform:translate(220px,0);-o-transform:translate(220px,0);transform:translate(220px,0)}body.ink-drawer.over.right .right-drawer{-webkit-transform:translate(-220px,0);-moz-transform:translate(-220px,0);-ms-transform:translate(-220px,0);-o-transform:translate(-220px,0);transform:translate(-220px,0)}.ink-shade{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgOAMAAM8AzbfAeUUAAAAASUVORK5CYII=);background:rgba(0,0,0,.8);width:100%;height:100%;top:0;right:0;bottom:0;left:0;margin-top:0;position:fixed;z-index:100;display:none;filter:alpha(Opacity=0);opacity:0}.ink-shade.fade{-webkit-transition:opacity 300ms;-moz-transition:opacity 300ms;-o-transition:opacity 300ms;transition:opacity 300ms}.ink-shade.visible{filter:alpha(Opacity=100);opacity:1}.ink-modal{top:50%;left:50%;width:90%;height:90%;background:#fff;z-index:100;position:absolute;overflow:hidden;filter:alpha(Opacity=100);opacity:1;-webkit-box-shadow:rgba(0,0,0,.8) 0 0 15px 0;-moz-box-shadow:rgba(0,0,0,.8) 0 0 15px 0;box-shadow:rgba(0,0,0,.8) 0 0 15px 0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;*zoom:1}.ink-modal:after{content:"";display:table;clear:both}.ink-modal>.modal-body{padding:1em;overflow-y:auto;overflow-x:hidden;height:auto}.ink-modal>.modal-body .ink-grid{padding-left:0;padding-right:0;width:100%;min-width:100%}.ink-modal>.modal-header,.ink-modal>header{border-bottom:1px #e6e6e6 solid;overflow:hidden;-webkit-box-shadow:rgba(175,175,175,.2) 0 1px 2px 0;-moz-box-shadow:rgba(175,175,175,.2) 0 1px 2px 0;box-shadow:rgba(175,175,175,.2) 0 1px 2px 0}.ink-modal>.modal-header>.modal-close,.ink-modal>header>.modal-close{padding-top:2px;text-align:center;color:#fff;width:26px;height:26px;line-height:1.2em;border:0;background:#bfbfbf;font-size:0;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%;text-shadow:rgba(0,0,0,.6) 0 -1px 0;filter:alpha(Opacity=60);opacity:.6;float:right}.ink-modal>.modal-header>.modal-close:after,.ink-modal>header>.modal-close:after{content:"\f00d";font-family:FontAwesome;font-size:medium;line-height:22px}.ink-modal>.modal-header>.modal-close:hover,.ink-modal>header>.modal-close:hover{filter:alpha(Opacity=100);opacity:1}.ink-modal>.modal-footer,.ink-modal>footer{background:#e6e6e6;margin-bottom:0;zoom:1;-webkit-box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0;-moz-box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0;box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0}.ink-modal>.modal-footer,.ink-modal>.modal-header,.ink-modal>footer,.ink-modal>header{padding:.8em 1em .65em}.ink-modal>.modal-footer:after,.ink-modal>.modal-footer:before,.ink-modal>.modal-header:after,.ink-modal>.modal-header:before,.ink-modal>footer:after,.ink-modal>footer:before,.ink-modal>header:after,.ink-modal>header:before{content:".";display:block;height:0;clear:both;visibility:hidden}.ink-modal-open{overflow:hidden}.ink-progress-bar{margin-bottom:1em;overflow:hidden;background:#f2f2f2;position:relative;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset;-moz-box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset;box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset}.ink-progress-bar .caption{position:absolute;top:0;left:0;width:100%;height:100%;line-height:1.7;text-align:center;color:#000;font-size:.813em;z-index:10}.ink-progress-bar .bar{height:1.3em;text-shadow:rgba(0,0,0,.25),0,1px,0;-webkit-box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;-moz-box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;-webkit-transition-property:width;-moz-transition-property:width;-o-transition-property:width;transition-property:width;-webkit-transition-duration:.6s;-moz-transition-duration:.6s;-o-transition-duration:.6s;transition-duration:.6s;-webkit-transition-timing-function:ease;-moz-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.ink-progress-bar .bar.grey{background:#ccc;color:#555}.ink-progress-bar .bar.green{background:#4a9b17;color:#fff}.ink-progress-bar .bar.blue{background:#0f75da;color:#fff}.ink-progress-bar .bar.red{background:#c91111;color:#fff}.ink-progress-bar .bar.orange{background:#ff9c00;color:#555}.ink-progress-bar .bar.black{background:#000;color:#fff}.dragging,.ink-sortable-list li{cursor:move;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;-ms-user-select:none;user-select:none;-ms-user-drag:none;-moz-user-drag:none;-khtml-user-drag:none;-webkit-user-drag:none;-o-user-drag:none;user-drag:none}.drag,.ink-sortable-list li.placeholder{-webkit-box-shadow:0,0,10px,0,rgba(0,0,0,.3);-moz-box-shadow:0,0,10px,0,rgba(0,0,0,.3);box-shadow:0,0,10px,0,rgba(0,0,0,.3)}.ink-sortable-list li{margin:0;border-bottom:1px solid #ccc;line-height:40px}.ink-sortable-list li.placeholder,.ink-sortable-list li:hover{background:#ccc;background:rgba(204,204,204,.2)}.ink-sortable-list li .ink-label{margin:0 .8em}.ink-sticky-stuck{position:fixed}.ink-tabs .tabs-nav{list-style:none;padding:0;*zoom:1}.ink-tabs .tabs-nav li{line-height:1.7;position:relative;margin:0}.ink-tabs .tabs-nav li a{padding:.5em 1em;display:block;border:1px solid transparent}.ink-tabs .tabs-nav li a:hover{background:#f0f0f0}.ink-tabs .tabs-nav li.active a{color:#555;cursor:default;text-decoration:none;background:#fff;border:1px solid #ccc}.ink-tabs .tabs-nav:after{content:"";display:table;clear:both}.ink-tabs .tabs-content{margin-top:1.5em;overflow:auto}.ink-tabs.top>.tabs-nav{border-bottom:1px solid #ccc}.ink-tabs.top>.tabs-nav li{float:left}.ink-tabs.top>.tabs-nav li a{margin-right:.4em;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;-ms-border-radius:4px 4px 0 0;-o-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.ink-tabs.top>.tabs-nav li.active{margin:0 0 -2px 0}.ink-tabs.top>.tabs-nav li.active a{border-bottom-color:transparent}.ink-tabs.bottom>.tabs-nav{border-top:1px solid #ccc}.ink-tabs.bottom>.tabs-nav li{float:left}.ink-tabs.bottom>.tabs-nav li a{margin-right:.4em;-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;-ms-border-radius:0 0 4px 4px;-o-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.ink-tabs.bottom>.tabs-nav li.active{margin:-2px 0 0 0}.ink-tabs.bottom>.tabs-nav li.active a{border-top-color:transparent}.ink-tabs.left>.tabs-nav{border-right:1px solid #ccc;float:left;margin-right:2em}.ink-tabs.left>.tabs-nav li{float:none;text-align:right}.ink-tabs.left>.tabs-nav li a{margin-bottom:.4em;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;-ms-border-radius:4px 0 0 4px;-o-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.ink-tabs.left>.tabs-nav li.active{margin:0 -2px 0 0}.ink-tabs.left>.tabs-nav li.active a{border-right-color:transparent}.ink-tabs.right>.tabs-nav{border-left:1px solid #ccc;float:right;margin-left:2em}.ink-tabs.right>.tabs-nav li{float:none}.ink-tabs.right>.tabs-nav li a{margin-bottom:.4em;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;-ms-border-radius:0 4px 4px 0;-o-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.ink-tabs.right>.tabs-nav li.active{margin:0 0 0 -2px}.ink-tabs.right>.tabs-nav li.active a{border-left-color:transparent}.ink-tagfield input[type=text].new-tag-input{background-color:#fff;border:1px solid #ccc;line-height:1em;margin:0;padding:5px;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-tagfield input[type=text].new-tag-input:focus{-webkit-box-shadow:0,0,0,3px,#eaeaea;-moz-box-shadow:0,0,0,3px,#eaeaea;box-shadow:0,0,0,3px,#eaeaea;border:1px solid #c3c3c3}.ink-tagfield span.ink-tag{background-color:#1b1b1b;color:#eaeaea;text-shadow:none;font-size:.9em;font-weight:400;border:1px solid #000;padding:4px 6px}.ink-tagfield span.ink-tag i.icon-remove{color:#ccc;font-size:.9em;font-weight:400;margin-left:4px}.ink-tagfield span.ink-tag i.icon-remove:hover{cursor:pointer;color:red}.ink-tooltip{display:inline-block;position:relative}.ink-tooltip>.content{background:#f0f0f0;padding:.5em .6em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;font-size:.8em;color:#8c8c8c}.ink-tooltip>.arrow{position:absolute}.ink-tooltip>.arrow.down,.ink-tooltip>.arrow.left,.ink-tooltip>.arrow.right,.ink-tooltip>.arrow.up{width:0;height:0}.ink-tooltip>.arrow.up{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #f0f0f0;top:-6px;left:50%;margin-left:-3px}.ink-tooltip>.arrow.down{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #f0f0f0;bottom:-5.45455px;left:50%;margin-left:-3px}.ink-tooltip>.arrow.right{border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:6px solid #f0f0f0;top:50%;right:-5.45455px;margin-top:-6px}.ink-tooltip>.arrow.left{border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:6px solid #f0f0f0;top:50%;left:-5.45455px;margin-top:-6px}.ink-tooltip.blue>.content{background:#0f75da;color:#fff}.ink-tooltip.blue>.arrow.up{border-bottom-color:#0f75da}.ink-tooltip.blue>.arrow.down{border-top-color:#0f75da}.ink-tooltip.blue>.arrow.left{border-right-color:#0f75da}.ink-tooltip.blue>.arrow.right{border-left-color:#0f75da}.ink-tooltip.red>.content{background:#c91111;color:#fff}.ink-tooltip.red>.arrow.up{border-bottom-color:#c91111}.ink-tooltip.red>.arrow.down{border-top-color:#c91111}.ink-tooltip.red>.arrow.left{border-right-color:#c91111}.ink-tooltip.red>.arrow.right{border-left-color:#c91111}.ink-tooltip.orange>.content{background:#ff9c00;color:#fff}.ink-tooltip.orange>.arrow.up{border-bottom-color:#ff9c00}.ink-tooltip.orange>.arrow.down{border-top-color:#ff9c00}.ink-tooltip.orange>.arrow.left{border-right-color:#ff9c00}.ink-tooltip.orange>.arrow.right{border-left-color:#ff9c00}.ink-tooltip.green>.content{background:#4a9b17;color:#fff}.ink-tooltip.green>.arrow.up{border-bottom-color:#4a9b17}.ink-tooltip.green>.arrow.down{border-top-color:#4a9b17}.ink-tooltip.green>.arrow.left{border-right-color:#4a9b17}.ink-tooltip.green>.arrow.right{border-left-color:#4a9b17}.ink-tooltip.black>.content{background:#000;color:#fff}.ink-tooltip.black>.arrow.up{border-bottom-color:#000}.ink-tooltip.black>.arrow.down{border-top-color:#000}.ink-tooltip.black>.arrow.left{border-right-color:#000}.ink-tooltip.black>.arrow.right{border-left-color:#000}.ink-tooltip.grey>.content{background:#ccc;color:#333}.ink-tooltip.grey>.arrow.up{border-bottom-color:#ccc}.ink-tooltip.grey>.arrow.down{border-top-color:#ccc}.ink-tooltip.grey>.arrow.left{border-right-color:#ccc}.ink-tooltip.grey>.arrow.right{border-left-color:#ccc}.ink-tree-view li{list-style-type:none}.ink-tree-view [data-open]>:before{margin-left:-1.3em;margin-right:.4em;text-decoration:none} \ No newline at end of file +@charset "UTF-8";.show-all{display:inherit}.hide-all{display:none!important}.no-margin{margin:0!important}.no-margin-top{margin-top:0!important}.no-margin-bottom{margin-bottom:0!important}.no-padding{padding:0!important}.push-left{float:left}.push-center{float:none!important;margin-left:auto;margin-right:auto}.push-right{float:right;-webkit-justify-content:flex-end;-moz-justify-content:flex-end;justify-content:flex-end}.align-left{text-align:left}.align-center{text-align:center}.align-right{text-align:right}.clearfix{overflow:hidden}.clearfix:after{content:"";display:table;clear:both}html{font-family:sans-serif}html *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}figure{margin:0}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.ink-alert.basic,.ink-alert.block{font-size:.938em;margin:1em 0;position:relative;overflow:hidden}.ink-alert.basic{padding:1em 3em 1em 1em}.ink-alert.basic p{margin:0}.ink-alert.basic .ink-close{top:.55em}.ink-alert.block{font-size:1em}.ink-alert.block>h4{padding:1em 3em 1em 1em;font-size:.938em;line-height:1.5;margin:0}.ink-alert.block p{margin:1.5em 1em}.ink-alert.block ul{list-style:inside}.ink-alert .ink-dismiss{position:absolute;line-height:.56em;font-size:1.8em;padding:5px;border:none;background:0 0;top:.5em;right:.4em}.ink-badge{padding:.2em .6em;font-size:.813em;margin-left:.6em}.ink-button{-webkit-appearance:menuitem;padding:8px 12px;cursor:pointer;text-decoration:none;text-align:center;display:inline-block;vertical-align:middle;white-space:nowrap;line-height:normal}.ink-button+.ink-button{margin-left:5px}.button-group>.ink-button{float:left;margin:5px 0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;border-left:none}.button-group>.ink-button:active,.button-group>.ink-button:hover{border-left:none}.button-group>.ink-button:first-child{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px;border-left:1px solid #bfbfbf}.button-group>.ink-button:last-child{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.button-group:after{content:"";display:table;clear:both}.button-toolbar>.button-group{margin-right:10px;float:left}.button-toolbar:after{content:"";display:table;clear:both}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-thin-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-thin-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-thin-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-thin-webfont.ttf?1423657803) format('truetype');font-weight:100;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-thinitalic-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-thinitalic-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-thinitalic-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-thinitalic-webfont.ttf?1423657803) format('truetype');font-weight:100;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-light-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-light-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-light-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-light-webfont.ttf?1423657803) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-lightitalic-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-lightitalic-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-lightitalic-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-lightitalic-webfont.ttf?1423657803) format('truetype');font-weight:300;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-regular-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-regular-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-regular-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-regular-webfont.ttf?1423657803) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-italic-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-italic-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-italic-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-italic-webfont.ttf?1423657803) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-medium-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-medium-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-medium-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-medium-webfont.ttf?1423657803) format('truetype');font-weight:500;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-mediumitalic-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-mediumitalic-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-mediumitalic-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-mediumitalic-webfont.ttf?1423657803) format('truetype');font-weight:500;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-bold-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-bold-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-bold-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-bold-webfont.ttf?1423657803) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-bolditalic-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-bolditalic-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-bolditalic-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-bolditalic-webfont.ttf?1423657803) format('truetype');font-weight:700;font-style:italic}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-black-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-black-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-black-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-black-webfont.ttf?1423657803) format('truetype');font-weight:900;font-style:normal}@font-face{font-family:Roboto;src:url(../fonts/Roboto/roboto-blackitalic-webfont.eot?1423657803);src:url(../fonts/Roboto/roboto-blackitalic-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto/roboto-blackitalic-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto/roboto-blackitalic-webfont.ttf?1423657803) format('truetype');font-weight:900;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-light-webfont.eot?1423657803);src:url(../fonts/Roboto_condensed/robotocondensed-light-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-light-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-light-webfont.ttf?1423657803) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot?1423657803);src:url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-lightitalic-webfont.ttf?1423657803) format('truetype');font-weight:300;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot?1423657803);src:url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-regular-webfont.ttf?1423657803) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot?1423657803);src:url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-italic-webfont.ttf?1423657803) format('truetype');font-weight:400;font-style:italic}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot?1423657803);src:url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-bold-webfont.ttf?1423657803) format('truetype');font-weight:700;font-style:normal}@font-face{font-family:Roboto_condensed;src:url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot?1423657803);src:url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.eot?&1423657803#iefix) format('embedded-opentype'),url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.woff?1423657803) format('woff'),url(../fonts/Roboto_condensed/robotocondensed-bolditalic-webfont.ttf?1423657803) format('truetype');font-weight:700;font-style:italic}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-thin-webfont.eot?1408628222);src:url(../fonts/Roboto_slab/robotoslab-thin-webfont.eot?&1408628222#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-thin-webfont.woff?1408628222) format('woff'),url(../fonts/Roboto_slab/robotoslab-thin-webfont.ttf?1408628222) format('truetype');font-weight:100;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-light-webfont.eot?1408628222);src:url(../fonts/Roboto_slab/robotoslab-light-webfont.eot?&1408628222#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-light-webfont.woff?1408628222) format('woff'),url(../fonts/Roboto_slab/robotoslab-light-webfont.ttf?1408628222) format('truetype');font-weight:300;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-regular-webfont.eot?1408628222);src:url(../fonts/Roboto_slab/robotoslab-regular-webfont.eot?&1408628222#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-regular-webfont.woff?1408628222) format('woff'),url(../fonts/Roboto_slab/robotoslab-regular-webfont.ttf?1408628222) format('truetype');font-weight:400;font-style:normal}@font-face{font-family:Roboto_slab;src:url(../fonts/Roboto_slab/robotoslab-bold-webfont.eot?1408628222);src:url(../fonts/Roboto_slab/robotoslab-bold-webfont.eot?&1408628222#iefix) format('embedded-opentype'),url(../fonts/Roboto_slab/robotoslab-bold-webfont.woff?1408628222) format('woff'),url(../fonts/Roboto_slab/robotoslab-bold-webfont.ttf?1408628222) format('truetype');font-weight:700;font-style:normal}.ink-form fieldset{border:none;padding:0;margin:0}.ink-form fieldset legend{font-size:1.438em;font-weight:700;width:100%;border-bottom:1px solid #ddd}.ink-form fieldset legend+*{-webkit-margin-top-collapse:separate;margin:2em 0}.ink-form p.tip{font-size:.875em;color:#909090;position:relative;margin:.2em 0 0 .1em}.ink-form p.label{padding:0;margin:0;color:#555;white-space:normal}.ink-form input[type=color],.ink-form input[type=date],.ink-form input[type=datetime-local],.ink-form input[type=datetime],.ink-form input[type=email],.ink-form input[type=month],.ink-form input[type=number],.ink-form input[type=password],.ink-form input[type=search],.ink-form input[type=tel],.ink-form input[type=text],.ink-form input[type=time],.ink-form input[type=url],.ink-form input[type=week],.ink-form select,.ink-form textarea{font-family:Roboto,Arial,Helvetica,sans-serif;font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;padding:8px 6px;border:1px solid #c6c6c6;resize:none;background:#FFF;vertical-align:middle}.ink-form input[type=color]:focus,.ink-form input[type=date]:focus,.ink-form input[type=datetime-local]:focus,.ink-form input[type=datetime]:focus,.ink-form input[type=email]:focus,.ink-form input[type=month]:focus,.ink-form input[type=number]:focus,.ink-form input[type=password]:focus,.ink-form input[type=search]:focus,.ink-form input[type=tel]:focus,.ink-form input[type=text]:focus,.ink-form input[type=time]:focus,.ink-form input[type=url]:focus,.ink-form input[type=week]:focus,.ink-form select:focus,.ink-form textarea:focus{border-color:rgba(153,153,153,.9);-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;outline:0}.ink-form input[type=color]:disabled,.ink-form input[type=date]:disabled,.ink-form input[type=datetime-local]:disabled,.ink-form input[type=datetime]:disabled,.ink-form input[type=email]:disabled,.ink-form input[type=month]:disabled,.ink-form input[type=number]:disabled,.ink-form input[type=password]:disabled,.ink-form input[type=search]:disabled,.ink-form input[type=tel]:disabled,.ink-form input[type=text]:disabled,.ink-form input[type=time]:disabled,.ink-form input[type=url]:disabled,.ink-form input[type=week]:disabled,.ink-form select:disabled,.ink-form textarea:disabled{background:#f2f2f2;cursor:not-allowed}.ink-form .input-file{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;padding:6px;border:1px solid #c6c6c6;background:#FFF;vertical-align:middle;line-height:1.2}.ink-form .input-file input[type=file]{-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0;border:none;padding:0;background:0 0;width:100%}.ink-form .ink-button{margin:0 5px}.ink-form label{cursor:pointer}.ink-form select{line-height:2;cursor:pointer}.ink-form textarea{min-height:5em}.ink-form .control-group{line-height:2;margin-bottom:1em}.ink-form .control-group:after{content:"";display:table;clear:both}.ink-form .control-group .control{position:relative}.ink-form .control-group .control:after{content:"";display:table;clear:both}.ink-form .control-group .control>li{position:relative}.ink-form .control-group .control>li:after{content:"";display:table;clear:both}.ink-form .control-group .control>input,.ink-form .control-group .control>select,.ink-form .control-group .control>textarea{width:100%}.ink-form .control-group .control>input+.fa,.ink-form .control-group .control>select+.fa,.ink-form .control-group .control>textarea+.fa{display:none}.ink-form .control-group .control.append-button>span,.ink-form .control-group .control.append-symbol>span,.ink-form .control-group .control.prepend-button>span,.ink-form .control-group .control.prepend-symbol>span{width:100%;position:relative}.ink-form .control-group .control.append-button>span>input,.ink-form .control-group .control.append-button>span>select,.ink-form .control-group .control.append-button>span>textarea,.ink-form .control-group .control.append-symbol>span>input,.ink-form .control-group .control.append-symbol>span>select,.ink-form .control-group .control.append-symbol>span>textarea,.ink-form .control-group .control.prepend-button>span>input,.ink-form .control-group .control.prepend-button>span>select,.ink-form .control-group .control.prepend-button>span>textarea,.ink-form .control-group .control.prepend-symbol>span>input,.ink-form .control-group .control.prepend-symbol>span>select,.ink-form .control-group .control.prepend-symbol>span>textarea{width:100%}.ink-form .control-group .control.append-button>input[type=button],.ink-form .control-group .control.append-button>input[type=reset],.ink-form .control-group .control.append-button>input[type=submit],.ink-form .control-group .control.append-symbol>input[type=button],.ink-form .control-group .control.append-symbol>input[type=reset],.ink-form .control-group .control.append-symbol>input[type=submit],.ink-form .control-group .control.prepend-button>input[type=button],.ink-form .control-group .control.prepend-button>input[type=reset],.ink-form .control-group .control.prepend-button>input[type=submit],.ink-form .control-group .control.prepend-symbol>input[type=button],.ink-form .control-group .control.prepend-symbol>input[type=reset],.ink-form .control-group .control.prepend-symbol>input[type=submit]{width:auto}.ink-form .control-group .control.append-button{display:table}.ink-form .control-group .control.append-button>span{display:table-cell}.ink-form .control-group .control.append-button>span>input,.ink-form .control-group .control.append-button>span>select,.ink-form .control-group .control.append-button>span>textarea{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-form .control-group .control.append-button .ink-button{margin:0;-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0;border-left:none}.ink-form .control-group .control.prepend-button{display:table}.ink-form .control-group .control.prepend-button>span{display:table-cell}.ink-form .control-group .control.prepend-button>span>input,.ink-form .control-group .control.prepend-button>span>select,.ink-form .control-group .control.prepend-button>span>textarea{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-form .control-group .control.prepend-button .ink-button{margin:0;-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px;border-right:none}.ink-form .control-group .control.append-symbol>span{display:block}.ink-form .control-group .control.append-symbol>span>input,.ink-form .control-group .control.append-symbol>span>select,.ink-form .control-group .control.append-symbol>span>textarea{padding-right:2.5em}.ink-form .control-group .control.append-symbol>span>[class*=" fa-"],.ink-form .control-group .control.append-symbol>span>[class^=fa-]{position:absolute;right:1em;top:.86em;pointer-events:none}.ink-form .control-group .control.prepend-symbol>span{display:block}.ink-form .control-group .control.prepend-symbol>span>input,.ink-form .control-group .control.prepend-symbol>span>select,.ink-form .control-group .control.prepend-symbol>span>textarea{padding-left:2.5em}.ink-form .control-group .control.prepend-symbol>span>[class*=" fa-"],.ink-form .control-group .control.prepend-symbol>span>[class^=fa-]{position:absolute;left:1em;top:.86em;pointer-events:none}.ink-form .control-group input[type=checkbox],.ink-form .control-group input[type=radio]{position:absolute;border:none;cursor:pointer}.ink-form .control-group input[type=checkbox]+label,.ink-form .control-group input[type=radio]+label{margin-top:-.28em;padding-left:1.25em;vertical-align:super;display:inline-block}.ink-form .control-group .inline li{padding:0}.ink-form .control-group .inline li label{margin-right:1em}.ink-form .control-group.validation.error input,.ink-form .control-group.validation.error select,.ink-form .control-group.validation.error textarea{outline:0;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;border:1px solid rgba(200,10,16,.5)}.ink-form .control-group.validation.error p.tip{color:rgba(150,7,12,.55)}.ink-form .control-group.validation.warning input,.ink-form .control-group.validation.warning select,.ink-form .control-group.validation.warning textarea{outline:0;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;border:1px solid rgba(255,156,0,.6)}.ink-form .control-group.validation.warning p.tip{color:rgba(204,125,0,.6)}.ink-form .control-group.required label,.ink-form .control-group.required p.label{color:#555}.ink-form .control-group.required label:after,.ink-form .control-group.required p.label:after{content:"\f069";color:#c91111;margin-left:.6em;font-family:FontAwesome;font-size:.75em;width:1.25em}.ink-form .control-group.required ul.control label:after{content:""}.ink-grid{width:auto;max-width:1440px;margin:0 auto}.all-5{width:5%;float:left;clear:none}.all-10{width:10%;float:left;clear:none}.all-15{width:15%;float:left;clear:none}.all-16{width:16.66%;float:left;clear:none}.all-20{width:20%;float:left;clear:none}.all-25{width:25%;float:left;clear:none}.all-30{width:30%;float:left;clear:none}.all-33{width:33.33%;float:left;clear:none}.all-35{width:35%;float:left;clear:none}.all-40{width:40%;float:left;clear:none}.all-45{width:45%;float:left;clear:none}.all-50{width:50%;float:left;clear:none}.all-55{width:55%;float:left;clear:none}.all-60{width:60%;float:left;clear:none}.all-65{width:65%;float:left;clear:none}.all-66{width:66.66%;float:left;clear:none}.all-70{width:70%;float:left;clear:none}.all-75{width:75%;float:left;clear:none}.all-80{width:80%;float:left;clear:none}.all-85{width:85%;float:left;clear:none}.all-90{width:90%;float:left;clear:none}.all-95{width:95%;float:left;clear:none}.all-100{width:100%;float:left;clear:none}[class~=all-100]{float:none;clear:both}@media screen and (min-width:1261px){.ink-grid{padding:0 2em}.column-group>[class*=xlarge-]{float:left;clear:none}.xlarge-5{width:5%}.xlarge-10{width:10%}.xlarge-15{width:15%}.xlarge-16{width:16.66%}.xlarge-20{width:20%}.xlarge-25{width:25%}.xlarge-30{width:30%}.xlarge-33{width:33.33%}.xlarge-35{width:35%}.xlarge-40{width:40%}.xlarge-45{width:45%}.xlarge-50{width:50%}.xlarge-55{width:55%}.xlarge-60{width:60%}.xlarge-65{width:65%}.xlarge-66{width:66.66%}.xlarge-70{width:70%}.xlarge-75{width:75%}.xlarge-80{width:80%}.xlarge-85{width:85%}.xlarge-90{width:90%}.xlarge-95{width:95%}.xlarge-100{width:100%}[class*=xlarge-100]{float:none;clear:both}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-2em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}.column-group.horizontal-gutters{margin-left:-2em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=xlarge-]{padding-left:2em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=xlarge-]{margin-bottom:2em}.column-group.double-gutters{margin-left:-4em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}.column-group.double-horizontal-gutters{margin-left:-4em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}.column-group.half-gutters{margin-left:-1em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}.column-group.half-horizontal-gutters{margin-left:-1em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}.column-group.quarter-gutters{margin-left:-.5em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}.column-group.quarter-horizontal-gutters{margin-left:-.5em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}.column-group.xlarge-gutters{margin-left:-2em}.column-group.xlarge-gutters>[class*=all-],.column-group.xlarge-gutters>[class*=xlarge-]{padding-left:2em;margin-bottom:2em}.column-group.xlarge-horizontal-gutters{margin-left:-2em}.column-group.xlarge-horizontal-gutters>[class*=all-],.column-group.xlarge-horizontal-gutters>[class*=xlarge-]{padding-left:2em}.column-group.xlarge-vertical-gutters>[class*=all-],.column-group.xlarge-vertical-gutters>[class*=xlarge-]{margin-bottom:2em}.column-group.xlarge-double-gutters{margin-left:-4em}.column-group.xlarge-double-gutters>[class*=all-],.column-group.xlarge-double-gutters>[class*=xlarge-]{padding-left:4em;margin-bottom:4em}.column-group.xlarge-double-horizontal-gutters{margin-left:-4em}.column-group.xlarge-double-horizontal-gutters>[class*=all-],.column-group.xlarge-double-horizontal-gutters>[class*=xlarge-]{padding-left:4em}.column-group.xlarge-double-vertical-gutters>[class*=all-],.column-group.xlarge-double-vertical-gutters>[class*=xlarge-]{margin-bottom:4em}.column-group.xlarge-half-gutters{margin-left:-1em}.column-group.xlarge-half-gutters>[class*=all-],.column-group.xlarge-half-gutters>[class*=xlarge-]{padding-left:1em;margin-bottom:1em}.column-group.xlarge-half-horizontal-gutters{margin-left:-1em}.column-group.xlarge-half-horizontal-gutters>[class*=all-],.column-group.xlarge-half-horizontal-gutters>[class*=xlarge-]{padding-left:1em}.column-group.xlarge-half-vertical-gutters>[class*=all-],.column-group.xlarge-half-vertical-gutters>[class*=xlarge-]{margin-bottom:1em}.column-group.xlarge-quarter-gutters{margin-left:-.5em}.column-group.xlarge-quarter-gutters>[class*=all-],.column-group.xlarge-quarter-gutters>[class*=xlarge-]{padding-left:.5em;margin-bottom:.5em}.column-group.xlarge-quarter-horizontal-gutters{margin-left:-.5em}.column-group.xlarge-quarter-horizontal-gutters>[class*=all-],.column-group.xlarge-quarter-horizontal-gutters>[class*=xlarge-]{padding-left:.5em}.column-group.xlarge-quarter-vertical-gutters>[class*=all-],.column-group.xlarge-quarter-vertical-gutters>[class*=xlarge-]{margin-bottom:.5em}.column-group.xlarge-no-gutters{margin-left:0}.column-group.xlarge-no-gutters>[class*=all-],.column-group.xlarge-no-gutters>[class*=xlarge-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=xlarge-],.ink-table td[class*=xlarge-],.ink-table tfoot[class*=xlarge-],.ink-table th[class*=xlarge-],.ink-table thead[class*=xlarge-],.ink-table tr[class*=xlarge-]{float:none}.xlarge-push-left{float:left}.xlarge-push-center{float:none;margin-left:auto;margin-right:auto}.xlarge-push-right{float:right}.xlarge-align-left{text-align:left}.xlarge-align-center{text-align:center}.xlarge-align-right{text-align:right}.xlarge-no-margin{margin:0!important}.space,.xlarge-space{margin:2em}.padding,.xlarge-padding{padding:2em}.double-space,.xlarge-double-space{margin:4em}.double-padding,.xlarge-double-padding{padding:4em}.half-space,.xlarge-half-space{margin:1em}.half-padding,.xlarge-half-padding{padding:1em}.quarter-space,.xlarge-quarter-space{margin:.5em}.quarter-padding,.xlarge-quarter-padding{padding:.5em}.vertical-space,.xlarge-vertical-space{margin-top:2em;margin-bottom:2em}.vertical-padding,.xlarge-vertical-padding{padding-top:2em;padding-bottom:2em}.double-vertical-space,.xlarge-double-vertical-space{margin-top:4em;margin-bottom:4em}.double-vertical-padding,.xlarge-double-vertical-padding{padding-top:4em;padding-bottom:4em}.half-vertical-space,.xlarge-half-vertical-space{margin-top:1em;margin-bottom:1em}.half-vertical-padding,.xlarge-half-vertical-padding{padding-top:1em;padding-bottom:1em}.quarter-vertical-space,.xlarge-quarter-vertical-space{margin-top:.5em;margin-bottom:.5em}.quarter-vertical-padding,.xlarge-quarter-vertical-padding{padding-top:.5em;padding-bottom:.5em}.horizontal-space,.xlarge-horizontal-space{margin-left:2em;margin-right:2em}.horizontal-padding,.xlarge-horizontal-padding{padding-left:2em;padding-right:2em}.double-horizontal-space,.xlarge-double-horizontal-space{margin-left:4em;margin-right:4em}.double-horizontal-padding,.xlarge-double-horizontal-padding{padding-left:4em;padding-right:4em}.half-horizontal-space,.xlarge-half-horizontal-space{margin-left:1em;margin-right:1em}.half-horizontal-padding,.xlarge-half-horizontal-padding{padding-left:1em;padding-right:1em}.quarter-horizontal-space,.xlarge-quarter-horizontal-space{margin-left:.5em;margin-right:.5em}.quarter-horizontal-padding,.xlarge-quarter-horizontal-padding{padding-left:.5em;padding-right:.5em}.top-space,.xlarge-top-space{margin-top:2em}.top-padding,.xlarge-top-padding{padding-top:2em}.double-top-space,.xlarge-double-top-space{margin-top:4em}.double-top-padding,.xlarge-double-top-padding{padding-top:4em}.half-top-space,.xlarge-half-top-space{margin-top:1em}.half-top-padding,.xlarge-half-top-padding{padding-top:1em}.quarter-top-space,.xlarge-quarter-top-space{margin-top:.5em}.quarter-top-padding,.xlarge-quarter-top-padding{padding-top:.5em}.right-space,.xlarge-right-space{margin-right:2em}.right-padding,.xlarge-right-padding{padding-right:2em}.double-right-space,.xlarge-double-right-space{margin-right:4em}.double-right-padding,.xlarge-double-right-padding{padding-right:4em}.half-right-space,.xlarge-half-right-space{margin-right:1em}.half-right-padding,.xlarge-half-right-padding{padding-right:1em}.quarter-right-space,.xlarge-quarter-right-space{margin-right:.5em}.quarter-right-padding,.xlarge-quarter-right-padding{padding-right:.5em}.bottom-space,.xlarge-bottom-space{margin-bottom:2em}.bottom-padding,.xlarge-bottom-padding{padding-bottom:2em}.double-bottom-space,.xlarge-double-bottom-space{margin-bottom:4em}.double-bottom-padding,.xlarge-double-bottom-padding{padding-bottom:4em}.half-bottom-space,.xlarge-half-bottom-space{margin-bottom:1em}.half-bottom-padding,.xlarge-half-bottom-padding{padding-bottom:1em}.quarter-bottom-space,.xlarge-quarter-bottom-space{margin-bottom:.5em}.quarter-bottom-padding,.xlarge-quarter-bottom-padding{padding-bottom:.5em}.left-space,.xlarge-left-space{margin-left:2em}.left-padding,.xlarge-left-padding{padding-left:2em}.double-left-space,.xlarge-double-left-space{margin-left:4em}.double-left-padding,.xlarge-double-left-padding{padding-left:4em}.half-left-space,.xlarge-half-left-space{margin-left:1em}.half-left-padding,.xlarge-half-left-padding{padding-left:1em}.quarter-left-space,.xlarge-quarter-left-space{margin-left:.5em}.quarter-left-padding,.xlarge-quarter-left-padding{padding-left:.5em}.hide-xlarge{display:none!important}.show-xlarge{display:inherit!important}table.show-xlarge{display:table}thead.show-xlarge{display:table-header-group}tbody.show-xlarge{display:table-row-group}tfoot.show-xlarge{display:table-footer-group}tr.show-xlarge{display:table-row}td.show-xlarge,th.show-xlarge{display:table-cell}}@media screen and (min-width:961px) and (max-width:1260px){.ink-grid{padding:0 1.75em}.column-group>[class*=large-]{float:left;clear:none}.large-5{width:5%}.large-10{width:10%}.large-15{width:15%}.large-16{width:16.66%}.large-20{width:20%}.large-25{width:25%}.large-30{width:30%}.large-33{width:33.33%}.large-35{width:35%}.large-40{width:40%}.large-45{width:45%}.large-50{width:50%}.large-55{width:55%}.large-60{width:60%}.large-65{width:65%}.large-66{width:66.66%}.large-70{width:70%}.large-75{width:75%}.large-80{width:80%}.large-85{width:85%}.large-90{width:90%}.large-95{width:95%}.large-100{width:100%}[class*=large-100]{float:none;clear:both}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1.75em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.horizontal-gutters{margin-left:-1.75em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.double-gutters{margin-left:-3.5em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.double-horizontal-gutters{margin-left:-3.5em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.half-gutters{margin-left:-.875em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.half-horizontal-gutters{margin-left:-.875em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.quarter-gutters{margin-left:-.4375em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.quarter-horizontal-gutters{margin-left:-.4375em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-gutters{margin-left:-1.75em}.column-group.large-gutters>[class*=all-],.column-group.large-gutters>[class*=large-]{padding-left:1.75em;margin-bottom:1.75em}.column-group.large-horizontal-gutters{margin-left:-1.75em}.column-group.large-horizontal-gutters>[class*=all-],.column-group.large-horizontal-gutters>[class*=large-]{padding-left:1.75em}.column-group.large-vertical-gutters>[class*=all-],.column-group.large-vertical-gutters>[class*=large-]{margin-bottom:1.75em}.column-group.large-double-gutters{margin-left:-3.5em}.column-group.large-double-gutters>[class*=all-],.column-group.large-double-gutters>[class*=large-]{padding-left:3.5em;margin-bottom:3.5em}.column-group.large-double-horizontal-gutters{margin-left:-3.5em}.column-group.large-double-horizontal-gutters>[class*=all-],.column-group.large-double-horizontal-gutters>[class*=large-]{padding-left:3.5em}.column-group.large-double-vertical-gutters>[class*=all-],.column-group.large-double-vertical-gutters>[class*=large-]{margin-bottom:3.5em}.column-group.large-half-gutters{margin-left:-.875em}.column-group.large-half-gutters>[class*=all-],.column-group.large-half-gutters>[class*=large-]{padding-left:.875em;margin-bottom:.875em}.column-group.large-half-horizontal-gutters{margin-left:-.875em}.column-group.large-half-horizontal-gutters>[class*=all-],.column-group.large-half-horizontal-gutters>[class*=large-]{padding-left:.875em}.column-group.large-half-vertical-gutters>[class*=all-],.column-group.large-half-vertical-gutters>[class*=large-]{margin-bottom:.875em}.column-group.large-quarter-gutters{margin-left:-.4375em}.column-group.large-quarter-gutters>[class*=all-],.column-group.large-quarter-gutters>[class*=large-]{padding-left:.4375em;margin-bottom:.4375em}.column-group.large-quarter-horizontal-gutters{margin-left:-.4375em}.column-group.large-quarter-horizontal-gutters>[class*=all-],.column-group.large-quarter-horizontal-gutters>[class*=large-]{padding-left:.4375em}.column-group.large-quarter-vertical-gutters>[class*=all-],.column-group.large-quarter-vertical-gutters>[class*=large-]{margin-bottom:.4375em}.column-group.large-no-gutters{margin-left:0}.column-group.large-no-gutters>[class*=all-],.column-group.large-no-gutters>[class*=large-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=large-],.ink-table td[class*=large-],.ink-table tfoot[class*=large-],.ink-table th[class*=large-],.ink-table thead[class*=large-],.ink-table tr[class*=large-]{float:none}.large-push-left{float:left}.large-push-center{float:none;margin-left:auto;margin-right:auto}.large-push-right{float:right}.large-align-left{text-align:left}.large-align-center{text-align:center}.large-align-right{text-align:right}.large-no-margin{margin:0!important}.large-space,.space{margin:1.75em}.large-padding,.padding{padding:1.75em}.double-space,.large-double-space{margin:3.5em}.double-padding,.large-double-padding{padding:3.5em}.half-space,.large-half-space{margin:.875em}.half-padding,.large-half-padding{padding:.875em}.large-quarter-space,.quarter-space{margin:.4375em}.large-quarter-padding,.quarter-padding{padding:.4375em}.large-vertical-space,.vertical-space{margin-top:1.75em;margin-bottom:1.75em}.large-vertical-padding,.vertical-padding{padding-top:1.75em;padding-bottom:1.75em}.double-vertical-space,.large-double-vertical-space{margin-top:3.5em;margin-bottom:3.5em}.double-vertical-padding,.large-double-vertical-padding{padding-top:3.5em;padding-bottom:3.5em}.half-vertical-space,.large-half-vertical-space{margin-top:.875em;margin-bottom:.875em}.half-vertical-padding,.large-half-vertical-padding{padding-top:.875em;padding-bottom:.875em}.large-quarter-vertical-space,.quarter-vertical-space{margin-top:.4375em;margin-bottom:.4375em}.large-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.4375em;padding-bottom:.4375em}.horizontal-space,.large-horizontal-space{margin-left:1.75em;margin-right:1.75em}.horizontal-padding,.large-horizontal-padding{padding-left:1.75em;padding-right:1.75em}.double-horizontal-space,.large-double-horizontal-space{margin-left:3.5em;margin-right:3.5em}.double-horizontal-padding,.large-double-horizontal-padding{padding-left:3.5em;padding-right:3.5em}.half-horizontal-space,.large-half-horizontal-space{margin-left:.875em;margin-right:.875em}.half-horizontal-padding,.large-half-horizontal-padding{padding-left:.875em;padding-right:.875em}.large-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.4375em;margin-right:.4375em}.large-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.4375em;padding-right:.4375em}.large-top-space,.top-space{margin-top:1.75em}.large-top-padding,.top-padding{padding-top:1.75em}.double-top-space,.large-double-top-space{margin-top:3.5em}.double-top-padding,.large-double-top-padding{padding-top:3.5em}.half-top-space,.large-half-top-space{margin-top:.875em}.half-top-padding,.large-half-top-padding{padding-top:.875em}.large-quarter-top-space,.quarter-top-space{margin-top:.4375em}.large-quarter-top-padding,.quarter-top-padding{padding-top:.4375em}.large-right-space,.right-space{margin-right:1.75em}.large-right-padding,.right-padding{padding-right:1.75em}.double-right-space,.large-double-right-space{margin-right:3.5em}.double-right-padding,.large-double-right-padding{padding-right:3.5em}.half-right-space,.large-half-right-space{margin-right:.875em}.half-right-padding,.large-half-right-padding{padding-right:.875em}.large-quarter-right-space,.quarter-right-space{margin-right:.4375em}.large-quarter-right-padding,.quarter-right-padding{padding-right:.4375em}.bottom-space,.large-bottom-space{margin-bottom:1.75em}.bottom-padding,.large-bottom-padding{padding-bottom:1.75em}.double-bottom-space,.large-double-bottom-space{margin-bottom:3.5em}.double-bottom-padding,.large-double-bottom-padding{padding-bottom:3.5em}.half-bottom-space,.large-half-bottom-space{margin-bottom:.875em}.half-bottom-padding,.large-half-bottom-padding{padding-bottom:.875em}.large-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.4375em}.large-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.4375em}.large-left-space,.left-space{margin-left:1.75em}.large-left-padding,.left-padding{padding-left:1.75em}.double-left-space,.large-double-left-space{margin-left:3.5em}.double-left-padding,.large-double-left-padding{padding-left:3.5em}.half-left-space,.large-half-left-space{margin-left:.875em}.half-left-padding,.large-half-left-padding{padding-left:.875em}.large-quarter-left-space,.quarter-left-space{margin-left:.4375em}.large-quarter-left-padding,.quarter-left-padding{padding-left:.4375em}.hide-large{display:none!important}.show-large{display:inherit!important}table.show-large{display:table}thead.show-large{display:table-header-group}tbody.show-large{display:table-row-group}tfoot.show-large{display:table-footer-group}tr.show-large{display:table-row}td.show-large,th.show-large{display:table-cell}}@media screen and (min-width:641px) and (max-width:960px){.ink-grid{padding:0 1.5em}.column-group>[class*=medium-]{float:left;clear:none}.medium-5{width:5%}.medium-10{width:10%}.medium-15{width:15%}.medium-16{width:16.66%}.medium-20{width:20%}.medium-25{width:25%}.medium-30{width:30%}.medium-33{width:33.33%}.medium-35{width:35%}.medium-40{width:40%}.medium-45{width:45%}.medium-50{width:50%}.medium-55{width:55%}.medium-60{width:60%}.medium-65{width:65%}.medium-66{width:66.66%}.medium-70{width:70%}.medium-75{width:75%}.medium-80{width:80%}.medium-85{width:85%}.medium-90{width:90%}.medium-95{width:95%}.medium-100{width:100%}[class*=medium-100]{float:none;clear:both}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1.5em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}.column-group.horizontal-gutters{margin-left:-1.5em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=medium-]{padding-left:1.5em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=medium-]{margin-bottom:1.5em}.column-group.double-gutters{margin-left:-3em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}.column-group.double-horizontal-gutters{margin-left:-3em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=medium-]{padding-left:3em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=medium-]{margin-bottom:3em}.column-group.half-gutters{margin-left:-.75em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}.column-group.half-horizontal-gutters{margin-left:-.75em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=medium-]{padding-left:.75em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}.column-group.quarter-gutters{margin-left:-.375em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}.column-group.quarter-horizontal-gutters{margin-left:-.375em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}.column-group.medium-gutters{margin-left:-1.5em}.column-group.medium-gutters>[class*=all-],.column-group.medium-gutters>[class*=medium-]{padding-left:1.5em;margin-bottom:1.5em}.column-group.medium-horizontal-gutters{margin-left:-1.5em}.column-group.medium-horizontal-gutters>[class*=all-],.column-group.medium-horizontal-gutters>[class*=medium-]{padding-left:1.5em}.column-group.medium-vertical-gutters>[class*=all-],.column-group.medium-vertical-gutters>[class*=medium-]{margin-bottom:1.5em}.column-group.medium-double-gutters{margin-left:-3em}.column-group.medium-double-gutters>[class*=all-],.column-group.medium-double-gutters>[class*=medium-]{padding-left:3em;margin-bottom:3em}.column-group.medium-double-horizontal-gutters{margin-left:-3em}.column-group.medium-double-horizontal-gutters>[class*=all-],.column-group.medium-double-horizontal-gutters>[class*=medium-]{padding-left:3em}.column-group.medium-double-vertical-gutters>[class*=all-],.column-group.medium-double-vertical-gutters>[class*=medium-]{margin-bottom:3em}.column-group.medium-half-gutters{margin-left:-.75em}.column-group.medium-half-gutters>[class*=all-],.column-group.medium-half-gutters>[class*=medium-]{padding-left:.75em;margin-bottom:.75em}.column-group.medium-half-horizontal-gutters{margin-left:-.75em}.column-group.medium-half-horizontal-gutters>[class*=all-],.column-group.medium-half-horizontal-gutters>[class*=medium-]{padding-left:.75em}.column-group.medium-half-vertical-gutters>[class*=all-],.column-group.medium-half-vertical-gutters>[class*=medium-]{margin-bottom:.75em}.column-group.medium-quarter-gutters{margin-left:-.375em}.column-group.medium-quarter-gutters>[class*=all-],.column-group.medium-quarter-gutters>[class*=medium-]{padding-left:.375em;margin-bottom:.375em}.column-group.medium-quarter-horizontal-gutters{margin-left:-.375em}.column-group.medium-quarter-horizontal-gutters>[class*=all-],.column-group.medium-quarter-horizontal-gutters>[class*=medium-]{padding-left:.375em}.column-group.medium-quarter-vertical-gutters>[class*=all-],.column-group.medium-quarter-vertical-gutters>[class*=medium-]{margin-bottom:.375em}.column-group.medium-no-gutters{margin-left:0}.column-group.medium-no-gutters>[class*=all-],.column-group.medium-no-gutters>[class*=medium-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=medium-],.ink-table td[class*=medium-],.ink-table tfoot[class*=medium-],.ink-table th[class*=medium-],.ink-table thead[class*=medium-],.ink-table tr[class*=medium-]{float:none}.medium-push-left{float:left}.medium-push-center{float:none;margin-left:auto;margin-right:auto}.medium-push-right{float:right}.medium-align-left{text-align:left}.medium-align-center{text-align:center}.medium-align-right{text-align:right}.medium-no-margin{margin:0!important}.medium-space,.space{margin:1.5em}.medium-padding,.padding{padding:1.5em}.double-space,.medium-double-space{margin:3em}.double-padding,.medium-double-padding{padding:3em}.half-space,.medium-half-space{margin:.75em}.half-padding,.medium-half-padding{padding:.75em}.medium-quarter-space,.quarter-space{margin:.375em}.medium-quarter-padding,.quarter-padding{padding:.375em}.medium-vertical-space,.vertical-space{margin-top:1.5em;margin-bottom:1.5em}.medium-vertical-padding,.vertical-padding{padding-top:1.5em;padding-bottom:1.5em}.double-vertical-space,.medium-double-vertical-space{margin-top:3em;margin-bottom:3em}.double-vertical-padding,.medium-double-vertical-padding{padding-top:3em;padding-bottom:3em}.half-vertical-space,.medium-half-vertical-space{margin-top:.75em;margin-bottom:.75em}.half-vertical-padding,.medium-half-vertical-padding{padding-top:.75em;padding-bottom:.75em}.medium-quarter-vertical-space,.quarter-vertical-space{margin-top:.375em;margin-bottom:.375em}.medium-quarter-vertical-padding,.quarter-vertical-padding{padding-top:.375em;padding-bottom:.375em}.horizontal-space,.medium-horizontal-space{margin-left:1.5em;margin-right:1.5em}.horizontal-padding,.medium-horizontal-padding{padding-left:1.5em;padding-right:1.5em}.double-horizontal-space,.medium-double-horizontal-space{margin-left:3em;margin-right:3em}.double-horizontal-padding,.medium-double-horizontal-padding{padding-left:3em;padding-right:3em}.half-horizontal-space,.medium-half-horizontal-space{margin-left:.75em;margin-right:.75em}.half-horizontal-padding,.medium-half-horizontal-padding{padding-left:.75em;padding-right:.75em}.medium-quarter-horizontal-space,.quarter-horizontal-space{margin-left:.375em;margin-right:.375em}.medium-quarter-horizontal-padding,.quarter-horizontal-padding{padding-left:.375em;padding-right:.375em}.medium-top-space,.top-space{margin-top:1.5em}.medium-top-padding,.top-padding{padding-top:1.5em}.double-top-space,.medium-double-top-space{margin-top:3em}.double-top-padding,.medium-double-top-padding{padding-top:3em}.half-top-space,.medium-half-top-space{margin-top:.75em}.half-top-padding,.medium-half-top-padding{padding-top:.75em}.medium-quarter-top-space,.quarter-top-space{margin-top:.375em}.medium-quarter-top-padding,.quarter-top-padding{padding-top:.375em}.medium-right-space,.right-space{margin-right:1.5em}.medium-right-padding,.right-padding{padding-right:1.5em}.double-right-space,.medium-double-right-space{margin-right:3em}.double-right-padding,.medium-double-right-padding{padding-right:3em}.half-right-space,.medium-half-right-space{margin-right:.75em}.half-right-padding,.medium-half-right-padding{padding-right:.75em}.medium-quarter-right-space,.quarter-right-space{margin-right:.375em}.medium-quarter-right-padding,.quarter-right-padding{padding-right:.375em}.bottom-space,.medium-bottom-space{margin-bottom:1.5em}.bottom-padding,.medium-bottom-padding{padding-bottom:1.5em}.double-bottom-space,.medium-double-bottom-space{margin-bottom:3em}.double-bottom-padding,.medium-double-bottom-padding{padding-bottom:3em}.half-bottom-space,.medium-half-bottom-space{margin-bottom:.75em}.half-bottom-padding,.medium-half-bottom-padding{padding-bottom:.75em}.medium-quarter-bottom-space,.quarter-bottom-space{margin-bottom:.375em}.medium-quarter-bottom-padding,.quarter-bottom-padding{padding-bottom:.375em}.left-space,.medium-left-space{margin-left:1.5em}.left-padding,.medium-left-padding{padding-left:1.5em}.double-left-space,.medium-double-left-space{margin-left:3em}.double-left-padding,.medium-double-left-padding{padding-left:3em}.half-left-space,.medium-half-left-space{margin-left:.75em}.half-left-padding,.medium-half-left-padding{padding-left:.75em}.medium-quarter-left-space,.quarter-left-space{margin-left:.375em}.medium-quarter-left-padding,.quarter-left-padding{padding-left:.375em}.hide-medium{display:none!important}.show-medium{display:inherit!important}table.show-medium{display:table}thead.show-medium{display:table-header-group}tbody.show-medium{display:table-row-group}tfoot.show-medium{display:table-footer-group}tr.show-medium{display:table-row}td.show-medium,th.show-medium{display:table-cell}}@media screen and (min-width:321px) and (max-width:640px){.ink-grid{padding:0 1.25em}.column-group>[class*=small-]{float:left;clear:none}.small-5{width:5%}.small-10{width:10%}.small-15{width:15%}.small-16{width:16.66%}.small-20{width:20%}.small-25{width:25%}.small-30{width:30%}.small-33{width:33.33%}.small-35{width:35%}.small-40{width:40%}.small-45{width:45%}.small-50{width:50%}.small-55{width:55%}.small-60{width:60%}.small-65{width:65%}.small-66{width:66.66%}.small-70{width:70%}.small-75{width:75%}.small-80{width:80%}.small-85{width:85%}.small-90{width:90%}.small-95{width:95%}.small-100{width:100%}[class*=small-100]{float:none;clear:both}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1.25em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}.column-group.horizontal-gutters{margin-left:-1.25em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=small-]{padding-left:1.25em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=small-]{margin-bottom:1.25em}.column-group.double-gutters{margin-left:-2.5em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}.column-group.double-horizontal-gutters{margin-left:-2.5em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=small-]{padding-left:2.5em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}.column-group.half-gutters{margin-left:-.625em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}.column-group.half-horizontal-gutters{margin-left:-.625em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=small-]{padding-left:.625em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=small-]{margin-bottom:.625em}.column-group.quarter-gutters{margin-left:-.3125em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}.column-group.quarter-horizontal-gutters{margin-left:-.3125em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}.column-group.small-gutters{margin-left:-1.25em}.column-group.small-gutters>[class*=all-],.column-group.small-gutters>[class*=small-]{padding-left:1.25em;margin-bottom:1.25em}.column-group.small-horizontal-gutters{margin-left:-1.25em}.column-group.small-horizontal-gutters>[class*=all-],.column-group.small-horizontal-gutters>[class*=small-]{padding-left:1.25em}.column-group.small-vertical-gutters>[class*=all-],.column-group.small-vertical-gutters>[class*=small-]{margin-bottom:1.25em}.column-group.small-double-gutters{margin-left:-2.5em}.column-group.small-double-gutters>[class*=all-],.column-group.small-double-gutters>[class*=small-]{padding-left:2.5em;margin-bottom:2.5em}.column-group.small-double-horizontal-gutters{margin-left:-2.5em}.column-group.small-double-horizontal-gutters>[class*=all-],.column-group.small-double-horizontal-gutters>[class*=small-]{padding-left:2.5em}.column-group.small-double-vertical-gutters>[class*=all-],.column-group.small-double-vertical-gutters>[class*=small-]{margin-bottom:2.5em}.column-group.small-half-gutters{margin-left:-.625em}.column-group.small-half-gutters>[class*=all-],.column-group.small-half-gutters>[class*=small-]{padding-left:.625em;margin-bottom:.625em}.column-group.small-half-horizontal-gutters{margin-left:-.625em}.column-group.small-half-horizontal-gutters>[class*=all-],.column-group.small-half-horizontal-gutters>[class*=small-]{padding-left:.625em}.column-group.small-half-vertical-gutters>[class*=all-],.column-group.small-half-vertical-gutters>[class*=small-]{margin-bottom:.625em}.column-group.small-quarter-gutters{margin-left:-.3125em}.column-group.small-quarter-gutters>[class*=all-],.column-group.small-quarter-gutters>[class*=small-]{padding-left:.3125em;margin-bottom:.3125em}.column-group.small-quarter-horizontal-gutters{margin-left:-.3125em}.column-group.small-quarter-horizontal-gutters>[class*=all-],.column-group.small-quarter-horizontal-gutters>[class*=small-]{padding-left:.3125em}.column-group.small-quarter-vertical-gutters>[class*=all-],.column-group.small-quarter-vertical-gutters>[class*=small-]{margin-bottom:.3125em}.column-group.small-no-gutters{margin-left:0}.column-group.small-no-gutters>[class*=all-],.column-group.small-no-gutters>[class*=small-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=small-],.ink-table td[class*=small-],.ink-table tfoot[class*=small-],.ink-table th[class*=small-],.ink-table thead[class*=small-],.ink-table tr[class*=small-]{float:none}.small-push-left{float:left}.small-push-center{float:none;margin-left:auto;margin-right:auto}.small-push-right{float:right}.small-align-left{text-align:left}.small-align-center{text-align:center}.small-align-right{text-align:right}.small-no-margin{margin:0!important}.small-space,.space{margin:1.25em}.padding,.small-padding{padding:1.25em}.double-space,.small-double-space{margin:2.5em}.double-padding,.small-double-padding{padding:2.5em}.half-space,.small-half-space{margin:.625em}.half-padding,.small-half-padding{padding:.625em}.quarter-space,.small-quarter-space{margin:.3125em}.quarter-padding,.small-quarter-padding{padding:.3125em}.small-vertical-space,.vertical-space{margin-top:1.25em;margin-bottom:1.25em}.small-vertical-padding,.vertical-padding{padding-top:1.25em;padding-bottom:1.25em}.double-vertical-space,.small-double-vertical-space{margin-top:2.5em;margin-bottom:2.5em}.double-vertical-padding,.small-double-vertical-padding{padding-top:2.5em;padding-bottom:2.5em}.half-vertical-space,.small-half-vertical-space{margin-top:.625em;margin-bottom:.625em}.half-vertical-padding,.small-half-vertical-padding{padding-top:.625em;padding-bottom:.625em}.quarter-vertical-space,.small-quarter-vertical-space{margin-top:.3125em;margin-bottom:.3125em}.quarter-vertical-padding,.small-quarter-vertical-padding{padding-top:.3125em;padding-bottom:.3125em}.horizontal-space,.small-horizontal-space{margin-left:1.25em;margin-right:1.25em}.horizontal-padding,.small-horizontal-padding{padding-left:1.25em;padding-right:1.25em}.double-horizontal-space,.small-double-horizontal-space{margin-left:2.5em;margin-right:2.5em}.double-horizontal-padding,.small-double-horizontal-padding{padding-left:2.5em;padding-right:2.5em}.half-horizontal-space,.small-half-horizontal-space{margin-left:.625em;margin-right:.625em}.half-horizontal-padding,.small-half-horizontal-padding{padding-left:.625em;padding-right:.625em}.quarter-horizontal-space,.small-quarter-horizontal-space{margin-left:.3125em;margin-right:.3125em}.quarter-horizontal-padding,.small-quarter-horizontal-padding{padding-left:.3125em;padding-right:.3125em}.small-top-space,.top-space{margin-top:1.25em}.small-top-padding,.top-padding{padding-top:1.25em}.double-top-space,.small-double-top-space{margin-top:2.5em}.double-top-padding,.small-double-top-padding{padding-top:2.5em}.half-top-space,.small-half-top-space{margin-top:.625em}.half-top-padding,.small-half-top-padding{padding-top:.625em}.quarter-top-space,.small-quarter-top-space{margin-top:.3125em}.quarter-top-padding,.small-quarter-top-padding{padding-top:.3125em}.right-space,.small-right-space{margin-right:1.25em}.right-padding,.small-right-padding{padding-right:1.25em}.double-right-space,.small-double-right-space{margin-right:2.5em}.double-right-padding,.small-double-right-padding{padding-right:2.5em}.half-right-space,.small-half-right-space{margin-right:.625em}.half-right-padding,.small-half-right-padding{padding-right:.625em}.quarter-right-space,.small-quarter-right-space{margin-right:.3125em}.quarter-right-padding,.small-quarter-right-padding{padding-right:.3125em}.bottom-space,.small-bottom-space{margin-bottom:1.25em}.bottom-padding,.small-bottom-padding{padding-bottom:1.25em}.double-bottom-space,.small-double-bottom-space{margin-bottom:2.5em}.double-bottom-padding,.small-double-bottom-padding{padding-bottom:2.5em}.half-bottom-space,.small-half-bottom-space{margin-bottom:.625em}.half-bottom-padding,.small-half-bottom-padding{padding-bottom:.625em}.quarter-bottom-space,.small-quarter-bottom-space{margin-bottom:.3125em}.quarter-bottom-padding,.small-quarter-bottom-padding{padding-bottom:.3125em}.left-space,.small-left-space{margin-left:1.25em}.left-padding,.small-left-padding{padding-left:1.25em}.double-left-space,.small-double-left-space{margin-left:2.5em}.double-left-padding,.small-double-left-padding{padding-left:2.5em}.half-left-space,.small-half-left-space{margin-left:.625em}.half-left-padding,.small-half-left-padding{padding-left:.625em}.quarter-left-space,.small-quarter-left-space{margin-left:.3125em}.quarter-left-padding,.small-quarter-left-padding{padding-left:.3125em}.hide-small{display:none!important}.show-small{display:inherit!important}table.show-small{display:table}thead.show-small{display:table-header-group}tbody.show-small{display:table-row-group}tfoot.show-small{display:table-footer-group}tr.show-small{display:table-row}td.show-small,th.show-small{display:table-cell}}@media screen and (max-width:320px){.ink-grid{padding:0 1em}.column-group>[class*=tiny-]{float:left;clear:none}.tiny-5{width:5%}.tiny-10{width:10%}.tiny-15{width:15%}.tiny-16{width:16.66%}.tiny-20{width:20%}.tiny-25{width:25%}.tiny-30{width:30%}.tiny-33{width:33.33%}.tiny-35{width:35%}.tiny-40{width:40%}.tiny-45{width:45%}.tiny-50{width:50%}.tiny-55{width:55%}.tiny-60{width:60%}.tiny-65{width:65%}.tiny-66{width:66.66%}.tiny-70{width:70%}.tiny-75{width:75%}.tiny-80{width:80%}.tiny-85{width:85%}.tiny-90{width:90%}.tiny-95{width:95%}.tiny-100{width:100%}[class*=tiny-100]{float:none;clear:both}.column-group:after{content:"";display:table;clear:both}.column-group.gutters{margin-left:-1em}.column-group.gutters>[class*=all-],.column-group.gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}.column-group.horizontal-gutters{margin-left:-1em}.column-group.horizontal-gutters>[class*=all-],.column-group.horizontal-gutters>[class*=tiny-]{padding-left:1em}.column-group.vertical-gutters>[class*=all-],.column-group.vertical-gutters>[class*=tiny-]{margin-bottom:1em}.column-group.double-gutters{margin-left:-2em}.column-group.double-gutters>[class*=all-],.column-group.double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}.column-group.double-horizontal-gutters{margin-left:-2em}.column-group.double-horizontal-gutters>[class*=all-],.column-group.double-horizontal-gutters>[class*=tiny-]{padding-left:2em}.column-group.double-vertical-gutters>[class*=all-],.column-group.double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}.column-group.half-gutters{margin-left:-.5em}.column-group.half-gutters>[class*=all-],.column-group.half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}.column-group.half-horizontal-gutters{margin-left:-.5em}.column-group.half-horizontal-gutters>[class*=all-],.column-group.half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}.column-group.half-vertical-gutters>[class*=all-],.column-group.half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}.column-group.quarter-gutters{margin-left:-.25em}.column-group.quarter-gutters>[class*=all-],.column-group.quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}.column-group.quarter-horizontal-gutters{margin-left:-.25em}.column-group.quarter-horizontal-gutters>[class*=all-],.column-group.quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}.column-group.quarter-vertical-gutters>[class*=all-],.column-group.quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}.column-group.tiny-gutters{margin-left:-1em}.column-group.tiny-gutters>[class*=all-],.column-group.tiny-gutters>[class*=tiny-]{padding-left:1em;margin-bottom:1em}.column-group.tiny-horizontal-gutters{margin-left:-1em}.column-group.tiny-horizontal-gutters>[class*=all-],.column-group.tiny-horizontal-gutters>[class*=tiny-]{padding-left:1em}.column-group.tiny-vertical-gutters>[class*=all-],.column-group.tiny-vertical-gutters>[class*=tiny-]{margin-bottom:1em}.column-group.tiny-double-gutters{margin-left:-2em}.column-group.tiny-double-gutters>[class*=all-],.column-group.tiny-double-gutters>[class*=tiny-]{padding-left:2em;margin-bottom:2em}.column-group.tiny-double-horizontal-gutters{margin-left:-2em}.column-group.tiny-double-horizontal-gutters>[class*=all-],.column-group.tiny-double-horizontal-gutters>[class*=tiny-]{padding-left:2em}.column-group.tiny-double-vertical-gutters>[class*=all-],.column-group.tiny-double-vertical-gutters>[class*=tiny-]{margin-bottom:2em}.column-group.tiny-half-gutters{margin-left:-.5em}.column-group.tiny-half-gutters>[class*=all-],.column-group.tiny-half-gutters>[class*=tiny-]{padding-left:.5em;margin-bottom:.5em}.column-group.tiny-half-horizontal-gutters{margin-left:-.5em}.column-group.tiny-half-horizontal-gutters>[class*=all-],.column-group.tiny-half-horizontal-gutters>[class*=tiny-]{padding-left:.5em}.column-group.tiny-half-vertical-gutters>[class*=all-],.column-group.tiny-half-vertical-gutters>[class*=tiny-]{margin-bottom:.5em}.column-group.tiny-quarter-gutters{margin-left:-.25em}.column-group.tiny-quarter-gutters>[class*=all-],.column-group.tiny-quarter-gutters>[class*=tiny-]{padding-left:.25em;margin-bottom:.25em}.column-group.tiny-quarter-horizontal-gutters{margin-left:-.25em}.column-group.tiny-quarter-horizontal-gutters>[class*=all-],.column-group.tiny-quarter-horizontal-gutters>[class*=tiny-]{padding-left:.25em}.column-group.tiny-quarter-vertical-gutters>[class*=all-],.column-group.tiny-quarter-vertical-gutters>[class*=tiny-]{margin-bottom:.25em}.column-group.tiny-no-gutters{margin-left:0}.column-group.tiny-no-gutters>[class*=all-],.column-group.tiny-no-gutters>[class*=tiny-]{padding-left:0;margin-bottom:0}.ink-table tbody[class*=tiny-],.ink-table td[class*=tiny-],.ink-table tfoot[class*=tiny-],.ink-table th[class*=tiny-],.ink-table thead[class*=tiny-],.ink-table tr[class*=tiny-]{float:none}.tiny-push-left{float:left}.tiny-push-center{float:none;margin-left:auto;margin-right:auto}.tiny-push-right{float:right}.tiny-align-left{text-align:left}.tiny-align-center{text-align:center}.tiny-align-right{text-align:right}.tiny-no-margin{margin:0!important}.space,.tiny-space{margin:1em}.padding,.tiny-padding{padding:1em}.double-space,.tiny-double-space{margin:2em}.double-padding,.tiny-double-padding{padding:2em}.half-space,.tiny-half-space{margin:.5em}.half-padding,.tiny-half-padding{padding:.5em}.quarter-space,.tiny-quarter-space{margin:.25em}.quarter-padding,.tiny-quarter-padding{padding:.25em}.tiny-vertical-space,.vertical-space{margin-top:1em;margin-bottom:1em}.tiny-vertical-padding,.vertical-padding{padding-top:1em;padding-bottom:1em}.double-vertical-space,.tiny-double-vertical-space{margin-top:2em;margin-bottom:2em}.double-vertical-padding,.tiny-double-vertical-padding{padding-top:2em;padding-bottom:2em}.half-vertical-space,.tiny-half-vertical-space{margin-top:.5em;margin-bottom:.5em}.half-vertical-padding,.tiny-half-vertical-padding{padding-top:.5em;padding-bottom:.5em}.quarter-vertical-space,.tiny-quarter-vertical-space{margin-top:.25em;margin-bottom:.25em}.quarter-vertical-padding,.tiny-quarter-vertical-padding{padding-top:.25em;padding-bottom:.25em}.horizontal-space,.tiny-horizontal-space{margin-left:1em;margin-right:1em}.horizontal-padding,.tiny-horizontal-padding{padding-left:1em;padding-right:1em}.double-horizontal-space,.tiny-double-horizontal-space{margin-left:2em;margin-right:2em}.double-horizontal-padding,.tiny-double-horizontal-padding{padding-left:2em;padding-right:2em}.half-horizontal-space,.tiny-half-horizontal-space{margin-left:.5em;margin-right:.5em}.half-horizontal-padding,.tiny-half-horizontal-padding{padding-left:.5em;padding-right:.5em}.quarter-horizontal-space,.tiny-quarter-horizontal-space{margin-left:.25em;margin-right:.25em}.quarter-horizontal-padding,.tiny-quarter-horizontal-padding{padding-left:.25em;padding-right:.25em}.tiny-top-space,.top-space{margin-top:1em}.tiny-top-padding,.top-padding{padding-top:1em}.double-top-space,.tiny-double-top-space{margin-top:2em}.double-top-padding,.tiny-double-top-padding{padding-top:2em}.half-top-space,.tiny-half-top-space{margin-top:.5em}.half-top-padding,.tiny-half-top-padding{padding-top:.5em}.quarter-top-space,.tiny-quarter-top-space{margin-top:.25em}.quarter-top-padding,.tiny-quarter-top-padding{padding-top:.25em}.right-space,.tiny-right-space{margin-right:1em}.right-padding,.tiny-right-padding{padding-right:1em}.double-right-space,.tiny-double-right-space{margin-right:2em}.double-right-padding,.tiny-double-right-padding{padding-right:2em}.half-right-space,.tiny-half-right-space{margin-right:.5em}.half-right-padding,.tiny-half-right-padding{padding-right:.5em}.quarter-right-space,.tiny-quarter-right-space{margin-right:.25em}.quarter-right-padding,.tiny-quarter-right-padding{padding-right:.25em}.bottom-space,.tiny-bottom-space{margin-bottom:1em}.bottom-padding,.tiny-bottom-padding{padding-bottom:1em}.double-bottom-space,.tiny-double-bottom-space{margin-bottom:2em}.double-bottom-padding,.tiny-double-bottom-padding{padding-bottom:2em}.half-bottom-space,.tiny-half-bottom-space{margin-bottom:.5em}.half-bottom-padding,.tiny-half-bottom-padding{padding-bottom:.5em}.quarter-bottom-space,.tiny-quarter-bottom-space{margin-bottom:.25em}.quarter-bottom-padding,.tiny-quarter-bottom-padding{padding-bottom:.25em}.left-space,.tiny-left-space{margin-left:1em}.left-padding,.tiny-left-padding{padding-left:1em}.double-left-space,.tiny-double-left-space{margin-left:2em}.double-left-padding,.tiny-double-left-padding{padding-left:2em}.half-left-space,.tiny-half-left-space{margin-left:.5em}.half-left-padding,.tiny-half-left-padding{padding-left:.5em}.quarter-left-space,.tiny-quarter-left-space{margin-left:.25em}.quarter-left-padding,.tiny-quarter-left-padding{padding-left:.25em}.hide-tiny{display:none!important}.show-tiny{display:inherit!important}table.show-tiny{display:table}thead.show-tiny{display:table-header-group}tbody.show-tiny{display:table-row-group}tfoot.show-tiny{display:table-footer-group}tr.show-tiny{display:table-row}td.show-tiny,th.show-tiny{display:table-cell}}@media screen and (min-width:1261px){html{font-size:1.08em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:961px) and (max-width:1260px){html{font-size:1.05em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:641px) and (max-width:960px){html{font-size:1em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (min-width:321px) and (max-width:640px){html{font-size:.98em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}@media screen and (max-width:320px){html{font-size:.97em}html:after{content:'[{"name":"xlarge", "size":{"min":"1261px","max":""}},{"name":"large", "size":{"min":"961px","max":"1260px"}},{"name":"medium", "size":{"min":"641px","max":"960px"}},{"name":"small", "size":{"min":"321px","max":"640px"}},{"name":"tiny", "size":{"min":"","max":"320px"}}]';display:none}}.ink-label{padding:0 .35em;white-space:nowrap}.ink-navigation{overflow:visible}.ink-navigation ul{list-style-type:none;padding:0;margin:0}.ink-navigation ul li{margin:0}.ink-navigation .breadcrumbs li{line-height:2.7em;display:inline}.ink-navigation .breadcrumbs li a{display:inline;padding:0}.ink-navigation .breadcrumbs li a:hover{background:0 0}.ink-navigation .breadcrumbs li.active a{cursor:default;text-decoration:none}.ink-navigation .breadcrumbs li:first-child a{padding-left:1.2em}.ink-navigation .breadcrumbs li:after{content:'/';display:inline;margin:0 .7em}.ink-navigation .breadcrumbs li:last-child:after{content:'';display:none}.ink-dropdown,.ink-navigation{position:relative}.ink-dropdown ul.dropdown,.ink-dropdown ul.dropdown-menu,.ink-navigation ul.dropdown,.ink-navigation ul.dropdown-menu{position:absolute;top:110%;background:#fff;z-index:30;border:1px solid #d9d9d9;height:auto;width:auto;min-width:10em;max-width:12em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:rgba(100,100,100,.3) 0 0 1px 0;-moz-box-shadow:rgba(100,100,100,.3) 0 0 1px 0;box-shadow:rgba(100,100,100,.3) 0 0 1px 0;margin-left:0;padding:.35em 0;font-size:.85em}.ink-dropdown ul.dropdown li,.ink-dropdown ul.dropdown-menu li,.ink-navigation ul.dropdown li,.ink-navigation ul.dropdown-menu li{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-border-radius:none;-moz-border-radius:none;-ms-border-radius:none;-o-border-radius:none;border-radius:none;width:auto;height:auto;min-height:auto;display:list-item;float:none;margin:0;text-align:left;text-transform:none;padding:0;position:relative;list-style-type:none}.ink-dropdown ul.dropdown li.separator-above,.ink-dropdown ul.dropdown-menu li.separator-above,.ink-navigation ul.dropdown li.separator-above,.ink-navigation ul.dropdown-menu li.separator-above{padding-top:.35em;margin-top:.35em;border-top:1px solid #d9d9d9}.ink-dropdown ul.dropdown li.separator-below,.ink-dropdown ul.dropdown-menu li.separator-below,.ink-navigation ul.dropdown li.separator-below,.ink-navigation ul.dropdown-menu li.separator-below{padding-bottom:.35em;margin-bottom:.35em;border-bottom:1px solid #d9d9d9}.ink-dropdown ul.dropdown li.heading,.ink-dropdown ul.dropdown-menu li.heading,.ink-navigation ul.dropdown li.heading,.ink-navigation ul.dropdown-menu li.heading{font-weight:700;margin-bottom:.35em;padding:.5em .8em;color:#333}.ink-dropdown ul.dropdown li a,.ink-dropdown ul.dropdown-menu li a,.ink-navigation ul.dropdown li a,.ink-navigation ul.dropdown-menu li a{color:#444;padding:.5em .8em;display:block;clear:both}.ink-dropdown ul.dropdown li a:hover,.ink-dropdown ul.dropdown-menu li a:hover,.ink-navigation ul.dropdown li a:hover,.ink-navigation ul.dropdown-menu li a:hover{background:#f2f2f2;text-decoration:none}.ink-dropdown ul.dropdown li.active a,.ink-dropdown ul.dropdown-menu li.active a,.ink-navigation ul.dropdown li.active a,.ink-navigation ul.dropdown-menu li.active a{background:#999;color:#fff}.ink-dropdown ul.dropdown li.disabled a,.ink-dropdown ul.dropdown-menu li.disabled a,.ink-navigation ul.dropdown li.disabled a,.ink-navigation ul.dropdown-menu li.disabled a{color:#b3b3b3}.ink-dropdown ul.dropdown li.disabled a:hover,.ink-dropdown ul.dropdown-menu li.disabled a:hover,.ink-navigation ul.dropdown li.disabled a:hover,.ink-navigation ul.dropdown-menu li.disabled a:hover{background:0 0;cursor:default}.ink-dropdown ul.dropdown li.submenu,.ink-dropdown ul.dropdown-menu li.submenu,.ink-navigation ul.dropdown li.submenu,.ink-navigation ul.dropdown-menu li.submenu{overflow:visible}.ink-dropdown ul.dropdown li.submenu>a,.ink-dropdown ul.dropdown-menu li.submenu>a,.ink-navigation ul.dropdown li.submenu>a,.ink-navigation ul.dropdown-menu li.submenu>a{white-space:nowrap}.ink-dropdown ul.dropdown li.submenu>a:after,.ink-dropdown ul.dropdown-menu li.submenu>a:after,.ink-navigation ul.dropdown li.submenu>a:after,.ink-navigation ul.dropdown-menu li.submenu>a:after{content:"\f0da";width:auto;margin-left:.8em;font-family:FontAwesome;color:#b3b3b3}.ink-dropdown ul.dropdown li.submenu:hover>a,.ink-dropdown ul.dropdown-menu li.submenu:hover>a,.ink-navigation ul.dropdown li.submenu:hover>a,.ink-navigation ul.dropdown-menu li.submenu:hover>a{background:#f2f2f2;text-decoration:none}.ink-dropdown ul.dropdown li.submenu:hover:hover>ul.dropdown,.ink-dropdown ul.dropdown li.submenu:hover:hover>ul.dropdown-menu,.ink-dropdown ul.dropdown-menu li.submenu:hover:hover>ul.dropdown,.ink-dropdown ul.dropdown-menu li.submenu:hover:hover>ul.dropdown-menu,.ink-navigation ul.dropdown li.submenu:hover:hover>ul.dropdown,.ink-navigation ul.dropdown li.submenu:hover:hover>ul.dropdown-menu,.ink-navigation ul.dropdown-menu li.submenu:hover:hover>ul.dropdown,.ink-navigation ul.dropdown-menu li.submenu:hover:hover>ul.dropdown-menu{display:block}.ink-dropdown ul.dropdown li.submenu>ul.dropdown,.ink-dropdown ul.dropdown li.submenu>ul.dropdown-menu,.ink-dropdown ul.dropdown-menu li.submenu>ul.dropdown,.ink-dropdown ul.dropdown-menu li.submenu>ul.dropdown-menu,.ink-navigation ul.dropdown li.submenu>ul.dropdown,.ink-navigation ul.dropdown li.submenu>ul.dropdown-menu,.ink-navigation ul.dropdown-menu li.submenu>ul.dropdown,.ink-navigation ul.dropdown-menu li.submenu>ul.dropdown-menu{font-size:inherit;position:absolute;top:-.36em;left:100%;display:none}.ink-navigation ul.pagination{overflow:hidden}.ink-navigation ul.pagination li{line-height:1.7;float:left}.ink-navigation ul.pagination li a{padding:.5em 1em;display:block;float:left}.ink-navigation ul.pagination.dotted li a{display:block;height:1em;width:1em;margin-right:.6em;padding:0;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%;text-indent:99999px}.ink-navigation ul.pagination.dotted li a:first-child,.ink-navigation ul.pagination.dotted li a:last-child{-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%}.ink-navigation ul.pagination.chevron li{display:none}.ink-navigation ul.pagination.chevron li.next,.ink-navigation ul.pagination.chevron li.previous{display:block}.ink-navigation ul.pagination.chevron li.next a,.ink-navigation ul.pagination.chevron li.previous a{display:block;position:absolute;top:35%;padding:0 .5em;margin:0;font-family:FontAwesome;font-size:4em}.ink-navigation ul.pagination.chevron li.next a span,.ink-navigation ul.pagination.chevron li.previous a span{text-indent:-99999px;display:inline-block}.ink-navigation ul.pagination.chevron li.previous a{left:0}.ink-navigation ul.pagination.chevron li.previous a:after{content:"\f137"}.ink-navigation ul.pagination.chevron li.next a{right:0}.ink-navigation ul.pagination.chevron li.next a:after{content:"\f138"}.ink-navigation .pills{overflow:hidden}.ink-navigation .pills li{overflow:hidden;display:block;float:left;margin:0 .5em .5em 0;line-height:1.7}.ink-navigation .pills li a{display:block;padding:.5em 1em}.ink-navigation .pills li a:hover{text-decoration:none}.ink-navigation .pills li.active a,.ink-navigation .pills li.disabled a{cursor:default}.ink-navigation ul.menu:after{content:"";display:table;clear:both}.ink-navigation ul.menu li:hover>ul.submenu{display:block}.ink-navigation ul.menu li ul.submenu{display:none;position:absolute;z-index:10}.ink-navigation ul.menu li ul.submenu li a{padding:.5em 1em;display:block;float:none}.ink-navigation ul.menu.horizontal.scrollable{font-size:0;white-space:nowrap;overflow-x:scroll;overflow-y:hidden;-webkit-overflow-scrolling:touch;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}.ink-navigation ul.menu.horizontal.scrollable li{display:inline-block;float:none}.ink-navigation ul.menu.horizontal.scrollable li a{border-right:rgba(10,10,10,.3) 1px solid;font-size:initial}.ink-navigation ul.menu.horizontal.scrollable li:last-child a{border-right:none}.ink-navigation ul.menu.horizontal li{float:left;position:relative}.ink-navigation ul.menu.horizontal li a{padding:.5em 1em;display:block;line-height:1.7}.ink-navigation ul.menu.horizontal li .control{margin-top:.3em}.ink-navigation ul.menu.horizontal li ul.submenu{min-width:100%;z-index:50;top:auto;left:auto}.ink-navigation ul.menu.horizontal li ul.submenu li{float:none}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout{position:absolute;top:0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout.left{right:100%}.ink-navigation ul.menu.horizontal li ul.submenu li .flyout.right{left:100%}.ink-navigation ul.menu.vertical li{line-height:1.7;position:relative}.ink-navigation ul.menu.vertical li a{padding:.5em 1em;display:block}.ink-navigation ul.menu.vertical li ul.submenu{position:relative;top:auto;left:auto}.ink-navigation ul.menu.vertical li ul.submenu.flyout{position:absolute;min-width:8em;top:0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.vertical li ul.submenu.flyout.left{right:100%}.ink-navigation ul.menu.vertical li ul.submenu.flyout.right{left:100%}@media print{*{background:0 0!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.ink-navigation{display:none}.ink-table{border-collapse:collapse}.ink-label{border:1px solid #000}}table.ink-table{width:100%;border-collapse:collapse;border-spacing:0}table.ink-table tr th{padding:5px 10px;line-height:1.3}table.ink-table tr th[data-sortable=true]:hover{cursor:pointer;text-decoration:underline}table.ink-table tr th[data-sortable=true]:hover i{text-decoration:none}table.ink-table tr th[data-sortable=true] i{padding-left:.5em}table.ink-table tr td{padding:5px 10px;line-height:1.3}table.ink-table.hover tbody tr:hover{cursor:pointer}table.ink-table.bordered{border-collapse:separate}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{color:#555;font-family:Roboto,Arial,Helvetica,sans-serif;line-height:1.45}.fw-100,.fw-light{font-weight:100}.fw-300,.fw-thin{font-weight:300}.fw-400,.fw-regular{font-weight:400}.fw-500,.fw-medium{font-weight:500}.fw-700,.fw-bold{font-weight:700}.fw-900,.fw-black{font-weight:900}.condensed-300,.condensed-thin{font-weight:200;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.condensed-400,.condensed-regular{font-weight:400;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.condensed-700,.condensed-bold{font-weight:700;font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.slab-100,.slab-light{font-weight:100;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-300,.slab-thin{font-weight:300;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-400,.slab-regular{font-weight:400;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.slab-700,.slab-bold{font-weight:700;font-family:Roboto_slab,Arial,Helvetica,sans-serif}.sans{font-family:Roboto,Arial,Helvetica,sans-serif}.serif{font-family:Times,"Times New Roman",serif}.monospace{font-family:Monaco,"Andale Mono","Courier New",monospace}.condensed{font-family:Roboto_condensed,Arial,Helvetica,sans-serif}.slab{font-family:Roboto_slab,Arial,Helvetica,sans-serif}.italic{font-style:italic}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalizer{text-transform:capitalize}.fa{font-size:14px}a{color:#6998C9;text-decoration:none;cursor:pointer}a:hover{color:#007ED5;text-decoration:underline}h1{font-size:2.2em;margin-top:0;margin-bottom:.59318em}h2{font-size:1.75em;margin-top:0;margin-bottom:.74571em}h3{font-size:1.5em;margin-top:0;margin-bottom:.87em}h4{font-size:1.25em;margin-top:0;margin-bottom:1.044em}h5,h6{font-size:1.1em;margin-top:0;margin-bottom:1.18636em}p,table{font-size:1em;margin-top:0;margin-bottom:1.305em}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,h6:first-child,p:first-child{margin-top:0}h1,h2,h3,h4,h5,h6{color:#404040;font-weight:700;line-height:1.16}small{color:#888}input,textarea{color:#666}h1 small,h2 small,h3 small,h4 small{color:#bbb;font-size:.6em;font-weight:100;line-height:1}mark{background:#dae5f2}address{color:#777;font-size:1em;line-height:1.4}address p{margin-top:0}address h6{color:#555}abbr:hover{cursor:help}blockquote{border-left:4px solid #ddd;padding-left:25px;margin:1em 0;font-weight:200;font-size:1.1em}blockquote small{font-size:.9em}blockquote small::after,blockquote small::before{content:' — '}.note{font-size:.9em;color:#777}.note strong{color:#555}.small{font-size:.75em}.medium{font-size:.85em}.large{font-size:1.2em}.extralarge{font-size:1.45em!important}hr{border:0;border-top:1px solid #ddd;margin:1em 0}.lead{font-size:1.1em;font-weight:700}ol,ul{line-height:1.4;padding:0 0 0 1.45em;margin:1em 0}ol li,ul li{margin:.5em 0}ul.unstyled{list-style:none;padding-left:0}ul.unstyled ul{list-style:disc}ul.unstyled ul.unstyled{list-style:none;padding-left:0}ul.inline{list-style:none}ul.inline li{display:inline-block;padding:0 .5em}ul.inline li:first-child{padding:0 .5em 0 0}dl{margin:1em 0}dl dt{font-weight:700;margin:.5em 0}dl dd{margin:.5em 0 .5em 25px}dl.inline dt{float:left;clear:left;text-align:right;width:180px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;margin:0}dl.inline dd{margin:.5em 0 .5em 200px}figure.ink-image{position:relative;border:1px solid #555}figure.ink-image>img{width:100%}figure.ink-image>figcaption{padding:1em;background:#fff;line-height:1.3}figure.ink-image>figcaption.over-bottom,figure.ink-image>figcaption.over-top{position:absolute;width:100%;left:0;border:none}figure.ink-image>figcaption.over-bottom.dark,figure.ink-image>figcaption.over-top.dark{color:#fff;background:rgba(0,0,0,.6)}figure.ink-image>figcaption.over-top{top:0;background:rgba(255,255,255,.7)}figure.ink-image>figcaption.over-bottom{bottom:0;background:rgba(255,255,255,.7)}figure.ink-image>figcaption.dark{color:#fff;background:#222}img{border:0;width:auto;max-width:100%;vertical-align:top}.ink-alert.basic,.ink-alert.block{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-alert.basic{background:rgba(255,156,0,.25);color:#b87814;border:1px solid #b87814}.ink-alert.basic .ink-dismiss{color:#b87814}.ink-alert.basic.success{background:rgba(74,155,23,.25);color:#38621d;border:1px solid #38621d}.ink-alert.basic.success .ink-dismiss{color:#38621d}.ink-alert.basic.error{background:rgba(201,17,17,.25);color:#891e1e;border:1px solid #891e1e}.ink-alert.basic.error .ink-dismiss{color:#891e1e}.ink-alert.basic.info{background:rgba(15,117,218,.25);color:#1e5b98;border:1px solid #1e5b98}.ink-alert.basic.info .ink-dismiss{color:#1e5b98}.ink-alert.block{border:1px solid #b87814;background:#fff}.ink-alert.block>h4{background:rgba(255,156,0,.3);color:#b87814}.ink-alert.block .ink-dismiss{color:#b87814}.ink-alert.block.success{border:1px solid #38621d;background:#fff}.ink-alert.block.success>h4{background:rgba(74,155,23,.3);color:#38621d}.ink-alert.block.success .ink-dismiss{color:#38621d}.ink-alert.block.error{border:1px solid #891e1e;background:#fff}.ink-alert.block.error>h4{background:rgba(201,17,17,.3);color:#891e1e}.ink-alert.block.error .ink-dismiss{color:#891e1e}.ink-alert.block.info{border:1px solid #1e5b98;background:#fff}.ink-alert.block.info>h4{background:rgba(15,117,218,.3);color:#1e5b98}.ink-alert.block.info .ink-dismiss{color:#1e5b98}.ink-alert .ink-dismiss{font-family:Arial,sans-serif;font-weight:700;text-shadow:#fff 0 1px 0;filter:alpha(Opacity=25);opacity:.25}.ink-alert .ink-dismiss:hover{filter:alpha(Opacity=60);opacity:.6}.ink-badge{-webkit-border-radius:8em;-moz-border-radius:8em;-ms-border-radius:8em;-o-border-radius:8em;border-radius:8em;color:#fff}.ink-badge.white{background:#fff;color:#555}.ink-badge.black{background:#000}.ink-badge.orange{background:#ff9c00}.ink-badge.red{background:#c91111}.ink-badge.green{background:#4a9b17}.ink-badge.blue{background:#0f75da}.ink-badge.yellow{background:#ffd500;color:#555}.ink-badge.grey{background:gray}.ink-badge+.ink-badge{margin-left:.2em}.ink-button{background:#d9d9d9;color:#000;border:1px solid #bfbfbf;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;font-weight:300}.ink-button:active,.ink-button:hover{text-decoration:none;color:#000;background:#ccc;border:1px solid #b3b3b3;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px;box-shadow:rgba(0,0,0,.2) 0 1px 1px}.ink-button:focus{outline:0;background:#ccc;-webkit-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;-moz-box-shadow:rgba(0,0,0,.2) 0 1px 1px inset;box-shadow:rgba(0,0,0,.2) 0 1px 1px inset}.ink-button[disabled]{background:#e6e6e6;border:1px solid #e6e6e6;color:#999}.ink-button[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.blue{color:#fff;background:#0f75da;border:1px solid #0c63b9}.ink-button.blue:active,.ink-button.blue:hover{background:#0d68c2;border:1px solid #0a56a1;color:#fff;text-decoration:none}.ink-button.blue:focus{background:#0d68c2}.ink-button.blue[disabled]{background:rgba(15,117,218,.6);border:1px solid rgba(15,117,218,0);color:#0c5baa}.ink-button.blue[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.green{color:#fff;background:#4a9b17;border:1px solid #3e8313}.ink-button.green:active,.ink-button.green:hover{background:#3f8514;border:1px solid #336d10;color:#fff;text-decoration:none}.ink-button.green:focus{background:#3f8514}.ink-button.green[disabled]{background:rgba(74,155,23,.6);border:1px solid rgba(74,155,23,0);color:#356f10}.ink-button.green[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.orange{color:#fff;background:#ff9c00;border:1px solid #d88400}.ink-button.orange:active,.ink-button.orange:hover{background:#e68c00;border:1px solid #bf7400;color:#fff;text-decoration:none}.ink-button.orange:focus{background:#e68c00}.ink-button.orange[disabled]{background:rgba(255,156,0,.6);border:1px solid rgba(255,156,0,0);color:#cc7d00}.ink-button.orange[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.red{color:#fff;background:#c91111;border:1px solid #aa0e0e}.ink-button.red:active,.ink-button.red:hover{background:#b10f0f;border:1px solid #920c0c;color:#fff;text-decoration:none}.ink-button.red:focus{background:#b10f0f}.ink-button.red[disabled]{background:rgba(201,17,17,.6);border:1px solid rgba(201,17,17,0);color:#9a0d0d}.ink-button.red[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.black{color:#fff;background:#1a1a1a;border:1px solid #161616}.ink-button.black:active,.ink-button.black:hover{background:#0d0d0d;border:1px solid #090909;color:#fff;text-decoration:none}.ink-button.black:focus{background:#0d0d0d}.ink-button.black[disabled]{background:rgba(26,26,26,.6);border:1px solid rgba(26,26,26,0);color:#000}.ink-button.black[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.ink-button.white{color:#555;background:#fff;border:1px solid #d8d8d8}.ink-button.white:active,.ink-button.white:hover{background:#f2f2f2;border:1px solid #cbcbcb;color:#555;text-decoration:none}.ink-button.white:focus{background:#f2f2f2}.ink-button.white[disabled]{background:rgba(255,255,255,.6);border:1px solid rgba(255,255,255,0);color:#e6e6e6}.ink-button.white[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.button-group>.ink-button[disabled]{background:#e6e6e6;border:1px solid rgba(217,217,217,.6)}.button-group>.ink-button[disabled]:hover{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.button-group>.ink-button.blue:first-child{border-left:#0c63b9}.button-group>.ink-button.blue[disabled]{background:rgba(15,117,218,.6);border:1px solid rgba(15,117,218,.3)}.button-group>.ink-button.green:first-child{border-left:#3e8313}.button-group>.ink-button.green[disabled]{background:rgba(74,155,23,.6);border:1px solid rgba(74,155,23,.3)}.button-group>.ink-button.orange:first-child{border-left:#d88400}.button-group>.ink-button.orange[disabled]{background:rgba(255,156,0,.6);border:1px solid rgba(255,156,0,.3)}.button-group>.ink-button.red:first-child{border-left:#aa0e0e}.button-group>.ink-button.red[disabled]{background:rgba(201,17,17,.6);border:1px solid rgba(201,17,17,.3)}.button-group>.ink-button.black:first-child{border-left:#161616}.button-group>.ink-button.black[disabled]{background:rgba(26,26,26,.6);border:1px solid rgba(26,26,26,.3)}.button-group>.ink-button.white:first-child{border-left:#d8d8d8}.button-group>.ink-button.white[disabled]{background:rgba(255,255,255,.6);border:1px solid rgba(255,255,255,.3)}.ink-label{color:#fff;font-weight:300;font-size:.938em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-label.white{background:#fff;color:#555}.ink-label.black{background:#000}.ink-label.orange{background:#ff9c00}.ink-label.red{background:#c91111}.ink-label.green{background:#4a9b17}.ink-label.blue{background:#0f75da}.ink-label.yellow{background:#ffd500;color:#555}.ink-label.grey{background:gray}.ink-label+.ink-label{margin-left:.2em}.ink-navigation ul.breadcrumbs{font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.breadcrumbs li.active a{background:0 0;color:#999}.ink-navigation ul.breadcrumbs li.active a:hover{cursor:default;text-decoration:none}.ink-navigation ul.breadcrumbs li a:hover{background:0 0;text-decoration:underline}.ink-navigation ul.breadcrumbs.white{background:#fff}.ink-navigation ul.breadcrumbs.white li a,.ink-navigation ul.breadcrumbs.white li:after{color:#555}.ink-navigation ul.breadcrumbs.white li.active a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.breadcrumbs.grey{background:#d9d9d9}.ink-navigation ul.breadcrumbs.grey li a,.ink-navigation ul.breadcrumbs.grey li:after{color:#555}.ink-navigation ul.breadcrumbs.grey li.active a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.breadcrumbs.black{background:#1a1a1a}.ink-navigation ul.breadcrumbs.black li a,.ink-navigation ul.breadcrumbs.black li:after{color:#fff}.ink-navigation ul.breadcrumbs.black li.active a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.breadcrumbs.blue{background:#1b75ce}.ink-navigation ul.breadcrumbs.blue li a,.ink-navigation ul.breadcrumbs.blue li:after{color:#fff}.ink-navigation ul.breadcrumbs.blue li.active a{color:#08427b;text-shadow:#1884ef 0 1px 0}.ink-navigation ul.breadcrumbs.orange{background:#f2990d}.ink-navigation ul.breadcrumbs.orange li a,.ink-navigation ul.breadcrumbs.orange li:after{color:#fff}.ink-navigation ul.breadcrumbs.orange li.active a{color:#995e00;text-shadow:#ffa81f 0 1px 0}.ink-navigation ul.breadcrumbs.green{background:#4c9220}.ink-navigation ul.breadcrumbs.green li a,.ink-navigation ul.breadcrumbs.green li:after{color:#fff}.ink-navigation ul.breadcrumbs.green li.active a{color:#20420a;text-shadow:#57b61b 0 1px 0}.ink-navigation ul.breadcrumbs.red{background:#be1c1c}.ink-navigation ul.breadcrumbs.red li a,.ink-navigation ul.breadcrumbs.red li:after{color:#fff}.ink-navigation ul.breadcrumbs.red li.active a{color:#6b0909;text-shadow:#e51313 0 1px 0}.ink-dropdown.green ul.dropdown-menu li.active a{background:#4a9b17;color:#fff}.ink-dropdown.orange ul.dropdown-menu li.active a{background:#ff9c00;color:#fff}.ink-dropdown.red ul.dropdown-menu li.active a{background:#c91111;color:#fff}.ink-dropdown.black ul.dropdown-menu li.active a{background:#1a1a1a;color:#fff}.ink-dropdown.blue ul.dropdown-menu li.active a{background:#0f75da;color:#fff}.ink-navigation ul.menu{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu>li{font-weight:300}.ink-navigation ul.menu>li.active a{text-decoration:underline}.ink-navigation ul.menu>li.heading{font-weight:500}.ink-navigation ul.menu>li.disabled a{color:#b3b3b3;text-shadow:#fff 0 1px 0}.ink-navigation ul.menu>li.disabled a:hover{cursor:default;background:0 0;text-decoration:none}.ink-navigation ul.menu>li ul.submenu li{font-size:.875em}.ink-navigation ul.menu>li ul.submenu li a{border-bottom:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.vertical li a{border-bottom:1px solid rgba(0,0,0,.15)}.ink-navigation ul.menu.vertical li:first-child,.ink-navigation ul.menu.vertical li:first-child>a{-webkit-border-radius:2px 2px 0 0;-moz-border-radius:2px 2px 0 0;-ms-border-radius:2px 2px 0 0;-o-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0}.ink-navigation ul.menu.vertical li:last-child{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child>a{border-bottom:none;-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child .submenu{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.vertical li:last-child .submenu.flyout{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.menu.vertical li:last-child .submenu li:last-child,.ink-navigation ul.menu.vertical li:last-child .submenu li:last-child a{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.horizontal>li:first-child,.ink-navigation ul.menu.horizontal>li:first-child a{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-navigation ul.menu.horizontal>li:last-child,.ink-navigation ul.menu.horizontal>li:last-child a{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-navigation ul.menu.horizontal>li ul.submenu{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#fff}.ink-navigation ul.menu.horizontal>li ul.submenu li:last-child{-webkit-border-radius:0 0 2px 2px;-moz-border-radius:0 0 2px 2px;-ms-border-radius:0 0 2px 2px;-o-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px}.ink-navigation ul.menu.horizontal>li ul.submenu li:last-child a{border-bottom:none}.ink-navigation ul.menu.white{background:#fff}.ink-navigation ul.menu.white li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.white li ul.submenu li a{color:#555}.ink-navigation ul.menu.white li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.white li.disabled a:hover{background:0 0}.ink-navigation ul.menu.white li.active{background:#e6e6e6}.ink-navigation ul.menu.white li.disabled a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.menu.white li a{color:#555;text-decoration:none}.ink-navigation ul.menu.white li a:hover{background:#f2f2f2}.ink-navigation ul.menu.grey{background:#d9d9d9}.ink-navigation ul.menu.grey li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.grey li ul.submenu li a{color:#555}.ink-navigation ul.menu.grey li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.grey li.disabled a:hover{background:0 0}.ink-navigation ul.menu.grey li.active{background:#bfbfbf}.ink-navigation ul.menu.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.menu.grey li a{color:#555;text-decoration:none}.ink-navigation ul.menu.grey li a:hover{background:#ccc}.ink-navigation ul.menu.black{background:#1a1a1a}.ink-navigation ul.menu.black li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.black li ul.submenu li a{color:#555}.ink-navigation ul.menu.black li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.black li.disabled a:hover{background:0 0}.ink-navigation ul.menu.black li.active{background:#333}.ink-navigation ul.menu.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.menu.black li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.black li a:hover{background:#404040}.ink-navigation ul.menu.blue{background:#1b75ce}.ink-navigation ul.menu.blue li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.blue li ul.submenu li a{color:#555}.ink-navigation ul.menu.blue li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.blue li.disabled a:hover{background:0 0}.ink-navigation ul.menu.blue li.active{background:#0c5baa}.ink-navigation ul.menu.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.menu.blue li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.blue li a:hover{background:#0d68c2}.ink-navigation ul.menu.green{background:#4c9220}.ink-navigation ul.menu.green li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.green li ul.submenu li a{color:#555}.ink-navigation ul.menu.green li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.green li.disabled a:hover{background:0 0}.ink-navigation ul.menu.green li.active{background:#356f10}.ink-navigation ul.menu.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.menu.green li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.green li a:hover{background:#3f8514}.ink-navigation ul.menu.orange{background:#f2990d}.ink-navigation ul.menu.orange li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.orange li ul.submenu li a{color:#555}.ink-navigation ul.menu.orange li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.orange li.disabled a:hover{background:0 0}.ink-navigation ul.menu.orange li.active{background:#cc7d00}.ink-navigation ul.menu.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.menu.orange li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.orange li a:hover{background:#e68c00}.ink-navigation ul.menu.red{background:#be1c1c}.ink-navigation ul.menu.red li ul.submenu{background:#fff;border:1px solid rgba(0,0,0,.1)}.ink-navigation ul.menu.red li ul.submenu li a{color:#555}.ink-navigation ul.menu.red li ul.submenu li a:hover{background:rgba(0,0,0,.05)}.ink-navigation ul.menu.red li.disabled a:hover{background:0 0}.ink-navigation ul.menu.red li.active{background:#9a0d0d}.ink-navigation ul.menu.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.menu.red li a{color:#fff;text-decoration:none}.ink-navigation ul.menu.red li a:hover{background:#b10f0f}.ink-navigation ul.pagination{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.pagination li{font-weight:300}.ink-navigation ul.pagination li.active a{text-decoration:underline}.ink-navigation ul.pagination li.disabled a{color:#b3b3b3;text-shadow:#fff 0 1px 0}.ink-navigation ul.pagination li.disabled a:hover{cursor:default;background:0 0;text-decoration:none}.ink-navigation ul.pagination li:first-child,.ink-navigation ul.pagination li:first-child a{-webkit-border-radius:2px 0 0 2px;-moz-border-radius:2px 0 0 2px;-ms-border-radius:2px 0 0 2px;-o-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.ink-navigation ul.pagination li:last-child,.ink-navigation ul.pagination li:last-child a{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.ink-navigation ul.pagination.white li{background:#fff}.ink-navigation ul.pagination.white li.active a{background:#e6e6e6}.ink-navigation ul.pagination.white li.disabled a{color:#ccc;text-shadow:#fff 0 1px 0}.ink-navigation ul.pagination.white li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.white li a{color:#555;text-decoration:none}.ink-navigation ul.pagination.white li a:hover{background:#f2f2f2}.ink-navigation ul.pagination.grey li{background:#d9d9d9}.ink-navigation ul.pagination.grey li.active a{background:#bfbfbf}.ink-navigation ul.pagination.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.pagination.grey li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.grey li a{color:#555;text-decoration:none}.ink-navigation ul.pagination.grey li a:hover{background:#ccc}.ink-navigation ul.pagination.black li{background:#1a1a1a}.ink-navigation ul.pagination.black li.active a{background:#333}.ink-navigation ul.pagination.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.pagination.black li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.black li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.black li a:hover{background:#292929}.ink-navigation ul.pagination.orange li{background:#f2990d}.ink-navigation ul.pagination.orange li.active a{background:#cc7d00}.ink-navigation ul.pagination.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.pagination.orange li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.orange li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.orange li a:hover{background:#e68c00}.ink-navigation ul.pagination.blue li{background:#1b75ce}.ink-navigation ul.pagination.blue li.active a{background:#0c5baa}.ink-navigation ul.pagination.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.pagination.blue li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.blue li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.blue li a:hover{background:#0d68c2}.ink-navigation ul.pagination.green li{background:#4c9220}.ink-navigation ul.pagination.green li.active a{background:#356f10}.ink-navigation ul.pagination.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.pagination.green li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.green li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.green li a:hover{background:#3f8514}.ink-navigation ul.pagination.red li{background:#be1c1c}.ink-navigation ul.pagination.red li.active a{background:#9a0d0d}.ink-navigation ul.pagination.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.pagination.red li.disabled a:hover{background:0 0}.ink-navigation ul.pagination.red li a{color:#fff;text-decoration:none}.ink-navigation ul.pagination.red li a:hover{background:#b10f0f}.ink-navigation ul.pagination.dotted li{background:0 0}.ink-navigation ul.pagination.dotted li a{background:#999;filter:alpha(Opacity=50);opacity:.5}.ink-navigation ul.pagination.dotted li.active a,.ink-navigation ul.pagination.dotted li:hover a{filter:alpha(Opacity=100);opacity:1}.ink-navigation ul.pagination.dotted.black li a{background:#1a1a1a}.ink-navigation ul.pagination.dotted.white li a{background:#fff}.ink-navigation ul.pagination.dotted.blue li a{background:#1b75ce}.ink-navigation ul.pagination.dotted.green li a{background:#4c9220}.ink-navigation ul.pagination.dotted.orange li a{background:#f2990d}.ink-navigation ul.pagination.dotted.red li a{background:#be1c1c}.ink-navigation ul.pagination.chevron li.next a,.ink-navigation ul.pagination.chevron li.previous a{color:#fff;filter:alpha(Opacity=60);opacity:.6}.ink-navigation ul.pagination.chevron li.next a.active,.ink-navigation ul.pagination.chevron li.next a:focus,.ink-navigation ul.pagination.chevron li.next a:hover,.ink-navigation ul.pagination.chevron li.previous a.active,.ink-navigation ul.pagination.chevron li.previous a:focus,.ink-navigation ul.pagination.chevron li.previous a:hover{filter:alpha(Opacity=70);opacity:.7;text-decoration:none;background:0 0}.ink-navigation ul.pagination.chevron li.disabled a{color:#fff;filter:alpha(Opacity=40);opacity:.4;text-shadow:none}.ink-navigation ul.pagination.chevron li.disabled a:focus,.ink-navigation ul.pagination.chevron li.disabled a:hover{color:#fff;filter:alpha(Opacity=40);opacity:.4}.ink-navigation ul.pagination.chevron.black li.disabled a,.ink-navigation ul.pagination.chevron.black li.next a,.ink-navigation ul.pagination.chevron.black li.previous a{color:#1a1a1a}.ink-navigation ul.pagination.chevron.grey li.disabled a,.ink-navigation ul.pagination.chevron.grey li.next a,.ink-navigation ul.pagination.chevron.grey li.previous a{color:#d9d9d9}.ink-navigation ul.pagination.chevron.blue li.disabled a,.ink-navigation ul.pagination.chevron.blue li.next a,.ink-navigation ul.pagination.chevron.blue li.previous a{color:#1b75ce}.ink-navigation ul.pagination.chevron.green li.disabled a,.ink-navigation ul.pagination.chevron.green li.next a,.ink-navigation ul.pagination.chevron.green li.previous a{color:#4c9220}.ink-navigation ul.pagination.chevron.orange li.disabled a,.ink-navigation ul.pagination.chevron.orange li.next a,.ink-navigation ul.pagination.chevron.orange li.previous a{color:#f2990d}.ink-navigation ul.pagination.chevron.red li.disabled a,.ink-navigation ul.pagination.chevron.red li.next a,.ink-navigation ul.pagination.chevron.red li.previous a{color:#be1c1c}.ink-navigation ul.pills li{background:#fff;font-weight:300;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-navigation ul.pills li a{color:#555;background:0 0}.ink-navigation ul.pills li a:hover,.ink-navigation ul.pills li.active a{background:#e6e6e6}.ink-navigation ul.pills li.disabled a{color:#999;text-shadow:#fff 0 1px 0}.ink-navigation ul.pills li.disabled a:hover{background:0 0}.ink-navigation ul.pills.grey li{background:#d9d9d9}.ink-navigation ul.pills.grey li.active a{background:#bfbfbf}.ink-navigation ul.pills.grey li.disabled a{color:#a6a6a6;text-shadow:#ededed 0 1px 0}.ink-navigation ul.pills.grey li.disabled a:hover{background:0 0}.ink-navigation ul.pills.grey li a{color:#555}.ink-navigation ul.pills.grey li a:hover{background:#ccc}.ink-navigation ul.pills.black li{background:#1a1a1a}.ink-navigation ul.pills.black li.active a{background:#333}.ink-navigation ul.pills.black li.disabled a{color:#666;text-shadow:#000 0 -1px 0}.ink-navigation ul.pills.black li.disabled a:hover{background:0 0}.ink-navigation ul.pills.black li a{color:#fff}.ink-navigation ul.pills.black li a:hover{background:#292929}.ink-navigation ul.pills.blue li{background:#1b75ce}.ink-navigation ul.pills.blue li.active a{background:#0c5baa}.ink-navigation ul.pills.blue li.disabled a{color:#08427b;text-shadow:#2289f0 0 1px 0}.ink-navigation ul.pills.blue li.disabled a:hover{background:0 0}.ink-navigation ul.pills.blue li a{color:#fff}.ink-navigation ul.pills.blue li a:hover{background:#0d68c2}.ink-navigation ul.pills.green li{background:#4c9220}.ink-navigation ul.pills.green li.active a{background:#356f10}.ink-navigation ul.pills.green li.disabled a{color:#20420a;text-shadow:#5bbf1c 0 1px 0}.ink-navigation ul.pills.green li.disabled a:hover{background:0 0}.ink-navigation ul.pills.green li a{color:#fff}.ink-navigation ul.pills.green li a:hover{background:#3f8514}.ink-navigation ul.pills.orange li{background:#f2990d}.ink-navigation ul.pills.orange li.active a{background:#cc7d00}.ink-navigation ul.pills.orange li.disabled a{color:#995e00;text-shadow:#ffac29 0 1px 0}.ink-navigation ul.pills.orange li.disabled a:hover{background:0 0}.ink-navigation ul.pills.orange li a{color:#fff}.ink-navigation ul.pills.orange li a:hover{background:#e68c00}.ink-navigation ul.pills.red li{background:#be1c1c}.ink-navigation ul.pills.red li.active a{background:#9a0d0d}.ink-navigation ul.pills.red li.disabled a{color:#6b0909;text-shadow:#eb1717 0 1px 0}.ink-navigation ul.pills.red li.disabled a:hover{background:0 0}.ink-navigation ul.pills.red li a{color:#fff}.ink-navigation ul.pills.red li a:hover{background:#b10f0f}table.ink-table{background:#fff}table.ink-table tr td,table.ink-table tr th{border-bottom:#bbb 1px solid;background:0 0}table.ink-table tr:last-child td{border-bottom:none}table.ink-table tfoot tr td,table.ink-table tfoot tr th{border-top:#bbb 1px solid}table.ink-table.alternating tbody tr:nth-child(odd){background-color:#f5f5f5}table.ink-table.hover tbody tr:hover{background:#fefbd6;color:#555}table.ink-table.bordered{border:1px solid #bbb;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}table.ink-table.bordered tr th{border-left:#bbb 1px solid}table.ink-table.bordered tr th:first-child{border-left:none}table.ink-table.bordered tr:last-child td{border-bottom:none}table.ink-table.bordered tr td{border-left:#bbb 1px solid}table.ink-table.bordered tr td:first-child{border-left:none}table.ink-table tbody>tr.red td{background:#c91111;color:#fff}table.ink-table tbody>tr.green td{background:#4a9b17;color:#fff}table.ink-table tbody>tr.blue td{background:#0f75da;color:#fff}table.ink-table tbody>tr.orange td{background:#ff9c00;color:#fff}table.ink-table tbody>tr.black td{background:#000;color:#ccc}table.ink-table tbody>tr.yellow td{background:#ffd500;color:#000}.animated.slow{animation-duration:1s}.animated.medium{animation-duration:.5s}.animated.fast{animation-duration:.2s}.ink-carousel{width:100%;position:relative;overflow:hidden;display:block}.ink-carousel .stage{width:100%;left:0;height:auto!important;margin-top:0;margin-bottom:0;padding-left:0;list-style-type:none;white-space:nowrap;position:relative;-webkit-transition:left .5s ease;-moz-transition:left .5s ease;-o-transition:left .5s ease;transition:left .5s ease}.ink-carousel .stage .slide{position:relative;display:inline-block;vertical-align:top;white-space:normal;margin:0;float:none;zoom:1}.ink-carousel .ink-navigation{position:static}.ink-datepicker-wrapper{position:relative}.ink-datepicker-calendar{margin-top:0;position:absolute}.ink-datepicker-calendar.right{left:100%;top:0}.ink-datepicker-calendar.left{right:100%;top:0}.ink-datepicker-calendar.bottom{top:100%;left:0}.ink-datepicker-calendar.top{bottom:100%;left:0}.ink-datepicker-calendar,.ink-datepicker-wrapper{display:inline;display:inline-block}.ink-calendar{-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;text-align:center;padding:.3em;min-width:17.4em;font-size:13px;-webkit-box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;-moz-box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;box-shadow:rgba(0,0,0,.4) 0 1px 2px 0;background:#fff;z-index:10}.ink-calendar a{text-decoration:none}.ink-calendar li{list-style:none inside}html.ink-modal-is-open .ink-calendar{z-index:101}.ink-calendar-top-options{padding:5px;font-size:.813em;cursor:pointer}.ink-calendar-top-options .clean{float:left}.ink-calendar-top-options .close{float:right}.ink-calendar-top{line-height:2em;background:#e6e6e6;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-calendar-top div{float:left}.ink-calendar-top .ink-calendar-next,.ink-calendar-top .ink-calendar-prev{width:10%}.ink-calendar-top .ink-calendar-next a,.ink-calendar-top .ink-calendar-prev a{display:block}.ink-calendar-top .ink-calendar-month_desc{width:80%}.ink-calendar-month,.ink-calendar-month-selector,.ink-calendar-year-selector{margin-top:.5em;padding-left:0}.ink-calendar-month li a,.ink-calendar-month-selector li a,.ink-calendar-year-selector li a{margin:0;line-height:2em;vertical-align:middle;display:block;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;color:#444}.ink-calendar-month li a:hover,.ink-calendar-month-selector li a:hover,.ink-calendar-year-selector li a:hover{background:#e6e6e6}.ink-calendar-month li a.ink-calendar-on,.ink-calendar-month li a.ink-calendar-on:hover,.ink-calendar-month-selector li a.ink-calendar-on,.ink-calendar-month-selector li a.ink-calendar-on:hover,.ink-calendar-year-selector li a.ink-calendar-on,.ink-calendar-year-selector li a.ink-calendar-on:hover{background:#0069d6;color:#fff}.ink-calendar-month li a.ink-calendar-off,.ink-calendar-month li a.ink-calendar-off:hover,.ink-calendar-month-selector li a.ink-calendar-off,.ink-calendar-month-selector li a.ink-calendar-off:hover,.ink-calendar-year-selector li a.ink-calendar-off,.ink-calendar-year-selector li a.ink-calendar-off:hover{background:#fff;color:#aaa;cursor:default}.ink-calendar-month ul,.ink-calendar-month-selector ul,.ink-calendar-year-selector ul{clear:both;padding-left:0}.ink-calendar-month ul li,.ink-calendar-month-selector ul li,.ink-calendar-year-selector ul li{width:2.4em;float:left;text-align:center;padding:0;margin:0}.ink-calendar-month-selector ul li,.ink-calendar-year-selector ul li{width:25%}.ink-calendar-month-selector,.ink-calendar-year-selector{display:none}.action_inactive,.ink-calendar-off{color:#ddd!important}.ink-calendar-month .ink-calendar-header{border-bottom:1px solid rgba(0,0,0,.1);padding-bottom:.5em;margin-bottom:.5em;color:#aaa}.ink-calendar-middle:after,.ink-calendar-month .ink-calendar-header:after,.ink-calendar-month .ink-calendar-middle ul:after,.ink-calendar-top-options:after,.ink-calendar-top:after{content:"";display:table;clear:both}body.ink-drawer{max-width:100%}body.ink-drawer .content-drawer,body.ink-drawer .left-drawer,body.ink-drawer .right-drawer{-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;transition-property:transform;-webkit-transition-duration:300ms;-moz-transition-duration:300ms;-o-transition-duration:300ms;transition-duration:300ms;-webkit-transition-timing-function:cubic-bezier(0.86,0,.07,1);-moz-transition-timing-function:cubic-bezier(0.86,0,.07,1);-o-transition-timing-function:cubic-bezier(0.86,0,.07,1);transition-timing-function:cubic-bezier(0.86,0,.07,1)}body.ink-drawer .left-drawer{left:-220px}body.ink-drawer .right-drawer{right:-220px}body.ink-drawer .content-drawer{width:100%}body.ink-drawer .left-drawer,body.ink-drawer .right-drawer{position:absolute;top:0;z-index:0;display:none;overflow-x:hidden;overflow-y:auto;width:220px;height:100%;-webkit-overflow-scrolling:touch}body.ink-drawer .left-drawer.show,body.ink-drawer .right-drawer.show{display:block;position:fixed}body.ink-drawer.push{overflow:hidden;width:100%;height:100%}body.ink-drawer.push .content-drawer{overflow:hidden}body.ink-drawer.push.left .content-drawer,body.ink-drawer.push.left .left-drawer{-webkit-transform:translate(220px,0);-moz-transform:translate(220px,0);-ms-transform:translate(220px,0);-o-transform:translate(220px,0);transform:translate(220px,0)}body.ink-drawer.push.right .content-drawer,body.ink-drawer.push.right .right-drawer{-webkit-transform:translate(-220px,0);-moz-transform:translate(-220px,0);-ms-transform:translate(-220px,0);-o-transform:translate(-220px,0);transform:translate(-220px,0)}body.ink-drawer.over{overflow:hidden;-webkit-user-drag:none}body.ink-drawer.over.left .left-drawer{-webkit-transform:translate(220px,0);-moz-transform:translate(220px,0);-ms-transform:translate(220px,0);-o-transform:translate(220px,0);transform:translate(220px,0)}body.ink-drawer.over.right .right-drawer{-webkit-transform:translate(-220px,0);-moz-transform:translate(-220px,0);-ms-transform:translate(-220px,0);-o-transform:translate(-220px,0);transform:translate(-220px,0)}.ink-shade{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgOAMAAM8AzbfAeUUAAAAASUVORK5CYII=);background:rgba(0,0,0,.8);width:100%;height:100%;top:0;right:0;bottom:0;left:0;margin-top:0;position:fixed;z-index:100;display:none;filter:alpha(Opacity=0);opacity:0}.ink-shade.fade{-webkit-transition:opacity 300ms;-moz-transition:opacity 300ms;-o-transition:opacity 300ms;transition:opacity 300ms}.ink-shade.visible{filter:alpha(Opacity=100);opacity:1}.ink-modal{top:50%;left:50%;width:90%;height:90%;background:#fff;z-index:100;position:absolute;overflow:hidden;filter:alpha(Opacity=100);opacity:1;-webkit-box-shadow:rgba(0,0,0,.8) 0 0 15px 0;-moz-box-shadow:rgba(0,0,0,.8) 0 0 15px 0;box-shadow:rgba(0,0,0,.8) 0 0 15px 0;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-modal:after{content:"";display:table;clear:both}.ink-modal>.modal-body{padding:1em;overflow-y:auto;overflow-x:hidden;height:auto}.ink-modal>.modal-body .ink-grid{padding-left:0;padding-right:0;width:100%;min-width:100%}.ink-modal>.modal-header,.ink-modal>header{border-bottom:1px #e6e6e6 solid;overflow:hidden;-webkit-box-shadow:rgba(175,175,175,.2) 0 1px 2px 0;-moz-box-shadow:rgba(175,175,175,.2) 0 1px 2px 0;box-shadow:rgba(175,175,175,.2) 0 1px 2px 0}.ink-modal>.modal-header>.modal-close,.ink-modal>header>.modal-close{padding-top:2px;text-align:center;color:#fff;width:26px;height:26px;line-height:1.2em;border:0;background:#bfbfbf;font-size:0;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%;text-shadow:rgba(0,0,0,.6) 0 -1px 0;filter:alpha(Opacity=60);opacity:.6;float:right}.ink-modal>.modal-header>.modal-close:after,.ink-modal>header>.modal-close:after{content:"\f00d";font-family:FontAwesome;font-size:medium;line-height:22px}.ink-modal>.modal-header>.modal-close:hover,.ink-modal>header>.modal-close:hover{filter:alpha(Opacity=100);opacity:1}.ink-modal>.modal-footer,.ink-modal>footer{background:#e6e6e6;margin-bottom:0;zoom:1;-webkit-box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0;-moz-box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0;box-shadow:rgba(175,175,175,.2) 0 -1px 2px 0}.ink-modal>.modal-footer,.ink-modal>.modal-header,.ink-modal>footer,.ink-modal>header{padding:.8em 1em .65em}.ink-modal>.modal-footer:after,.ink-modal>.modal-footer:before,.ink-modal>.modal-header:after,.ink-modal>.modal-header:before,.ink-modal>footer:after,.ink-modal>footer:before,.ink-modal>header:after,.ink-modal>header:before{content:".";display:block;height:0;clear:both;visibility:hidden}.ink-modal-open{overflow:hidden}.ink-progress-bar{margin-bottom:1em;overflow:hidden;background:#f2f2f2;position:relative;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset;-moz-box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset;box-shadow:0,1px,3px,0,rgba(0,0,0,.2),inset}.ink-progress-bar .caption{position:absolute;top:0;left:0;width:100%;height:100%;line-height:1.7;text-align:center;color:#000;font-size:.813em;z-index:10}.ink-progress-bar .bar{height:1.3em;text-shadow:rgba(0,0,0,.25),0,1px,0;-webkit-box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;-moz-box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;box-shadow:0,1px,1px,0,rgba(0,0,0,.1),inset;-webkit-transition-property:width;-moz-transition-property:width;-o-transition-property:width;transition-property:width;-webkit-transition-duration:.6s;-moz-transition-duration:.6s;-o-transition-duration:.6s;transition-duration:.6s;-webkit-transition-timing-function:ease;-moz-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.ink-progress-bar .bar.grey{background:#ccc;color:#555}.ink-progress-bar .bar.green{background:#4a9b17;color:#fff}.ink-progress-bar .bar.blue{background:#0f75da;color:#fff}.ink-progress-bar .bar.red{background:#c91111;color:#fff}.ink-progress-bar .bar.orange{background:#ff9c00;color:#555}.ink-progress-bar .bar.black{background:#000;color:#fff}.dragging,.ink-sortable-list li{cursor:move;-moz-user-select:none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;-ms-user-select:none;user-select:none;-ms-user-drag:none;-moz-user-drag:none;-khtml-user-drag:none;-webkit-user-drag:none;-o-user-drag:none;user-drag:none}.drag,.ink-sortable-list li.placeholder{-webkit-box-shadow:0,0,10px,0,rgba(0,0,0,.3);-moz-box-shadow:0,0,10px,0,rgba(0,0,0,.3);box-shadow:0,0,10px,0,rgba(0,0,0,.3)}.ink-sortable-list li{margin:0;border-bottom:1px solid #ccc;line-height:40px}.ink-sortable-list li.placeholder,.ink-sortable-list li:hover{background:#ccc;background:rgba(204,204,204,.2)}.ink-sortable-list li .ink-label{margin:0 .8em}.ink-sticky-stuck{position:fixed}.ink-tabs .tabs-nav{list-style:none;padding:0}.ink-tabs .tabs-nav li{line-height:1.7;position:relative;margin:0}.ink-tabs .tabs-nav li a{padding:.5em 1em;display:block;border:1px solid transparent}.ink-tabs .tabs-nav li a:hover{background:#f0f0f0}.ink-tabs .tabs-nav li.active a{color:#555;cursor:default;text-decoration:none;background:#fff;border:1px solid #ccc}.ink-tabs .tabs-nav:after{content:"";display:table;clear:both}.ink-tabs .tabs-content{margin-top:1.5em;overflow:auto}.ink-tabs.top>.tabs-nav{border-bottom:1px solid #ccc}.ink-tabs.top>.tabs-nav li{float:left}.ink-tabs.top>.tabs-nav li a{margin-right:.4em;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;-ms-border-radius:4px 4px 0 0;-o-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.ink-tabs.top>.tabs-nav li.active{margin:0 0 -2px}.ink-tabs.top>.tabs-nav li.active a{border-bottom-color:transparent}.ink-tabs.bottom>.tabs-nav{border-top:1px solid #ccc}.ink-tabs.bottom>.tabs-nav li{float:left}.ink-tabs.bottom>.tabs-nav li a{margin-right:.4em;-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;-ms-border-radius:0 0 4px 4px;-o-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.ink-tabs.bottom>.tabs-nav li.active{margin:-2px 0 0}.ink-tabs.bottom>.tabs-nav li.active a{border-top-color:transparent}.ink-tabs.left>.tabs-nav{border-right:1px solid #ccc;float:left;margin-right:2em}.ink-tabs.left>.tabs-nav li{float:none;text-align:right}.ink-tabs.left>.tabs-nav li a{margin-bottom:.4em;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;-ms-border-radius:4px 0 0 4px;-o-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.ink-tabs.left>.tabs-nav li.active{margin:0 -2px 0 0}.ink-tabs.left>.tabs-nav li.active a{border-right-color:transparent}.ink-tabs.right>.tabs-nav{border-left:1px solid #ccc;float:right;margin-left:2em}.ink-tabs.right>.tabs-nav li{float:none}.ink-tabs.right>.tabs-nav li a{margin-bottom:.4em;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;-ms-border-radius:0 4px 4px 0;-o-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.ink-tabs.right>.tabs-nav li.active{margin:0 0 0 -2px}.ink-tabs.right>.tabs-nav li.active a{border-left-color:transparent}.ink-tagfield input[type=text].new-tag-input{background-color:#fff;border:1px solid #ccc;line-height:1em;margin:0;padding:5px;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px}.ink-tagfield input[type=text].new-tag-input:focus{-webkit-box-shadow:0,0,0,3px,#eaeaea;-moz-box-shadow:0,0,0,3px,#eaeaea;box-shadow:0,0,0,3px,#eaeaea;border:1px solid #c3c3c3}.ink-tagfield span.ink-tag{background-color:#1b1b1b;color:#eaeaea;text-shadow:none;font-size:.9em;font-weight:400;border:1px solid #000;padding:4px 6px}.ink-tagfield span.ink-tag i.icon-remove{color:#ccc;font-size:.9em;font-weight:400;margin-left:4px}.ink-tagfield span.ink-tag i.icon-remove:hover{cursor:pointer;color:red}.ink-tooltip{display:inline-block;position:relative}.ink-tooltip>.content{background:#f0f0f0;padding:.5em .6em;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;font-size:.8em;color:#8c8c8c}.ink-tooltip>.arrow{position:absolute}.ink-tooltip>.arrow.down,.ink-tooltip>.arrow.left,.ink-tooltip>.arrow.right,.ink-tooltip>.arrow.up{width:0;height:0}.ink-tooltip>.arrow.up{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #f0f0f0;top:-6px;left:50%;margin-left:-3px}.ink-tooltip>.arrow.down{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #f0f0f0;bottom:-5.45px;left:50%;margin-left:-3px}.ink-tooltip>.arrow.right{border-top:6px solid transparent;border-bottom:6px solid transparent;border-left:6px solid #f0f0f0;top:50%;right:-5.45px;margin-top:-6px}.ink-tooltip>.arrow.left{border-top:6px solid transparent;border-bottom:6px solid transparent;border-right:6px solid #f0f0f0;top:50%;left:-5.45px;margin-top:-6px}.ink-tooltip.blue>.content{background:#0f75da;color:#fff}.ink-tooltip.blue>.arrow.up{border-bottom-color:#0f75da}.ink-tooltip.blue>.arrow.down{border-top-color:#0f75da}.ink-tooltip.blue>.arrow.left{border-right-color:#0f75da}.ink-tooltip.blue>.arrow.right{border-left-color:#0f75da}.ink-tooltip.red>.content{background:#c91111;color:#fff}.ink-tooltip.red>.arrow.up{border-bottom-color:#c91111}.ink-tooltip.red>.arrow.down{border-top-color:#c91111}.ink-tooltip.red>.arrow.left{border-right-color:#c91111}.ink-tooltip.red>.arrow.right{border-left-color:#c91111}.ink-tooltip.orange>.content{background:#ff9c00;color:#fff}.ink-tooltip.orange>.arrow.up{border-bottom-color:#ff9c00}.ink-tooltip.orange>.arrow.down{border-top-color:#ff9c00}.ink-tooltip.orange>.arrow.left{border-right-color:#ff9c00}.ink-tooltip.orange>.arrow.right{border-left-color:#ff9c00}.ink-tooltip.green>.content{background:#4a9b17;color:#fff}.ink-tooltip.green>.arrow.up{border-bottom-color:#4a9b17}.ink-tooltip.green>.arrow.down{border-top-color:#4a9b17}.ink-tooltip.green>.arrow.left{border-right-color:#4a9b17}.ink-tooltip.green>.arrow.right{border-left-color:#4a9b17}.ink-tooltip.black>.content{background:#000;color:#fff}.ink-tooltip.black>.arrow.up{border-bottom-color:#000}.ink-tooltip.black>.arrow.down{border-top-color:#000}.ink-tooltip.black>.arrow.left{border-right-color:#000}.ink-tooltip.black>.arrow.right{border-left-color:#000}.ink-tooltip.grey>.content{background:#ccc;color:#333}.ink-tooltip.grey>.arrow.up{border-bottom-color:#ccc}.ink-tooltip.grey>.arrow.down{border-top-color:#ccc}.ink-tooltip.grey>.arrow.left{border-right-color:#ccc}.ink-tooltip.grey>.arrow.right{border-left-color:#ccc}.ink-tree-view li{list-style-type:none}.ink-tree-view [data-open]>:before{margin-left:-1.3em;margin-right:.4em;text-decoration:none} \ No newline at end of file diff --git a/dist/css/quick-start.css b/dist/css/quick-start.css index 0ab60b004..5f9f9c22c 100644 --- a/dist/css/quick-start.css +++ b/dist/css/quick-start.css @@ -1,14 +1,14 @@ /** -* Ink -* -* A set of tools for quick development of web interfaces. -* -* @package Ink -* @author Sapo Ink Team -* @license http://opensource.org/licenses/MIT MIT -* @link http://ink.sapo.pt -* @version 3.1.3 -*/ + * Ink + * + * A set of tools for quick development of web interfaces. + * + * @package Ink + * @author Sapo Ink Team + * @license http://opensource.org/licenses/MIT MIT + * @link http://ink.sapo.pt + * @version 3.1.3 + */ /** * Sets the grids maximum width * @var $grid-max-width (pixels|ems|percentage) diff --git a/dist/js/ink-all.js b/dist/js/ink-all.js index ea5b7037c..96b94f699 100644 --- a/dist/js/ink-all.js +++ b/dist/js/ink-all.js @@ -15330,7 +15330,7 @@ Ink.createModule('Ink.UI.DatePicker', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1', var parentIsControl = Selector.matchesSelector( this._element.parentNode, - '.ink-form .control-group .control'); + '.ink-form .control-group .control, .ink-form .control-group .control > *'); if (parentIsControl) { this._wrapper = this._element.parentNode; diff --git a/dist/js/ink-all.min.js b/dist/js/ink-all.min.js index 8ba350513..37dcac23b 100644 --- a/dist/js/ink-all.min.js +++ b/dist/js/ink-all.min.js @@ -1,7 +1,7 @@ !function(a,b){"use strict";if(!("Ink"in a)){var c={},d={},e=[],f={},g=[],h={},i=Function.prototype.apply,j=function(a){if("object"!=typeof a)return!1;for(var b in a)if(a.hasOwnProperty(b))return!1;return!0};a.Ink={VERSION:"3.1.2",_checkPendingRequireModules:function(){var a,b,c,e,f,h,i=[],j=[];for(a=0,b=g.length;b>a;++a)if(c=g[a]){for(e in c.left)c.left.hasOwnProperty(e)&&(f=d[e],f&&(c.args[c.left[e]]=f,delete c.left[e],--c.remaining));if(c.remaining>0)i.push(c);else{if(h=c.cb,!h)continue;delete c.cb,j.push([h,c.args])}}g=i;for(var k=0;k0&&setTimeout(function(){Ink._checkPendingRequireModules()},0)},getPath:function(a,b){var d=a.split(/[._]/g),e,f,g,h;for(f=d.length;f>=0;f-=1)if(e=d.slice(0,f+1).join("."),c[e]){g=e;break}return g in c?(h=c[g],/\/$/.test(h)||(h+="/"),fg;++g)e[d[g]]=e[d[g]]||{},f=e,e=e[d[g]];return c?[f,d[g-1]]:e},getModule:function(a,b){var c=b?[a,"_",b].join(""):a;return d[c]},createModule:function(b,c,g,i){if("string"!=typeof b)throw new Error("module name must be a string!");if(!("number"==typeof c||"string"==typeof c&&c.length>0))throw new Error("version number missing!");var k=[b,"_",c].join("");h[k]=!0;var l=function(){if(!d[k]){delete f[k],delete f[b];var g=Array.prototype.slice.call(arguments),l=i.apply(a,g);e.push(k),"object"==typeof l?l._version=c:"function"==typeof l&&(l.prototype._version=c,l._version=c);var m=0===b.indexOf("Ink."),n;m&&(n=Ink.namespace(b,!0)),d[k]=l,delete h[k],m&&(n[0][n[1]+"_"+c]=l),d[b]=l,m&&j(n[0][n[1]])&&(n[0][n[1]]=l),this&&Ink._checkPendingRequireModules()}};this.requireModules(g,l)},requireModules:function(a,b){var c,e,h,i,j;if(e=a&&a.length,h={args:new Array(e),left:{},remaining:e,cb:b},"object"!=typeof a||void 0===a.length)throw new Error("Dependency list should be an array!");if("function"!=typeof b)throw new Error("Callback should be a function!");for(c=0;e>c;++c)Ink._moduleRenames[a[c]]?(Ink.warn(a[c]+" was renamed to "+Ink._moduleRenames[a[c]]),i=Ink._moduleRenames[a[c]]):i=a[c],i?(j=d[i],j?(h.args[c]=j,--h.remaining):(f[i]||Ink._loadLater(i),h.left[i]=c)):--h.remaining;h.remaining>0?g.push(h):b.apply(!0,h.args)},_moduleRenames:{"Ink.UI.Aux_1":"Ink.UI.Common_1"},getModulesLoadOrder:function(){return e.slice()},getModuleScripts:function(){var a=this.getModulesLoadOrder();return a.unshift("Ink_1"),a=a.map(function(a){return[""].join("")}),a.join("\n")},createExt:function(a,b,c,d){return Ink.createModule("Ink.Ext."+a,b,c,d)},bind:function(a,b){var c=Array.prototype.slice.call(arguments,2);return function(){var d=Array.prototype.slice.call(arguments),e=c.concat(d);return a.apply(b===!1?this:b,e)}},bindMethod:function(a,b){return Ink.bind.apply(Ink,[a[b],a].concat([].slice.call(arguments,2)))},bindEvent:function(b,c){var d=Array.prototype.slice.call(arguments,2);return function(e){var f=d.slice();return f.unshift(e||a.event),b.apply(c===!1?this:c,f)}},i:function(a){return"string"==typeof a?b.getElementById(a)||null:a},ss:function(a,c){if("undefined"==typeof Ink.Dom||"undefined"==typeof Ink.Dom.Selector)throw new Error("This method requires Ink.Dom.Selector");return Ink.Dom.Selector.select(a,c||b)},s:function(a,c){if("undefined"==typeof Ink.Dom||"undefined"==typeof Ink.Dom.Selector)throw new Error("This method requires Ink.Dom.Selector");return Ink.Dom.Selector.select(a,c||b)[0]||null},extendObj:function(a){for(var b=[].slice.call(arguments,1),c=0,d=b.length;d>c;c++)if(b[c])for(var e in b[c])Object.prototype.hasOwnProperty.call(b[c],e)&&(a[e]=b[c][e]);return a},log:function(){var b=a.console;b&&b.log&&i.call(b.log,b,arguments)},warn:function(){var b=a.console;b&&b.warn&&i.call(b.warn,b,arguments)},error:function(){var b=a.console;b&&b.error&&i.call(b.error,b,arguments)}}}}(window,document),Ink.createModule("Ink.Net.Ajax","1",[],function(){"use strict";var Ajax=function(a,b){this.init(a,b)};Ajax.globalOptions={parameters:{},requestHeaders:{}};var xMLHttpRequestWithCredentials="XMLHttpRequest"in window&&"withCredentials"in new XMLHttpRequest;return Ajax.prototype={init:function(a,b){if(!a)throw new Error("new Ink.Net.Ajax: Pass a url as the first argument!");var c=Ink.extendObj({asynchronous:!0,contentType:"application/x-www-form-urlencoded",cors:!1,validateCors:!1,debug:!1,delay:0,evalJS:!0,method:"POST",parameters:null,postBody:"",requestHeaders:null,sanitizeJSON:!1,signRequest:!1,timeout:0,useCredentials:!1,xhrProxy:"",onComplete:null,onCreate:null,onException:null,onFailure:null,onHeaders:null,onInit:null,onSuccess:null,onTimeout:null},Ajax.globalOptions);if(b&&"object"==typeof b){if(c=Ink.extendObj(c,b),"object"==typeof b.parameters)c.parameters=Ink.extendObj(Ink.extendObj({},Ajax.globalOptions.parameters),b.parameters);else if(null!==b.parameters){var d=this.paramsObjToStr(Ajax.globalOptions.parameters);d&&(c.parameters=b.parameters+"&"+d)}c.requestHeaders=Ink.extendObj({},Ajax.globalOptions.requestHeaders),c.requestHeaders=Ink.extendObj(c.requestHeaders,b.requestHeaders)}this.options=c,this.safeCall("onInit"),this.url=a;var e=this._locationFromURL(a);this.isHTTP=this._locationIsHTTP(e),this.isCrossDomain=this._locationIsCrossDomain(e,location),this.requestHasBody=c.method.search(/^get|head$/i)<0,this.options.validateCors===!0&&(this.options.cors=this.isCrossDomain),this.options.cors&&(this.isCrossDomain=!1),this.transport=this.getTransport(),this.request()},_locationFromURL:function(a){var b=document.createElementNS?document.createElementNS("http://www.w3.org/1999/xhtml","a"):document.createElement("a");return b.setAttribute("href",a),b},_locationIsHTTP:function(a){return a.href.match(/^https?:/i)?!0:!1},_locationIsCrossDomain:function(a,b){if(b=b||window.location,Ajax.prototype._locationIsHTTP(a)&&"widget:"!==b.protocol&&"object"!=typeof window.widget){var c=a.href.split("//"),d=b.href.split("//");if(1===c.length||1===d.length)return!1;var e=c[0],f=d[0],g=/:|\//,h=c[1].split(g)[0],i=d[1].split(g)[0];return e!==f||h!==i}return!1},getTransport:function(){if(!xMLHttpRequestWithCredentials&&this.options.cors&&"XDomainRequest"in window)return this.usingXDomainReq=!0,new XDomainRequest;if("undefined"!=typeof XMLHttpRequest)return new XMLHttpRequest;if("undefined"==typeof ActiveXObject)return null;try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(a){return new ActiveXObject("Microsoft.XMLHTTP")}},setHeaders:function(){if(this.transport)try{var a={Accept:"text/javascript,text/xml,application/xml,application/xhtml+xml,text/html,application/json;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1","Accept-Language":navigator.language,"X-Requested-With":"XMLHttpRequest","X-Ink-Version":"3"};if(this.options.cors&&(this.options.signRequest||delete a["X-Requested-With"],delete a["X-Ink-Version"]),this.options.requestHeaders&&"object"==typeof this.options.requestHeaders)for(var b in this.options.requestHeaders)this.options.requestHeaders.hasOwnProperty(b)&&(a[b]=this.options.requestHeaders[b]);this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005&&(a.Connection="close");for(var c in a)a.hasOwnProperty(c)&&this.transport.setRequestHeader(c,a[c])}catch(d){}},paramsObjToStr:function(a){var b,c,d,e,f=[];if("object"!=typeof a)return a;for(d in a)if(a.hasOwnProperty(d))if(e=a[d],"[object Array]"!==Object.prototype.toString.call(e)||isNaN(e.length))f=f.concat([encodeURIComponent(d),"=",encodeURIComponent(e),"&"]);else for(b=0,c=e.length;c>b;b++)f=f.concat([encodeURIComponent(d),"[]","=",encodeURIComponent(e[b]),"&"]);return f.length>0&&f.pop(),f.join("")},setParams:function(){var a=null,b=this.options.parameters;a="object"==typeof b?this.paramsObjToStr(b):""+b,a&&(this.url=this.url.indexOf("?")>-1?this.url.split("#")[0]+"&"+a:this.url.split("#")[0]+"?"+a)},getHeader:function(a){if(this.usingXDomainReq&&"Content-Type"===a)return this.transport.contentType;try{return this.transport.getResponseHeader(a)}catch(b){return null}},getAllHeaders:function(){try{return this.transport.getAllResponseHeaders()}catch(a){return null}},getResponse:function(){var a=this.transport,b={headerJSON:null,responseJSON:null,getHeader:this.getHeader,getAllHeaders:this.getAllHeaders,request:this,transport:a,timeTaken:new Date-this.startTime,requestedUrl:this.url};b.readyState=a.readyState;try{b.responseText=a.responseText}catch(c){}try{b.responseXML=a.responseXML}catch(c){}try{b.status=a.status}catch(c){b.status=0}try{b.statusText=a.statusText}catch(c){b.statusText=""}return b},abort:function(){if(this.transport){clearTimeout(this.delayTimeout),clearTimeout(this.stoTimeout);try{this.transport.abort()}catch(a){}this.finish()}},runStateChange:function(){var a=this.transport.readyState;if(3===a)this.isHTTP&&this.safeCall("onHeaders");else if(4===a||this.usingXDomainReq){if(this.options.asynchronous&&this.options.delay&&this.startTime+this.options.delay>(new Date).getTime())return void(this.delayTimeout=setTimeout(Ink.bind(this.runStateChange,this),this.options.delay+this.startTime-(new Date).getTime()));var b,c=this.transport.responseText,d=this.getResponse(),e=this.transport.status;this.isHTTP&&!this.options.asynchronous&&this.safeCall("onHeaders"),clearTimeout(this.stoTimeout),0===e?this.isHTTP?this.safeCall("onException",new Error("Ink.Net.Ajax: network error! (HTTP status 0)")):e=c?200:404:304===e&&(e=200);var f=this.usingXDomainReq||e>=200&&300>e,g=this.getHeader("Content-Type")||"";if(this.options.evalJS&&(g.indexOf("application/json")>=0||"force"===this.options.evalJS))try{b=this.evalJSON(c,this.sanitizeJSON),b&&(c=d.responseJSON=b)}catch(h){f&&this.safeCall("onException",h)}if(this.usingXDomainReq&&-1!==g.indexOf("xml")&&"DOMParser"in window){var i;switch(g){case"application/xml":case"application/xhtml+xml":case"image/svg+xml":i=g;break;default:i="text/xml"}var j=(new DOMParser).parseFromString(this.transport.responseText,i);this.transport.responseXML=j,d.responseXML=j}null!=this.transport.responseXML&&null==d.responseJSON&&""!==this.transport.responseXML.xml&&(c=this.transport.responseXML),(e||this.usingXDomainReq)&&(f?this.safeCall("onSuccess",d,c):this.safeCall("onFailure",d,c),this.safeCall("on"+e,d,c)),this.finish(d,c)}},finish:function(a,b){if(a&&this.safeCall("onComplete",a,b),clearTimeout(this.stoTimeout),this.transport){try{this.transport.onreadystatechange=null}catch(c){}"function"==typeof this.transport.destroy&&this.transport.destroy(),this.transport=null}},safeCall:function(a){var b=arguments[1]instanceof Error?arguments[1]:null;if("function"==typeof this.options[a])try{this.options[a].apply(this,[].slice.call(arguments,1))}catch(c){Ink.error("Ink.Net.Ajax: an error was raised while executing "+a+".",c)}else b&&Ink.error("Ink.Net.Ajax: "+b)},setRequestHeader:function(a,b){this.options.requestHeaders||(this.options.requestHeaders={}),this.options.requestHeaders[a]=b},request:function(){if(this.transport){var a=null;this.requestHasBody?(null!==this.options.postBody&&""!==this.options.postBody?(a=this.options.postBody,this.setParams()):null!==this.options.parameters&&""!==this.options.parameters&&(a=this.options.parameters),"object"!=typeof a||a.nodeType?"object"!=typeof a&&null!==a&&(a=""+a):a=this.paramsObjToStr(a),this.options.contentType&&this.setRequestHeader("Content-Type",this.options.contentType)):this.setParams();var b=this.url,c=this.options.method,d=this.isCrossDomain;d&&this.options.xhrProxy&&(this.setRequestHeader("X-Url",b),b=this.options.xhrProxy+encodeURIComponent(b),d=!1);try{this.transport.open(c,b,this.options.asynchronous)}catch(e){return this.safeCall("onException",e),this.finish(this.getResponse(),null)}this.setHeaders(),this.safeCall("onCreate"),this.options.timeout&&!isNaN(this.options.timeout)&&(this.stoTimeout=setTimeout(Ink.bind(function(){this.options.onTimeout&&(this.safeCall("onTimeout"),this.abort())},this),1e3*this.options.timeout)),this.options.useCredentials&&!this.usingXDomainReq&&(this.transport.withCredentials=!0),this.options.asynchronous&&!this.usingXDomainReq?this.transport.onreadystatechange=Ink.bind(this.runStateChange,this):this.usingXDomainReq&&(this.transport.onload=Ink.bind(this.runStateChange,this));try{if(d)return void Ink.error("Ink.Net.Ajax: You are attempting to request a URL which is cross-domain from this one. To do this, you *must* enable the `cors` option!");this.startTime=(new Date).getTime(),this.transport.send(a)}catch(e){return this.safeCall("onException",e),this.finish(this.getResponse(),null)}this.options.asynchronous||this.runStateChange()}},isJSON:function(a){return"string"==typeof a&&a?(a=a.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,""),/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/.test(a)):!1},evalJSON:function(strJSON,sanitize){if(strJSON&&(!sanitize||this.isJSON(strJSON)))try{return"undefined"!=typeof JSON&&"undefined"!=typeof JSON.parse?JSON.parse(strJSON):eval("("+strJSON+")")}catch(e){throw new Error("Ink.Net.Ajax: Bad JSON string. "+e)}return null}},Ajax.load=function(a,b){var c=Ajax.prototype._locationIsCrossDomain(window.location,Ajax.prototype._locationFromURL(a));return new Ajax(a,{method:"GET",cors:c,onSuccess:function(a){b(a.responseJSON||a.responseText,a)}})},Ajax.ping=function(a,b){var c=Ajax.prototype._locationIsCrossDomain(window.location,Ajax.prototype._locationFromURL(a));return new Ajax(a,{method:"HEAD",cors:c,onSuccess:function(a){"function"==typeof b&&b(a)}})},Ajax}),Ink.createModule("Ink.Net.JsonP","1",[],function(){"use strict";var a=function(a,b){this.init(a,b)};return a.prototype={init:function(a,b){if(this.options=Ink.extendObj({onSuccess:void 0,onFailure:void 0,failureObj:{},timeout:10,params:{},callbackParam:"jsoncallback",internalCallback:"_cb",randVar:!1},b||{}),this.randVar=this.options.randVar!==!1?this.options.randVar:parseInt(1e5*Math.random(),10),this.options.internalCallback+=this.randVar,this.uri=a,"function"==typeof this.options.onComplete&&(this.options.onSuccess=this.options.onComplete),"string"!=typeof this.uri)throw new Error("Ink.Net.JsonP: Please define an URI");if("function"!=typeof this.options.onSuccess)throw new Error("Ink.Net.JsonP: please define a callback function on option onSuccess!");Ink.Net.JsonP[this.options.internalCallback]=Ink.bind(function(){this.options.onSuccess(arguments[0]),this._cleanUp()},this),this.timeout=setTimeout(Ink.bind(function(){this.abort(),"function"==typeof this.options.onFailure&&this.options.onFailure(this.options.failureObj)},this),1e3*this.options.timeout),this._addScriptTag()},abort:function(){Ink.Net.JsonP[this.options.internalCallback]=Ink.bindMethod(this,"_cleanUp")},_addParamsToGet:function(a,b){var c=-1!==a.indexOf("?"),d,e,f,g=[a];for(e in b)b.hasOwnProperty(e)&&(c?d="&":(d="?",c=!0),f=b[e],"number"==typeof f||f||(f=""),g=g.concat([d,e,"=",encodeURIComponent(f)]));return g.join("")},_getScriptContainer:function(){return document.body||document.getElementsByTagName("body")[0]||document.getElementsByTagName("head")[0]||document.documentElement},_addScriptTag:function(){this.options.params[this.options.callbackParam]="Ink.Net.JsonP."+this.options.internalCallback,this.options.params.rnd_seed=this.randVar,this.uri=this._addParamsToGet(this.uri,this.options.params),this._scriptEl=document.createElement("script"),this._scriptEl.type="text/javascript",this._scriptEl.src=this.uri;var a=this._getScriptContainer();a.appendChild(this._scriptEl)},_cleanUp:function(){this.timeout&&window.clearTimeout(this.timeout),delete this.options.onSuccess,delete this.options.onFailure,delete Ink.Net.JsonP[this.options.internalCallback],this._removeScriptTag()},_removeScriptTag:function(){this._scriptEl&&(this._scriptEl.parentNode.removeChild(this._scriptEl),delete this._scriptEl)}},a}),Ink.createModule("Ink.Dom.Browser","1",[],function(){"use strict";var a={IE:!1,GECKO:!1,OPERA:!1,SAFARI:!1,KONQUEROR:!1,CHROME:!1,model:!1,version:!1,userAgent:!1,cssPrefix:!1,domPrefix:!1,init:function(){this.detectBrowser(),this.setDimensions(),this.setReferrer()},setDimensions:function(){var a=0,b=0;"number"==typeof window.innerWidth?(a=window.innerWidth,b=window.innerHeight):document.documentElement&&(document.documentElement.clientWidth||document.documentElement.clientHeight)?(a=document.documentElement.clientWidth,b=document.documentElement.clientHeight):document.body&&(document.body.clientWidth||document.body.clientHeight)&&(a=document.body.clientWidth,b=document.body.clientHeight),this.windowWidth=a,this.windowHeight=b},setReferrer:function(){this.referrer=document.referrer&&document.referrer.length?window.escape(document.referrer):!1},detectBrowser:function(){this._sniffUserAgent(navigator.userAgent)},_sniffUserAgent:function(a){if(this.userAgent=a,a=a.toLowerCase(),/applewebkit\//.test(a))if(this.cssPrefix="-webkit-",this.domPrefix="Webkit",/(chrome|crios)\//.test(a))this.CHROME=!0,this.model="chrome",this.version=a.replace(/(.*)chrome\/([^\s]+)(.*)/,"$2");else{this.SAFARI=!0,this.model="safari";var b=/version\/([^) ]+)/;this.version=b.test(a)?a.match(b)[1]:a.replace(/(.*)applewebkit\/([^\s]+)(.*)/,"$2")}else if(/opera/.test(a))this.OPERA=!0,this.model="opera",this.version=a.replace(/(.*)opera.([^\s$]+)(.*)/,"$2"),this.cssPrefix="-o-",this.domPrefix="O";else if(/konqueror/.test(a))this.KONQUEROR=!0,this.model="konqueror",this.version=a.replace(/(.*)konqueror\/([^;]+);(.*)/,"$2"),this.cssPrefix="-khtml-",this.domPrefix="Khtml";else if(/(msie|trident)/i.test(a))this.IE=!0,this.model="ie",this.version=/rv:((?:\d|\.)+)/.test(a)?a.match(/rv:((?:\d|\.)+)/)[1]:a.replace(/(.*)\smsie\s([^;]+);(.*)/,"$2"),this.cssPrefix="-ms-",this.domPrefix="ms";else if(/gecko/.test(a)){this.cssPrefix="-moz-",this.domPrefix="Moz",this.GECKO=!0;var c=/(camino|chimera|epiphany|minefield|firefox|firebird|phoenix|galeon|iceweasel|k\-meleon|seamonkey|netscape|songbird|sylera)/;if(c.test(a))this.model=a.match(c)[1],this.version=a.replace(new RegExp("(.*)"+this.model+"/([^;\\s$]+)(.*)"),"$2");else{this.model="mozilla";var d=/(.*)rv:([^)]+)(.*)/;d.test(a)&&(this.version=a.replace(d,"$2"))}}},debug:function(){var a="known browsers: (ie, gecko, opera, safari, konqueror) \n";a+=[this.IE,this.GECKO,this.OPERA,this.SAFARI,this.KONQUEROR]+"\n",a+="cssPrefix -> "+this.cssPrefix+"\n",a+="domPrefix -> "+this.domPrefix+"\n",a+="model -> "+this.model+"\n",a+="version -> "+this.version+"\n",a+="\n",a+="original UA -> "+this.userAgent,alert(a)}};return a.init(),a}),Ink.createModule("Ink.Dom.Css",1,[],function(){"use strict";var a="defaultView"in document&&"getComputedStyle"in document.defaultView?document.defaultView.getComputedStyle:window.getComputedStyle,b={addRemoveClassName:function(a,b,c){return c?this.addClassName(a,b):void this.removeClassName(a,b)},addClassName:function(a,c){if(a=Ink.i(a),!a||!c)return null;c=(""+c).split(/[, ]+/);for(var d=0,e=c.length;e>d;d++)c[d].replace(/^\s+|\s+$/g,"")&&("undefined"!=typeof a.classList?a.classList.add(c[d]):b.hasClassName(a,c[d])||(a.className+=(a.className?" ":"")+c[d]))},removeClassName:function(a,b){if(a=Ink.i(a),!a||!b)return null;b=(""+b).split(/[, ]+/);var c=0,d=b.length;if("undefined"!=typeof a.classList)for(;d>c;c++)a.classList.remove(b[c]);else{for(var e=a.className||"",f;d>c;c++)f=new RegExp("(^|\\s+)"+b[c]+"(\\s+|$)"),e=e.replace(f," ");a.className=e.replace(/^\s+/,"").replace(/\s+$/,"")}},setClassName:function(a,b,c){this.addRemoveClassName(a,b,c||!1)},hasClassName:function(a,b,c){if(a=Ink.i(a),!a||!b)return!1;b=(""+b).split(/[, ]+/);for(var d=0,e=b.length,f,g;e>d;d++){if("undefined"!=typeof a.classList)f=a.classList.contains(b[d]);else{var h=a.className;h===b[d]?f=!0:(g=new RegExp("(^|\\s)"+b[d]+"(\\s|$)"),f=g.test(h))}if(f&&!c)return!0;if(!f&&c)return!1}return c?!0:!1},blinkClass:function(a,c,d,e){a=Ink.i(a),b.addRemoveClassName(a,c,!e),setTimeout(function(){b.addRemoveClassName(a,c,e)},Number(d)||100)},toggleClassName:function(a,c,d){return a&&c?"undefined"!=typeof d?b.addRemoveClassName(a,c,d):void("undefined"==typeof a.classList||/[, ]/.test(c)?b.hasClassName(a,c)?b.removeClassName(a,c):b.addClassName(a,c):(a=Ink.i(a),null!==a&&a.classList.toggle(c))):!1},setOpacity:function(a,b){if(a=Ink.i(a),null!==a){var c=1;isNaN(Number(b))||(c=0>=b?0:1>=b?b:100>=b?b/100:1),"undefined"!=typeof a.style.opacity?a.style.opacity=c:a.style.filter="alpha(opacity:"+(100*c|0)+")"}},_camelCase:function(a){return a?a.replace(/-(\w)/g,function(a,b){return b.toUpperCase()}):a},getStyle:function(b,c){if(b=Ink.i(b),null!==b&&b.style){c="float"===c?"cssFloat":this._camelCase(c);var d=b.style[c];if(!a||d&&"auto"!==d)!d&&b.currentStyle&&(d=b.currentStyle[c],"auto"!==d||"width"!==c&&"height"!==c||(d=b["offset"+c.charAt(0).toUpperCase()+c.slice(1)]+"px"));else{var e=a(b,null);d=e?e[c]:null}if("opacity"===c)return d?parseFloat(d,10):1;if("borderTopWidth"===c||"borderBottomWidth"===c||"borderRightWidth"===c||"borderLeftWidth"===c){if("thin"===d)return"1px";if("medium"===d)return"3px";if("thick"===d)return"5px"}return"auto"===d?null:d}},setStyle:function(a,b){if(a=Ink.i(a),null!==a)if("string"==typeof b)a.style.cssText+="; "+b,-1!==b.indexOf("opacity")&&this.setOpacity(a,b.match(/opacity:\s*(\d?\.?\d*)/)[1]);else for(var c in b)b.hasOwnProperty(c)&&("opacity"===c?this.setOpacity(a,b[c]):"float"===c||"cssFloat"===c?"undefined"==typeof a.style.styleFloat?a.style.cssFloat=b[c]:a.style.styleFloat=b[c]:a.style[c]=b[c])},show:function(a,b){a=Ink.i(a),null!==a&&(a.style.display=b||"")},hide:function(a){a=Ink.i(a),null!==a&&(a.style.display="none")},showHide:function(a,b){a=Ink.i(a),a&&(a.style.display=b?"":"none")},toggle:function(a,b){a=Ink.i(a),null!==a&&("undefined"!=typeof b?b===!0?this.show(a):this.hide(a):"none"===this.getStyle(a,"display").toLowerCase()?this.show(a):this.hide(a))},_getRefTag:function(a){if(a.firstElementChild)return a.firstElementChild;for(var b=a.firstChild;b;b=b.nextSibling)if(1===b.nodeType)return b;return null},appendStyleTag:function(a,b,c){c=Ink.extendObj({type:"text/css",force:!1},c||{});var d=document.getElementsByTagName("style"),e=!1,f=!0,g,h;for(g=0,h=d.length;h>g;g++)e=d[g].innerHTML,e.indexOf(a)>=0&&(f=!1);if(f){var i=document.createElement("style"),j=document.getElementsByTagName("head")[0],k=!1,l="";i.type=c.type,l+=a+" {",l+=b,l+="} ","undefined"!=typeof i.styleSheet?i.styleSheet.cssText=l:i.appendChild(document.createTextNode(l)),c.force?j.appendChild(i):(k=this._getRefTag(j),k&&j.insertBefore(i,k))}},appendStylesheet:function(a,b){b=Ink.extendObj({media:"screen",type:"text/css",force:!1},b||{});var c,d=document.createElement("link"),e=document.getElementsByTagName("head")[0];d.media=b.media,d.type=b.type,d.href=a,d.rel="Stylesheet",b.force?e.appendChild(d):(c=this._getRefTag(e),c&&e.insertBefore(d,c))},_loadingCSSFiles:{},_loadedCSSFiles:{},appendStylesheetCb:function(a,b){if(!a)return b(a);if(this._loadedCSSFiles[a])return b(a);var c=this._loadingCSSFiles[a];if(c)return c.push(b);this._loadingCSSFiles[a]=[b];var d=document.createElement("link");d.type="text/css",d.rel="stylesheet",d.href=a;var e=document.getElementsByTagName("head")[0];e.appendChild(d);var f=document.createElement("img");f.onerror=Ink.bindEvent(function(a,b){var c=b;this._loadedCSSFiles[c]=!0;for(var d=this._loadingCSSFiles[c],e=0,f=d.length;f>e;++e)d[e](c);delete this._loadingCSSFiles[c]},this,a),f.src=a},decToHex:function(a){var b=function(a){return 1===a.length&&(a="0"+a),a=a.toUpperCase()};if("object"==typeof a){var c=b(parseInt(a.r,10).toString(16)),d=b(parseInt(a.g,10).toString(16)),e=b(parseInt(a.b,10).toString(16));return c+d+e}a+="";var f=a.match(/\((\d+),\s?(\d+),\s?(\d+)\)/);return null!==f?b(parseInt(f[1],10).toString(16))+b(parseInt(f[2],10).toString(16))+b(parseInt(f[3],10).toString(16)):b(parseInt(a,10).toString(16))},hexToDec:function(a){return 0===a.indexOf("#")&&(a=a.substr(1)),6===a.length?{r:parseInt(a.substr(0,2),16),g:parseInt(a.substr(2,2),16),b:parseInt(a.substr(4,2),16)}:3===a.length?{r:parseInt(a.charAt(0)+a.charAt(0),16),g:parseInt(a.charAt(1)+a.charAt(1),16),b:parseInt(a.charAt(2)+a.charAt(2),16)}:a.length<=2?parseInt(a,16):void 0},getPropertyFromStylesheet:function(a,b){var c=this.getRuleFromStylesheet(a);return c?c.style[b]:null},getPropertyFromStylesheet2:function(a,b){for(var c=this.getRulesFromStylesheet(a),d,e=0,f=c.length;f>e;e++)if(d=c[e].style[b],null!==d&&void 0!==d)return d;return null},getRuleFromStylesheet:function(a){var b,c,d,e,f,g=document.styleSheets;if(!g)return null;for(var h=0,i=document.styleSheets.length;i>h;++h){if(b=document.styleSheets[h],c=b.rules?b.rules:b.cssRules,!c)return null;for(d=0,e=c.length;e>d;++d)if(f=c[d],f.selectorText&&f.selectorText===a)return f}return null},getRulesFromStylesheet:function(a){var b=[],c,d,e,f,g,h=document.styleSheets;if(!h)return b;for(var i=0,j=document.styleSheets.length;j>i;++i){if(c=document.styleSheets[i],d=c.rules?c.rules:c.cssRules,!d)return null;for(e=0,f=d.length;f>e;++e)g=d[e],g.selectorText&&g.selectorText===a&&b.push(g)}return b},getPropertiesFromRule:function(a){var b=this.getRuleFromStylesheet(a),c={},d,e,f;b=b.style.cssText;var g=b.split(";"),h,i,j,k;for(e=0,f=g.length;f>e;++e)" "===g[e].charAt(0)&&(g[e]=g[e].substring(1)),h=g[e].split(":"),d=this._camelCase(h[0].toLowerCase()),i=h[1],i&&(i=i.substring(1),"padding"===d||"margin"===d||"borderWidth"===d?("borderWidth"===d?(j="border",k="Width"):(j=d,k=""),-1!==i.indexOf(" ")?(i=i.split(" "),c[j+"Top"+k]=i[0],c[j+"Bottom"+k]=i[0],c[j+"Left"+k]=i[1],c[j+"Right"+k]=i[1]):(c[j+"Top"+k]=i,c[j+"Bottom"+k]=i,c[j+"Left"+k]=i,c[j+"Right"+k]=i)):"borderRadius"===d?-1!==i.indexOf(" ")?(i=i.split(" "),c.borderTopLeftRadius=i[0],c.borderBottomRightRadius=i[0],c.borderTopRightRadius=i[1],c.borderBottomLeftRadius=i[1]):(c.borderTopLeftRadius=i,c.borderTopRightRadius=i,c.borderBottomLeftRadius=i,c.borderBottomRightRadius=i):c[d]=i);return c},changeFontSize:function(a,b,c,d,e){var f=this;Ink.requireModules(["Ink.Dom.Selector_1"],function(g){var h;if("string"!=typeof a?h="1st argument must be a CSS selector rule.":"number"!=typeof b?h="2nd argument must be a number.":void 0!==c&&"+"!==c&&"*"!==c?h='3rd argument must be one of "+", "*".':void 0!==d&&("number"!=typeof d||0>=d)?h="4th argument must be a positive number.":void 0!==e&&("number"!=typeof e||e>e)&&(h="5th argument must be a positive number greater than minValue."),h)throw new TypeError(h);var i,j,k=g.select(a);void 0===d&&(d=1),c="*"===c?function(a,b){return a*b}:function(a,b){return a+b};for(var l=0,m=k.length;m>l;++l)j=k[l],i=parseFloat(f.getStyle(j,"fontSize")),i=c(i,b),d>i||"number"==typeof e&&i>e||(j.style.fontSize=i+"px")})}};return b}),Ink.createModule("Ink.Dom.Element",1,[],function(){"use strict";function a(a){var b={};try{b=a.getBoundingClientRect()}catch(c){b={top:a.offsetTop,left:a.offsetLeft}}return b}var b="function"==typeof document.createRange&&"function"==typeof window.Range.prototype.createContextualFragment,c="Ink.Dom.Element tbody: "+Math.random(),d=function(){var a=document.createElement("div");return a.innerHTML="",0!==a.getElementsByTagName("tbody").length}(),e={isDOMElement:function(a){return null!==a&&"object"==typeof a&&"nodeType"in a&&1===a.nodeType},get:function(a){return"undefined"!=typeof a?"string"==typeof a?document.getElementById(a):a:null},create:function(a,b){var c=document.createElement(a);if(b)for(var d in b)b.hasOwnProperty(d)&&(d in e?e[d](c,b[d]):"className"===d||"class"===d?c.className=b.className||b["class"]:c.setAttribute(d,b[d]));return c},remove:function(a){a=Ink.i(a);var b;a&&(b=a.parentNode)&&b.removeChild(a)},scrollTo:function(a){if(a=e.get(a)){if(a.scrollIntoView)return a.scrollIntoView();var b={},c=0,d=0;do c+=a.offsetTop||0,d+=a.offsetLeft||0,a=a.offsetParent;while(a);b={x:d,y:c},window.scrollTo(b.x,b.y)}},offsetTop:function(a){return e.offset(a)[1]},offsetLeft:function(a){return e.offset(a)[0]},positionedOffset:function(a){var b=0,c=0;a=e.get(a);do if(b+=a.offsetTop||0,c+=a.offsetLeft||0,a=a.offsetParent){if("body"===a.tagName.toLowerCase())break;var d=a.style.position;if(!d&&a.currentStyle&&(d=a.currentStyle.position),(!d||"auto"===d)&&"undefined"!=typeof getComputedStyle){var f=getComputedStyle(a,null);d=f?f.position:null}if("relative"===d||"absolute"===d)break}while(a);return[c,b]},offset:function(b){b=Ink.i(b);var c=[0,0],d=b.ownerDocument,e=d.documentElement,f=a(b),g=d.body,h=e.clientTop||g.clientTop||0,i=e.clientLeft||g.clientLeft||0,j=d.pageYOffset||e.scrollTop||g.scrollTop,k=d.pageXOffset||e.scrollLeft||g.scrollLeft,l=f.top+j-h,m=f.left+k-i;return c=[m,l]},scroll:function(a){return a=a?Ink.i(a):document.body,[window.pageXOffset?window.pageXOffset:a.scrollLeft,window.pageYOffset?window.pageYOffset:a.scrollTop]},_getPropPx:function(a,b){var c,d,e=a.getPropertyValue?a.getPropertyValue(b):a[b];return e?(d=e.indexOf("px"),c=-1===d?0:parseFloat(e,10)):c=0,c},offset2:function(a){return e.offset(a)},hasAttribute:function(a,b){return a=Ink.i(a),a.hasAttribute?a.hasAttribute(b):!!a.getAttribute(b)},insertAfter:function(a,b){(b=e.get(b))&&(null!==b.nextSibling?b.parentNode.insertBefore(a,b.nextSibling):b.parentNode.appendChild(a))},insertBefore:function(a,b){(b=e.get(b))&&b.parentNode.insertBefore(a,b)},insertTop:function(a,b){(b=e.get(b))&&(b.firstChild?b.insertBefore(a,b.firstChild):b.appendChild(a))},insertBottom:function(a,b){b=Ink.i(b),b.appendChild(a)},textContent:function(a){a=Ink.i(a);var b,c,d,f;switch(a&&a.nodeType){case 9:return e.textContent(a.documentElement||a.body&&a.body.parentNode||a.body);case 1:if(b="textContent"in a?a.textContent:a.innerText,"undefined"!=typeof b)return b;case 11:if(b=a.textContent,"undefined"!=typeof b)return b;if(a.firstChild===a.lastChild)return e.textContent(a.firstChild);for(b=[],d=a.childNodes,c=0,f=d.length;f>c;++c)b.push(e.textContent(d[c]));return b.join("");case 3:case 4:return a.nodeValue}return""},setTextContent:function(a,b){switch(a=Ink.i(a),a&&a.nodeType){case 1:if("innerText"in a){a.innerText=b;break}case 11:if("textContent"in a){a.textContent=b;break}case 9:for(;a.firstChild;)a.removeChild(a.firstChild);if(""!==b){var c=a.ownerDocument||a;a.appendChild(c.createTextNode(b))}break;case 3:case 4:a.nodeValue=b}},isLink:function(a){var b=a&&1===a.nodeType&&(/^a|area$/i.test(a.tagName)||a.hasAttributeNS&&a.hasAttributeNS("http://www.w3.org/1999/xlink","href"));return!!b},isAncestorOf:function(a,b){if(!b||!a)return!1;if(b.compareDocumentPosition)return 0!==(16&a.compareDocumentPosition(b));for(;b=b.parentNode;)if(b===a)return!0;return!1},descendantOf:function(a,b){return a!==b&&e.isAncestorOf(a,b)},firstElementChild:function(a){if(!a)return null;if("firstElementChild"in a)return a.firstElementChild;for(var b=a.firstChild;b&&1!==b.nodeType;)b=b.nextSibling;return b},lastElementChild:function(a){if(!a)return null;if("lastElementChild"in a)return a.lastElementChild;for(var b=a.lastChild;b&&1!==b.nodeType;)b=b.previousSibling;return b},nextElementSibling:function(a){var b=null;if(!a)return b;if("nextElementSibling"in a)return a.nextElementSibling;for(b=a.nextSibling;b&&1!==b.nodeType;)b=b.nextSibling;return b},previousElementSibling:function(a){var b=null;if(!a)return b;if("previousElementSibling"in a)return a.previousElementSibling;for(b=a.previousSibling;b&&1!==b.nodeType;)b=b.previousSibling; return b},elementWidth:function(a){return"string"==typeof a&&(a=document.getElementById(a)),a.offsetWidth},elementHeight:function(a){return"string"==typeof a&&(a=document.getElementById(a)),a.offsetHeight},elementLeft:function(a){return e.offsetLeft(a)},elementTop:function(a){return e.offsetTop(a)},elementDimensions:function(a){return a=Ink.i(a),[a.offsetWidth,a.offsetHeight]},outerDimensions:function(b){var c=a(b),d=Ink.getModule("Ink.Dom.Css_1"),e=Ink.bindMethod(d,"getStyle",b);return[c.right-c.left+parseFloat(e("marginLeft")||0)+parseFloat(e("marginRight")||0),c.bottom-c.top+parseFloat(e("marginTop")||0)+parseFloat(e("marginBottom")||0)]},inViewport:function(b,c){var d=a(Ink.i(b));return"boolean"==typeof c&&(c={partial:c,margin:0}),c=Ink.extendObj({partial:!1,margin:0},c||{}),c.partial?d.bottom+c.margin>0&&d.left-c.margin0:d.top+c.margin>0&&d.right-c.margin0},isHidden:function(a){var b=a.offsetWidth,c=a.offsetHeight,d="tr"===a.tagName.toLowerCase(),e=Ink.getModule("Ink.Dom.Css_1");return 0!==b||0!==c||d?0===b||0===c||d?"none"===e.getStyle(a,"display").toLowerCase():!1:!0},isVisible:function(a){return!this.isHidden(a)},clonePosition:function(a,b){var c=e.offset(b);return a.style.left=c[0]+"px",a.style.top=c[1]+"px",a},ellipsizeText:function(a){(a=Ink.i(a))&&(a.style.overflow="hidden",a.style.whiteSpace="nowrap",a.style.textOverflow="ellipsis")},findUpwardsHaving:function(a,b){for(;a&&1===a.nodeType;){if(b(a))return a;a=a.parentNode}return!1},findUpwardsByClass:function(a,b){var c=new RegExp("(^|\\s)"+b+"(\\s|$)"),d=function(a){var b=a.className;return b&&c.test(b)};return e.findUpwardsHaving(a,d)},findUpwardsByTag:function(a,b){b=b.toUpperCase();var c=function(a){return a.nodeName&&a.nodeName.toUpperCase()===b};return e.findUpwardsHaving(a,c)},findUpwardsById:function(a,b){var c=function(a){return a.id===b};return e.findUpwardsHaving(a,c)},findUpwardsBySelector:function(a,b){var c=Ink.getModule("Ink.Dom.Selector","1");if(!c)throw new Error("This method requires Ink.Dom.Selector");var d=function(a){return c.matchesSelector(a,b)};return e.findUpwardsHaving(a,d)},getChildrenText:function(a,b){var c,d,f,g=a.childNodes,h=g.length,i="";if(!a)return i;for(d=0;h>d;++d)c=g[d],c&&3===c.nodeType&&(f=e._trimString(String(c.data)),f.length>0?(i+=f,b&&a.removeChild(c)):a.removeChild(c));return i},_trimString:function(a){return String.prototype.trim?a.trim():a.replace(/^\s*/,"").replace(/\s*$/,"")},getSelectValues:function(a){for(var b=Ink.i(a),c=[],d=0;dd;++d)b=a[d],b instanceof Array?1===b.length&&b.push(b[0]):b=[b,b],c.push(b);return c},fillSelect:function(a,b,c,d){var f=Ink.i(a);if(f){f.innerHTML="";var g,h;c||(h=document.createElement("option"),h.setAttribute("value",""),f.appendChild(h)),b=e._normalizeData(b);for(var i=0,j=b.length;j>i;++i)g=b[i],h=document.createElement("option"),h.setAttribute("value",g[0]),g.length>2&&h.setAttribute("extra",g[2]),h.appendChild(document.createTextNode(g[1])),g[0]===d&&h.setAttribute("selected","selected"),f.appendChild(h)}},fillRadios:function(a,b,c,d,f,g){a=Ink.i(a);var h=document.createElement("span");e.insertAfter(h,a),c=e._normalizeData(c);var i,j;d||(j=document.createElement("input"),j.setAttribute("type","radio"),j.setAttribute("name",b),j.setAttribute("value",""),h.appendChild(j),g&&h.appendChild(document.createElement(g)));for(var k=0;kc;++c)if(a.children[c]===b)return c;return!1},nextSiblings:function(a){if(a=Ink.i(a),"object"==typeof a&&null!==a&&a.nodeType&&1===a.nodeType){for(var b=[],c=a.parentNode.children,d=e.parentIndexOf(a.parentNode,a),f=++d,g=c.length;g>f;f++)b.push(c[f]);return b}return[]},previousSiblings:function(a){if(a=Ink.i(a),"object"==typeof a&&null!==a&&a.nodeType&&1===a.nodeType){for(var b=[],c=a.parentNode.children,d=e.parentIndexOf(a.parentNode,a),f=0,g=d;g>f;f++)b.push(c[f]);return b}return[]},siblings:function(a){if(a=Ink.i(a),"object"==typeof a&&null!==a&&a.nodeType&&1===a.nodeType){for(var b=[],c=a.parentNode.children,d=0,e=c.length;e>d;d++)a!==c[d]&&b.push(c[d]);return b}return[]},childElementCount:function(a){return a=Ink.i(a),"childElementCount"in a?a.childElementCount:a?e.siblings(a).length+1:0},_wrapElements:{TABLE:function(a,b){return a.innerHTML=d?"
"+b+"
"+c+"
":""+b+"
",a.firstChild},TBODY:function(a,b){return a.innerHTML=""+b+"
",a.firstChild.getElementsByTagName("tbody")[0]},THEAD:function(a,b){return a.innerHTML=""+b+"
",a.firstChild.getElementsByTagName("thead")[0]},TFOOT:function(a,b){return a.innerHTML=""+b+"
",a.firstChild.getElementsByTagName("tfoot")[0]},TR:function(a,b){return a.innerHTML=""+b+"
",a.firstChild.firstChild.firstChild}},_getWrapper:function(a,b){var f=a.nodeName&&a.nodeName.toUpperCase(),g=document.createElement("div"),h=e._wrapElements[f];if(!h)return g.innerHTML=b,g;if(g=h(g,b),d&&"TABLE"===f)for(var i=g.getElementsByTagName("td"),j=0,k=i.length;k>j;j++)if(i[j].innerHTML===c){var l=i[j].parentNode.parentNode;l.parentNode.removeChild(l)}return g},appendHTML:function(a,b){if(a=Ink.i(a),null!==a)for(var c=e._getWrapper(a,b);c.firstChild;)a.appendChild(c.firstChild)},prependHTML:function(a,b){if(a=Ink.i(a),null!==a)for(var c=e._getWrapper(a,b);c.lastChild;)a.insertBefore(c.lastChild,a.firstChild)},setHTML:function(a,b){if(a=Ink.i(a),null!==a)try{a.innerHTML=b}catch(c){for(;a.firstChild;)a.removeChild(a.firstChild);e.appendHTML(a,b)}},wrap:function(a,b){a=Ink.i(a),b=Ink.i(b);var c=a.nextSibling,d=a.parentNode;return b.appendChild(a),null!==c?d.insertBefore(b,c):d.appendChild(b),b},unwrap:function(a,b){a=Ink.i(a);var c;c="string"==typeof b?e.findUpwardsBySelector(a,b):"object"==typeof b&&b.tagName?e.findUpwardsHaving(a,function(a){return a===b}):a.parentNode,c&&c.parentNode&&e.insertBefore(a,c)},replace:function(a,b){a=Ink.i(a),null!==a&&a.parentNode.replaceChild(b,a)},removeTextNodeChildren:function(a){if(a=Ink.i(a),null!==a){var b,c,d=a;for(a=a.firstChild;a;)c=3===a.nodeType,b=a,a=a.nextSibling,c&&d.removeChild(b)}},htmlToFragment:b?function(a){var b;return"string"!=typeof a?document.createDocumentFragment():(b=document.createRange(),b.selectNode(document.body),b.createContextualFragment(a))}:function(a){var b=document.createDocumentFragment(),c,d;if("string"!=typeof a)return b;for(c=document.createElement("div"),c.innerHTML=a;d=c.firstChild;)b.appendChild(d);return b},_camelCase:function(a){return a?a.replace(/-(\w)/g,function(a,b){return b.toUpperCase()}):a},data:function(a){var b;if("object"!=typeof a&&"string"!=typeof a)throw"[Ink.Dom.Element.data] :: Invalid selector defined";if("object"==typeof a)b=a;else{var c=Ink.getModule("Ink.Dom.Selector",1);if(!c)throw"[Ink.Dom.Element.data] :: this method requires Ink.Dom.Selector - v1";if(b=c.select(a),b.length<=0)throw"[Ink.Dom.Element.data] :: Can't find any element with the specified selector";b=b[0]}var d={},f=b.attributes||[],g,h,i;if(f)for(var j=0,k=f.length;k>j;++j)g=f[j],h=g.name,i=g.value,h&&0===h.indexOf("data-")&&(d[e._camelCase(h.replace("data-",""))]=i);return d},moveCursorTo:function(a,b){if(a=Ink.i(a),null!==a)if(a.setSelectionRange)a.setSelectionRange(b,b);else{var c=a.createTextRange();c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",b),c.select()}},pageWidth:function(){var a;a=window.innerWidth&&window.scrollMaxX?window.innerWidth+window.scrollMaxX:document.body.scrollWidth>document.body.offsetWidth?document.body.scrollWidth:document.body.offsetWidth;var b;return window.self.innerWidth?b=document.documentElement.clientWidth?document.documentElement.clientWidth:window.self.innerWidth:document.documentElement&&document.documentElement.clientWidth?b=document.documentElement.clientWidth:document.body&&(b=document.body.clientWidth),b>a?a:b},pageHeight:function(){var a;a=window.innerHeight&&window.scrollMaxY?window.innerHeight+window.scrollMaxY:document.body.scrollHeight>document.body.offsetHeight?document.body.scrollHeight:document.body.offsetHeight;var b;return window.self.innerHeight?b=window.self.innerHeight:document.documentElement&&document.documentElement.clientHeight?b=document.documentElement.clientHeight:document.body&&(b=document.body.clientHeight),b>a?b:a},viewportWidth:function(){return"undefined"!=typeof window.innerWidth?window.innerWidth:document.documentElement&&"undefined"!=typeof document.documentElement.offsetWidth?document.documentElement.offsetWidth:void 0},viewportHeight:function(){return"undefined"!=typeof window.innerHeight?window.innerHeight:document.documentElement&&"undefined"!=typeof document.documentElement.offsetHeight?document.documentElement.offsetHeight:void 0},scrollWidth:function(){return"undefined"!=typeof window.self.pageXOffset?window.self.pageXOffset:"undefined"!=typeof document.documentElement&&"undefined"!=typeof document.documentElement.scrollLeft?document.documentElement.scrollLeft:document.body.scrollLeft},scrollHeight:function(){return"undefined"!=typeof window.self.pageYOffset?window.self.pageYOffset:"undefined"!=typeof document.documentElement&&"undefined"!=typeof document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop}};return e}),Ink.createModule("Ink.Dom.Event",1,[],function(){var a=function(a,b,c){return c()}("bean",this,function(a,b){a=a||"bean",b=b||this;var c=window,d=b[a],e=/[^\.]*(?=\..*)\.|.*/,f=/\..*/,g="addEventListener",h="removeEventListener",i=document||{},j=i.documentElement||{},k=j[g],l=k?g:"attachEvent",m={},n=Array.prototype.slice,o=function(a,b){return a.split(b||" ")},p=function(a){return"string"==typeof a},q=function(a){return"function"==typeof a},r="click dblclick mouseup mousedown contextmenu mousewheel mousemultiwheel DOMMouseScroll mouseover mouseout mousemove selectstart selectend keydown keypress keyup orientationchange focus blur change reset select submit load unload beforeunload resize move DOMContentLoaded readystatechange message error abort scroll ",s="show input invalid touchstart touchmove touchend touchcancel gesturestart gesturechange gestureend textinputreadystatechange pageshow pagehide popstate hashchange offline online afterprint beforeprint dragstart dragenter dragover dragleave drag drop dragend loadstart progress suspend emptied stalled loadmetadata loadeddata canplay canplaythrough playing waiting seeking seeked ended durationchange timeupdate play pause ratechange volumechange cuechange checking noupdate downloading cached updateready obsolete ",t=function(a,b,c){for(c=0;cg;g++)if(m[g].reg.test(e)){n[e]=k=m[g].fix;break}for(j=k(a,this,e),g=j.length;g--;)!((i=j[g])in this)&&i in a&&(this[i]=a[i])}}};return p.prototype.preventDefault=function(){this.originalEvent.preventDefault?this.originalEvent.preventDefault():this.originalEvent.returnValue=!1},p.prototype.stopPropagation=function(){this.originalEvent.stopPropagation?this.originalEvent.stopPropagation():this.originalEvent.cancelBubble=!0},p.prototype.stop=function(){this.preventDefault(),this.stopPropagation(),this.stopped=!0},p.prototype.stopImmediatePropagation=function(){this.originalEvent.stopImmediatePropagation&&this.originalEvent.stopImmediatePropagation(),this.isImmediatePropagationStopped=function(){return!0}},p.prototype.isImmediatePropagationStopped=function(){return this.originalEvent.isImmediatePropagationStopped&&this.originalEvent.isImmediatePropagationStopped()},p.prototype.clone=function(a){var b=new p(this,this.element,this.isNative);return b.currentTarget=a,b},p}(),w=function(a,b){return k||b||a!==i&&a!==c?a:j},x=function(){var a=function(a,b,c,d){var e=function(c,e){return b.apply(a,d?n.call(e,c?0:1).concat(d):e)},f=function(c,d){return b.__beanDel?b.__beanDel.ft(c.target,a):d},g=c?function(a){var b=f(a,this);return c.apply(b,arguments)?(a&&(a.currentTarget=b),e(a,arguments)):void 0}:function(a){return b.__beanDel&&(a=a.clone(f(a))),e(a,arguments)};return g.__beanDel=b.__beanDel,g},b=function(b,c,d,e,f,g,h){var i=u[c],j;"unload"==c&&(d=D(E,b,c,d,e)),i&&(i.condition&&(d=a(b,d,i.condition,g)),c=i.base||c),this.isNative=j=t[c]&&!!b[l],this.customType=!k&&!j&&c,this.element=b,this.type=c,this.original=e,this.namespaces=f,this.eventType=k||j?c:"propertychange",this.target=w(b,j),this[l]=!!this.target[l],this.root=h,this.handler=a(b,d,null,g)};return b.prototype.inNamespaces=function(a){var b,c,d=0;if(!a)return!0;if(!this.namespaces)return!1;for(b=a.length;b--;)for(c=this.namespaces.length;c--;)a[b]==this.namespaces[c]&&d++;return a.length===d},b.prototype.matches=function(a,b,c){return!(this.element!==a||b&&this.original!==b||c&&this.handler!==c)},b}(),y=function(){var a={},b=function(c,d,e,f,g,h){var i=g?"r":"$";if(d&&"*"!=d){var j=0,k,l=a[i+d],m="*"==c;if(!l)return;for(k=l.length;k>j;j++)if((m||l[j].matches(c,e,f))&&!h(l[j],l,j,d))return}else for(var n in a)n.charAt(0)==i&&b(c,n.substr(1),e,f,g,h)},c=function(b,c,d,e){var f,g=a[(e?"r":"$")+c];if(g)for(f=g.length;f--;)if(!g[f].root&&g[f].matches(b,d,null))return!0;return!1},d=function(a,c,d,e){var f=[];return b(a,c,d,null,e,function(a){return f.push(a)}),f},e=function(b){var c=!b.root&&!this.has(b.element,b.type,null,!1),d=(b.root?"r":"$")+b.type;return(a[d]||(a[d]=[])).push(b),c},f=function(c){b(c.element,c.type,null,c.handler,c.root,function(b,c,d){return c.splice(d,1),b.removed=!0,0===c.length&&delete a[(b.root?"r":"$")+b.type],!1})},g=function(){var b,c=[];for(b in a)"$"==b.charAt(0)&&(c=c.concat(a[b]));return c};return{has:c,get:d,put:e,del:f,entries:g}}(),z,A=function(a){z=arguments.length?a:i.querySelectorAll?function(a,b){return b.querySelectorAll(a)}:function(){throw new Error("Bean: No selector engine installed")}},B=function(a,b){if(k||!b||!a||a.propertyName=="_on"+b){var c=y.get(this,b||a.type,null,!1),d=c.length,e=0;for(a=new v(a,this,!0),b&&(a.type=b);d>e&&!a.isImmediatePropagationStopped();e++)c[e].removed||c[e].handler.call(this,a)}},C=k?function(a,b,c){a[c?g:h](b,B,!1)}:function(a,b,c,d){var e;c?(y.put(e=new x(a,d||b,function(b){B.call(a,b,d)},B,null,null,!0)),d&&null==a["_on"+d]&&(a["_on"+d]=0),e.target.attachEvent("on"+e.eventType,e.handler)):(e=y.get(a,d||b,B,!0)[0],e&&(e.target.detachEvent("on"+e.eventType,e.handler),y.del(e)))},D=function(a,b,c,d,e){return function(){d.apply(this,arguments),a(b,c,e)}},E=function(a,b,c,d){var e=b&&b.replace(f,""),g=y.get(a,e,null,!1),h={},i,j;for(i=0,j=g.length;j>i;i++)c&&g[i].original!==c||!g[i].inNamespaces(d)||(y.del(g[i]),!h[g[i].eventType]&&g[i][l]&&(h[g[i].eventType]={t:g[i].eventType,c:g[i].type}));for(i in h)h.hasOwnProperty(i)&&(y.has(a,h[i].t,null,!1)||C(a,h[i].t,!1,h[i].c))},F=function(a,b){var c=function(b,c){for(var d,e=p(a)?z(a,c):a;b&&b!==c;b=b.parentNode)for(d=e.length;d--;)if(e[d]===b)return b},d=function(a){var d=c(a.target,this);d&&b.apply(d,arguments)};return d.__beanDel={ft:c,selector:a},d},G=k?function(a,b,d){var e=i.createEvent(a?"HTMLEvents":"UIEvents");e[a?"initEvent":"initUIEvent"](b,!0,!0,c,1),d.dispatchEvent(e)}:function(a,b,c){c=w(c,a),a?c.fireEvent("on"+b,i.createEventObject()):c["_on"+b]++},H=function(a,b,c){var d=p(b),g,h,i,j;if(d&&b.indexOf(" ")>0){for(b=o(b),j=b.length;j--;)H(a,b[j],c);return a}if(h=d&&b.replace(f,""),h&&u[h]&&(h=u[h].base),!b||d)(i=d&&b.replace(e,""))&&(i=o(i,".")),E(a,h,c,i);else if(q(b))E(a,null,b);else for(g in b)b.hasOwnProperty(g)&&H(a,g,b[g]);return a},I=function(a,b,c,d){var g,h,i,j,k,p,r;{if(void 0!==c||"object"!=typeof b){for(q(c)?(k=n.call(arguments,3),d=g=c):(g=d,k=n.call(arguments,4),d=F(c,g,z)),i=o(b),this===m&&(d=D(H,a,b,d,g)),j=i.length;j--;)r=y.put(p=new x(a,i[j].replace(f,""),d,g,o(i[j].replace(e,""),"."),k,!1)),p[l]&&r&&C(a,p.eventType,!0,p.customType);return a}for(h in b)b.hasOwnProperty(h)&&I.call(this,a,h,b[h])}},J=function(a,b,c,d){return I.apply(null,p(c)?[a,c,b,d].concat(arguments.length>3?n.call(arguments,5):[]):n.call(arguments))},K=function(){return I.apply(m,arguments)},L=function(a,b,c){var d=o(b),g,h,i,j,k;for(g=d.length;g--;)if(b=d[g].replace(f,""),(j=d[g].replace(e,""))&&(j=o(j,".")),j||c||!a[l])for(k=y.get(a,b,null,!1),c=[!1].concat(c),h=0,i=k.length;i>h;h++)k[h].inNamespaces(j)&&k[h].handler.apply(a,c);else G(t[b],b,a);return a},M=function(a,b,c){for(var d=y.get(b,c,null,!1),e=d.length,f=0,g,h;e>f;f++)d[f].original&&(g=[a,d[f].type],(h=d[f].handler.__beanDel)&&g.push(h.selector),g.push(d[f].original),I.apply(null,g));return a},N={on:I,add:J,one:K,off:H,remove:H,clone:M,fire:L,Event:v,setSelectorEngine:A,noConflict:function(){return b[a]=d,this}};if(c.attachEvent){var O=function(){var a,b=y.entries();for(a in b)b[a].type&&"unload"!==b[a].type&&H(b[a].element,b[a].type);c.detachEvent("onunload",O),c.CollectGarbage&&c.CollectGarbage()};c.attachEvent("onunload",O)}return A(Ink.ss),N}),b={KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_SPACE:32,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,KEY_HOME:36,KEY_END:35,KEY_PAGEUP:33,KEY_PAGEDOWN:34,KEY_INSERT:45,throttle:function(a,b){function c(){var f=+new Date,g=f-d;if(g>=b)return d=f,a.apply(this,[].slice.call(arguments));var h=this,i=[].slice.call(arguments);e&&clearTimeout(e),e=setTimeout(function(){return e=null,c.apply(h,i)},b-g)}b=b||0;var d=0,e;return c},element:function(a){var b=a.delegationTarget||a.target||"mouseout"===a.type&&a.fromElement||"mouseleave"===a.type&&a.fromElement||"mouseover"===a.type&&a.toElement||"mouseenter"===a.type&&a.toElement||a.srcElement||null;return!b||3!==b.nodeType&&4!==b.nodeType?b:b.parentNode},relatedTarget:function(a){var b=a.relatedTarget||"mouseout"===a.type&&a.toElement||"mouseleave"===a.type&&a.toElement||"mouseover"===a.type&&a.fromElement||"mouseenter"===a.type&&a.fromElement||null;return!b||3!==b.nodeType&&4!==b.nodeType?b:b.parentNode},findElement:function(a,b,c){for(var d=this.element(a);;){if(d.nodeName.toLowerCase()===b.toLowerCase())return d;if(d=d.parentNode,!d)return c?!1:document;if(!d.parentNode)return c?!1:document}},observe:function(a,b,c,d){return a=Ink.i(a),a?(a.addEventListener?a.addEventListener(b,c,!!d):a.attachEvent("on"+b,c=Ink.bind(c,a)),c):void 0},observeOnce:function(a,c,d,e){var f=function(){return b.stopObserving(a,c,g),d.apply(this,arguments)},g=b.observe(a,c,f,e);return g},observeMulti:function(a,b,c,d){if("string"==typeof a?a=Ink.ss(a):a&&1===a.nodeType&&(a=[a]),!a[0])return!1;for(var e=0,f=a.length;f>e;e++)this.observe(a[e],b,c,d);return c},observeDelegated:function(a,c,d,e){return b.observe(a,c,function(c){var f=b.element(c);if(f&&f!==a)for(var g=f;g!==a&&g!==document&&g;){if(Ink.Dom.Selector_1.matchesSelector(g,d))return c.delegationTarget=g,e(c);g=g.parentNode}})},stopObserving:function(a,b,c,d){a=Ink.i(a),a&&(a.removeEventListener?a.removeEventListener(b,c,!!d):a.detachEvent("on"+b,c))},stop:function(a){null!==a.cancelBubble&&(a.cancelBubble=!0),a.stopPropagation&&a.stopPropagation(),a.preventDefault&&a.preventDefault(),window.attachEvent&&(a.returnValue=!1),null!==a.cancel&&(a.cancel=!0)},stopPropagation:function(a){null!==a.cancelBubble&&(a.cancelBubble=!0),a.stopPropagation&&a.stopPropagation()},stopDefault:function(a){a.preventDefault&&a.preventDefault(),window.attachEvent&&(a.returnValue=!1),null!==a.cancel&&(a.cancel=!0)},pointer:function(a){return{x:this.pointerX(a),y:this.pointerY(a)}},pointerX:function(a){return a.touches&&a.touches[0]&&a.touches[0].clientX||a.pageX||a.clientX+(document.documentElement.scrollLeft||document.body.scrollLeft)},pointerY:function(a){return a.touches&&a.touches[0]&&a.touches[0].clientY||a.pageY||a.clientY+(document.documentElement.scrollTop||document.body.scrollTop)},isLeftClick:function(a){if(window.addEventListener){if(0===a.button)return!0;if("touchend"===a.type&&null===a.button)return!0}else if(1===a.button)return!0;return!1},isRightClick:function(a){return 2===a.button},isMiddleClick:function(a){return window.addEventListener?1===a.button:4===a.button;return!1},getCharFromKeyboardEvent:function(a,b){var c=a.keyCode,d=String.fromCharCode(c),e=a.shiftKey;if(c>=65&&90>=c)return"boolean"==typeof b&&(e=b),e?d:d.toLowerCase();if(c>=96&&105>=c)return String.fromCharCode(48+(c-96));switch(c){case 109:case 189:return"-";case 107:case 187:return"+"}return d},debug:function(){}};return Ink.extendObj(b,a)}),Ink.createModule("Ink.Dom.FormSerialize",1,["Ink.Util.Array_1","Ink.Dom.Element_1","Ink.Dom.Selector_1"],function(a,b,c){"use strict";function d(c){return null!=c&&!b.isDOMElement(c)&&(a.isArray(c)||"string"!=typeof c&&"number"==typeof c.length)}function e(a){return d(a)?a:[a]}var f={serialize:function(b,c){c=c||{};var d={},e={},g=this.asPairs(b,{elements:!0,emptyArray:e,outputUnchecked:c.outputUnchecked});return null==g?g:(a.forEach(g,function(a){var b=a[0].replace(/\[\]$/,""),c=a[1],g=a[2];c===e?d[b]=[]:f._resultsInArray(g)||/\[\]$/.test(a[0])?(d[b]=d[b]||[],d[b].push(c)):d[b]=c}),d)},asPairs:function(b,d){function e(a,b,c){h.push(d.elements?[a,b,c]:[a,b])}function g(b){var f=b.nodeName.toLowerCase(),g=(b.type+"").toLowerCase();if("select"===f&&b.multiple){var h=!1;a.forEach(c.select("option:checked",b),function(a){e(b.name,a.value,b),h=!0}),!h&&"emptyArray"in d&&e(b.name,d.emptyArray,b)}else"input"!==f||"checkbox"!==g&&"radio"!==g||!d.outputUnchecked?e(b.name,b.value,b):e(b.name,null,b)}var h=[];if(d=d||{},b=Ink.i(b)){for(var i=a.filter(b.elements,function(a){return f._isSerialized(a,d)}),j=0,k=i.length;k>j;j++)g(i[j]);return h}return null},fillIn:function(a,b){if(!(a=Ink.i(a)))return null;var c;if("object"!=typeof b||d(b)){if(!d(b))return null;c=b}else c=f._objToPairs(b);return f._fillInPairs(a,c)},_objToPairs:function(a){var b=[],c;for(var d in a)if(a.hasOwnProperty(d)){c=e(a[d]);for(var f=0,g=c.length;g>f;f++)b.push([d,c[f]]);0===g&&b.push([d,[]])}return b},_fillInPairs:function(b,c){c=a.groupBy(c,{key:function(a){return a[0].replace(/\[\]$/,"")}}),c=a.map(c,function(b){var c=a.reduce(b,function(a,b){return[null,a[1].concat([b[1]])]},[null,[]])[1];return[b[0][0],c]});for(var d,g,h,i=0,j=c.length;j>i;i++){if(d=c[i][0],d in b)g=b[d];else{if(!(d+"[]"in b))continue;g=b[d+"[]"],d+="[]"}g=e(g),h=c[i][1],f._fillInOne(d,g,h)}},_fillInOne:function(a,c,d){var e=c[0],g=e.nodeName.toLowerCase(),h=e.getAttribute("type");h=h&&h.toLowerCase();var i="select"===g&&b.hasAttribute(e,"multiple");if("checkbox"===h||"radio"===h)f._fillInBoolean(c,d,"checked");else if(i)f._fillInBoolean(c[0].options,d,"selected");else{c.length!==d.length&&Ink.warn("Form had "+c.length+' inputs named "'+a+'", but received '+d.length+" values.");for(var j=0,k=Math.min(c.length,d.length);k>j;j+=1)c[j].value=d[j]}},_fillInBoolean:function(b,c,d){a.forEach(b,function(b){var e=a.inArray(b.value,c);b[d]=e})},_resultsInArray:function(a){var c=a.getAttribute("type"),d=a.nodeName.toLowerCase();return"checkbox"===c||"select"===d&&b.hasAttribute(a,"multiple")},_isSerialized:function(a,c){if(c=c||{},!b.isDOMElement(a))return!1;if(!b.hasAttribute(a,"name"))return!1;var d=a.nodeName.toLowerCase();return d&&"fieldset"!==d?"checkbox"===a.type||"radio"===a.type?c.outputUnchecked?!0:!!a.checked:!0:!1}};return f}),Ink.createModule("Ink.Dom.Loaded",1,[],function(){"use strict";var a={_contexts:[],run:function(a,b){b||(b=a,a=window);for(var c,d=0,e=this._contexts.length;e>d;d++)if(this._contexts[d][0]===a){c=this._contexts[d][1];break}c||(c={cbQueue:[],win:a,doc:a.document,root:a.document.documentElement,done:!1,top:!0},c.handlers={checkState:Ink.bindEvent(this._checkState,this,c),poll:Ink.bind(this._poll,this,c)},this._contexts.push([a,c]));var f=c.doc.addEventListener;c.add=f?"addEventListener":"attachEvent",c.rem=f?"removeEventListener":"detachEvent",c.pre=f?"":"on",c.det=f?"DOMContentLoaded":"onreadystatechange",c.wet=c.pre+"load";var g=c.handlers.checkState,h=/complete|loaded/.test(c.doc.readyState)&&"about:blank"!==c.win.location.toString();if(h)setTimeout(Ink.bind(function(){b.call(c.win,"lazy")},this),0);else{c.cbQueue.push(b),c.doc[c.add](c.det,g),c.win[c.add](c.wet,g);var i=1;try{i=c.win.frameElement}catch(j){}if(!f&&c.root&&c.root.doScroll){try{c.top=!i}catch(j){}c.top&&this._poll(c)}}},_checkState:function(a,b){if(a&&("readystatechange"!==a.type||/complete|loaded/.test(b.doc.readyState))){var c="load"===a.type?b.win:b.doc;c[b.rem](b.pre+a.type,b.handlers.checkState,!1),this._ready(b)}},_poll:function(a){try{a.root.doScroll("left")}catch(b){return setTimeout(a.handlers.poll,50)}this._ready(a)},_ready:function(a){if(!a.done){a.done=!0;for(var b=0;bw.cacheLength&&delete a[b.shift()],a[c]=d}}function c(a){return a[L]=!0,a}function d(a){var b=E.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b=null}}function e(a,b,c,d){var e,f,g,h,i,l,m,n,o,p;if((b?b.ownerDocument||b:M)!==E&&D(b),b=b||E,c=c||[],!a||"string"!=typeof a)return c;if(1!==(h=b.nodeType)&&9!==h)return[];if(G&&!d){if(e=pb.exec(a))if(g=e[1]){if(9===h){if(f=b.getElementById(g),!f||!f.parentNode)return c;if(f.id===g)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(g))&&K(b,f)&&f.id===g)return c.push(f),c}else{if(e[2])return $.apply(c,b.getElementsByTagName(a)),c;if((g=e[3])&&N.getElementsByClassName&&b.getElementsByClassName)return $.apply(c,b.getElementsByClassName(g)),c}if(N.qsa&&!H.test(a)){if(m=!0,n=L,o=b,p=9===h&&a,1===h&&"object"!==b.nodeName.toLowerCase()){for(l=j(a),(m=b.getAttribute("id"))?n=m.replace(sb,"\\$&"):b.setAttribute("id",n),n="[id='"+n+"'] ",i=l.length;i--;)l[i]=n+k(l[i]);o=nb.test(a)&&b.parentNode||b,p=l.join(",")}if(p)try{return $.apply(c,o.querySelectorAll(p)),c}catch(q){}finally{m||b.removeAttribute("id")}}}return s(a.replace(hb,"$1"),b,c,d)}function f(a,b){var c=b&&a,d=c&&(~b.sourceIndex||W)-(~a.sourceIndex||W);if(d)return d;if(c)for(;c=c.nextSibling;)if(c===b)return-1;return a?1:-1}function g(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function h(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function i(a){return c(function(b){return b=+b,c(function(c,d){for(var e,f=a([],c.length,b),g=f.length;g--;)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function j(a,b){var c,d,f,g,h,i,j,k=R[a+" "];if(k)return b?0:k.slice(0);for(h=a,i=[],j=w.preFilter;h;){(!c||(d=ib.exec(h)))&&(d&&(h=h.slice(d[0].length)||h),i.push(f=[])),c=!1,(d=jb.exec(h))&&(c=d.shift(),f.push({value:c,type:d[0].replace(hb," ")}),h=h.slice(c.length));for(g in w.filter)!(d=mb[g].exec(h))||j[g]&&!(d=j[g](d))||(c=d.shift(),f.push({value:c,type:g,matches:d}),h=h.slice(c.length));if(!c)break}return b?h.length:h?e.error(a):R(a,i).slice(0)}function k(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function l(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=P++;return b.first?function(b,c,f){for(;b=b[d];)if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=O+" "+f;if(g){for(;b=b[d];)if((1===b.nodeType||e)&&a(b,c,g))return!0}else for(;b=b[d];)if(1===b.nodeType||e)if(j=b[L]||(b[L]={}),(i=j[d])&&i[0]===k){if((h=i[1])===!0||h===v)return h===!0}else if(i=j[d]=[k],i[1]=a(b,c,g)||v,i[1]===!0)return!0}}function m(a){return a.length>1?function(b,c,d){for(var e=a.length;e--;)if(!a[e](b,c,d))return!1;return!0}:a[0]}function n(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function o(a,b,d,e,f,g){return e&&!e[L]&&(e=o(e)),f&&!f[L]&&(f=o(f,g)),c(function(c,g,h,i){var j,k,l,m=[],o=[],p=g.length,q=c||r(b||"*",h.nodeType?[h]:h,[]),s=!a||!c&&b?q:n(q,m,a,h,i),t=d?f||(c?a:p||e)?[]:g:s;if(d&&d(s,t,h,i),e)for(j=n(t,o),e(j,[],h,i),k=j.length;k--;)(l=j[k])&&(t[o[k]]=!(s[o[k]]=l));if(c){if(f||a){if(f){for(j=[],k=t.length;k--;)(l=t[k])&&j.push(s[k]=l);f(null,t=[],j,i)}for(k=t.length;k--;)(l=t[k])&&(j=f?ab.call(c,l):m[k])>-1&&(c[j]=!(g[j]=l))}}else t=n(t===g?t.splice(p,t.length):t),f?f(null,g,t,i):$.apply(g,t)})}function p(a){for(var b,c,d,e=a.length,f=w.relative[a[0].type],g=f||w.relative[" "],h=f?1:0,i=l(function(a){return a===b},g,!0),j=l(function(a){return ab.call(b,a)>-1},g,!0),n=[function(a,c,d){return!f&&(d||c!==A)||((b=c).nodeType?i(a,c,d):j(a,c,d))}];e>h;h++)if(c=w.relative[a[h].type])n=[l(m(n),c)];else{if(c=w.filter[a[h].type].apply(null,a[h].matches),c[L]){for(d=++h;e>d&&!w.relative[a[d].type];d++);return o(h>1&&m(n),h>1&&k(a.slice(0,h-1)).replace(hb,"$1"),c,d>h&&p(a.slice(h,d)),e>d&&p(a=a.slice(d)),e>d&&k(a)) }n.push(c)}return m(n)}function q(a,b){var d=0,f=b.length>0,g=a.length>0,h=function(c,h,i,j,k){var l,m,o,p=[],q=0,r="0",s=c&&[],t=null!=k,u=A,x=c||g&&w.find.TAG("*",k&&h.parentNode||h),y=O+=null==u?1:Math.random()||.1;for(t&&(A=h!==E&&h,v=d);null!=(l=x[r]);r++){if(g&&l){for(m=0;o=a[m++];)if(o(l,h,i)){j.push(l);break}t&&(O=y,v=++d)}f&&((l=!o&&l)&&q--,c&&s.push(l))}if(q+=r,f&&r!==q){for(m=0;o=b[m++];)o(s,p,h,i);if(c){if(q>0)for(;r--;)s[r]||p[r]||(p[r]=Y.call(j));p=n(p)}$.apply(j,p),t&&!c&&p.length>0&&q+b.length>1&&e.uniqueSort(j)}return t&&(O=y,A=u),s};return f?c(h):h}function r(a,b,c){for(var d=0,f=b.length;f>d;d++)e(a,b[d],c);return c}function s(a,b,c,d){var e,f,g,h,i,l=j(a);if(!d&&1===l.length){if(f=l[0]=l[0].slice(0),f.length>2&&"ID"===(g=f[0]).type&&9===b.nodeType&&G&&w.relative[f[1].type]){if(b=(w.find.ID(g.matches[0].replace(ub,vb),b)||[])[0],!b)return c;a=a.slice(f.shift().value.length)}for(e=mb.needsContext.test(a)?0:f.length;e--&&(g=f[e],!w.relative[h=g.type]);)if((i=w.find[h])&&(d=i(g.matches[0].replace(ub,vb),nb.test(f[0].type)&&b.parentNode||b))){if(f.splice(e,1),a=d.length&&k(f),!a)return $.apply(c,d),c;break}}return z(a,l)(d,b,!G,c,nb.test(a)),c}function t(){}var u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L="sizzle"+-new Date,M=window.document,N={},O=0,P=0,Q=b(),R=b(),S=b(),T=!1,U=function(){return 0},V="undefined",W=1<<31,X=[],Y=X.pop,Z=X.push,$=X.push,_=X.slice,ab=X.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},bb="[\\x20\\t\\r\\n\\f]",cb="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",db=cb.replace("w","w#"),eb="([*^$|!~]?=)",fb="\\["+bb+"*("+cb+")"+bb+"*(?:"+eb+bb+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+db+")|)|)"+bb+"*\\]",gb=":("+cb+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+fb.replace(3,8)+")*)|.*)\\)|)",hb=new RegExp("^"+bb+"+|((?:^|[^\\\\])(?:\\\\.)*)"+bb+"+$","g"),ib=new RegExp("^"+bb+"*,"+bb+"*"),jb=new RegExp("^"+bb+"*([\\x20\\t\\r\\n\\f>+~])"+bb+"*"),kb=new RegExp(gb),lb=new RegExp("^"+db+"$"),mb={ID:new RegExp("^#("+cb+")"),CLASS:new RegExp("^\\.("+cb+")"),NAME:new RegExp("^\\[name=['\"]?("+cb+")['\"]?\\]"),TAG:new RegExp("^("+cb.replace("w","w*")+")"),ATTR:new RegExp("^"+fb),PSEUDO:new RegExp("^"+gb),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+bb+"*(even|odd|(([+-]|)(\\d*)n|)"+bb+"*(?:([+-]|)"+bb+"*(\\d+)|))"+bb+"*\\)|)","i"),needsContext:new RegExp("^"+bb+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+bb+"*((?:-\\d)?\\d*)"+bb+"*\\)|)(?=[^-]|$)","i")},nb=/[\x20\t\r\n\f]*[+~]/,ob=/^[^{]+\{\s*\[native code/,pb=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,qb=/^(?:input|select|textarea|button)$/i,rb=/^h\d$/i,sb=/'|\\/g,tb=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,ub=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,vb=function(a,b){var c="0x"+b-65536;return c!==c?b:0>c?String.fromCharCode(c+65536):String.fromCharCode(c>>10|55296,1023&c|56320)};try{$.apply(X=_.call(M.childNodes),M.childNodes),X[M.childNodes.length].nodeType}catch(wb){$={apply:X.length?function(a,b){Z.apply(a,_.call(b))}:function(a,b){for(var c=a.length,d=0;a[c++]=b[d++];);a.length=c-1}}}y=e.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},D=e.setDocument=function(b){var c=b?b.ownerDocument||b:M;return c!==E&&9===c.nodeType&&c.documentElement?(E=c,F=c.documentElement,G=!y(c),N.getElementsByTagName=d(function(a){return a.appendChild(c.createComment("")),!a.getElementsByTagName("*").length}),N.attributes=d(function(a){a.innerHTML="";var b=typeof a.lastChild.getAttribute("multiple");return"boolean"!==b&&"string"!==b}),N.getElementsByClassName=d(function(a){return a.innerHTML="",a.getElementsByClassName&&a.getElementsByClassName("e").length?(a.lastChild.className="e",2===a.getElementsByClassName("e").length):!1}),N.getByName=d(function(a){a.id=L+0,a.appendChild(E.createElement("a")).setAttribute("name",L),a.appendChild(E.createElement("i")).setAttribute("name",L),F.appendChild(a);var b=c.getElementsByName&&c.getElementsByName(L).length===2+c.getElementsByName(L+0).length;return F.removeChild(a),b}),N.sortDetached=d(function(a){return a.compareDocumentPosition&&1&a.compareDocumentPosition(E.createElement("div"))}),w.attrHandle=d(function(a){return a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!==V&&"#"===a.firstChild.getAttribute("href")})?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},N.getByName?(w.find.ID=function(a,b){if(typeof b.getElementById!==V&&G){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},w.filter.ID=function(a){var b=a.replace(ub,vb);return function(a){return a.getAttribute("id")===b}}):(w.find.ID=function(a,b){if(typeof b.getElementById!==V&&G){var c=b.getElementById(a);return c?c.id===a||typeof c.getAttributeNode!==V&&c.getAttributeNode("id").value===a?[c]:void 0:[]}},w.filter.ID=function(a){var b=a.replace(ub,vb);return function(a){var c=typeof a.getAttributeNode!==V&&a.getAttributeNode("id");return c&&c.value===b}}),w.find.TAG=N.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==V?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){for(;c=f[e++];)1===c.nodeType&&d.push(c);return d}return f},w.find.NAME=N.getByName&&function(a,b){return typeof b.getElementsByName!==V?b.getElementsByName(name):void 0},w.find.CLASS=N.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==V&&G?b.getElementsByClassName(a):void 0},I=[],H=[":focus"],(N.qsa=a(c.querySelectorAll))&&(d(function(a){a.innerHTML="",a.querySelectorAll("[selected]").length||H.push("\\["+bb+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||H.push(":checked")}),d(function(a){a.innerHTML="",a.querySelectorAll("[i^='']").length&&H.push("[*^$]="+bb+"*(?:\"\"|'')"),a.querySelectorAll(":enabled").length||H.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),H.push(",.*:")})),(N.matchesSelector=a(J=F.matchesSelector||F.mozMatchesSelector||F.webkitMatchesSelector||F.oMatchesSelector||F.msMatchesSelector))&&d(function(a){N.disconnectedMatch=J.call(a,"div"),J.call(a,"[s!='']:x"),I.push("!=",gb)}),H=new RegExp(H.join("|")),I=I.length&&new RegExp(I.join("|")),K=a(F.contains)||F.compareDocumentPosition?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},U=F.compareDocumentPosition?function(a,b){if(a===b)return T=!0,0;var d=b.compareDocumentPosition&&a.compareDocumentPosition&&a.compareDocumentPosition(b);return d?1&d||B&&b.compareDocumentPosition(a)===d?a===c||K(M,a)?-1:b===c||K(M,b)?1:C?ab.call(C,a)-ab.call(C,b):0:4&d?-1:1:a.compareDocumentPosition?-1:1}:function(a,b){var d,e=0,g=a.parentNode,h=b.parentNode,i=[a],j=[b];if(a===b)return T=!0,0;if(!g||!h)return a===c?-1:b===c?1:g?-1:h?1:0;if(g===h)return f(a,b);for(d=a;d=d.parentNode;)i.unshift(d);for(d=b;d=d.parentNode;)j.unshift(d);for(;i[e]===j[e];)e++;return e?f(i[e],j[e]):i[e]===M?-1:j[e]===M?1:0},E):E},e.matches=function(a,b){return e(a,null,null,b)},e.matchesSelector=function(a,b){if((a.ownerDocument||a)!==E&&D(a),b=b.replace(tb,"='$1']"),N.matchesSelector&&G&&(!I||!I.test(b))&&!H.test(b))try{var c=J.call(a,b);if(c||N.disconnectedMatch||a.document&&11!==a.document.nodeType)return c}catch(d){}return e(b,E,null,[a]).length>0},e.contains=function(a,b){return(a.ownerDocument||a)!==E&&D(a),K(a,b)},e.attr=function(a,b){var c;return(a.ownerDocument||a)!==E&&D(a),G&&(b=b.toLowerCase()),(c=w.attrHandle[b])?c(a):!G||N.attributes?a.getAttribute(b):((c=a.getAttributeNode(b))||a.getAttribute(b))&&a[b]===!0?b:c&&c.specified?c.value:null},e.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},e.uniqueSort=function(a){var b,c=[],d=0,e=0;if(T=!N.detectDuplicates,B=!N.sortDetached,C=!N.sortStable&&a.slice(0),a.sort(U),T){for(;b=a[e++];)b===a[e]&&(d=c.push(e));for(;d--;)a.splice(c[d],1)}return a},x=e.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(1===e||9===e||11===e){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=x(a)}else if(3===e||4===e)return a.nodeValue}else for(;b=a[d];d++)c+=x(b);return c},w=e.selectors={cacheLength:50,createPseudo:c,match:mb,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ub,vb),a[3]=(a[4]||a[5]||"").replace(ub,vb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||e.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&e.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return mb.CHILD.test(a[0])?null:(a[4]?a[2]=a[4]:c&&kb.test(c)&&(b=j(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){return"*"===a?function(){return!0}:(a=a.replace(ub,vb).toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=Q[a+" "];return b||(b=new RegExp("(^|"+bb+")"+a+"("+bb+"|$)"))&&Q(a,function(a){return b.test(a.className||typeof a.getAttribute!==V&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var f=e.attr(d,a);return null==f?"!="===b:b?(f+="","="===b?f===c:"!="===b?f!==c:"^="===b?c&&0===f.indexOf(c):"*="===b?c&&f.indexOf(c)>-1:"$="===b?c&&f.slice(-c.length)===c:"~="===b?(" "+f+" ").indexOf(c)>-1:"|="===b?f===c||f.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){for(;p;){for(l=b;l=l[p];)if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){for(k=q[L]||(q[L]={}),j=k[a]||[],n=j[0]===O&&j[1],m=j[0]===O&&j[2],l=n&&q.childNodes[n];l=++n&&l&&l[p]||(m=n=0)||o.pop();)if(1===l.nodeType&&++m&&l===b){k[a]=[O,n,m];break}}else if(s&&(j=(b[L]||(b[L]={}))[a])&&j[0]===O)m=j[1];else for(;(l=++n&&l&&l[p]||(m=n=0)||o.pop())&&((h?l.nodeName.toLowerCase()!==r:1!==l.nodeType)||!++m||(s&&((l[L]||(l[L]={}))[a]=[O,m]),l!==b)););return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var d,f=w.pseudos[a]||w.setFilters[a.toLowerCase()]||e.error("unsupported pseudo: "+a);return f[L]?f(b):f.length>1?(d=[a,a,"",b],w.setFilters.hasOwnProperty(a.toLowerCase())?c(function(a,c){for(var d,e=f(a,b),g=e.length;g--;)d=ab.call(a,e[g]),a[d]=!(c[d]=e[g])}):function(a){return f(a,0,d)}):f}},pseudos:{not:c(function(a){var b=[],d=[],e=z(a.replace(hb,"$1"));return e[L]?c(function(a,b,c,d){for(var f,g=e(a,null,d,[]),h=a.length;h--;)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,c,f){return b[0]=a,e(b,null,f,d),!d.pop()}}),has:c(function(a){return function(b){return e(a,b).length>0}}),contains:c(function(a){return function(b){return(b.textContent||b.innerText||x(b)).indexOf(a)>-1}}),lang:c(function(a){return lb.test(a||"")||e.error("unsupported lang: "+a),a=a.replace(ub,vb).toLowerCase(),function(b){var c;do if(c=G?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(a){var b=window.location&&window.location.hash;return b&&b.slice(1)===a.id},root:function(a){return a===F},focus:function(a){return a===E.activeElement&&(!E.hasFocus||E.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeName>"@"||3===a.nodeType||4===a.nodeType)return!1;return!0},parent:function(a){return!w.pseudos.empty(a)},header:function(a){return rb.test(a.nodeName)},input:function(a){return qb.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||b.toLowerCase()===a.type)},first:i(function(){return[0]}),last:i(function(a,b){return[b-1]}),eq:i(function(a,b,c){return[0>c?c+b:c]}),even:i(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:i(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:i(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:i(function(a,b,c){for(var d=0>c?c+b:c;++dc;c++)b("position","absolute"),b(this._isY?"top":"left",c*this._elLength+"px")},_onTouchStart:function(a){if(!(a.touches.length>1)){this._swipeData={x:b.pointerX(a),y:b.pointerY(a)};var c=this._ulEl.getBoundingClientRect();this._swipeData.firstUlPos=c[this._isY?"top":"left"],this._swipeData.inUlX=this._swipeData.x-c.left,this._swipeData.inUlY=this._swipeData.y-c.top,i(this._ulEl,"none"),this._touchMoveIsFirstTouchMove=!0}},_onTouchMove:function(a){if(!(a.touches.length>1)){var c=b.pointerX(a),d=b.pointerY(a),e=this._swipeData.y-d,f=this._swipeData.x-c;if(this._touchMoveIsFirstTouchMove){var g=Math.abs(e),h=Math.abs(f);this._touchMoveIsFirstTouchMove=void 0,this._scrolling=this._isY?h>g:g>h,this._scrolling||this._onAnimationFrame()}!this._scrolling&&this._swipeData&&(b.stopDefault(a),this._swipeData.pointerDelta=this._isY?e:f,this._swipeData.pointerPos=this._isY?d:c)}},_onAnimationFrame:function(){var a=this._swipeData;if(a&&!this._scrolling&&!this._touchMoveIsFirstTouchMove){var b=this._element.getBoundingClientRect(),c;c=this._isY?a.pointerPos-a.inUlY-b.top:a.pointerPos-a.inUlX-b.left,this._ulEl.style[this._isY?"top":"left"]=c+"px",j(Ink.bindMethod(this,"_onAnimationFrame"))}},_onTouchEnd:function(a){if(this._swipeData&&this._swipeData.pointerPos&&!this._scrolling&&!this._touchMoveIsFirstTouchMove){var c=.1,d=this._swipeData.pointerDelta,e=this.getPage(),f=d/this._elLength/this._slidesPerPage;Math.abs(f)>c&&(e+=Math[0>d?"floor":"ceil"](f)),e=g(e,0,this._numPages-1),isNaN(e)||this.setPage(e),b.stopDefault(a)}i(this._ulEl,null),this._swipeData=null,this._touchMoveIsFirstTouchMove=void 0,this._scrolling=void 0},_onPaginationChange:function(a){this._setPage(a.getCurrent())},getPage:function(){return this._pagination?this._pagination.getCurrent():this._currentPage||0},getPagination:function(){return this._pagination||null},setPage:function(a,b){return b&&(a%=this._numPages,0>a&&(a=this._numPages-a)),a=g(a,0,this._numPages-1),a===this._currentPage?void(this._swipeData&&this._setPage(a)):void(this._pagination?this._pagination.setCurrent(a):this._setPage(a))},_setPage:function(a){var b=a*this._deltaLength,c=a===this._numPages-1;if(!this._options.spaceAfterLastSlide&&c&&a>0){var d=this._liEls.length-a*this._slidesPerPage;d2)&&r('the "defaults" argument must be an object mapping option names to [typestring, optional] arrays.'),k=a in h?o._coerce_from_string(m,h[a],a,b):i,k!==i?o._options_validate(k,m)?k:(s("("+a+" option) Invalid "+m+" "+q(k)),n):a in d?d[a]:n!==i?n:void r("Option "+a+" is required!")}"string"!=typeof b&&(e=d,d=c,c=b,b=""),d=d||{};var g={},h=e?a.data(e):{},k,l,m,n,p=function(a){return b&&(a=b+': "'+(""+a).replace(/"/,'\\"')+'"'),a},q=function(a){return'"'+(""+a).replace(/"/,'\\"')+'"'},r=function(a){throw new Error(p(a))},s=function(a){Ink.error(p(a)+". Ignoring option.")};for(var t in c)c.hasOwnProperty(t)&&(g[t]=f(t));return g},_coerce_from_string:function(a,b,c,d){return a in o._coerce_funcs?o._coerce_funcs[a](b,c,d):b},_options_validate:function(a,b){return b in o._options_validate_types?o._options_validate_types[b].call(o,a):!1},_coerce_funcs:function(){var a={element:function(a){return o.elOrSelector(a,"")},elements:function(a){return o.elsOrSelector(a,"",!1)},object:function(a){return a},number:function(a){return parseFloat(a)},"boolean":function(a){return!("false"===a||""===a||null===a)},string:function(a){return a},"function":function(a,b,c){return Ink.error(c+': You cannot specify the option "'+b+"\" through data-attributes because it's a function"),i}};return a["float"]=a.integer=a.number,a}(),_options_validate_types:function(){var a={string:function(a){return"string"==typeof a},number:function(a){return"number"==typeof a&&!isNaN(a)&&isFinite(a)},integer:function(a){return a===Math.round(a)},element:function(a){return o.isDOMElement(a)},elements:function(a){return a&&"object"==typeof a&&"number"==typeof a.length&&a.length},"boolean":function(a){return"boolean"==typeof a},object:function(){return!0}};return a["float"]=a.number,a}(),clone:function(a){try{return JSON.parse(JSON.stringify(a))}catch(b){throw new Error("Given object cannot have loops!")}},childIndex:a.parentIndexOf,ajaxJSON:function(a,c,d){new b(a,{evalJS:"force",method:"POST",parameters:c,onSuccess:function(a){try{if(a=a.responseJSON,"ok"!==a.status)throw"server error: "+a.message;d(null,a)}catch(b){d(b)}},onFailure:function(){d("communication failure")}})},currentLayout:function(){var a,b,e,f,g,h=d.select("#ink-layout-detector")[0];if(!h){h=document.createElement("div"),h.id="ink-layout-detector";for(e in o.Layouts)o.Layouts.hasOwnProperty(e)&&(f=o.Layouts[e],g=document.createElement("div"),g.className="show-"+f+" hide-all",g.setAttribute("data-ink-layout",f),h.appendChild(g));document.body.appendChild(h)}for(a=0,b=h.children.length;b>a;++a)if(g=h.children[a],"block"===c.getStyle(g,"display"))return g.getAttribute("data-ink-layout");return"large"},hashSet:function(a){if("object"!=typeof a)throw new TypeError("o should be an object!");var b=e.getAnchorString();b=Ink.extendObj(b,a),window.location.hash=e.genQueryString("",b).substring(1)},cleanChildren:function(b){if(!o.isDOMElement(b))throw new Error("Please provide a valid DOMElement");a.setHTML(b,"")},storeIdAndClasses:function(a,b){if(!o.isDOMElement(a))throw"Please provide a valid Element as first parameter";var c=a.id;c&&(b._id=c);var d=a.className;d&&(b._classes=d)},restoreIdAndClasses:function(a,b){if(!o.isDOMElement(a))throw"Please provide a valid Element as first parameter";b._id&&a.id!==b._id&&(a.id=b._id),b._classes&&-1===a.className.indexOf(b._classes)&&(a.className?a.className+=" "+b._classes:a.className=b._classes),b._instanceId&&!a.getAttribute("data-instance")&&a.setAttribute("data-instance",b._instanceId)},_warnDoubleInstantiation:function(a,b){function c(a){return(a.constructor&&a.constructor._name||a._name||"").replace(/_.*?$/,"")}var d=o.getInstance(a);if(""!==c(b)&&d){var e=c(b);if(e){for(var f=0,g=d.length;g>f;f++)if(e===c(d[f]))return Ink.warn("Creating more than one "+e+"for the same element.","(Was creating a "+e+" on:",a,")."),!1;return!0}}},registerInstance:function(a,b){if(a){if(b||(b=a._element),!o.isDOMElement(b))throw new TypeError("Ink.UI.Common.registerInstance: The element passed in is not a DOM element!");if(o._warnDoubleInstantiation(b,a)===!1)return!1;var c=n.get(b);return c||(c=[],n.set(b,c)),c.push(a),!0}},unregisterInstance:function(a){if(a&&a._element)for(var b=n.get(a._element),c=0,d=b.length;d>c;c++)b[c]===a&&b.splice(c,1)},getInstance:function(a,b){var c=a;if(a=o.elOrSelector(a),!o.isDOMElement(a))return Ink.warn("Ink.UI.Common: getInstance called on non-element ("+c+")"),[];var d=n.get(a);if(d||(d=[]),"function"!=typeof b)return d;for(var e=0,f=d.length;f>e;e++)if(d[e]instanceof b)return d[e];return null},getInstanceFromSelector:function(a){return o.getInstance(a)},getInstanceIds:function(){if(m.length>0)return m;var a=[];for(var b in l)l.hasOwnProperty(b)&&a.push(b);return a},getInstances:function(){if(m.length>0)return m;var a=[];for(var b in l)l.hasOwnProperty(b)&&a.push(l[b]);return a},destroyComponent:function(){o.unregisterInstance(this),this._element.parentNode.removeChild(this._element)}};return h._validateInstance=function(a){var b;if("function"!=typeof a._validate)return!0;try{b=a._validate()}catch(c){b=c}return b instanceof Error?(a._validationError=b,!1):!0},h._stubInstance=function(a,b,c){g(b.prototype,a),g(h.prototype,a),Ink.warn(c+" was not correctly created. "+(a._validationError||""))},h.getInstance=function(a){return a=o.elOrSelector(a),o.getInstance(a,this)},Ink.extendObj(h.prototype,{getOption:function(a){return!this.constructor||a in this.constructor._optionDefinition?this._options[a]:void Ink.error('"'+a+'" is not an option for '+this.constructor._name)},setOption:function(a,b){return!this.constructor||a in this.constructor._optionDefinition?void(this._options[a]=b):void Ink.error('"'+a+" is not an option for "+this.constructor._name)},getElement:function(){return this._element}}),o.BaseUIComponent=h,o.createUIComponent=function r(a,b){function c(a,b){if(!a)throw new Error("Ink.UI_1.createUIComponent: "+b)}function d(b,d,e){var f=a[b];c("undefined"!=typeof f,a+" doesn't have a \""+b+'" property. '+e),c(d&&typeof f===d,"typeof "+a+"."+b+' is not "'+d+'". '+e)}a._componentOptions=b||{},c("function"==typeof a,"constructor argument is not a function!"),d("_name","string","This property is used for error messages. Set it to the full module path and version (Ink.My.Module_1)."),d("_optionDefinition","object","This property contains the option names, types and defaults. See Ink.UI.Common.options() for reference.");var e=a.prototype;a.prototype="function"==typeof Object.create?Object.create(h.prototype):function f(){function a(){}return a.prototype=h.prototype,new a}(),Ink.extendObj(a.prototype,e),a.prototype.constructor=a,Ink.extendObj(a,h)},o}),Ink.createModule("Ink.UI.DatePicker","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1","Ink.Util.Date_1","Ink.Dom.Browser_1"],function(a,b,c,d,e,f,g){"use strict";function h(a,b,c){return a>c&&(a=c),b>a&&(a=b),a}function i(a){var b=a.split("-");return j(+b[0],+b[1]-1,+b[2])}function j(a,b,c){return{_year:a,_month:b,_day:c}}function k(a){return{_year:a.getFullYear(),_month:a.getMonth(),_day:a.getDate()}}function l(){a.BaseUIComponent.apply(this,arguments)}return l._name="DatePicker_1",l._optionDefinition={autoOpen:["Boolean",!1],cleanText:["String","Clear"],closeText:["String","Close"],pickerField:["Element",null],containerElement:["Element",null],cssClass:["String","ink-calendar bottom"],dateRange:["String",null],displayInSelect:["Boolean",!1],dayField:["Element",null],monthField:["Element",null],yearField:["Element",null],format:["String","yyyy-mm-dd"],nextLinkText:["String","»"],ofText:["String"," of "],onFocus:["Boolean",!0],onMonthSelected:["Function",null],onSetDate:["Function",null],onYearSelected:["Function",null],position:["String","right"],prevLinkText:["String","«"],showClean:["Boolean",!0],showClose:["Boolean",!0],shy:["Boolean",!0],startDate:["String",null],startWeekDay:["Number",1],validDayFn:["Function",null],validMonthFn:["Function",null],validYearFn:["Function",null],nextValidDateFn:["Function",null],prevValidDateFn:["Function",null],yearRange:["String",null],month:["Object",{1:"January",2:"February",3:"March",4:"April",5:"May",6:"June",7:"July",8:"August",9:"September",10:"October",11:"November",12:"December"}],wDay:["Object",{0:"Sunday",1:"Monday",2:"Tuesday",3:"Wednesday",4:"Thursday",5:"Friday",6:"Saturday"}]},l.prototype={_init:function(){this._options.format=this._dateParsers[this._options.format]||this._options.format,this._hoverPicker=!1,this._picker=this._options.pickerField||null,this._setMinMax(this._options.dateRange||this._options.yearRange),this.setDate(this._options.startDate?this._options.startDate:this._element&&this._element.value?this._element.value:new Date),(this._options.startWeekDay<0||this._options.startWeekDay>6)&&(Ink.warn('Ink.UI.DatePicker_1: option "startWeekDay" must be between 0 (sunday) and 6 (saturday)'),this._options.startWeekDay=h(this._options.startWeekDay,0,6)),Ink.extendObj(this._options,this._lang||{}),this._render(),this._listenToContainerObjectEvents() -},_validate:function(){if(this._options.displayInSelect&&!(this._options.dayField&&this._options.monthField&&this._options.yearField))throw new Error("Ink.UI.DatePicker: displayInSelect option enabled.Please specify dayField, monthField and yearField selectors.")},_render:function(){this._containerObject=document.createElement("div"),this._containerObject.className=this._options.cssClass+" ink-datepicker-calendar hide-all",this._renderSuperTopBar();var b=document.createElement("div");b.className="ink-calendar-top",this._monthDescContainer=document.createElement("div"),this._monthDescContainer.className="ink-calendar-month_desc",this._monthPrev=document.createElement("div"),this._monthPrev.className="ink-calendar-prev",this._monthPrev.appendChild(d.create("a",{href:"#prev",className:"change_month_prev",setHTML:this._options.prevLinkText})),this._monthNext=document.createElement("div"),this._monthNext.className="ink-calendar-next",this._monthNext.appendChild(d.create("a",{href:"#next",className:"change_month_next",setHTML:this._options.nextLinkText})),b.appendChild(this._monthPrev),b.appendChild(this._monthDescContainer),b.appendChild(this._monthNext),this._monthContainer=document.createElement("div"),this._monthContainer.className="ink-calendar-month",this._containerObject.appendChild(b),this._containerObject.appendChild(this._monthContainer),this._monthSelector=this._renderMonthSelector(),this._containerObject.appendChild(this._monthSelector),this._yearSelector=document.createElement("ul"),this._yearSelector.className="ink-calendar-year-selector",this._containerObject.appendChild(this._yearSelector),(!this._options.onFocus||this._options.displayInSelect)&&(this._picker=this._options.pickerField?a.elOrSelector(this._options.pickerField,"pickerField"):d.create("a",{href:"#open_cal",setHTML:"open",insertBottom:this._element.parentNode,className:"ink-datepicker-picker-field"})),this._appendDatePickerToDom(),this._renderMonth(),this._monthChanger=d.create("a",{href:"#monthchanger",className:"ink-calendar-link-month",setTextContent:this._options.month[this._month+1]}),this._ofText=d.create("span",{className:"ink-calendar-of-text",setHTML:this._options.ofText}),this._yearChanger=d.create("a",{href:"#yearchanger",className:"ink-calendar-link-year",setTextContent:this._year}),this._monthDescContainer.appendChild(this._monthChanger),this._monthDescContainer.appendChild(this._ofText),this._monthDescContainer.appendChild(this._yearChanger),this._options.inline?this.show():this._addOpenCloseEvents(),this._addDateChangeHandlersToInputs()},_addDateChangeHandlersToInputs:function(){var a=this._element;this._options.displayInSelect&&(a=[this._options.dayField,this._options.monthField,this._options.yearField]),b.observeMulti(a,"change",Ink.bindEvent(function(){this._updateDate(),this._showDefaultView(),this.setDate(),this._inline||this._hoverPicker||this._hide(!0)},this))},show:function(){this._updateDate(),this._renderMonth(),c.removeClassName(this._containerObject,"hide-all")},_addOpenCloseEvents:function(){var a=this._picker||this._element;b.observe(a,"click",Ink.bindEvent(function(a){b.stop(a),this.show()},this)),this._options.autoOpen&&this.show(),this._options.displayInSelect||b.observe(a,"blur",Ink.bindEvent(function(){this._hoverPicker||this._hide(!0)},this)),this._options.shy&&b.observe(document,"click",Ink.bindEvent(function(a){for(var c=b.element(a),e=[this._options.dayField,this._options.monthField,this._options.yearField,this._picker,this._element],f=0,g=e.length;g>f;f++)if(e[f]&&d.descendantOf(e[f],c))return;this._hide(!0)},this))},_renderMonthSelector:function(){var a=document.createElement("ul");a.className="ink-calendar-month-selector";for(var b=document.createElement("ul"),c=1;12>=c;c++)b.appendChild(this._renderMonthButton(c)),c%4===0&&(a.appendChild(b),b=document.createElement("ul"));return a},_renderMonthButton:function(a){var b=document.createElement("li");return b.appendChild(d.create("a",{"data-cal-month":a,setTextContent:this._options.month[a].substring(0,3)})),b},_appendDatePickerToDom:function(){if(this._options.containerElement){var b=a.elOrSelector(this._options.containerElement);b.appendChild(this._containerObject)}var c=e.matchesSelector(this._element.parentNode,".ink-form .control-group .control");c?(this._wrapper=this._element.parentNode,this._wrapperIsControl=!0):(this._wrapper=d.create("div",{className:"ink-datepicker-wrapper"}),d.wrap(this._element,this._wrapper)),d.insertAfter(this._containerObject,this._element)},_renderSuperTopBar:function(){this._options.showClose&&this._options.showClean&&(this._superTopBar=document.createElement("div"),this._superTopBar.className="ink-calendar-top-options",this._options.showClean&&this._superTopBar.appendChild(d.create("a",{className:"clean",setHTML:this._options.cleanText})),this._options.showClose&&this._superTopBar.appendChild(d.create("a",{className:"close",setHTML:this._options.closeText})),this._containerObject.appendChild(this._superTopBar))},_listenToContainerObjectEvents:function(){b.observe(this._containerObject,"mouseover",Ink.bindEvent(function(a){b.stop(a),this._hoverPicker=!0},this)),b.observe(this._containerObject,"mouseout",Ink.bindEvent(function(a){b.stop(a),this._hoverPicker=!1},this)),b.observe(this._containerObject,"click",Ink.bindEvent(this._onClick,this))},_onClick:function(a){var d=b.element(a);return c.hasClassName(d,"ink-calendar-off")?(b.stopDefault(a),null):(b.stop(a),this._onRelativeChangerClick(d),this._onAbsoluteChangerClick(d),c.hasClassName(d,"ink-calendar-link-month")?this._showMonthSelector():c.hasClassName(d,"ink-calendar-link-year")?this._showYearSelector():c.hasClassName(d,"clean")?this._clean():c.hasClassName(d,"close")&&this._hide(!1),void this._updateDescription())},_onRelativeChangerClick:function(a){var b={change_year_next:1,change_year_prev:-1},c={change_month_next:1,change_month_prev:-1};a.className in c?this._updateCal(c[a.className]):a.className in b&&this._showYearSelector(b[a.className])},_onAbsoluteChangerClick:function(a){var b=d.data(a);Number(b.calDay)?(this.setDate(new Date(this._year,this._month,b.calDay)),this._hide()):Number(b.calMonth)?(this._month=Number(b.calMonth)-1,this._showDefaultView(),this._updateCal()):Number(b.calYear)&&this._changeYear(Number(b.calYear))},_changeYear:function(a){a=+a,isNaN(a)||(this._year=a,"function"==typeof this._options.onYearSelected&&this._options.onYearSelected(this,{year:this._year}),this._showMonthSelector())},_clean:function(){this._options.displayInSelect?(this._options.yearField.selectedIndex=0,this._options.monthField.selectedIndex=0,this._options.dayField.selectedIndex=0):this._element.value=""},_hide:function(a){a=void 0===a?!0:a,(a===!1||a&&this._options.shy)&&c.addClassName(this._containerObject,"hide-all")},_setMinMax:function(a){function b(){c._min=d,c._max=e}var c=this,d={_year:-Number.MAX_VALUE,_month:0,_day:1},e={_year:Number.MAX_VALUE,_month:11,_day:31};if(!a)return b();var g=a.split(":"),j=/^(\d{4})((\-)(\d{1,2})((\-)(\d{1,2}))?)?$/;f.each([{name:"_min",date:g[0],noLim:d},{name:"_max",date:g[1],noLim:e}],Ink.bind(function(a){var b=a.noLim;if("NOW"===a.date.toUpperCase()){var c=new Date;b=k(c)}else"EVER"===a.date.toUpperCase()?b=a.noLim:j.test(a.date)&&(b=i(a.date),b._month=h(b._month,0,11),b._day=h(b._day,1,this._daysInMonth(b._year,b._month+1)));this[a.name]=b},this));var l=-1!==this._dateCmp(this._max,this._min);l||b()},_fitDateToRange:function(a){return this._isValidDate(a)||(a=k(new Date)),-1===this._dateCmp(a,this._min)?Ink.extendObj({},this._min):1===this._dateCmp(a,this._max)?Ink.extendObj({},this._max):Ink.extendObj({},a)},_dateWithinRange:function(a){return arguments.length||(a=this),!this._dateAboveMax(a)&&!this._dateBelowMin(a)},_dateAboveMax:function(a){return 1===this._dateCmp(a,this._max)},_dateBelowMin:function(a){return-1===this._dateCmp(a,this._min)},_dateCmp:function(a,b){return this._dateCmpUntil(a,b,"_day")},_dateCmpUntil:function(a,b,c){var d=["_year","_month","_day"],e=-1;do{if(e++,a[d[e]]>b[d[e]])return 1;if(a[d[e]]this._min._year){var f=d.create("li");f.appendChild(d.create("a",{href:"#year_prev",className:"change_year_prev",setHTML:this._options.prevLinkText})),e.appendChild(f)}else e.appendChild(d.create("li",{setHTML:" "}));for(var g=1;11>g;g++)g%4===0&&(e=d.create("ul"),this._yearSelector.appendChild(e)),c=b+g-1,e.appendChild(this._getYearButton(c));if(cthis._max._year||b+9=1&&+a._month+1<=12&&+a._day>=1&&+a._day<=this._daysInMonth(a._year,a._month+1)},_isDate:function(a,b){try{if("undefined"==typeof a)return!1;var c=g.set(a,b);if(c&&this._isValidDate(k(c)))return!0}catch(d){}return!1},_acceptableDay:function(a){return this._acceptableDateComponent(a,"validDayFn")},_acceptableMonth:function(a){return this._acceptableDateComponent(a,"validMonthFn")},_acceptableYear:function(a){return this._acceptableDateComponent(a,"validYearFn")},_acceptableDateComponent:function(a,b){return this._options[b]?this._callUserCallbackBool(this._options[b],a):this._dateWithinRange(a)},_writeDateInFormat:function(){return g.get(this._options.format,this.getDate())},setDate:function(a){if(a&&"function"==typeof a.getDate&&(a=[a.getFullYear(),a.getMonth()+1,a.getDate()].join("-")),/\d{4}-\d{1,2}-\d{1,2}/.test(a)){var b=a.split("-");this._year=+b[0],this._month=+b[1]-1,this._day=+b[2]}this._setDate()},getDate:function(){if(!this._day)throw"Ink.UI.DatePicker: Still picking a date. Cannot getDate now!";return new Date(this._year,this._month,this._day)},_setDate:function(a){if(a){var b=d.data(a);this._day=+b.calDay||this._day}var c=this._fitDateToRange(this);this._year=c._year,this._month=c._month,this._day=c._day,this._options.displayInSelect?(this._options.dayField.value=this._day,this._options.monthField.value=this._month+1,this._options.yearField.value=this._year):this._element.value=this._writeDateInFormat(),this._options.onSetDate&&this._options.onSetDate(this,{date:this.getDate()})},_updateCal:function(a){"function"==typeof this._options.onMonthSelected&&this._options.onMonthSelected(this,{year:this._year,month:this._month}),a&&null===this._updateMonth(a)||this._renderMonth()},_daysInMonth:function(a,b){var c={2:a%400===0||a%4===0&&a%100!==0?29:28,4:30,6:30,9:30,11:30};return c[b]||31},_updateMonth:function(a){var b;return a>0?b=this._getNextMonth():0>a&&(b=this._getPrevMonth()),b?(this._year=b._year,this._month=b._month,void(this._day=b._day)):null},_getNextMonth:function(a){return this._tryLeap(a,"Month","next",function(a){return a._month+=1,a._month>11&&(a._month=0,a._year+=1),a})},_getPrevMonth:function(a){return this._tryLeap(a,"Month","prev",function(a){return a._month-=1,a._month<0&&(a._month=11,a._year-=1),a})},_getPrevYear:function(a){return this._tryLeap(a,"Year","prev",function(a){return a._year-=1,a})},_getNextYear:function(a){return this._tryLeap(a,"Year","next",function(a){return a._year+=1,a})},_tryLeap:function(a,b,c,d){a=a||{_year:this._year,_month:this._month,_day:this._day};var e="prev"===c?"_min":"_max",f=this[e];if(0===this._dateCmpUntil(a,f,b))return null;var g=this._options[c+"ValidDateFn"];if(g)return this._callUserCallbackDate(g,a);a=d(a);var h=this._daysInMonth(a._year,a._month+1);return a._day>h&&(a._day=h),a=this._fitDateToRange(a),this["_acceptable"+b](a)?a:null},_getNextDecade:function(a){a=a||{_year:this._year,_month:this._month,_day:this._day};var b=this._getCurrentDecade(a);return b+10>this._max._year?null:b+10},_getPrevDecade:function(a){a=a||{_year:this._year,_month:this._month,_day:this._day};var b=this._getCurrentDecade(a);return b-10e&&(e+=7),e},_getDayButtons:function(a,b){var c=this._daysInMonth(a,b+1),e=document.createDocumentFragment(),f=d.create("ul");e.appendChild(f);for(var g=this._getFirstDayIndex(a,b),h=0;g>h;h++)f.appendChild(d.create("li",{className:"ink-calendar-empty",setHTML:" "}));for(var i=1;c>=i;i++)(i-1+g)%7===0&&(f=d.create("ul"),e.appendChild(f)),f.appendChild(this._getDayButton(a,b,i));return e},_getDayButton:function(a,b,c){var e={},f=j(a,b,c);this._acceptableDay(f)?(e["data-cal-day"]=c,this._day&&0===this._dateCmp(f,this)&&(e.className="ink-calendar-on")):e.className="ink-calendar-off",e.setTextContent=c;var g=d.create("li");return g.appendChild(d.create("a",e)),g},_getMonthCalendarHeader:function(a){for(var b=d.create("ul",{className:"ink-calendar-header"}),c,e=0;7>e;e++)c=(a+e)%7,b.appendChild(d.create("li",{setTextContent:this._options.wDay[c].substring(0,1)}));return b},_addMonthClassNames:function(a){f.forEach((a||this._monthSelector).getElementsByTagName("a"),Ink.bindMethod(this,"_addMonthButtonClassNames"))},_addMonthButtonClassNames:function(a){var b=d.data(a);if(!b.calMonth)throw"not a calendar month button!";var e=+b.calMonth-1;if(e===this._month)c.addClassName(a,"ink-calendar-on"),c.removeClassName(a,"ink-calendar-off");else{c.removeClassName(a,"ink-calendar-on");var f=!this._acceptableMonth({_year:this._year,_month:e});c.addRemoveClassName(a,"ink-calendar-off",f)}},lang:function(a){this._lang=a},showMonth:function(){this._renderMonth()},isMonthRendered:function(){var a=e.select(".ink-calendar-header",this._containerObject)[0];return"none"!==c.getStyle(a.parentNode,"display")&&"none"!==c.getStyle(a.parentNode.parentNode,"display")},destroy:function(){d.unwrap(this._element),d.remove(this._wrapper),d.remove(this._containerObject),a.unregisterInstance.call(this)}},a.createUIComponent(l),l}),Ink.createModule("Ink.UI.Draggable","1",["Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Browser_1","Ink.Dom.Selector_1","Ink.UI.Common_1"],function(a,b,c,d,e,f){"use strict";function g(a,b,c){return a=Math.min(a,c),a=Math.max(a,b)}function h(){f.BaseUIComponent.apply(this,arguments)}var i=0,j=1;return h._name="Draggable_1",h._optionDefinition={constraint:["String",!1],constraintElm:["Element",!1],top:["Number",!1],right:["Number",!1],bottom:["Number",!1],left:["Number",!1],handle:["Element",!1],revert:["Boolean",!1],cursor:["String","move"],zIndex:["Number",9999],fps:["Number",0],droppableProxy:["Element",!1],mouseAnchor:["String",void 0],dragClass:["String","drag"],skipChildren:["Boolean",!0],onStart:["Function",!1],onEnd:["Function",!1],onDrag:["Function",!1],onChange:["Function",!1]},h.prototype={_init:function(){var a=this._options;this.constraintElm=a.constraintElm&&f.elOrSelector(a.constraintElm),this.handle=!1,this.elmStartPosition=!1,this.active=!1,this.dragged=!1,this.prevCoords=!1,this.placeholder=!1,this.position=!1,this.zindex=!1,this.firstDrag=!0,a.fps&&(this.deltaMs=1e3/a.fps,this.lastRunAt=0),this.handlers={},this.handlers.start=Ink.bindEvent(this._onStart,this),this.handlers.dragFacade=Ink.bindEvent(this._onDragFacade,this),this.handlers.drag=Ink.bindEvent(this._onDrag,this),this.handlers.end=Ink.bindEvent(this._onEnd,this),this.handlers.selectStart=function(a){return b.stop(a),!1},this.handle=this._options.handle?f.elOrSelector(this._options.handle):this._element,this.handle.style.cursor=a.cursor,b.observe(this.handle,"touchstart",this.handlers.start),b.observe(this.handle,"mousedown",this.handlers.start),d.IE&&b.observe(this._element,"selectstart",this.handlers.selectStart)},destroy:function(){b.stopObserving(this.handle,"touchstart",this.handlers.start),b.stopObserving(this.handle,"mousedown",this.handlers.start),d.IE&&b.stopObserving(this._element,"selectstart",this.handlers.selectStart)},_getCoords:function(b){var c=[a.scrollWidth(),a.scrollHeight()];return{x:(b.touches?b.touches[0].clientX:b.clientX)+c[i],y:(b.touches?b.touches[0].clientY:b.clientY)+c[j]}},_cloneStyle:function(b,d){d.className=b.className,d.style.borderWidth="0",d.style.padding="0",d.style.position="absolute",d.style.width=a.elementWidth(b)+"px",d.style.height=a.elementHeight(b)+"px",d.style.left=a.elementLeft(b)+"px",d.style.top=a.elementTop(b)+"px",d.style.cssFloat=c.getStyle(b,"float"),d.style.display=c.getStyle(b,"display")},_onStart:function(d){if(!this.active&&b.isLeftClick(d)||"undefined"==typeof d.button){var e=b.element(d);if(this._options.skipChildren&&e!==this.handle)return;b.stop(d),c.addClassName(this._element,this._options.dragClass),this.elmStartPosition=[a.elementLeft(this._element),a.elementTop(this._element)];var f=[parseInt(c.getStyle(this._element,"left"),10),parseInt(c.getStyle(this._element,"top"),10)],g=a.elementDimensions(this._element);this.originalPosition=[f[i]?f[i]:null,f[j]?f[j]:null],this.delta=this._getCoords(d),this.active=!0,this.position=c.getStyle(this._element,"position"),this.zindex=c.getStyle(this._element,"zIndex");var h=document.createElement("div");if(h.style.position=this.position,h.style.width=g[i]+"px",h.style.height=g[j]+"px",h.style.marginTop=c.getStyle(this._element,"margin-top"),h.style.marginBottom=c.getStyle(this._element,"margin-bottom"),h.style.marginLeft=c.getStyle(this._element,"margin-left"),h.style.marginRight=c.getStyle(this._element,"margin-right"),h.style.borderWidth="0",h.style.padding="0",h.style.cssFloat=c.getStyle(this._element,"float"),h.style.display=c.getStyle(this._element,"display"),h.style.visibility="hidden",this.delta2=[this.delta.x-this.elmStartPosition[i],this.delta.y-this.elmStartPosition[j]],this._options.mouseAnchor){var k=this._options.mouseAnchor.split(" "),l=[g[i],g[j]];"left"===k[0]?l[i]=0:"center"===k[0]&&(l[i]=parseInt(l[i]/2,10)),"top"===k[1]?l[j]=0:"center"===k[1]&&(l[j]=parseInt(l[j]/2,10)),this.applyDelta=[this.delta2[i]-l[i],this.delta2[j]-l[j]]}var m=this._options.fps?"dragFacade":"drag";if(this.placeholder=h,this._options.onStart&&this._options.onStart(this._element,d),this._options.droppableProxy){this.proxy=document.createElement("div"),g=[window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight];var n=this.proxy.style;n.width=g[i]+"px",n.height=g[j]+"px",n.position="fixed",n.left="0",n.top="0",n.zIndex=this._options.zIndex+1,n.backgroundColor="#FF0000",c.setOpacity(this.proxy,0);for(var o=document.body.firstChild;o&&1!==o.nodeType;)o=o.nextSibling;document.body.insertBefore(this.proxy,o),b.observe(this.proxy,"mousemove",this.handlers[m]),b.observe(this.proxy,"touchmove",this.handlers[m])}else b.observe(document,"mousemove",this.handlers[m]);return this._element.style.position="absolute",this._element.style.zIndex=this._options.zIndex,this._element.parentNode.insertBefore(this.placeholder,this._element),this._onDrag(d),b.observe(document,"mouseup",this.handlers.end),b.observe(document,"touchend",this.handlers.end),!1}},_onDragFacade:function(a){var b=+new Date;(!this.lastRunAt||b>this.lastRunAt+this.deltaMs)&&(this.lastRunAt=b,this._onDrag(a))},_onDrag:function(c){if(this.active){b.stop(c),this.dragged=!0;var d=this._getCoords(c),e=d.x,f=d.y,h=this._options,k=!1,l=!1;if(this.prevCoords&&e!==this.prevCoords.x||f!==this.prevCoords.y){h.onDrag&&h.onDrag(this._element,c),this.prevCoords=d,k=this.elmStartPosition[i]+e-this.delta.x,l=this.elmStartPosition[j]+f-this.delta.y;var m=a.elementDimensions(this._element);if(this.constraintElm){var n=a.offset(this.constraintElm),o=a.elementDimensions(this.constraintElm),p=n[j]+(h.top||0),q=n[j]+o[j]-(h.bottom||0),r=n[i]+(h.left||0),s=n[i]+o[i]-(h.right||0);l=g(l,p,q-m[j]),k=g(k,r,s-m[i])}else if(h.constraint){var t=h.right===!1?a.pageWidth()-m[i]:h.right,u=h.left===!1?0:h.left,v=h.top===!1?0:h.top,w=h.bottom===!1?a.pageHeight()-m[j]:h.bottom;("horizontal"===h.constraint||"both"===h.constraint)&&(k=g(k,u,t)),("vertical"===h.constraint||"both"===h.constraint)&&(l=g(l,v,w))}var x=Ink.getModule("Ink.UI.Droppable_1");if(this.firstDrag&&(x&&x.updateAll(),this.firstDrag=!1),k&&(this._element.style.left=k+"px"),l&&(this._element.style.top=l+"px"),x){var y=this._options.mouseAnchor?{x:e-this.applyDelta[i],y:f-this.applyDelta[j]}:d;x.action(y,"drag",c,this._element)}h.onChange&&h.onChange(this)}}},_onEnd:function(d){if(b.stopObserving(document,"mousemove",this.handlers.drag),b.stopObserving(document,"touchmove",this.handlers.drag),this._options.fps&&this._onDrag(d),c.removeClassName(this._element,this._options.dragClass),this.active&&this.dragged){this._options.droppableProxy&&document.body.removeChild(this.proxy),this.pt&&(a.remove(this.pt),this.pt=void 0),this.placeholder&&a.remove(this.placeholder),this._options.revert&&(this._element.style.position=this.position,this._element.style.zIndex=null!==this.zindex?this.zindex:"auto",this._element.style.left=this.originalPosition[i]?this.originalPosition[i]+"px":"",this._element.style.top=this.originalPosition[j]?this.originalPosition[j]+"px":""),this._options.onEnd&&this._options.onEnd(this._element,d);var e=Ink.getModule("Ink.UI.Droppable_1");e&&e.action(this._getCoords(d),"drop",d,this._element),this.position=!1,this.zindex=!1,this.firstDrag=!0}this.active=!1,this.dragged=!1}},f.createUIComponent(h),h}),Ink.createModule("Ink.UI.Drawer","1",["Ink.UI.Common_1","Ink.Dom.Loaded_1","Ink.Dom.Selector_1","Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Css_1"],function(a,b,c,d,e,f){"use strict";function g(a){if(document.addEventListener){m&&h();var b=!1;m=function(c){return"mousedown"===c.type||"mouseup"===c.type?void(b="mousedown"===c.type):void(b||a(c.target))},document.addEventListener("focus",m,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("mouseup",m,!0)}}function h(){document.addEventListener&&m&&(document.removeEventListener("focus",m,!0),document.removeEventListener("mousedown",m,!0),document.removeEventListener("mouseup",m,!0),m=null)}function i(a){for(var b=Ink.ss("[tabindex]",a),c=null,d=null,e=0;ef)&&(c=f,d=b[e])}if(d)return d.focus(),!0;var g=Ink.s(l,a);return g?(g.focus(),!0):!1}function j(a){return'Ink.UI.Drawer_1: Could not find the "'+a+'" element on this page. Please make sure it exists.'}function k(b,c){a.isDOMElement(b)||(c=b),a.BaseUIComponent.apply(this,[document.body,c])}var l=['[tabindex]:not([tabindex="-1"])',"input","select","textarea","button","object","a[href]","area"].join(","),m=null,n=function(a){var b={WebkitTransitionProperty:"webkitTransitionEnd",transitionProperty:"transitionend"};for(var c in b)if(b.hasOwnProperty(c)&&void 0!==a.style[c])return{styleProp:c,eventName:b[c]};return!1}(document.createElement("div"));return k.transitionSupport=n,k._name="Drawer_1",k._optionDefinition={parentSelector:["String",".ink-drawer"],leftDrawer:["String",".left-drawer"],leftTrigger:["String",".left-drawer-trigger"],rightDrawer:["String",".right-drawer"],rightTrigger:["String",".right-drawer-trigger"],contentDrawer:["String",".content-drawer"],mode:["String","push"],sides:["String","both"]},k.prototype={_init:function(){function a(a){a.drawer&&a.triggers.length?b=!0:c=j(a.drawer?a.drawerOption:a.triggerOption)}if(this._contentDrawers=Ink.ss(this._options.contentDrawer),this._leftDrawer=Ink.s(this._options.leftDrawer),this._leftTriggers=Ink.ss(this._options.leftTrigger),this._rightDrawer=Ink.s(this._options.rightDrawer),this._rightTriggers=Ink.ss(this._options.rightTrigger),f.addClassName(document.body,"ink-drawer"),0===this._contentDrawers.length)throw new Error('Ink.UI.Drawer_1: Could not find any "'+this._options.contentDrawer+'" elements on this page. Please make sure you have at least one.');switch(this._options.sides){case"both":this._triggers=this._options.leftTrigger+", "+this._options.rightTrigger+", "+this._options.contentDrawer;break;case"left":this._triggers=this._options.leftTrigger+", "+this._options.contentDrawer;break;case"right":this._triggers=this._options.rightTrigger+", "+this._options.contentDrawer}var b=!1,c=null;("left"===this._options.sides||"both"===this._options.sides)&&a({name:"left",drawer:this._leftDrawer,drawerOption:this._options.leftDrawer,triggers:this._leftTriggers,triggerOption:this._options.leftTrigger}),("right"===this._options.sides||"both"===this._options.sides)&&a({name:"right",drawer:this._rightDrawer,drawerOption:this._options.rightDrawer,triggers:this._rightTriggers,triggerOption:this._options.rightTrigger}),b||Ink.warn(c),this._isOpen=!1,this._direction=void 0,this._handlers={click:Ink.bindEvent(this._onClick,this),afterTransition:Ink.bindEvent(this._afterTransition,this)},this._addEvents()},_onClick:function(a){var b=d.findUpwardsBySelector(a.currentTarget,this._options.leftTrigger)?"left":d.findUpwardsBySelector(a.currentTarget,this._options.rightTrigger)?"right":null;if(b)return void this._onTriggerClicked(a,b);if(this._isOpen){var c=d.findUpwardsBySelector(a.currentTarget,this._options.contentDrawer),e=d.isLink(a.target);(c||e)&&this.close(),c&&a.preventDefault()}},_onTriggerClicked:function(a,b){this._isOpen?this.close():this.open(b),a.preventDefault()},_afterTransition:function(){this._isOpen||f.removeClassName(this._getRecentDrawer(),"show")},_addEvents:function(){e.on(document.body,"click",this._triggers+', a[href*="#"]',this._handlers.click)},_getRecentDrawer:function(){return"left"===this._direction?this._leftDrawer:"right"===this._direction?this._rightDrawer:null},open:function(a){this._isOpen=!0,this._direction=a;var b=this._getRecentDrawer();f.addClassName(b,"show"),setTimeout(Ink.bind(function(){f.addClassName(document.body,[this._options.mode,a])},this),0),n&&this._transitionWillOccur(b)&&e.one(b,n.eventName,function(){f.removeClassName(b,"show");var a=+b.offsetWidth;f.addClassName(b,"show")});var c=document.activeElement,j=i(b);g(Ink.bind(function(a){var e=d.isAncestorOf(b,a);e||(this.close(),h(),j&&c&&c.focus())},this))},_transitionWillOccur:function(a){return!(!n||!f.getStyle(a,n.styleProp))},close:function(){if(this._isOpen!==!1){var a=this._getRecentDrawer();if(a){h(),this._isOpen=!1;var b=null;n&&(b=this._transitionWillOccur(this._getRecentDrawer())),f.removeClassName(document.body,[this._options.mode,this._direction]),b?e.one(document.body,n.eventName,this._handlers.afterTransition):this._handlers.afterTransition()}}}},a.createUIComponent(k),k}),Ink.createModule("Ink.UI.Dropdown","1",["Ink.UI.Common_1","Ink.UI.Toggle_1","Ink.Dom.Event_1","Ink.Dom.Element_1"],function(a,b,c,d){"use strict";function e(){a.BaseUIComponent.apply(this,arguments)}return e._name="Dropdown_1",e._optionDefinition={target:["Element"],hoverOpen:["Number",null],dismissOnInsideClick:["Boolean",!1],dismissOnOutsideClick:["Boolean",!0],dismissAfter:["Number",null],onInsideClick:["Function",null],onOutsideClick:["Function",null],onOpen:["Function",null],onDismiss:["Function",null]},e.prototype={_init:function(){this._toggle=new b(this._element,{target:this._options.target,closeOnInsideClick:null,closeOnClick:!1,onChangeState:Ink.bind(function(a){return this._openOrDismiss(a,!0,!0)},this)}),c.observeMulti([this._options.target,this._element],"mouseout",Ink.bindMethod(this,"_onMouseOut")),c.observeMulti([this._options.target,this._element],"mouseover",Ink.bindMethod(this,"_onMouseOver")),c.observe(this._options.target,"click",Ink.bindMethod(this,"_onInsideClick")),c.observe(document,"click",Ink.bindMethod(this,"_onOutsideClick"))},_onMouseOver:function(){"number"==typeof this._options.hoverOpen&&this._toggle.getState()===!1&&(clearTimeout(this._openTimeout),this._openTimeout=setTimeout(Ink.bindMethod(this,"open",!0),1e3*this._options.hoverOpen)),"number"==typeof this._options.dismissAfter&&clearTimeout(this._dismissTimeout)},_onMouseOut:function(){"number"==typeof this._options.dismissAfter&&this._toggle.getState()===!0&&(clearTimeout(this._dismissTimeout),this._dismissTimeout=setTimeout(Ink.bindMethod(this,"dismiss",!0),1e3*this._options.dismissAfter)),"number"==typeof this._options.hoverOpen&&clearTimeout(this._openTimeout)},_onInsideClick:function(a){var b=this._handlerCall("onInsideClick",c.element(a));b!==!1&&this._options.dismissOnInsideClick&&this.dismiss(!0)},_onOutsideClick:function(a){var b=c.element(a),e=d.findUpwardsHaving(b,Ink.bind(function(a){return a===this._element},this)),f=d.findUpwardsHaving(b,Ink.bind(function(a){return a===this._options.target},this));if(!e&&!f){var g=this._handlerCall("onOutsideClick",b);if(g===!1)return;this._options.dismissOnOutsideClick&&this.dismiss(!0)}},dismiss:function(a){this._openOrDismiss(!1,a,arguments[1])},open:function(a){this._openOrDismiss(!0,a,arguments[1])},_openOrDismiss:function(a,b,c){if(!this._toggle||this._toggle.getState()!==a){if(b&&this._handlerCall(a?"onOpen":"onDismiss")===!1)return!1; +},_validate:function(){if(this._options.displayInSelect&&!(this._options.dayField&&this._options.monthField&&this._options.yearField))throw new Error("Ink.UI.DatePicker: displayInSelect option enabled.Please specify dayField, monthField and yearField selectors.")},_render:function(){this._containerObject=document.createElement("div"),this._containerObject.className=this._options.cssClass+" ink-datepicker-calendar hide-all",this._renderSuperTopBar();var b=document.createElement("div");b.className="ink-calendar-top",this._monthDescContainer=document.createElement("div"),this._monthDescContainer.className="ink-calendar-month_desc",this._monthPrev=document.createElement("div"),this._monthPrev.className="ink-calendar-prev",this._monthPrev.appendChild(d.create("a",{href:"#prev",className:"change_month_prev",setHTML:this._options.prevLinkText})),this._monthNext=document.createElement("div"),this._monthNext.className="ink-calendar-next",this._monthNext.appendChild(d.create("a",{href:"#next",className:"change_month_next",setHTML:this._options.nextLinkText})),b.appendChild(this._monthPrev),b.appendChild(this._monthDescContainer),b.appendChild(this._monthNext),this._monthContainer=document.createElement("div"),this._monthContainer.className="ink-calendar-month",this._containerObject.appendChild(b),this._containerObject.appendChild(this._monthContainer),this._monthSelector=this._renderMonthSelector(),this._containerObject.appendChild(this._monthSelector),this._yearSelector=document.createElement("ul"),this._yearSelector.className="ink-calendar-year-selector",this._containerObject.appendChild(this._yearSelector),(!this._options.onFocus||this._options.displayInSelect)&&(this._picker=this._options.pickerField?a.elOrSelector(this._options.pickerField,"pickerField"):d.create("a",{href:"#open_cal",setHTML:"open",insertBottom:this._element.parentNode,className:"ink-datepicker-picker-field"})),this._appendDatePickerToDom(),this._renderMonth(),this._monthChanger=d.create("a",{href:"#monthchanger",className:"ink-calendar-link-month",setTextContent:this._options.month[this._month+1]}),this._ofText=d.create("span",{className:"ink-calendar-of-text",setHTML:this._options.ofText}),this._yearChanger=d.create("a",{href:"#yearchanger",className:"ink-calendar-link-year",setTextContent:this._year}),this._monthDescContainer.appendChild(this._monthChanger),this._monthDescContainer.appendChild(this._ofText),this._monthDescContainer.appendChild(this._yearChanger),this._options.inline?this.show():this._addOpenCloseEvents(),this._addDateChangeHandlersToInputs()},_addDateChangeHandlersToInputs:function(){var a=this._element;this._options.displayInSelect&&(a=[this._options.dayField,this._options.monthField,this._options.yearField]),b.observeMulti(a,"change",Ink.bindEvent(function(){this._updateDate(),this._showDefaultView(),this.setDate(),this._inline||this._hoverPicker||this._hide(!0)},this))},show:function(){this._updateDate(),this._renderMonth(),c.removeClassName(this._containerObject,"hide-all")},_addOpenCloseEvents:function(){var a=this._picker||this._element;b.observe(a,"click",Ink.bindEvent(function(a){b.stop(a),this.show()},this)),this._options.autoOpen&&this.show(),this._options.displayInSelect||b.observe(a,"blur",Ink.bindEvent(function(){this._hoverPicker||this._hide(!0)},this)),this._options.shy&&b.observe(document,"click",Ink.bindEvent(function(a){for(var c=b.element(a),e=[this._options.dayField,this._options.monthField,this._options.yearField,this._picker,this._element],f=0,g=e.length;g>f;f++)if(e[f]&&d.descendantOf(e[f],c))return;this._hide(!0)},this))},_renderMonthSelector:function(){var a=document.createElement("ul");a.className="ink-calendar-month-selector";for(var b=document.createElement("ul"),c=1;12>=c;c++)b.appendChild(this._renderMonthButton(c)),c%4===0&&(a.appendChild(b),b=document.createElement("ul"));return a},_renderMonthButton:function(a){var b=document.createElement("li");return b.appendChild(d.create("a",{"data-cal-month":a,setTextContent:this._options.month[a].substring(0,3)})),b},_appendDatePickerToDom:function(){if(this._options.containerElement){var b=a.elOrSelector(this._options.containerElement);b.appendChild(this._containerObject)}var c=e.matchesSelector(this._element.parentNode,".ink-form .control-group .control, .ink-form .control-group .control > *");c?(this._wrapper=this._element.parentNode,this._wrapperIsControl=!0):(this._wrapper=d.create("div",{className:"ink-datepicker-wrapper"}),d.wrap(this._element,this._wrapper)),d.insertAfter(this._containerObject,this._element)},_renderSuperTopBar:function(){this._options.showClose&&this._options.showClean&&(this._superTopBar=document.createElement("div"),this._superTopBar.className="ink-calendar-top-options",this._options.showClean&&this._superTopBar.appendChild(d.create("a",{className:"clean",setHTML:this._options.cleanText})),this._options.showClose&&this._superTopBar.appendChild(d.create("a",{className:"close",setHTML:this._options.closeText})),this._containerObject.appendChild(this._superTopBar))},_listenToContainerObjectEvents:function(){b.observe(this._containerObject,"mouseover",Ink.bindEvent(function(a){b.stop(a),this._hoverPicker=!0},this)),b.observe(this._containerObject,"mouseout",Ink.bindEvent(function(a){b.stop(a),this._hoverPicker=!1},this)),b.observe(this._containerObject,"click",Ink.bindEvent(this._onClick,this))},_onClick:function(a){var d=b.element(a);return c.hasClassName(d,"ink-calendar-off")?(b.stopDefault(a),null):(b.stop(a),this._onRelativeChangerClick(d),this._onAbsoluteChangerClick(d),c.hasClassName(d,"ink-calendar-link-month")?this._showMonthSelector():c.hasClassName(d,"ink-calendar-link-year")?this._showYearSelector():c.hasClassName(d,"clean")?this._clean():c.hasClassName(d,"close")&&this._hide(!1),void this._updateDescription())},_onRelativeChangerClick:function(a){var b={change_year_next:1,change_year_prev:-1},c={change_month_next:1,change_month_prev:-1};a.className in c?this._updateCal(c[a.className]):a.className in b&&this._showYearSelector(b[a.className])},_onAbsoluteChangerClick:function(a){var b=d.data(a);Number(b.calDay)?(this.setDate(new Date(this._year,this._month,b.calDay)),this._hide()):Number(b.calMonth)?(this._month=Number(b.calMonth)-1,this._showDefaultView(),this._updateCal()):Number(b.calYear)&&this._changeYear(Number(b.calYear))},_changeYear:function(a){a=+a,isNaN(a)||(this._year=a,"function"==typeof this._options.onYearSelected&&this._options.onYearSelected(this,{year:this._year}),this._showMonthSelector())},_clean:function(){this._options.displayInSelect?(this._options.yearField.selectedIndex=0,this._options.monthField.selectedIndex=0,this._options.dayField.selectedIndex=0):this._element.value=""},_hide:function(a){a=void 0===a?!0:a,(a===!1||a&&this._options.shy)&&c.addClassName(this._containerObject,"hide-all")},_setMinMax:function(a){function b(){c._min=d,c._max=e}var c=this,d={_year:-Number.MAX_VALUE,_month:0,_day:1},e={_year:Number.MAX_VALUE,_month:11,_day:31};if(!a)return b();var g=a.split(":"),j=/^(\d{4})((\-)(\d{1,2})((\-)(\d{1,2}))?)?$/;f.each([{name:"_min",date:g[0],noLim:d},{name:"_max",date:g[1],noLim:e}],Ink.bind(function(a){var b=a.noLim;if("NOW"===a.date.toUpperCase()){var c=new Date;b=k(c)}else"EVER"===a.date.toUpperCase()?b=a.noLim:j.test(a.date)&&(b=i(a.date),b._month=h(b._month,0,11),b._day=h(b._day,1,this._daysInMonth(b._year,b._month+1)));this[a.name]=b},this));var l=-1!==this._dateCmp(this._max,this._min);l||b()},_fitDateToRange:function(a){return this._isValidDate(a)||(a=k(new Date)),-1===this._dateCmp(a,this._min)?Ink.extendObj({},this._min):1===this._dateCmp(a,this._max)?Ink.extendObj({},this._max):Ink.extendObj({},a)},_dateWithinRange:function(a){return arguments.length||(a=this),!this._dateAboveMax(a)&&!this._dateBelowMin(a)},_dateAboveMax:function(a){return 1===this._dateCmp(a,this._max)},_dateBelowMin:function(a){return-1===this._dateCmp(a,this._min)},_dateCmp:function(a,b){return this._dateCmpUntil(a,b,"_day")},_dateCmpUntil:function(a,b,c){var d=["_year","_month","_day"],e=-1;do{if(e++,a[d[e]]>b[d[e]])return 1;if(a[d[e]]this._min._year){var f=d.create("li");f.appendChild(d.create("a",{href:"#year_prev",className:"change_year_prev",setHTML:this._options.prevLinkText})),e.appendChild(f)}else e.appendChild(d.create("li",{setHTML:" "}));for(var g=1;11>g;g++)g%4===0&&(e=d.create("ul"),this._yearSelector.appendChild(e)),c=b+g-1,e.appendChild(this._getYearButton(c));if(cthis._max._year||b+9=1&&+a._month+1<=12&&+a._day>=1&&+a._day<=this._daysInMonth(a._year,a._month+1)},_isDate:function(a,b){try{if("undefined"==typeof a)return!1;var c=g.set(a,b);if(c&&this._isValidDate(k(c)))return!0}catch(d){}return!1},_acceptableDay:function(a){return this._acceptableDateComponent(a,"validDayFn")},_acceptableMonth:function(a){return this._acceptableDateComponent(a,"validMonthFn")},_acceptableYear:function(a){return this._acceptableDateComponent(a,"validYearFn")},_acceptableDateComponent:function(a,b){return this._options[b]?this._callUserCallbackBool(this._options[b],a):this._dateWithinRange(a)},_writeDateInFormat:function(){return g.get(this._options.format,this.getDate())},setDate:function(a){if(a&&"function"==typeof a.getDate&&(a=[a.getFullYear(),a.getMonth()+1,a.getDate()].join("-")),/\d{4}-\d{1,2}-\d{1,2}/.test(a)){var b=a.split("-");this._year=+b[0],this._month=+b[1]-1,this._day=+b[2]}this._setDate()},getDate:function(){if(!this._day)throw"Ink.UI.DatePicker: Still picking a date. Cannot getDate now!";return new Date(this._year,this._month,this._day)},_setDate:function(a){if(a){var b=d.data(a);this._day=+b.calDay||this._day}var c=this._fitDateToRange(this);this._year=c._year,this._month=c._month,this._day=c._day,this._options.displayInSelect?(this._options.dayField.value=this._day,this._options.monthField.value=this._month+1,this._options.yearField.value=this._year):this._element.value=this._writeDateInFormat(),this._options.onSetDate&&this._options.onSetDate(this,{date:this.getDate()})},_updateCal:function(a){"function"==typeof this._options.onMonthSelected&&this._options.onMonthSelected(this,{year:this._year,month:this._month}),a&&null===this._updateMonth(a)||this._renderMonth()},_daysInMonth:function(a,b){var c={2:a%400===0||a%4===0&&a%100!==0?29:28,4:30,6:30,9:30,11:30};return c[b]||31},_updateMonth:function(a){var b;return a>0?b=this._getNextMonth():0>a&&(b=this._getPrevMonth()),b?(this._year=b._year,this._month=b._month,void(this._day=b._day)):null},_getNextMonth:function(a){return this._tryLeap(a,"Month","next",function(a){return a._month+=1,a._month>11&&(a._month=0,a._year+=1),a})},_getPrevMonth:function(a){return this._tryLeap(a,"Month","prev",function(a){return a._month-=1,a._month<0&&(a._month=11,a._year-=1),a})},_getPrevYear:function(a){return this._tryLeap(a,"Year","prev",function(a){return a._year-=1,a})},_getNextYear:function(a){return this._tryLeap(a,"Year","next",function(a){return a._year+=1,a})},_tryLeap:function(a,b,c,d){a=a||{_year:this._year,_month:this._month,_day:this._day};var e="prev"===c?"_min":"_max",f=this[e];if(0===this._dateCmpUntil(a,f,b))return null;var g=this._options[c+"ValidDateFn"];if(g)return this._callUserCallbackDate(g,a);a=d(a);var h=this._daysInMonth(a._year,a._month+1);return a._day>h&&(a._day=h),a=this._fitDateToRange(a),this["_acceptable"+b](a)?a:null},_getNextDecade:function(a){a=a||{_year:this._year,_month:this._month,_day:this._day};var b=this._getCurrentDecade(a);return b+10>this._max._year?null:b+10},_getPrevDecade:function(a){a=a||{_year:this._year,_month:this._month,_day:this._day};var b=this._getCurrentDecade(a);return b-10e&&(e+=7),e},_getDayButtons:function(a,b){var c=this._daysInMonth(a,b+1),e=document.createDocumentFragment(),f=d.create("ul");e.appendChild(f);for(var g=this._getFirstDayIndex(a,b),h=0;g>h;h++)f.appendChild(d.create("li",{className:"ink-calendar-empty",setHTML:" "}));for(var i=1;c>=i;i++)(i-1+g)%7===0&&(f=d.create("ul"),e.appendChild(f)),f.appendChild(this._getDayButton(a,b,i));return e},_getDayButton:function(a,b,c){var e={},f=j(a,b,c);this._acceptableDay(f)?(e["data-cal-day"]=c,this._day&&0===this._dateCmp(f,this)&&(e.className="ink-calendar-on")):e.className="ink-calendar-off",e.setTextContent=c;var g=d.create("li");return g.appendChild(d.create("a",e)),g},_getMonthCalendarHeader:function(a){for(var b=d.create("ul",{className:"ink-calendar-header"}),c,e=0;7>e;e++)c=(a+e)%7,b.appendChild(d.create("li",{setTextContent:this._options.wDay[c].substring(0,1)}));return b},_addMonthClassNames:function(a){f.forEach((a||this._monthSelector).getElementsByTagName("a"),Ink.bindMethod(this,"_addMonthButtonClassNames"))},_addMonthButtonClassNames:function(a){var b=d.data(a);if(!b.calMonth)throw"not a calendar month button!";var e=+b.calMonth-1;if(e===this._month)c.addClassName(a,"ink-calendar-on"),c.removeClassName(a,"ink-calendar-off");else{c.removeClassName(a,"ink-calendar-on");var f=!this._acceptableMonth({_year:this._year,_month:e});c.addRemoveClassName(a,"ink-calendar-off",f)}},lang:function(a){this._lang=a},showMonth:function(){this._renderMonth()},isMonthRendered:function(){var a=e.select(".ink-calendar-header",this._containerObject)[0];return"none"!==c.getStyle(a.parentNode,"display")&&"none"!==c.getStyle(a.parentNode.parentNode,"display")},destroy:function(){d.unwrap(this._element),d.remove(this._wrapper),d.remove(this._containerObject),a.unregisterInstance.call(this)}},a.createUIComponent(l),l}),Ink.createModule("Ink.UI.Draggable","1",["Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Browser_1","Ink.Dom.Selector_1","Ink.UI.Common_1"],function(a,b,c,d,e,f){"use strict";function g(a,b,c){return a=Math.min(a,c),a=Math.max(a,b)}function h(){f.BaseUIComponent.apply(this,arguments)}var i=0,j=1;return h._name="Draggable_1",h._optionDefinition={constraint:["String",!1],constraintElm:["Element",!1],top:["Number",!1],right:["Number",!1],bottom:["Number",!1],left:["Number",!1],handle:["Element",!1],revert:["Boolean",!1],cursor:["String","move"],zIndex:["Number",9999],fps:["Number",0],droppableProxy:["Element",!1],mouseAnchor:["String",void 0],dragClass:["String","drag"],skipChildren:["Boolean",!0],onStart:["Function",!1],onEnd:["Function",!1],onDrag:["Function",!1],onChange:["Function",!1]},h.prototype={_init:function(){var a=this._options;this.constraintElm=a.constraintElm&&f.elOrSelector(a.constraintElm),this.handle=!1,this.elmStartPosition=!1,this.active=!1,this.dragged=!1,this.prevCoords=!1,this.placeholder=!1,this.position=!1,this.zindex=!1,this.firstDrag=!0,a.fps&&(this.deltaMs=1e3/a.fps,this.lastRunAt=0),this.handlers={},this.handlers.start=Ink.bindEvent(this._onStart,this),this.handlers.dragFacade=Ink.bindEvent(this._onDragFacade,this),this.handlers.drag=Ink.bindEvent(this._onDrag,this),this.handlers.end=Ink.bindEvent(this._onEnd,this),this.handlers.selectStart=function(a){return b.stop(a),!1},this.handle=this._options.handle?f.elOrSelector(this._options.handle):this._element,this.handle.style.cursor=a.cursor,b.observe(this.handle,"touchstart",this.handlers.start),b.observe(this.handle,"mousedown",this.handlers.start),d.IE&&b.observe(this._element,"selectstart",this.handlers.selectStart)},destroy:function(){b.stopObserving(this.handle,"touchstart",this.handlers.start),b.stopObserving(this.handle,"mousedown",this.handlers.start),d.IE&&b.stopObserving(this._element,"selectstart",this.handlers.selectStart)},_getCoords:function(b){var c=[a.scrollWidth(),a.scrollHeight()];return{x:(b.touches?b.touches[0].clientX:b.clientX)+c[i],y:(b.touches?b.touches[0].clientY:b.clientY)+c[j]}},_cloneStyle:function(b,d){d.className=b.className,d.style.borderWidth="0",d.style.padding="0",d.style.position="absolute",d.style.width=a.elementWidth(b)+"px",d.style.height=a.elementHeight(b)+"px",d.style.left=a.elementLeft(b)+"px",d.style.top=a.elementTop(b)+"px",d.style.cssFloat=c.getStyle(b,"float"),d.style.display=c.getStyle(b,"display")},_onStart:function(d){if(!this.active&&b.isLeftClick(d)||"undefined"==typeof d.button){var e=b.element(d);if(this._options.skipChildren&&e!==this.handle)return;b.stop(d),c.addClassName(this._element,this._options.dragClass),this.elmStartPosition=[a.elementLeft(this._element),a.elementTop(this._element)];var f=[parseInt(c.getStyle(this._element,"left"),10),parseInt(c.getStyle(this._element,"top"),10)],g=a.elementDimensions(this._element);this.originalPosition=[f[i]?f[i]:null,f[j]?f[j]:null],this.delta=this._getCoords(d),this.active=!0,this.position=c.getStyle(this._element,"position"),this.zindex=c.getStyle(this._element,"zIndex");var h=document.createElement("div");if(h.style.position=this.position,h.style.width=g[i]+"px",h.style.height=g[j]+"px",h.style.marginTop=c.getStyle(this._element,"margin-top"),h.style.marginBottom=c.getStyle(this._element,"margin-bottom"),h.style.marginLeft=c.getStyle(this._element,"margin-left"),h.style.marginRight=c.getStyle(this._element,"margin-right"),h.style.borderWidth="0",h.style.padding="0",h.style.cssFloat=c.getStyle(this._element,"float"),h.style.display=c.getStyle(this._element,"display"),h.style.visibility="hidden",this.delta2=[this.delta.x-this.elmStartPosition[i],this.delta.y-this.elmStartPosition[j]],this._options.mouseAnchor){var k=this._options.mouseAnchor.split(" "),l=[g[i],g[j]];"left"===k[0]?l[i]=0:"center"===k[0]&&(l[i]=parseInt(l[i]/2,10)),"top"===k[1]?l[j]=0:"center"===k[1]&&(l[j]=parseInt(l[j]/2,10)),this.applyDelta=[this.delta2[i]-l[i],this.delta2[j]-l[j]]}var m=this._options.fps?"dragFacade":"drag";if(this.placeholder=h,this._options.onStart&&this._options.onStart(this._element,d),this._options.droppableProxy){this.proxy=document.createElement("div"),g=[window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight];var n=this.proxy.style;n.width=g[i]+"px",n.height=g[j]+"px",n.position="fixed",n.left="0",n.top="0",n.zIndex=this._options.zIndex+1,n.backgroundColor="#FF0000",c.setOpacity(this.proxy,0);for(var o=document.body.firstChild;o&&1!==o.nodeType;)o=o.nextSibling;document.body.insertBefore(this.proxy,o),b.observe(this.proxy,"mousemove",this.handlers[m]),b.observe(this.proxy,"touchmove",this.handlers[m])}else b.observe(document,"mousemove",this.handlers[m]);return this._element.style.position="absolute",this._element.style.zIndex=this._options.zIndex,this._element.parentNode.insertBefore(this.placeholder,this._element),this._onDrag(d),b.observe(document,"mouseup",this.handlers.end),b.observe(document,"touchend",this.handlers.end),!1}},_onDragFacade:function(a){var b=+new Date;(!this.lastRunAt||b>this.lastRunAt+this.deltaMs)&&(this.lastRunAt=b,this._onDrag(a))},_onDrag:function(c){if(this.active){b.stop(c),this.dragged=!0;var d=this._getCoords(c),e=d.x,f=d.y,h=this._options,k=!1,l=!1;if(this.prevCoords&&e!==this.prevCoords.x||f!==this.prevCoords.y){h.onDrag&&h.onDrag(this._element,c),this.prevCoords=d,k=this.elmStartPosition[i]+e-this.delta.x,l=this.elmStartPosition[j]+f-this.delta.y;var m=a.elementDimensions(this._element);if(this.constraintElm){var n=a.offset(this.constraintElm),o=a.elementDimensions(this.constraintElm),p=n[j]+(h.top||0),q=n[j]+o[j]-(h.bottom||0),r=n[i]+(h.left||0),s=n[i]+o[i]-(h.right||0);l=g(l,p,q-m[j]),k=g(k,r,s-m[i])}else if(h.constraint){var t=h.right===!1?a.pageWidth()-m[i]:h.right,u=h.left===!1?0:h.left,v=h.top===!1?0:h.top,w=h.bottom===!1?a.pageHeight()-m[j]:h.bottom;("horizontal"===h.constraint||"both"===h.constraint)&&(k=g(k,u,t)),("vertical"===h.constraint||"both"===h.constraint)&&(l=g(l,v,w))}var x=Ink.getModule("Ink.UI.Droppable_1");if(this.firstDrag&&(x&&x.updateAll(),this.firstDrag=!1),k&&(this._element.style.left=k+"px"),l&&(this._element.style.top=l+"px"),x){var y=this._options.mouseAnchor?{x:e-this.applyDelta[i],y:f-this.applyDelta[j]}:d;x.action(y,"drag",c,this._element)}h.onChange&&h.onChange(this)}}},_onEnd:function(d){if(b.stopObserving(document,"mousemove",this.handlers.drag),b.stopObserving(document,"touchmove",this.handlers.drag),this._options.fps&&this._onDrag(d),c.removeClassName(this._element,this._options.dragClass),this.active&&this.dragged){this._options.droppableProxy&&document.body.removeChild(this.proxy),this.pt&&(a.remove(this.pt),this.pt=void 0),this.placeholder&&a.remove(this.placeholder),this._options.revert&&(this._element.style.position=this.position,this._element.style.zIndex=null!==this.zindex?this.zindex:"auto",this._element.style.left=this.originalPosition[i]?this.originalPosition[i]+"px":"",this._element.style.top=this.originalPosition[j]?this.originalPosition[j]+"px":""),this._options.onEnd&&this._options.onEnd(this._element,d);var e=Ink.getModule("Ink.UI.Droppable_1");e&&e.action(this._getCoords(d),"drop",d,this._element),this.position=!1,this.zindex=!1,this.firstDrag=!0}this.active=!1,this.dragged=!1}},f.createUIComponent(h),h}),Ink.createModule("Ink.UI.Drawer","1",["Ink.UI.Common_1","Ink.Dom.Loaded_1","Ink.Dom.Selector_1","Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Css_1"],function(a,b,c,d,e,f){"use strict";function g(a){if(document.addEventListener){m&&h();var b=!1;m=function(c){return"mousedown"===c.type||"mouseup"===c.type?void(b="mousedown"===c.type):void(b||a(c.target))},document.addEventListener("focus",m,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("mouseup",m,!0)}}function h(){document.addEventListener&&m&&(document.removeEventListener("focus",m,!0),document.removeEventListener("mousedown",m,!0),document.removeEventListener("mouseup",m,!0),m=null)}function i(a){for(var b=Ink.ss("[tabindex]",a),c=null,d=null,e=0;ef)&&(c=f,d=b[e])}if(d)return d.focus(),!0;var g=Ink.s(l,a);return g?(g.focus(),!0):!1}function j(a){return'Ink.UI.Drawer_1: Could not find the "'+a+'" element on this page. Please make sure it exists.'}function k(b,c){a.isDOMElement(b)||(c=b),a.BaseUIComponent.apply(this,[document.body,c])}var l=['[tabindex]:not([tabindex="-1"])',"input","select","textarea","button","object","a[href]","area"].join(","),m=null,n=function(a){var b={WebkitTransitionProperty:"webkitTransitionEnd",transitionProperty:"transitionend"};for(var c in b)if(b.hasOwnProperty(c)&&void 0!==a.style[c])return{styleProp:c,eventName:b[c]};return!1}(document.createElement("div"));return k.transitionSupport=n,k._name="Drawer_1",k._optionDefinition={parentSelector:["String",".ink-drawer"],leftDrawer:["String",".left-drawer"],leftTrigger:["String",".left-drawer-trigger"],rightDrawer:["String",".right-drawer"],rightTrigger:["String",".right-drawer-trigger"],contentDrawer:["String",".content-drawer"],mode:["String","push"],sides:["String","both"]},k.prototype={_init:function(){function a(a){a.drawer&&a.triggers.length?b=!0:c=j(a.drawer?a.drawerOption:a.triggerOption)}if(this._contentDrawers=Ink.ss(this._options.contentDrawer),this._leftDrawer=Ink.s(this._options.leftDrawer),this._leftTriggers=Ink.ss(this._options.leftTrigger),this._rightDrawer=Ink.s(this._options.rightDrawer),this._rightTriggers=Ink.ss(this._options.rightTrigger),f.addClassName(document.body,"ink-drawer"),0===this._contentDrawers.length)throw new Error('Ink.UI.Drawer_1: Could not find any "'+this._options.contentDrawer+'" elements on this page. Please make sure you have at least one.');switch(this._options.sides){case"both":this._triggers=this._options.leftTrigger+", "+this._options.rightTrigger+", "+this._options.contentDrawer;break;case"left":this._triggers=this._options.leftTrigger+", "+this._options.contentDrawer;break;case"right":this._triggers=this._options.rightTrigger+", "+this._options.contentDrawer}var b=!1,c=null;("left"===this._options.sides||"both"===this._options.sides)&&a({name:"left",drawer:this._leftDrawer,drawerOption:this._options.leftDrawer,triggers:this._leftTriggers,triggerOption:this._options.leftTrigger}),("right"===this._options.sides||"both"===this._options.sides)&&a({name:"right",drawer:this._rightDrawer,drawerOption:this._options.rightDrawer,triggers:this._rightTriggers,triggerOption:this._options.rightTrigger}),b||Ink.warn(c),this._isOpen=!1,this._direction=void 0,this._handlers={click:Ink.bindEvent(this._onClick,this),afterTransition:Ink.bindEvent(this._afterTransition,this)},this._addEvents()},_onClick:function(a){var b=d.findUpwardsBySelector(a.currentTarget,this._options.leftTrigger)?"left":d.findUpwardsBySelector(a.currentTarget,this._options.rightTrigger)?"right":null;if(b)return void this._onTriggerClicked(a,b);if(this._isOpen){var c=d.findUpwardsBySelector(a.currentTarget,this._options.contentDrawer),e=d.isLink(a.target);(c||e)&&this.close(),c&&a.preventDefault()}},_onTriggerClicked:function(a,b){this._isOpen?this.close():this.open(b),a.preventDefault()},_afterTransition:function(){this._isOpen||f.removeClassName(this._getRecentDrawer(),"show")},_addEvents:function(){e.on(document.body,"click",this._triggers+', a[href*="#"]',this._handlers.click)},_getRecentDrawer:function(){return"left"===this._direction?this._leftDrawer:"right"===this._direction?this._rightDrawer:null},open:function(a){this._isOpen=!0,this._direction=a;var b=this._getRecentDrawer();f.addClassName(b,"show"),setTimeout(Ink.bind(function(){f.addClassName(document.body,[this._options.mode,a])},this),0),n&&this._transitionWillOccur(b)&&e.one(b,n.eventName,function(){f.removeClassName(b,"show");var a=+b.offsetWidth;f.addClassName(b,"show")});var c=document.activeElement,j=i(b);g(Ink.bind(function(a){var e=d.isAncestorOf(b,a);e||(this.close(),h(),j&&c&&c.focus())},this))},_transitionWillOccur:function(a){return!(!n||!f.getStyle(a,n.styleProp))},close:function(){if(this._isOpen!==!1){var a=this._getRecentDrawer();if(a){h(),this._isOpen=!1;var b=null;n&&(b=this._transitionWillOccur(this._getRecentDrawer())),f.removeClassName(document.body,[this._options.mode,this._direction]),b?e.one(document.body,n.eventName,this._handlers.afterTransition):this._handlers.afterTransition()}}}},a.createUIComponent(k),k}),Ink.createModule("Ink.UI.Dropdown","1",["Ink.UI.Common_1","Ink.UI.Toggle_1","Ink.Dom.Event_1","Ink.Dom.Element_1"],function(a,b,c,d){"use strict";function e(){a.BaseUIComponent.apply(this,arguments)}return e._name="Dropdown_1",e._optionDefinition={target:["Element"],hoverOpen:["Number",null],dismissOnInsideClick:["Boolean",!1],dismissOnOutsideClick:["Boolean",!0],dismissAfter:["Number",null],onInsideClick:["Function",null],onOutsideClick:["Function",null],onOpen:["Function",null],onDismiss:["Function",null]},e.prototype={_init:function(){this._toggle=new b(this._element,{target:this._options.target,closeOnInsideClick:null,closeOnClick:!1,onChangeState:Ink.bind(function(a){return this._openOrDismiss(a,!0,!0)},this)}),c.observeMulti([this._options.target,this._element],"mouseout",Ink.bindMethod(this,"_onMouseOut")),c.observeMulti([this._options.target,this._element],"mouseover",Ink.bindMethod(this,"_onMouseOver")),c.observe(this._options.target,"click",Ink.bindMethod(this,"_onInsideClick")),c.observe(document,"click",Ink.bindMethod(this,"_onOutsideClick"))},_onMouseOver:function(){"number"==typeof this._options.hoverOpen&&this._toggle.getState()===!1&&(clearTimeout(this._openTimeout),this._openTimeout=setTimeout(Ink.bindMethod(this,"open",!0),1e3*this._options.hoverOpen)),"number"==typeof this._options.dismissAfter&&clearTimeout(this._dismissTimeout)},_onMouseOut:function(){"number"==typeof this._options.dismissAfter&&this._toggle.getState()===!0&&(clearTimeout(this._dismissTimeout),this._dismissTimeout=setTimeout(Ink.bindMethod(this,"dismiss",!0),1e3*this._options.dismissAfter)),"number"==typeof this._options.hoverOpen&&clearTimeout(this._openTimeout)},_onInsideClick:function(a){var b=this._handlerCall("onInsideClick",c.element(a));b!==!1&&this._options.dismissOnInsideClick&&this.dismiss(!0)},_onOutsideClick:function(a){var b=c.element(a),e=d.findUpwardsHaving(b,Ink.bind(function(a){return a===this._element},this)),f=d.findUpwardsHaving(b,Ink.bind(function(a){return a===this._options.target},this));if(!e&&!f){var g=this._handlerCall("onOutsideClick",b);if(g===!1)return;this._options.dismissOnOutsideClick&&this.dismiss(!0)}},dismiss:function(a){this._openOrDismiss(!1,a,arguments[1])},open:function(a){this._openOrDismiss(!0,a,arguments[1])},_openOrDismiss:function(a,b,c){if(!this._toggle||this._toggle.getState()!==a){if(b&&this._handlerCall(a?"onOpen":"onDismiss")===!1)return!1; c||this._toggle.setState(a),clearTimeout(this._dismissTimeout),clearTimeout(this._openTimeout)}},_handlerCall:function(a){return this._options[a]?this._options[a].call(this,[].slice.call(arguments,1)):void 0}},a.createUIComponent(e),e}),Ink.createModule("Ink.UI.Droppable","1",["Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.UI.Common_1","Ink.Util.Array_1","Ink.Dom.Selector_1"],function(a,b,c,d,e,f){"use strict";var g=function(a){return function(b){return c.addClassName(a,b)}},h=function(a){return function(b){return c.removeClassName(a,b)}},i={debug:!1,_droppables:[],_draggables:[],add:function(b,c){function e(a){a.style.position="inherit"}b=d.elOrSelector(b,"Droppable.add target element");var f=Ink.extendObj({hoverClass:c.hoverclass||!1,accept:!1,onHover:!1,onDrop:!1,onDropOut:!1},c||{},a.data(b));"string"==typeof f.hoverClass&&(f.hoverClass=f.hoverClass.split(/\s+/));var g=this,h={move:function(a,b){e(a),b.appendChild(a)},copy:function(a,b){e(a),b.appendChild(a.cloneNode(!0))},revert:function(a){g._findDraggable(a).originalParent.appendChild(a),e(a)}},i;if("string"==typeof f.onHover&&(i=f.onHover,f.onHover=h[i],void 0===f.onHover))throw new Error("Unknown hover event handler: "+i);if("string"==typeof f.onDrop&&(i=f.onDrop,f.onDrop=h[i],void 0===f.onDrop))throw new Error("Unknown drop event handler: "+i);if("string"==typeof f.onDropOut&&(i=f.onDropOut,f.onDropOut=h[i],void 0===f.onDropOut))throw new Error("Unknown dropOut event handler: "+i);var j={element:b,data:{},options:f};this._droppables.push(j),this._update(j)},_findData:function(a){for(var b=this._droppables,c=0,d=b.length;d>c;c++)if(b[c].element===a)return b[c]},_findDraggable:function(a){for(var b=this._draggables,c=0,d=b.length;d>c;c++)if(b[c].element===a)return b[c]},updateAll:function(){e.each(this._droppables,i._update)},update:function(a){this._update(this._findData(a))},_update:function(b){var c=b.data,d=b.element;c.left=a.offsetLeft(d),c.top=a.offsetTop(d),c.right=c.left+a.elementWidth(d),c.bottom=c.top+a.elementHeight(d)},remove:function(a){a=d.elOrSelector(a);for(var b=this._droppables.length,c=0;b>c;c++)if(this._droppables[c].element===a){this._droppables.splice(c,1);break}return b!==this._droppables.length},action:function(a,b,c,d){e.each(this._droppables,Ink.bind(function(i){var j=i.data,k=i.options,l=i.element;(!k.accept||f.matches(k.accept,[d]).length)&&("drag"!==b||this._findDraggable(d)||this._draggables.push({element:d,originalParent:d.parentNode}),a.x>=j.left&&a.x<=j.right&&a.y>=j.top&&a.y<=j.bottom?"drag"===b?(k.hoverClass&&e.each(k.hoverClass,g(l)),k.onHover&&k.onHover(d,l)):"drop"===b&&(k.hoverClass&&e.each(k.hoverClass,h(l)),k.onDrop&&k.onDrop(d,l,c)):"drag"===b&&k.hoverClass?e.each(k.hoverClass,h(l)):"drop"===b&&k.onDropOut&&k.onDropOut(d,l,c))},this))}};return i}),Ink.createModule("Ink.UI.FormValidator","1",["Ink.Dom.Element_1","Ink.Dom.Css_1","Ink.Util.Validator_1","Ink.Dom.Selector_1"],function(a,b,c,d){"use strict";function e(a){if(!a.name)return[];if(!a.form)return d.select('[name="'+a.name+'"]');var b=a.form[a.name];return b?("undefined"==typeof b.length&&(b=[b]),b):function(){for(var b=[],c=Ink.ss("*",a.form),d=0;d0?(b.onError?b.onError(c):this._showError(a,c),!1):(b.onError||this._clearError(a),this._clearCache(),b.onSuccess&&b.onSuccess(),!0)},reset:function(){this._clearError(),this._clearCache()},_free:function(){this.element=null,this.custom=!1,this.confirmGroup=!1},_clearCache:function(){this.element=null,this.elements=[],this.custom=!1,this.confirmGroup=!1},_getElements:function(){var a=this.elements[this.element.id]=[];this.confirmElms[this.element.id]=[];for(var c=d.select(":input",this.element),e=!1,f=0,g=c.length;g>f;f++){e=c[f];var h=(e.getAttribute("type")+"").toLowerCase();if("radio"===h||"checkbox"===h){if(0===a.length||e.getAttribute("type")!==a[a.length-1].getAttribute("type")&&e.getAttribute("name")!==a[a.length-1].getAttribute("name"))for(var i in this._flagMap)if(b.hasClassName(e,i)){a.push(e);break}}else{for(var j in this._flagMap)if(b.hasClassName(e,j)&&"ink-fv-confirm"!==j){a.push(e);break}b.hasClassName(e,"ink-fv-confirm")&&(this.confirmElms[this.element.id].push(e),this.hasConfirm[this.element.id]=!0)}}},_validateElements:function(){var a;this._getElements(),this.hasConfirm[this.element.id]===!0&&(a=this._makeConfirmGroups());for(var c=[],d=!1,e=!1,f,g=0,h=this.elements[this.element.id].length;h>g;g++)if(f=!1,d=this.elements[this.element.id][g],!d.disabled)for(var i in this._flagMap)if(b.hasClassName(d,i))if("ink-fv-custom"!==i&&"ink-fv-confirm"!==i)this._isValid(d,i)||(f?c[c.length-1].errors.push(i):(c.push({elm:d,errors:[i]}),f=!0));else if("ink-fv-confirm"!==i)e=this._isCustomValid(d),e.length>0&&c.push({elm:d,errors:[i],custom:e});else if("ink-fv-confirm"===i)continue;return c=this._validateConfirmGroups(a,c)},_validateConfirmGroups:function(a,b){var c=!1;for(var d in a)a.hasOwnProperty(d)&&(c=a[d],2===c.length&&c[0].value!==c[1].value&&b.push({elm:c[1],errors:["ink-fv-confirm"]}));return b},_makeConfirmGroups:function(){var a;if(this.confirmGroup&&this.confirmGroup.length>0){a={};for(var c=!1,d=!1,e=0,f=this.confirmElms[this.element.id].length;f>e;e++){c=this.confirmElms[this.element.id][e];for(var g=0,h=this.confirmGroup.length;h>g;g++)d=this.confirmGroup[g],b.hasClassName(c,d)&&("undefined"==typeof a[d]?a[d]=[c]:a[d].push(c))}return a}return 2===this.confirmElms[this.element.id].length&&(a={"ink-fv-confirm":[this.confirmElms[this.element.id][0],this.confirmElms[this.element.id][1]]}),a;return!1},_isCustomValid:function(a){for(var c=[],d=!1,e=0,f=this.custom.length;f>e;e++)d=this.custom[e],b.hasClassName(a,d.flag)&&(d.callback(a,d.msg)||c.push({flag:d.flag,msg:d.msg}));return c},_isValid:function(a,d){var f=a.nodeName.toLowerCase(),g=(a.getAttribute("type")||"").toLowerCase(),h=this._trim(a.value);if("ink-fv-required"!==d&&"checkbox"!==g&&"radio"!==g&&""===h)return!b.hasClassName(a,"ink-fv-required");switch(d){case"ink-fv-required":if("select"===f)return a.selectedIndex>0?!0:!1;if("checkbox"!==g&&"radio"!==g)return""!==h;if("checkbox"===g||"radio"===g){for(var i=e(a),j=0,k=i.length;k>j;j++)if(i[j].checked===!0)return!0;return!1}return!1;case"ink-fv-email":return c.mail(a.value);case"ink-fv-url":return c.url(a.value);case"ink-fv-number":return!isNaN(Number(a.value))&&isFinite(Number(a.value));case"ink-fv-phone_pt":return c.isPTPhone(a.value);case"ink-fv-phone_cv":return c.isCVPhone(a.value);case"ink-fv-phone_ao":return c.isAOPhone(a.value);case"ink-fv-phone_mz":return c.isMZPhone(a.value);case"ink-fv-date":var l=Ink.getModule("Ink.Dom.Element",1),m=l.data(a),n="yyyy-mm-dd";if(b.hasClassName(a,"ink-datepicker")&&"format"in m?n=m.format:"validFormat"in m&&(n=m.validFormat),!(n in c._dateParsers)){var o=[];for(var p in c._dateParsers)c._dateParsers.hasOwnProperty(p)&&o.push(p);throw new Error("The attribute data-valid-format must be one of the following values: "+o.join(", "))}return c.isDate(n,a.value);case"ink-fv-custom":}return!1},_showError:function(a,b){this._clearError(a);for(var c=!1,d=0,e=b.length;e>d;d++)c=b[d].elm,c&&this._showAnErrorOnElement(c,b[d])},_showAnErrorOnElement:function(c,d){var e=a.findUpwardsByClass(c,"control-group"),f=a.findUpwardsByClass(c,"control"),g=[this._errorClassName,this._errorTypeClassName].join(" "),h=a.create("p",{className:g});h.innerHTML="ink-fv-custom"!==d.errors[0]?this._flagMap[d.errors[0]].msg:d.custom[0].msg;var i=f||e;i?i.appendChild(h):a.insertAfter(h,c),f&&("ink-fv-required"===d.errors[0]?b.addClassName(e,"validation error"):b.addClassName(e,"validation warning"))},_clearError:function(c){for(var d=c.getElementsByTagName("p"),e,f,g=d.length-1;g>=0;g--)e=d[g],b.hasClassName(e,this._errorClassName)&&(f=a.findUpwardsBySelector(e,".control-group"),f&&b.removeClassName(f,["validation","error","warning"]),b.hasClassName(e,this._errorClassName,!0)&&a.remove(e));var h=c.getElementsByTagName("ul");for(g=h.length-1;g>=0;g--)e=h[g],b.hasClassName(e,"control-group")&&b.removeClassName(e,"validation error")},_trim:function(a){return"string"==typeof a?a.replace(/^\s+|\s+$|\n+$/g,""):void 0}};return f}),Ink.createModule("Ink.UI.FormValidator","2",["Ink.UI.Common_1","Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Selector_1","Ink.Dom.Css_1","Ink.Util.Array_1","Ink.Util.I18n_1","Ink.Util.Validator_1"],function(a,b,c,d,e,f,g,h){"use strict";function i(){a.BaseUIComponent.apply(this,arguments)}function j(){a.BaseUIComponent.apply(this,arguments)}var k={required:function(a){return"undefined"!=typeof a&&!/^\s*$/.test(a)},min_length:function(a,b){return"string"==typeof a&&a.length>=parseInt(b,10)},max_length:function(a,b){return"string"==typeof a&&a.length<=parseInt(b,10)},exact_length:function(a,b){return"string"==typeof a&&a.length===parseInt(b,10)},email:function(a){return"string"==typeof a&&h.mail(a)},url:function(a,b){return b=b||!1,"string"==typeof a&&h.url(a,b)},ip:function(a,b){return"string"!=typeof a?!1:h.isIP(a,b)},phone:function(a,b){if("string"!=typeof a)return!1;var c=b?b.toUpperCase():"";return h["is"+c+"Phone"](a)},credit_card:function(a,b){return"string"!=typeof a?!1:h.isCreditCard(a,b||"default")},date:function(a,b){return"string"==typeof a&&h.isDate(b,a)},alpha:function(a,b){return h.ascii(a,{singleLineWhitespace:b})},text:function(a,b,c){return h.unicode(a,{singleLineWhitespace:b,unicodePunctuation:c})},latin:function(a,b,c){return"string"!=typeof a?!1:h.latin1(a,{latin1Punctuation:b,singleLineWhitespace:c})},alpha_numeric:function(a){return h.ascii(a,{numbers:!0})},alpha_dash:function(a){return h.ascii(a,{dash:!0,underscore:!0})},digit:function(a){return"string"==typeof a&&/^[0-9]{1}$/.test(a)},integer:function(a,b){return h.number(a,{negative:!b,decimalPlaces:0})},decimal:function(a,b,c,d){return h.number(a,{decimalSep:b||".",decimalPlaces:+c||null,maxDigits:+d})},numeric:function(a,b,c,d){return b=b||".",-1!==a.indexOf(b)?k.decimal(a,b,c,d):k.integer(a)},range:function(a,b,c,d){return a=+a,b=+b,c=+c,isNaN(a)||isNaN(b)||isNaN(c)?!1:b>a||a>c?!1:d?(a-b)%d===0:!0},color:function(a){return h.isColor(a)},matches:function(a,b){var c=this.getFormElements()[b][0],d=c.getValue();return c._rules.required&&""===d?!1:a===d}},l=new g({en_US:{"formvalidator.required":"The {field} filling is mandatory","formvalidator.min_length":"The {field} must have a minimum size of {param1} characters","formvalidator.max_length":"The {field} must have a maximum size of {param1} characters","formvalidator.exact_length":"The {field} must have an exact size of {param1} characters","formvalidator.email":"The {field} must have a valid e-mail address","formvalidator.url":"The {field} must have a valid URL","formvalidator.ip":"The {field} does not contain a valid {param1} IP address","formvalidator.phone":"The {field} does not contain a valid {param1} phone number","formvalidator.credit_card":"The {field} does not contain a valid {param1} credit card","formvalidator.date":"The {field} should contain a date in the {param1} format","formvalidator.alpha":"The {field} should only contain letters","formvalidator.text":"The {field} should only contain alphabetic characters","formvalidator.latin":"The {field} should only contain alphabetic characters","formvalidator.alpha_numeric":"The {field} should only contain letters or numbers","formvalidator.alpha_dash":"The {field} should only contain letters or dashes","formvalidator.digit":"The {field} should only contain a digit","formvalidator.integer":"The {field} should only contain an integer","formvalidator.decimal":"The {field} should contain a valid decimal number","formvalidator.numeric":"The {field} should contain a number","formvalidator.range":"The {field} should contain a number between {param1} and {param2}","formvalidator.color":"The {field} should contain a valid color","formvalidator.matches":"The {field} should match the field {param1}","formvalidator.validation_function_not_found":"The rule {rule} has not been defined"},pt_PT:{"formvalidator.required":"Preencher {field} é obrigatório","formvalidator.min_length":"{field} deve ter no mínimo {param1} caracteres","formvalidator.max_length":"{field} tem um tamanho máximo de {param1} caracteres","formvalidator.exact_length":"{field} devia ter exactamente {param1} caracteres","formvalidator.email":"{field} deve ser um e-mail válido","formvalidator.url":"O {field} deve ser um URL válido","formvalidator.ip":"{field} não tem um endereço IP {param1} válido","formvalidator.phone":"{field} deve ser preenchido com um número de telefone {param1} válido.","formvalidator.credit_card":"{field} não tem um cartão de crédito {param1} válido","formvalidator.date":"{field} deve conter uma data no formato {param1}","formvalidator.alpha":"O campo {field} deve conter apenas caracteres alfabéticos","formvalidator.text":"O campo {field} deve conter apenas caracteres alfabéticos","formvalidator.latin":"O campo {field} deve conter apenas caracteres alfabéticos","formvalidator.alpha_numeric":"{field} deve conter apenas letras e números","formvalidator.alpha_dash":"{field} deve conter apenas letras e traços","formvalidator.digit":"{field} destina-se a ser preenchido com apenas um dígito","formvalidator.integer":"{field} deve conter um número inteiro","formvalidator.decimal":"{field} deve conter um número válido","formvalidator.numeric":"{field} deve conter um número válido","formvalidator.range":"{field} deve conter um número entre {param1} e {param2}","formvalidator.color":"{field} deve conter uma cor válida","formvalidator.matches":"{field} deve corresponder ao campo {param1}","formvalidator.validation_function_not_found":"[A regra {rule} não foi definida]"}},"en_US");return i._name="FormElement_1",i._optionDefinition={label:["String",null],rules:["String",null],form:["Object"]},i.prototype={_init:function(){this._errors={},this._rules={},this._value=null,null===this._options.label&&(this._options.label=this._getLabel())},_getLabel:function(){var a=b.findUpwardsBySelector(this._element,".control-group label");return a?b.textContent(a):this._element.name||this._element.id||""},_parseRules:function(a){this._rules={},a=a.split("|");var b,c=a.length,d,e,f;if(c>0)for(b=0;c>b;b++)if(d=a[b])if(-1!==(f=d.indexOf("["))){e=d.substr(f+1),e=e.split("]"),e=e[0],e=e.split(",");for(var g=0,h=e.length;h>g;g++)e[g]="true"===e[g]?!0:"false"===e[g]?!1:e[g];e.splice(0,0,this.getValue()),d=d.substr(0,f),this._rules[d]=e}else this._rules[d]=[this.getValue()]},_addError:function(a){for(var b=this._rules[a]||[],c={field:this._options.label,value:this.getValue()},d=1;d"),this._errorMessages.push(f)},this)),!1)}},a.createUIComponent(j),j.FormElement=i,j.validationFunctions=k,j}),Ink.createModule("Ink.UI.ImageQuery","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Util.Array_1"],function(a,b,c,d){"use strict";function e(){a.BaseUIComponent.apply(this,arguments)}return e._name="ImageQuery_1",e._optionDefinition={src:["String"],retina:["String",void 0],queries:["Object"],onLoad:["Function",null]},e.prototype={_init:function(){var a;if(-1!==(a=this._element.src.lastIndexOf("?"))){var c=this._element.src.substr(a);this._filename=this._element.src.replace(c,"").split("/").pop()+c}else this._filename=this._element.src.split("/").pop();this._options.queries||(this._options.queries=[]),this._options.queries=d.sortMulti(this._options.queries,"width").reverse(),"function"==typeof this._options.onLoad&&b.observe(this._element,"load",Ink.bindEvent(this._onLoad,this)),this._onResize(),b.observe(window,"resize",b.throttle(Ink.bindMethod(this,"_onResize"),400))},_onResize:function(){if(this._options.queries.length){var a=this._findCurrentQuery();this._element.src=this.getQuerySrc(a)}},_findCurrentQuery:function(){for(var a=c.viewportWidth(),b=this._options.queries,d=b.length-1,e=0;d>e;e+=1)if(b[e].width<=a)return b[e];return b[d]},getQuerySrc:function(a){var b=a.src||this._options.src;if(window.devicePixelRatio>1&&void 0!==this._options.retina&&(b=a.retina||this._options.retina),a.file=this._filename,"function"==typeof b&&(b=b.apply(this,[this._element,a]),"string"!=typeof b))throw'[ImageQuery] :: "src" callback does not return a string';return b=b.replace(/{:(.*?)}/g,function(b,c){return a[c]}),delete a.file,b},_onLoad:function(){this._options.onLoad.call(this)}},a.createUIComponent(e),e}),Ink.createModule("Ink.UI.LazyLoad","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1"],function(a,b,c){"use strict";function d(){a.BaseUIComponent.apply(this,arguments)}return d._name="LazyLoad_1",d._optionDefinition={item:["String",".lazyload-item"],placeholder:["String",null],source:["String","data-src"],destination:["String","src"],delay:["Number",100],delta:["Number",0],image:["Boolean",!0],scrollElement:["Element",window],touchEvents:["Boolean",!0],onInsideViewport:["Function",!1],onAfterAttributeChange:["Function",!1],autoInit:["Boolean",!0]},d.prototype={_init:function(){this._aData=[],this._hasEvents=!1,this._options.autoInit&&this._activate()},_activate:function(){this._getData(),this._hasEvents||this._addEvents(),this._onScrollThrottled()},_getData:function(){for(var a=Ink.ss(this._options.item,this._element),b=null,d=0,e=a.length;e>d;d++)null==this._options.placeholder||c.hasAttribute(a[d],this._options.destination)||a[d].setAttribute(this._options.destination,this._options.placeholder),b=a[d].getAttribute(this._options.source),null===b&&this._options.image||this._aData.push({elm:a[d],original:b})},_addEvents:function(){this._onScrollThrottled=b.throttle(Ink.bindEvent(this._onScroll,this),this._options.delay),"ontouchmove"in document.documentElement&&this._options.touchEvents&&b.observe(document.documentElement,"touchmove",this._onScrollThrottled),b.observe(this._options.scrollElement,"scroll",this._onScrollThrottled),this._hasEvents=!0},_removeEvents:function(){"ontouchmove"in document.documentElement&&this._options.touchEvents&&b.stopObserving(document.documentElement,"touchmove",this._onScrollThrottled),b.stopObserving(this._options.scrollElement,"scroll",this._onScrollThrottled),this._hasEvents=!1},_onScroll:function(){for(var a,b=0;bthis.originalStatus[c]?this._modalDiv.style[h(c)]:Math.round(.9*b[c])+"px")},this)),this._resizeContainer(),this._reposition()},_onShadeClick:function(a){var f=b.element(a);if(f===this._modalShadow)this.dismiss();else if(c.hasClassName(f,"ink-close")||c.hasClassName(f,"ink-dismiss")||d.findUpwardsBySelector(f,".ink-close,.ink-dismiss")||this._options.closeOnClick&&(!d.descendantOf(this._shadeElement,f)||f===this._shadeElement)){for(var g=e.select(".ink-alert",this._shadeElement),h=g.length,i=0;h>i;i++)if(d.descendantOf(g[i],f))return;this.dismiss(),this._isOpen||b.stop(a)}},_onKeyDown:function(a){27===a.keyCode&&this._isOpen&&this._options.closeOnEscape&&k[k.length-1]===this&&(this.dismiss(),this._isOpen||b.stop(a))},_resizeContainer:function(){var a=d.elementHeight(this._modalDiv);this._modalHeader=e.select(".modal-header",this._modalDiv)[0],this._modalHeader&&(a-=d.elementHeight(this._modalHeader)),this._modalFooter=e.select(".modal-footer",this._modalDiv)[0],this._modalFooter&&(a-=d.elementHeight(this._modalFooter)),this._contentContainer.style.height=a+"px",a!==d.elementHeight(this._contentContainer)&&(this._contentContainer.style.height=~~(a-(d.elementHeight(this._contentContainer)-a))+"px"),this._markupMode},open:function(a){if(this.isOpen())return!1;a&&b.stop(a);var e="CSS1Compat"===document.compatMode?document.documentElement:document.body;c.addClassName(this._modalShadow,"ink-shade"),this._modalShadow.style.display=this._modalDiv.style.display="block",this._modalShadow.offsetHeight,c.addClassName(this._modalShadow,"visible"),c.addClassName(this._modalDiv,"visible"),this._contentElement=this._modalDiv,this._shadeElement=this._modalShadow,this._markupMode||this.setContentMarkup(this._options.markup);var i={width:-1!==(""+this._options.width).indexOf("%"),height:-1!==(""+this._options.height).indexOf("%")};f.forEach(["width","height"],Ink.bind(function(a){void 0!==this._options[a]?(this._modalDiv.style[a]=this._options[a],i[a]||(this._modalDiv.style[h(a)]=d["element"+g(a)](this._modalDiv)+"px")):this._modalDiv.style[h(a)]=d["element"+g(a)](this._modalDiv)+"px",i[a]&&parseInt(e["client"+h(a)],10)<=parseInt(this._modalDiv.style[a],10)&&(this._modalDiv.style[a]=Math.round(.9*parseInt(e["client"+h(a)],10))+"px")},this)),this.originalStatus={viewportHeight:d.elementHeight(e),viewportWidth:d.elementWidth(e),height:d.elementHeight(this._modalDiv),width:d.elementWidth(this._modalDiv)},this._options.responsive?(this._onResize(!0),b.observe(window,"resize",this._handlers.resize)):(this._resizeContainer(),this._reposition()),this._options.onShow&&this._options.onShow(this),b.observe(this._shadeElement,"click",this._handlers.click),this._options.closeOnEscape&&b.observe(document,"keydown",this._handlers.keyDown),this._isOpen=!0,k.push(this),c.addClassName(document.documentElement,"ink-modal-open")},isOpen:function(){return this._isOpen},dismiss:function(){if(this._isOpen){if(this._options.onDismiss){var a=this._options.onDismiss(this);if(a===!1)return}if(this._isOpen=!1,this._options.responsive&&b.stopObserving(window,"resize",this._handlers.resize),this._markupMode?(c.removeClassName(this._modalDiv,"visible"),c.removeClassName(this._modalShadow,"visible"),this._waitForFade(this._modalShadow,Ink.bind(function(){this._modalShadow.style.display="none"},this))):(this._modalShadow.parentNode.removeChild(this._modalShadow),this.destroy()),k=f.remove(k,f.keyValue(this,k),1),0===k.length){var d=document.documentElement;c.removeClassName(d,"ink-modal-open")}}},_waitForFade:function(a,d){if(!j)return d();if("ontransitionend"in a)return b.observeOnce(a,"transitionEnd",d);var e=5,f=function(){+c.getStyle(a,"opacity")>0&&e>0?(e--,setTimeout(f,250)):d()};setTimeout(f,500)},destroy:function(){a.unregisterInstance(this._instanceId)},getContentElement:function(){return this._contentContainer},setContentMarkup:function(a){if(this._markupMode)this._contentContainer.innerHTML=a;else{if(this._modalDiv.innerHTML=[a].join(""),this._contentContainer=e.select(".modal-body",this._modalDiv),!this._contentContainer.length){var b=e.select(".modal-header",this._modalDiv),g=e.select(".modal-footer",this._modalDiv);f.each(b,d.remove),f.each(g,d.remove);var h=document.createElement("div");c.addClassName(h,"modal-body"),h.innerHTML=this._modalDiv.innerHTML,this._modalDiv.innerHTML="";var i=b.concat([h]).concat(g);f.each(i,Ink.bindMethod(this._modalDiv,"appendChild")),this._contentContainer=e.select(".modal-body",this._modalDiv)}this._contentContainer=this._contentContainer[0]}this._contentElement=this._modalDiv,this._resizeContainer()}},a.createUIComponent(i,{elementIsOptional:!0}),i}),Ink.createModule("Ink.UI.Pagination","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1"],function(a,b,c,d,e){"use strict";function f(){a.BaseUIComponent.apply(this,arguments)}var g=function(a,b,c){var d=document.createElement("a");if(d.setAttribute("href","#"),"number"==typeof b&&d.setAttribute("data-index",b),c&&c.wrapText){var e=document.createElement("span");d.appendChild(e),e.innerHTML=a}else d.innerHTML=a;return d};return f._name="Pagination_1",f._optionDefinition={size:["Integer",null],totalItemCount:["Integer",null],itemsPerPage:["Integer",null],maxSize:["Integer",null],start:["Integer",1],sideButtons:["Boolean",1],firstLabel:["String","First"],lastLabel:["String","Last"],previousLabel:["String","Previous"],nextLabel:["String","Next"],previousPageLabel:["String",null],nextPageLabel:["String",null],onChange:["Function",void 0],hashParameter:["String","page"],parentTag:["String","ul"],childTag:["String","li"],wrapperClass:["String","ink-navigation"],paginationClass:["String","pagination"],activeClass:["String","active"],disabledClass:["String","disabled"],hideClass:["String","hide-all"],previousClass:["String","previous"],previousPageClass:["String","previousPage"],nextClass:["String","next"],nextPageClass:["String","nextPage"],firstClass:["String","first"],lastClass:["String","last"],numberFormatter:["Function",function(a){return a+1 }],autoWrap:["Boolean",!1]},f.prototype={_init:function(){this._options.previousPageLabel||(this._options.previousPageLabel=this._options.previousLabel+" "+this._options.maxSize),this._options.nextPageLabel||(this._options.nextPageLabel=this._options.nextLabel+" "+this._options.maxSize),this._handlers={click:Ink.bindEvent(this._onClick,this)},a.isInteger(this._options.totalItemCount)&&a.isInteger(this._options.itemsPerPage)?this._size=this._calculateSize(this._options.totalItemCount,this._options.itemsPerPage):a.isInteger(this._options.size)?this._size=this._options.size:(Ink.error("Ink.UI.Pagination: Please supply a size option or totalItemCount and itemsPerPage options."),this._size=0),this._current=this._options.start-1,this._itemLiEls=[],this._generateMarkup(this._element),this._updateItems(),this._observe()},_observe:function(){b.observeDelegated(this._element,"click","."+this._options.paginationClass+" > "+this._options.childTag,this._handlers.click)},_calculateSize:function(a,b){return Math.ceil(a/b)},_updateItems:function(){var a=this._itemLiEls,b=this._size===a.length,d,e,f;if(b)for(d=0,e=this._size;e>d;++d)c.setClassName(a[d],this._options.activeClass,d===this._current);else{for(d=a.length-1;d>=0;--d)this._ulEl.removeChild(a[d]);for(a=[],d=0,e=this._size;e>d;++d)f=document.createElement(this._options.childTag),f.appendChild(g(this._options.numberFormatter(d,this._size),d)),c.setClassName(f,this._options.activeClass,d===this._current),this._nextEl?this._ulEl.insertBefore(f,this._nextEl):this._ulEl.appendChild(f),a.push(f);this._itemLiEls=a}if(this._options.maxSize){var h=Math.floor(this._current/this._options.maxSize),i=this._options.maxSize*h,j=i+this._options.maxSize-1;for(d=0,e=this._size;e>d;++d)f=a[d],c.setClassName(f,this._options.hideClass,i>d||d>j);this._pageStart=i,this._pageEnd=j,this._page=h,c.setClassName(this._prevPageEl,this._options.disabledClass,!this.hasPreviousPage()),c.setClassName(this._nextPageEl,this._options.disabledClass,!this.hasNextPage()),c.setClassName(this._firstEl,this._options.disabledClass,this.isFirst()),c.setClassName(this._lastEl,this._options.disabledClass,this.isLast())}this._prevEl&&!this._options.autoWrap&&c.setClassName(this._prevEl,this._options.disabledClass,!this.hasPrevious()),this._nextEl&&!this._options.autoWrap&&c.setClassName(this._nextEl,this._options.disabledClass,!this.hasNext())},_generateMarkup:function(a){c.addClassName(a,"ink-navigation");var b=Ink.s("."+this._options.paginationClass,a),d=!1;b?d=!0:(b=document.createElement(this._options.parentTag),c.addClassName(b,this._options.paginationClass));var e=c.hasClassName(b,"chevron"),f=c.hasClassName(b,"dotted"),h=Ink.bind(function(a,d){var e=document.createElement(this._options.childTag),f=g(this._options[a+"Label"],void 0,{wrapText:d&&d.wrapText});return c.addClassName(e,this._options[a+"Class"]),e.appendChild(f),b.appendChild(e),e},this);!f&&this._options.maxSize&&(this._firstEl=h("first"),this._prevPageEl=h("previousPage")),(f&&this._options.sideButtons===!0||!f&&this._options.sideButtons)&&(this._prevEl=h("previous",{wrapText:e}),this._nextEl=h("next",{wrapText:e})),!f&&this._options.maxSize&&(this._nextPageEl=h("nextPage"),this._lastEl=h("last")),d||a.appendChild(b),this._ulEl=b},_onClick:function(a){b.stop(a);var d=b.element(a);if(!c.hasClassName(d,this._options.activeClass)&&!c.hasClassName(d,this._options.disabledClass)){var f=c.hasClassName(d,this._options.previousClass),g=c.hasClassName(d,this._options.nextClass),h=c.hasClassName(d,this._options.previousPageClass),i=c.hasClassName(d,this._options.nextPageClass),j=c.hasClassName(d,this._options.firstClass),k=c.hasClassName(d,this._options.lastClass);if(j)this.setCurrent(0);else if(k)this.setCurrent(this._size-1);else if(h||i)this.setCurrent((h?-1:1)*this._options.maxSize,!0,!!this._options.autoWrap);else if(f||g)this.setCurrent(f?-1:1,!0,!!this._options.autoWrap);else{var l=e.select("[data-index]",d)[0],m=l&&parseInt(l.getAttribute("data-index"),10);this.setCurrent(m)}}},setOnChange:function(a){if(a&&"function"!=typeof a)throw new TypeError("onChange option must be a function!");this._options.onChange=a},setSize:function(b){if(!a.isInteger(b))throw new TypeError("1st argument must be an integer number!");this._size=b,this._updateItems(),this._current=0},setSizeInItems:function(a,b){var c=Math.ceil(a/b);this.setSize(c)},setCurrent:function(b,c,d){if(!a.isInteger(b))throw new TypeError("1st argument must be an integer number!");c&&(b+=this._current),d?(b%=this._size,0>b&&(b+=this._size)):(b>this._size-1&&(b=this._size-1),0>b&&(b=0)),this._current=b,this._updateItems(),this._options.onChange&&this._options.onChange(this,b)},next:function(a){this.setCurrent(1,!0,a)},previous:function(a){this.setCurrent(-1,!0,a)},getSize:function(){return this._size},getCurrent:function(){return this._current},isFirst:function(){return 0===this._current},isLast:function(){return this._current===this._size-1},hasPrevious:function(){return this._current>0},hasNext:function(){return this._currentthis._options.maxSize-1},hasNextPage:function(){return this._options.maxSize&&this._size-this._current>=this._options.maxSize+1},destroy:a.destroyComponent},a.createUIComponent(f),f}),Ink.createModule("Ink.UI.ProgressBar","1",["Ink.UI.Common_1","Ink.Dom.Selector_1"],function(a,b){"use strict";function c(){a.BaseUIComponent.apply(this,arguments)}return c._name="ProgressBar_1",c._optionDefinition={startValue:["Number",0],onStart:["Function",function(){}],onEnd:["Function",function(){}]},c.prototype={_init:function(){if(this._value=this._options.startValue,this._elementBar=b.select(".bar",this._element),this._elementBar.length<1)throw new Error("[Ink.UI.ProgressBar] :: Bar element not found");this._elementBar=this._elementBar[0],this.setValue(this._options.startValue)},setValue:function(a){this._options.onStart.call(this,this._value),a=parseInt(a,10),isNaN(a)||0>a?a=0:a>100&&(a=100),this._value=a,this._elementBar.style.width=this._value+"%",this._options.onEnd.call(this,this._value)}},a.createUIComponent(c),c}),Ink.createModule("Ink.UI.SmoothScroller","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Dom.Css_1"],function(a,b,c,d,e){"use strict";var f=window.requestAnimationFrame||function(a){return setTimeout(a,10)},g=window.cancelAnimationFrame||function(a){clearTimeout(a)},h={speed:10,changeHash:!0,margin:0,scroll:function(a,b){var d=Math.round(c.scrollHeight()),e=Math.round(a-(b.margin||0));d+=e>d?Math.ceil((e-d)/b.speed):(e-d)/b.speed,g(h.interval),d!==e&&h.offsetTop!==d?h.interval=f(Ink.bindMethod(h,"scroll",a,b),document.body):h.onDone(b),window.scrollTo(0,d),h.offsetTop=d},init:function(a){b.on(document,"click",a||"a.scrollableLink, a.ink-smooth-scroll",h.onClick)},render:function(){},onClick:function(b){var d=b.currentTarget,f=(location+"").replace(/#.*?$/,""),g=(d.href+"").replace(/#.*?$/,"");if(g===f){var i=d.getAttribute("data-hash")||(d.getAttribute("href")||"").replace(/^.*?#/,"");if(i){b.preventDefault();var j="ul > li.active > "+k,k='a[name="'+i+'"],#'+i,l=Ink.s(k),m=Ink.s(j);if(m=m&&m.parentNode,l){e.hasClassName(d.parentNode,"active")||(m&&e.removeClassName(m,"active"),e.addClassName(d.parentNode,"active"));var n=a.options("SmoothScroller link options",{margin:["Number",h.margin],speed:["Number",h.speed],changeHash:["Boolean",h.changeHash]},{},d);h.hash=i,h.scroll(c.offsetTop(l),n)}}}},onDone:function(a){a.changeHash===!0&&(window.location.hash=h.hash),h.hash=h.offsetTop=null}};return h}),Ink.createModule("Ink.UI.SortableList","1",["Ink.UI.Common_1","Ink.Dom.Css_1","Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Dom.Selector_1"],function(a,b,c,d,e){"use strict";function f(){a.BaseUIComponent.apply(this,arguments)}var g="ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0;return f._name="SortableList_1",f._optionDefinition={placeholderClass:["String","placeholder"],draggedClass:["String","hide-all"],draggingClass:["String","dragging"],dragSelector:["String","> li"],handleSelector:["String",":not(button, button *, a[href], a[href] *)"],moveSelector:["String",!1],swap:["Boolean",!1],cancelMouseOut:["Boolean",!1],onDrop:["Function",function(){}]},f.prototype={_init:function(){this._handlers={down:Ink.bind(this._onDown,this),move:Ink.bind(this._onMove,this),up:Ink.bind(this._onUp,this)},this._isMoving=!1,this._down=g?"touchstart mousedown":"mousedown",this._move=g?"touchmove mousemove":"mousemove",this._up=g?"touchend mouseup":"mouseup",this._observe()},_observe:function(){c.on(this._element,this._down,this._options.dragSelector,this._handlers.down),c.on(this._element,this._move,this._options.dragSelector,this._handlers.move),this._options.cancelMouseOut&&c.on(this._element,"mouseleave",Ink.bind(this.stopMoving,this)),c.on(document.documentElement,this._up,this._handlers.up)},_onDown:function(a){if(!(this._isMoving||this._placeholder||this._options.handleSelector&&!e.matchesSelector(a.target,this._options.handleSelector))){var b=a.currentTarget;return this._isMoving=b,this._placeholder=b.cloneNode(!0),this._movePlaceholder(b),this._addMovingClasses(),!1}},_onMove:function(a){var b=a.currentTarget;if("touchmove"===a.type){var c=a.touches[0];b=document.elementFromPoint(c.clientX,c.clientY),b=d.findUpwardsBySelector(b,this._options.dragSelector)}this.validateMove(b),a.preventDefault()},_onUp:function(a){return this._isMoving&&this._placeholder&&a.currentTarget!==this._isMoving&&a.currentTarget!==this._placeholder?(d.insertBefore(this._isMoving,this._placeholder),this.stopMoving(),this._options.onDrop.call(this,{droppedElement:a.currentTarget}),!1):void 0},_addMovingClasses:function(){b.addClassName(this._placeholder,this._options.placeholderClass),b.addClassName(this._isMoving,this._options.draggedClass),b.addClassName(document.documentElement,this._options.draggingClass)},_removeMovingClasses:function(){this._isMoving&&b.removeClassName(this._isMoving,this._options.draggedClass),this._placeholder&&b.removeClassName(this._placeholder,this._options.placeholderClass),b.removeClassName(document.documentElement,this._options.draggingClass)},_movePlaceholder:function(a){var b=this._placeholder,c,e,f,g;b?this._options.swap?(d.insertAfter(b,a),d.insertBefore(a,this._isMoving),d.insertBefore(this._isMoving,b)):(c=d.offset(a),e=d.offset(this._placeholder),f=c[1]>e[1],g=c[0]>e[0],f&&g||!f&&!g?d.insertBefore(b,a):d.insertAfter(b,a),d.insertBefore(this._isMoving,b)):d.insertAfter(b,a)},destroy:a.destroyComponent,stopMoving:function(){this._removeMovingClasses(),d.remove(this._placeholder),this._placeholder=!1,this._isMoving=!1},validateMove:function(a){a&&this._isMoving&&this._placeholder&&a!==this._placeholder&&a!==this._isMoving&&(!this._options.moveSelector||e.matchesSelector(a,this._options.moveSelector)?this._movePlaceholder(a):this.stopMoving())}},a.createUIComponent(f),f}),Ink.createModule("Ink.UI.Spy","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1"],function(a,b,c,d,e){"use strict";function f(a){for(var b=0,c=m.length;c>b;b++)if(m[b][0]===a)return b;return null}function g(a,b){var c=f(b);null===c?m.push([b,[a]]):m[c][1].push(a)}function h(){n||(n=!0,b.observe(document,"scroll",b.throttle(i,300)))}function i(){for(var a=0,b=m.length;b>a;a++)j(m[a][0],m[a][1])}function j(a,b){for(var f=k(b),g=e.select("li.active",a),h=0,i=g.length;i>h;h++)c.removeClassName(g[h],"active");if(null!==f){var j='a[href$="#'+(f.name||f.id)+'"]',l=e.select(j,a);for(h=0,i=l.length;i>h;h++)c.addClassName(d.findUpwardsByTag(l[h],"li"),"active")}}function k(a){for(var b=-1/0,c,d,e=0,f=a.length;f>e;e++)d=a[e].getBoundingClientRect(),d.top<=0&&d.top>b&&(b=d.top,c=e);return void 0===c?null:a[c]}function l(){a.BaseUIComponent.apply(this,arguments)}var m=[],n=!1;return l._name="Spy_1",l._optionDefinition={target:["Element",void 0],activeClass:["String","active"]},l.prototype={_init:function(){g(this._element,this._options.target),h(),i()}},a.createUIComponent(l),l}),Ink.createModule("Ink.UI.Stacker",1,["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1"],function(a,b,c){"use strict";function d(){a.BaseUIComponent.apply(this,arguments)}return d._name="Stacker_1",d._optionDefinition={column:["String",".stacker-column"],item:["String",".stacker-item"],customBreakPoints:["Object",null],largeMax:["Number",Number.MAX_VALUE],largeMin:["Number",961],mediumMax:["Number",960],mediumMin:["Number",651],smallMax:["Number",650],smallMin:["Number",0],largeCols:["Integer",3],mediumCols:["Integer",2],smallCols:["Integer",1],isOrdered:["Boolean",!0],onRunCallback:["Function",null],onResizeCallback:["Function",null],onAPIReloadCallback:["Function",null]},d.prototype={_init:function(){this._aList=[],this._curLayout="large",this._runFirstTime=!1,this._getPageItemsToList(),(this._canApplyLayoutChange()||!this._runFirstTime)&&(this._runFirstTime=!0,this._applyLayoutChange(),"function"==typeof this._options.onRunCallback&&this._options.onRunCallback(this._curLayout)),this._addEvents()},addItem:function(a){this._aList.push(a)},reloadItems:function(){this._applyLayoutChange(),"function"==typeof this._options.onAPIReloadCallback&&this._options.onAPIReloadCallback(this._curLayout)},_addEvents:function(){b.observe(window,"resize",Ink.bindEvent(this._onResize,this))},_onResize:function(){this._canApplyLayoutChange()&&(this._removeDomItems(),this._applyLayoutChange(),"function"==typeof this._options.onResizeCallback&&this._options.onResizeCallback(this._curLayout))},_setCurLayout:function(){var a=c.viewportWidth();if(this._options.customBreakpoints&&"object"==typeof this._options.customBreakPoints){for(var b in this._options.customBreakPoints)if(this._options.customBreakPoints.hasOwnProperty(b)&&a>=Number(this._options.customBreakPoints[b].min)&&a<=Number(this._options.customBreakPoints[b].max)&&this._curLayout!==b)return void(this._curLayout=b)}else a<=Number(this._options.largeMax)&&a>=Number(this._options.largeMin)&&"large"!==this._curLayout?this._curLayout="large":a>=Number(this._options.mediumMin)&&a<=Number(this._options.mediumMax)&&"medium"!==this._curLayout?this._curLayout="medium":a>=Number(this._options.smallMin)&&a<=Number(this._options.smallMax)&&"small"!==this._curLayout&&(this._curLayout="small")},_getColumnsToShow:function(){return Number(this._options.customBreakPoints&&"object"==typeof this._options.customBreakPoints?this._options.customBreakPoints[this._curLayout].cols:this._options[this._curLayout+"Cols"])},_canApplyLayoutChange:function(){var a=this._curLayout;return this._setCurLayout(),a!==this._curLayout?!0:!1},_getPageItemsToList:function(){this._aColumn=Ink.ss(this._options.column,this._element);var a=this._aColumn.length,b=0;if(a>0){for(var c=0;c0&&this._options.isOrdered){for(var f=[],g=0;g0)for(var b=0;a>b;b++)for(var c=Ink.ss(this._options.item,this._aColumn[b]),d=c.length-1;d>=0;d--)c[d].parentNode.removeChild(c[d])},_applyLayoutChange:function(){var a=this._getColumnsToShow(),b=this._aList.length,c=0,d=0;if(a>0)for(;a>d;){if(this._aColumn[d].appendChild(this._aList[c]),c++,d++,c===b)return;d===a&&(d=0)}}},a.createUIComponent(d),d}),Ink.createModule("Ink.UI.Sticky","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Dom.Css_1"],function(a,b,c,d){"use strict";function e(){a.BaseUIComponent.apply(this,arguments)}return e._name="Sticky_1",e._optionDefinition={offsetBottom:["Integer",0],offsetTop:["Integer",0],topElement:["Element",null],wrapperClass:["String","ink-sticky-wrapper"],stickyClass:["String","ink-sticky-stuck"],inlineDimensions:["Boolean",!0],inlinePosition:["Boolean",!0],bottomElement:["Element",null],activateInLayouts:["String",null]},e.prototype={_init:function(){this._options.activateInLayouts&&(this._options.activateInLayouts=this._options.activateInLayouts.toString()),this._dims=null,this._options.offsetTop=parseInt(this._options.offsetTop,10)||0,this._options.offsetBottom=parseInt(this._options.offsetBottom,10)||0,this._options.topElement&&(this._options.topElement=a.elOrSelector(this._options.topElement,"Top Element")),this._options.bottomElement&&(this._options.bottomElement=a.elOrSelector(this._options.bottomElement,"Sticky bottom Element")),this._wrapper=c.create("div",{className:this._options.wrapperClass}),c.wrap(this._element,this._wrapper);var d=document.addEventListener?document:window;this._onScroll=Ink.bind(b.throttle(this._onScroll,33),this),b.observe(d,"scroll",this._onScroll),b.observe(window,"resize",Ink.bindEvent(b.throttle(this._onResize,100),this)),this._onScroll()},_isDisabledInLayout:function(){if(!this._options.activateInLayouts)return!1;var b=a.currentLayout();return b?-1===this._options.activateInLayouts.indexOf(b):!1},_onScroll:function(){var a=this._getDims(),b=c.scrollHeight(),d=this._isDisabledInLayout()||b<=a.top-this._options.offsetTop||this._options.topElement&&this._options.topElement.getBoundingClientRect().bottom+this._options.offsetTop>0;if(d)return void this._unstick();var e=this._options.offsetTop+a.height+c.scrollHeight(),f=document.body.scrollHeight;this._options.bottomElement&&(f=this._options.bottomElement.getBoundingClientRect().top+c.scrollHeight()),f-=this._options.offsetBottom,this._stickTo(f>e?"screen":"bottom")},_stickTo:function(a){var b=this._element.style,e=this._getDims();if(d.addClassName(this._element,this._options.stickyClass),this._wrapper.style.height=e.height+"px",this._inlineDimensions(e.height+"px",e.width+"px"),this._options.inlinePosition!==!1)if(b.left=e.left+"px","screen"===a)b.bottom=null,b.top=this._options.offsetTop+"px";else if("bottom"===a){var f=this._getBottomOffset(),g=c.scrollHeight()+c.viewportHeight(),h=c.pageHeight()-g;b.bottom=f-h+"px",b.top="auto"}},_unstick:function(){d.removeClassName(this._element,this._options.stickyClass),this._inlineDimensions(null,null),this._options.inlinePosition&&(this._element.style.left=null,this._element.style.top=null,this._element.style.bottom=null),this._wrapper.style.height=null,this._wrapper.style.width=null,this._dims=null},_onResize:function(){this._dims=null,this._onScroll()},_getDims:function(){if(null!==this._dims)return this._dims;var a=this._element.style,b=a.position,d=a.width;a.position="static",a.width=null;var e=c.outerDimensions(this._element),f=this._wrapper.getBoundingClientRect();return this._dims={height:e[1],width:e[0],left:f.left+c.scrollWidth(),top:f.top+c.scrollHeight()},a.position=b,a.width=d,this._dims},_inlineDimensions:function(a,b){this._options.inlineDimensions&&(this._element.style.height=a,this._element.style.width=b)},_getBottomOffset:function(){var a=this._options.offsetBottom;return this._options.bottomElement&&(a+=c.pageHeight()-c.offsetTop(this._options.bottomElement)),a}},a.createUIComponent(e),e}),Ink.createModule("Ink.UI.Swipe","1",["Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.UI.Common_1"],function(a,b,c){"use strict";function d(){"function"==typeof arguments[1]&&(arguments[1]={onEnd:arguments[1]}),c.BaseUIComponent.apply(this,arguments)}return d._name="Swipe_1",d._optionDefinition={onEnd:["Function",void 0],onStart:["Function",void 0],onMove:["Function",void 0],minDist:["Number",void 0],maxDist:["Number",void 0],minDuration:["Number",void 0],maxDuration:["Number",void 0],axis:["String",void 0],storeGesture:["Boolean",!1],stopEvents:["Boolean",!0]},d.prototype={_supported:"ontouchstart"in document.documentElement,_init:function(){this._handlers={down:Ink.bindEvent(this._onDown,this),move:Ink.bindEvent(this._onMove,this),up:Ink.bindEvent(this._onUp,this)};var b=document.body;a.observe(b,"touchstart",this._handlers.down),(this._options.storeGesture||this._options.onMove)&&a.observe(b,"touchmove",this._handlers.move),a.observe(b,"touchend",this._handlers.up),this._isOn=!1},_isMeOrParent:function(a,b){if(a){do{if(a===b)return!0;a=a.parentNode}while(a);return!1}},_pushGesture:function(a,b){this._options.storeGesture&&(this._gesture.push(a),this._time.push(b))},_onDown:function(b){1===b.changedTouches.length&&this._isMeOrParent(b.target,this._element)&&(this._options.stopEvents===!0&&a.stop(b),b=b.changedTouches[0],this._isOn=!0,this._target=b.target,this._t0=+new Date,this._p0=[b.pageX,b.pageY],this._options.storeGesture&&(this._gesture=[],this._time=[]),this._pushGesture(this._p0,0),this._options.onStart&&this._options.onStart({event:b,element:this._element,instance:this,position:this._p0,dt:0}))},_onMove:function(b){if(this._isOn&&1===b.changedTouches.length){this._options.stopEvents===!0&&a.stop(b),b=b.changedTouches[0];var c=+new Date,d=c-this._t0,e=[b.pageX,b.pageY];this._pushGesture(e,d),this._options.onMove&&this._options.onMove({event:b,element:this._element,instance:this,position:e,dt:d})}},_onUp:function(b){if(this._isOn&&1===b.changedTouches.length){this._options.stopEvents===!0&&a.stop(b),b=b.changedTouches[0],this._isOn=!1;var c=+new Date,d=[b.pageX,b.pageY],e=c-this._t0,f=[d[0]-this._p0[0],d[1]-this._p0[1]],g=Math.sqrt(f[0]*f[0]+f[1]*f[1]),h=Math.abs(f[0])>Math.abs(f[1])?"x":"y",i=this._options;i.minDist&&gi.maxDist||i.minDuration&&ei.maxDuration||i.axis&&h!==i.axis||this._options.onEnd&&this._options.onEnd({event:b,element:this._element,instance:this,gesture:this._gesture,time:this._time,axis:h,overallMovement:f,overallTime:e})}}},c.createUIComponent(d),d}),Ink.createModule("Ink.UI.Table","1",["Ink.Util.Url_1","Ink.UI.Pagination_1","Ink.Net.Ajax_1","Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1","Ink.Util.String_1","Ink.Util.Json_1"],function(a,b,c,d,e,f,g,h,i,j,k){"use strict";function l(a){return!isNaN(a)&&r.test(a)?parseInt(a,10):isNaN(a)?a:parseFloat(a)}function m(a,b){return a===b?0:a>b?1:-1}function n(a,b){var c=l(g.textContent(a)),d=l(g.textContent(b));return typeof c==typeof d?m(c,d):"number"==typeof c?1:-1;return m(c,d)}function o(a){if("undefined"!=typeof Object.keys)return Object.keys(a);var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b}function p(){d.BaseUIComponent.apply(this,arguments)}function q(a){return a}var r=/\d/g;return p._name="Table_1",p._optionDefinition={pageSize:["Integer",null],caretUpClass:["String","fa fa-caret-up"],caretDownClass:["String","fa fa-caret-down"],endpoint:["String",null],createEndpointUrl:["Function",null],createEndpointURL:["Function",null],getDataFromEndPoint:["Function",null],getDataFromEndpoint:["Function",null],processJSONRows:["Function",function(a){return"number"==typeof a.length?a:a.rows||null}],processJSONRow:["Function",q],processJSONField:["Function",q],processJSONHeaders:["Function",function(a){return a.fields}],processJSONTotalRows:["Function",function(a){return a.totalRows||a.length}],getSortKey:["Function",null],pagination:["Element",null],allowResetSorting:["Boolean",!1],visibleFields:["String",null],tdClassNames:["Object",{}],paginationOptions:["Object",null]},p.prototype={_validate:function(){if("table"!==this._element.nodeName.toLowerCase())throw new Error("[Ink.UI.Table] :: The element is not a table")},_init:function(){this._options.createEndpointUrl&&(this._options.createEndpointURL=this._options.createEndpointUrl),this._options.getDataFromEndPoint&&(this._options.getDataFromEndpoint=this._options.getDataFromEndpoint),this._markupMode=!this._options.endpoint,this._options.visibleFields&&(this._options.visibleFields=this._options.visibleFields.toString().split(/[, ]+/g)),this._thead=this._element.tHead||this._element.createTHead(),this._headers=h.select("th",this._thead),this._handlers={thClick:null},this._originalFields=[],this._sortableFields={},this._originalData=this._data=[],this._pagination=null,this._totalRows=0,this._handlers.thClick=e.on(this._element,"click",'thead th[data-sortable="true"]',Ink.bindMethod(this,"_onThClick")),this._markupMode?(this._resetSortOrder(),this._addHeadersClasses(),this._data=h.select("tbody tr",this._element),this._originalData=this._data.slice(0),this._totalRows=this._data.length,this._setPagination()):this._getData()},_addHeadersClasses:function(){for(var a,b,c=0,d=this._headers.length;d>c;c++)a=g.textContent(this._headers[c]),b=this._options.tdClassNames[a],b&&f.addClassName(this._headers[c],b)},_onThClick:function(a){var b=e.element(a),c=void 0!==this._options.pageSize;e.stop(a);var d=i.keyValue(b,this._headers,!0),f=d!==!1&&void 0!==this._sortableFields[d];if(f)if(!this._markupMode&&c)this._invertSortOrder(d,!1);else{"desc"===this._sortableFields[d]&&this._options.allowResetSorting?(this._setSortOrderOfColumn(d,null),this._data=this._originalData.slice(0)):this._invertSortOrder(d,!0);var g=h.select("tbody",this._element)[0];i.each(this._data,function(a){g.appendChild(a)}),this._pagination&&(this._pagination.setCurrent(0),this._paginate(1))}},_invertSortOrder:function(a,b){for(var c="asc"===this._sortableFields[a],d=0,e=this._headers.length;e>d;d++)this._setSortOrderOfColumn(d,null);b&&(this._sort(a),c&&this._data.reverse()),this._setSortOrderOfColumn(a,!c)},_setSortOrderOfColumn:function(a,b){var c=this._headers[a],d=[""],e="none";b===!0?(d=[''],e="asc"):b===!1&&(d=[''],e="desc"),this._sortableFields[a]=e,c.innerHTML=g.textContent(c)+d.join("")},_paginate:function(a){if(this._pagination){var b=this._options.pageSize,c=(a-1)*b,d=c+b;i.each(this._data,function(a,b){b>=c&&d>b?f.removeClassName(a,"hide-all"):f.addClassName(a,"hide-all")})}},_registerFieldNames:function(a){this._originalFields=[],i.forEach(a,Ink.bind(function(a){this._fieldIsVisible(a)&&this._originalFields.push(a)},this))},_fieldIsVisible:function(a){return!this._options.visibleFields||-1!==this._options.visibleFields.indexOf(a)},_sort:function(a){function b(b){return d.call(e,{columnIndex:a,columnName:c,data:g.textContent(b),element:b})}var c=g.textContent(this._headers[a]),d=this._options.getSortKey;d&&(d="function"==typeof d[c]?d[c]:"function"==typeof d?d:null);var e=this;this._data.sort(function(c,e){var f=Ink.ss("td",c)[a],g=Ink.ss("td",e)[a];return d?m(b(f),b(g)):n(f,g,a)})},_createHeadersFromJson:function(a){if(this._registerFieldNames(o(a)),!this._thead.children.length)for(var b=this._thead.insertRow(0),c,d=0,e=a.length;e>d;d++)this._fieldIsVisible(a[d])&&(c=g.create("th"),c=this._createSingleHeaderFromJson(a[d],c),b.appendChild(c),this._headers.push(c))},_createSingleHeaderFromJson:function(a,b){return a.sortable&&b.setAttribute("data-sortable","true"),a.label&&g.setTextContent(b,a.label),b},_resetSortOrder:function(){for(var a=0,b=this._headers.length;b>a;a++){var c=g.data(this._headers[a]);c.sortable&&"true"===c.sortable.toString()&&(this._sortableFields[a]="none")}},_createRowsFromJSON:function(a){var b=h.select("tbody",this._element)[0];b?g.setHTML(b,""):(b=document.createElement("tbody"),this._element.appendChild(b)),this._data=[];var c;for(var d in a)a.hasOwnProperty(d)&&(c=this._options.processJSONRow(a[d]),this._createSingleRowFromJson(b,c,d));this._originalData=this._data.slice(0)},_createSingleRowFromJson:function(a,b,c){var d=document.createElement("tr");a.appendChild(d);for(var e in b)b.hasOwnProperty(e)&&this._createFieldFromJson(d,b[e],e,c);this._data.push(d)},_createFieldFromJson:function(a,b,c,d){if(this._fieldIsVisible(c)){var e=this._options.processJSONField[c]||this._options.processJSONField,g;g="function"==typeof e?e(b,c,d):b;var h=this._elOrFieldData(g),i=this._options.tdClassNames[c];i&&f.addClassName(h,i),a.appendChild(h)}},_elOrFieldData:function(a){if(d.isDOMElement(a))return a;var b="string"==typeof a,c="number"==typeof a,e=g.create("td");if(b&&/^\s*? li.active",this._menu),h=0,i=g.length;i>h;h++)g[h]!==a&&c.removeClassName(g[h],"active");return this._activeMenuTab&&(c.removeClassName(this._activeMenuTab,"active"),c.removeClassName(this._activeSection,"active"),c.addClassName(this._activeSection,"hide-all")),this._activeMenuLink=a,this._activeMenuTab=this._activeMenuLink.parentNode,this._activeSection=e.select(f,this._element)[0],this._activeSection?(c.addClassName(this._activeMenuTab,"active"),c.addClassName(this._activeSection,"active"),c.removeClassName(this._activeSection,"hide-all"),void(b&&"undefined"!=typeof this._options.onChange&&this._options.onChange(this))):void(this._activeMenuLink=this._activeMenuTab=this._activeSection=null)},_onTabClickedGeneric:function(a){a.preventDefault();var b=!c.hasClassName(a.currentTarget,"ink-disabled")&&a.currentTarget!==this._activeMenuLink;b&&this._onTabClicked(a.currentTarget)},_onTabClicked:function(a){var b=a.getAttribute("href")||"";b=b.substr(b.indexOf("#")),b&&null!==Ink.i(this._dehashify(b))&&a!==this._activeMenuLink&&this.changeTab(a)},_hashify:function(a){return a?0===a.indexOf("#")?a:"#"+a:""},_dehashify:function(a){return a?(""+a).replace(/^#/,""):""},_findLinkByHref:function(a){if(!a)return null;if(1===a.nodeType){if(d.isAncestorOf(a,this._element))return null;for(var b=e.select("a",this._menu),c=a.getAttribute("id"),f=0,g=b.length;g>f;f++){if(b[f]===a||d.isAncestorOf(a,b[f]))return b[f];if(c&&c===this._dehashify(b[f].hash))return b[f]}return null}return a=this._hashify(a),e.select('a[href$="'+a+'"]',this._menu)[0]||null},changeTab:function(a){a=this._findLinkByHref(a),a&&!c.hasClassName(a,"ink-disabled")&&this._changeTab(a,!0)},disable:function(a){c.addClassName(this._findLinkByHref(a),"ink-disabled")},enable:function(a){c.removeClassName(this._findLinkByHref(a),"ink-disabled")},activeTab:function(){return this._activeSection.getAttribute("id")},activeMenuLink:function(){return this._activeMenuLink},activeSection:function(){return this._activeSection},destroy:a.destroyComponent},a.createUIComponent(f),f}),Ink.createModule("Ink.UI.TagField","1",["Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Browser_1","Ink.UI.Droppable_1","Ink.Util.Array_1","Ink.Dom.Selector_1","Ink.UI.Common_1"],function(a,b,c,d,e,f,g,h){"use strict";function i(){h.BaseUIComponent.apply(this,arguments)}var j=13,k=8,l=function(a){return!!a},m=1==="s,".split(/,/g).length,n=function(){var a=String.prototype.split,b=void 0===/()??/.exec("")[1],c;return c=function(c,d,e){if("[object RegExp]"!==Object.prototype.toString.call(d))return a.call(c,d,e);var f=[],g=(d.ignoreCase?"i":"")+(d.multiline?"m":"")+(d.extended?"x":"")+(d.sticky?"y":""),h=0,d=new RegExp(d.source,g+"g"),i,j,k,l;for(c+="",b||(i=new RegExp("^"+d.source+"$(?!\\s)",g)),e=void 0===e?-1>>>0:e>>>0;(j=d.exec(c))&&(k=j.index+j[0].length,!(k>h&&(f.push(c.slice(h,j.index)),!b&&j.length>1&&j[0].replace(i,function(){for(var a=1;a1&&j.index=e)));)d.lastIndex===j.index&&d.lastIndex++;return h===c.length?(l||!d.test(""))&&f.push(""):f.push(c.slice(h)),f.length>e?f.slice(0,e):f}}();return i._name="TagField_1",i._optionDefinition={tags:["String",[]],tagQuery:["Object",null],tagQueryAsync:["Object",null],allowRepeated:["Boolean",!1],maxTags:["Integer",-1],outSeparator:["String",","],separator:["String",/[,; ]+/g],autoSplit:["Boolean",!0]},i.prototype={_init:function(){var d=this._options;"string"==typeof d.separator&&(d.separator=new RegExp(d.separator,"g")),"string"==typeof d.tags&&(d.tags=this._readInput(d.tags)),c.addClassName(this._element,"hide-all"),this._viewElm=a.create("div",{className:"ink-tagfield",insertAfter:this._element}),this._input=a.create("input",{type:"text",className:"new-tag-input",insertBottom:this._viewElm});var e=[].concat(d.tags,this._tagsFromMarkup(this._element));this._tags=[],f.each(e,Ink.bindMethod(this,"_addTag")),b.observe(this._input,"keyup",Ink.bindEvent(this._onKeyUp,this)),b.observe(this._input,"change",Ink.bindEvent(this._onKeyUp,this)),b.observe(this._input,"keydown",Ink.bindEvent(this._onKeyDown,this)),b.observe(this._input,"blur",Ink.bindEvent(this._onBlur,this)),b.observe(this._viewElm,"click",Ink.bindEvent(this._refocus,this))},destroy:function(){a.remove(this._viewElm),c.removeClassName(this._element,"hide-all")},_tagsFromMarkup:function(b){var c=b.tagName.toLowerCase();if("input"===c)return this._readInput(b.value);if("select"===c)return f.map(b.getElementsByTagName("option"),function(b){return a.textContent(b)});throw new Error("Cannot read tags from a "+c+" tag. Unknown tag")},_tagsToMarkup:function(b,c){var d=c.tagName.toLowerCase();if("input"===d)this._options.separator&&(c.value=b.join(this._options.outSeparator));else{if("select"!==d)throw new Error("TagField: Cannot read tags from a "+d+" tag. Unknown tag");c.innerHTML="",f.each(b,function(b){var d=a.create("option",{selected:"selected"});a.setTextContent(d,b),c.appendChild(d)})}},_addTag:function(c){if(!(-1!==this._options.maxTags&&this._tags.length>=this._options.maxTags)){if(!this._options.allowRepeated&&f.inArray(c,this._tags,c)||!c)return!1;var d=a.create("span",{className:"ink-tag",setTextContent:c+" "}),e=a.create("span",{className:"remove fa fa-times",insertBottom:d});b.observe(e,"click",Ink.bindEvent(this._removeTag,this,null));var g=document.createTextNode(" ");this._tags.push(c),this._viewElm.insertBefore(d,this._input),this._viewElm.insertBefore(g,this._input),this._tagsToMarkup(this._tags,this._element)}},_readInput:function(a){return this._options.separator?f.filter(a.split(this._options.separator),l):[a]},_onKeyUp:function(){if(this._options.autoSplit){var a;if(a=m?n(this._input.value,this._options.separator):this._input.value.split(this._options.separator),!(a.length<=1)){var b=a[a.length-1];a=a.splice(0,a.length-1),a=f.filter(a,l),f.each(a,Ink.bind(this._addTag,this)),this._input.value=b}}},_onKeyDown:function(a){return a.which===j?this._onEnterKeyDown(a):a.which===k?this._onBackspaceKeyDown():void(this._removeConfirm&&this._unsetRemovingVisual(this._tags.length-1))},_onBackspaceKeyDown:function(){this._input.value||(this._removeConfirm?(this._unsetRemovingVisual(this._tags.length-1),this._removeTag(this._tags.length-1),this._removeConfirm=null):this._setRemovingVisual(this._tags.length-1))},_onEnterKeyDown:function(a){var c=this._input.value;c&&(this._addTag(c),this._input.value=""),b.stopDefault(a)},_onBlur:function(){this._addTag(this._input.value),this._input.value=""},_setRemovingVisual:function(a){var d=this._viewElm.children[a];d&&(c.addClassName(d,"tag-deleting"),this._removeRemovingVisualTimeout=setTimeout(Ink.bindMethod(this,"_unsetRemovingVisual",a),4e3),b.observe(this._input,"blur",Ink.bindMethod(this,"_unsetRemovingVisual",a)),this._removeConfirm=!0)},_unsetRemovingVisual:function(a){var b=this._viewElm.children[a];b&&(c.removeClassName(b,"tag-deleting"),clearTimeout(this._removeRemovingVisualTimeout)),this._removeConfirm=null},_removeTag:function(c){var d;if("object"==typeof c){var e=b.element(c).parentNode;d=a.parentIndexOf(this._viewElm,e)}else"number"==typeof c&&(d=c);this._tags=f.remove(this._tags,d,1),a.remove(this._viewElm.children[d]),this._tagsToMarkup(this._tags,this._element)},_refocus:function(a){return this._input.focus(),b.stop(a),!1}},h.createUIComponent(i),i}),Ink.createModule("Ink.UI.Toggle","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1"],function(a,b,c,d,e,f){"use strict";function g(){a.BaseUIComponent.apply(this,arguments)}return g._name="Toggle_1",g._optionDefinition={target:["Elements"],triggerEvent:["String","click"],closeOnClick:["Boolean",!0],canToggleAnAncestor:["Boolean",!1],isAccordion:["Boolean",!1],initialState:["Boolean",null],classNameOn:["String","show-all"],classNameOff:["String","hide-all"],closeOnInsideClick:["String","a[href]"],onChangeState:["Function",null]},g.prototype={_init:function(){var b,e;if(this._targets=a.elsOrSelector(this._options.target),this._options.closeOnClick=this._options.closeOnClick,null===this._options.initialState&&(this._options.initialState=c.hasClassName(this._targets[0],this._options.classNameOn)),"show-all"!==this._options.classNameOn||"hide-all"!==this._options.classNameOff)for(b=0,e=this._targets.length;e>b;b++)c.removeClassName(this._targets[b],"show-all"),c.removeClassName(this._targets[b],"hide-all");if(this._options.isAccordion&&(this._accordionContainer=d.findUpwardsByClass(this._element,"accordion"),this._accordionContainer||Ink.warn('Ink.UI.Toggle_1: This toggle has the isToggle option set to `true`, but is not a descendant of an element with the class "accordion"! Because of this, it won\'t be able to find other toggles in the same accordion and cooperate with them.')),this._constructing=!0,this._bindEvents(),null!==this._options.initialState)this.setState(this._options.initialState,!0);else{var f="none"!==c.getStyle(this._targets[0],"display");this.setState(f,!0)}for(b=0,e=this._targets.length;e>b;b++)this._targets[b].style.display&&(this._targets[b].style.display="");this._element.setAttribute("data-is-toggle-trigger","true"),this._constructing=!1},_bindEvents:function(){if(this._options.triggerEvent&&b.on(this._element,this._options.triggerEvent,Ink.bind(this._onTriggerEvent,this)),this._options.closeOnClick&&b.observe(document,"click",Ink.bind(this._onOutsideClick,this)),this._options.closeOnInsideClick){var a=this._options.closeOnInsideClick;"true"===a.toString()&&(a="*"),b.observeMulti(this._targets,"click",Ink.bind(function(c){d.findUpwardsBySelector(b.element(c),a)&&this.setState(!1,!0)},this))}},_onTriggerEvent:function(a){var c=b.element(a),e=f.some(this._targets,function(a){return a===c||d.isAncestorOf(a,c)});if(this._options.canToggleAnAncestor||!e){var g=this.getState();this.setState(!g,!0),!g&&this._firstTime&&(this._firstTime=!1),b.stopDefault(a)}},_updateAccordion:function(){if(this._accordionContainer&&this.getState()!==!1)for(var a=e.select("[data-is-toggle-trigger]",this._accordionContainer),b=0;bi;i++)if(d.isAncestorOf(e[i],c)&&d.isAncestorOf(e[i],this._element))return;this.setState(!1,!0)}}},setState:function(a,b){if(a!==this.getState()||this._constructing){var d,e;if(this._group&&a)for(d=0,e=this._group.length;e>d;d++)this._group[d].getState()===!0&&this._group[d].setState(!1,!0);if(b&&"function"==typeof this._options.onChangeState){var f=this._options.onChangeState(a);if(f===!1)return!1}for(d=0,e=this._targets.length;e>d;d++)c.addRemoveClassName(this._targets[d],this._options.classNameOn,a),c.addRemoveClassName(this._targets[d],this._options.classNameOff,!a);c.addRemoveClassName(this._element,"active",a),this._accordionContainer&&this._updateAccordion()}},getState:function(){return c.hasClassName(this._element,"active")}},a.createUIComponent(g),g}),Ink.createModule("Ink.UI.Tooltip","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1","Ink.Dom.Css_1","Ink.Dom.Browser_1"],function(a,b,c,d,e,f){"use strict";function g(a,b){this._init(a,b||{})}function h(a,b){this._init(a,b)}var i,j,k;!function(){for(var a=document.createElement("DIV"),b=["transition","oTransition","msTransition","mozTransition","webkitTransition"],c=0;ce;e++)this.tooltips[e]=new h(this,c[e])},destroy:function(){e.each(this.tooltips,function(a){a._destroy()}),this.tooltips=null,this.options=null}},h.prototype={_oppositeDirections:{left:"right",right:"left",up:"down",down:"up"},_init:function(c,d){b.observe(d,"mouseover",Ink.bindEvent(this._onMouseOver,this)),b.observe(d,"focus",Ink.bindEvent(this._onMouseOver,this)),b.observe(d,"mouseout",Ink.bindEvent(this._onMouseOut,this)),b.observe(d,"blur",Ink.bindEvent(this._onMouseOut,this)),b.observe(d,"mousemove",Ink.bindEvent(this._onMouseMove,this)),this.root=c,this.element=d,this._delayTimeout=null,this.tooltip=null,a.registerInstance(this,this.element)},_makeTooltip:function(a){if(!this._getOpt("text")&&!this._getOpt("html")&&!c.hasAttribute(this.element,"title"))return!1;var d=this._createTooltipElement();this.tooltip&&this._removeTooltip(),this.tooltip=d,this._fadeInTooltipElement(d),this._placeTooltipElement(d,a),b.observe(d,"mouseover",Ink.bindEvent(this._onTooltipMouseOver,this));var e=this._getFloatOpt("timeout");e&&setTimeout(Ink.bind(function(){this.tooltip===d&&this._removeTooltip()},this),1e3*e)},_createTooltipElement:function(){var b=this._getOpt("template"),e=this._getOpt("templatefield"),g,h;if(b){var i=document.createElement("DIV");if(i.innerHTML=a.elOrSelector(b,"options.template").outerHTML,g=i.firstChild,e){if(h=d.select(e,g),!h)throw"options.templatefield must be a valid selector within options.template";h=h[0]}else h=g}else g=document.createElement("DIV"),f.addClassName(g,"ink-tooltip"),f.addClassName(g,this._getOpt("color")),h=document.createElement("DIV"),f.addClassName(h,"content"),g.appendChild(h);return this._getOpt("html")?h.innerHTML=this._getOpt("html"):this._getOpt("text")?c.setTextContent(h,this._getOpt("text")):c.setTextContent(h,this.element.getAttribute("title")),g.style.display="block",g.style.position="absolute",g.style.zIndex=this._getIntOpt("zIndex"),g},_fadeInTooltipElement:function(a){var b=this._getFloatOpt("fade");i&&b&&(a.style.opacity="0",a.style[i]=b+"s",a.style[j]="opacity",a.style[k]="ease-in-out",setTimeout(function(){a.style.opacity="1"},0))},_placeTooltipElement:function(a,b){var d=this._getOpt("where");if(null!==b||"mousemove"!==d&&"mousefix"!==d||(d="up"),"mousemove"===d||"mousefix"===d){var e=b;this._setPos(e[0],e[1]),m.appendChild(a)}else if(d.match(/(up|down|left|right)/)){m.appendChild(a);var g=c.offset(this.element),h=g[0],i=g[1],j=c.elementWidth(this.element)/2-c.elementWidth(a)/2,k=c.elementHeight(this.element)/2-c.elementHeight(a)/2,l=this._getIntOpt("spacing"),n=c.elementDimensions(a),o=c.elementDimensions(this.element),p=c.scrollWidth()+c.viewportWidth(),q=c.scrollHeight()+c.viewportHeight();d=this._getWhereValueInsideViewport(d,{left:h-n[0],right:h+n[0],top:i+n[1],bottom:i+n[1]},{right:p,bottom:q}),"up"===d?(i-=n[1],i-=l,h+=j):"down"===d?(i+=o[1],i+=l,h+=j):"left"===d?(h-=n[0],h-=l,i+=k):"right"===d&&(h+=o[0],h+=l,i+=k);var r=null;d.match(/(up|down|left|right)/)&&(r=document.createElement("SPAN"),f.addClassName(r,"arrow"),f.addClassName(r,this._oppositeDirections[d]),a.appendChild(r));var s=h,t=i,u=t+n[1]-q,v=s+n[0]-p,w=0-s,x=0-t;u>0?(r&&(r.style.top=n[1]/2+u+"px"),t-=u):x>0?(r&&(r.style.top=n[1]/2-x+"px"),t+=x):v>0?(r&&(r.style.left=n[0]/2+v+"px"),s-=v):w>0&&(r&&(r.style.left=n[0]/2-w+"px"),s+=w),a.style.left=s+"px",a.style.top=t+"px"}},_getWhereValueInsideViewport:function(a,b,c){return"left"===a&&b.left<0?"right":"right"===a&&b.right>c.right?"left":"up"===a&&b.top<0?"down":"down"===a&&b.bottom>c.bottom?"up":a},_removeTooltip:function(){var a=this.tooltip;if(a){var b=Ink.bind(c.remove,{},a);"mousemove"!==this._getOpt("where")&&i?(a.style.opacity=0,setTimeout(b,1e3*this._getFloatOpt("fade"))):b(),this.tooltip=null}},_getOpt:function(a){var b=c.data(this.element)[c._camelCase("tip-"+a)];if(b)return b;var d=this.root.options[a];return"undefined"!=typeof d?d:void 0},_getIntOpt:function(a){return parseInt(this._getOpt(a),10)},_getFloatOpt:function(a){return parseFloat(this._getOpt(a),10)},_destroy:function(){this.tooltip&&c.remove(this.tooltip),this.root=null,this.element=null,this.tooltip=null},_onMouseOver:function(a){var b;b="mouseover"!==a.type?null:this._getMousePosition(a);var c=this._getFloatOpt("delay");c?this._delayTimeout=setTimeout(Ink.bind(function(){this.tooltip||this._makeTooltip(b),this._delayTimeout=null},this),1e3*c):this._makeTooltip(b)},_onMouseMove:function(a){if("mousemove"===this._getOpt("where")&&this.tooltip){var b=this._getMousePosition(a);this._setPos(b[0],b[1])}},_onMouseOut:function(){this._getIntOpt("forever")||this._removeTooltip(),this._delayTimeout&&(clearTimeout(this._delayTimeout),this._delayTimeout=null)},_onTooltipMouseOver:function(){this.tooltip&&this._removeTooltip()},_setPos:function(a,b){a+=this._getIntOpt("left"),b+=this._getIntOpt("top");var d=this._getPageXY();if(this.tooltip){var e=[c.elementWidth(this.tooltip),c.elementHeight(this.tooltip)],f=this._getScroll();e[0]+a-f[0]>=d[0]-20&&(a=a-e[0]-this._getIntOpt("left")-10),e[1]+b-f[1]>=d[1]-20&&(b=b-e[1]-this._getIntOpt("top")-10),this.tooltip.style.left=a+"px",this.tooltip.style.top=b+"px"}},_getPageXY:function(){var a=0,b=0;return"number"==typeof window.innerWidth?(a=window.innerWidth,b=window.innerHeight):document.documentElement&&(document.documentElement.clientWidth||document.documentElement.clientHeight)?(a=document.documentElement.clientWidth,b=document.documentElement.clientHeight):document.body&&(document.body.clientWidth||document.body.clientHeight)&&(a=document.body.clientWidth,b=document.body.clientHeight),[parseInt(a,10),parseInt(b,10)]},_getScroll:function(){var a=document.documentElement,b=document.body;return a&&(a.scrollLeft||a.scrollTop)?[a.scrollLeft,a.scrollTop]:b?[b.scrollLeft,b.scrollTop]:[0,0]},_getMousePosition:function(a){return[parseInt(b.pointerX(a),10),parseInt(b.pointerY(a),10)]}},g}),Ink.createModule("Ink.UI.TreeView","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1"],function(a,b,c,d,e,f){"use strict";function g(){a.BaseUIComponent.apply(this,arguments)}return g._name="TreeView_1",g._optionDefinition={node:["String","li"],children:["String","ul"],parentClass:["String","parent"],openNodeClass:["String","open"],openClass:["String","fa fa-minus-circle"],closedClass:["String","fa fa-plus-circle"],hideClass:["String","hide-all"],iconTag:["String","i"],stopDefault:["Boolean",!0]},g.prototype={_init:function(){this._handlers={click:Ink.bindEvent(this._onClick,this)},b.on(this._element,"click",this._options.node,this._handlers.click),f.each(Ink.ss(this._options.node,this._element),Ink.bind(function(a){if(this.isParent(a)){c.addClassName(a,this._options.parentClass);var b=this.isOpen(a);this._getIcon(a)||d.create(this._options.iconTag,{insertTop:a}),this._setNodeOpen(a,b)}},this))},_getIcon:function(a){return Ink.s("> "+this._options.iconTag,a)},isOpen:function(a){if(!this._getChild(a))throw new Error("not a node!");return"true"===a.getAttribute("data-open")||c.hasClassName(a,this._options.openNodeClass)},isParent:function(a){return c.hasClassName(a,this._options.parentClass)||null!=this._getChild(a)},_setNodeOpen:function(a,b){var d=this._getChild(a);if(d){c.setClassName(d,this._options.hideClass,!b);var e=this._getIcon(a);a.setAttribute("data-open",b);var f=b?this._options.openClass:this._options.closedClass,g=b?this._options.closedClass:this._options.openClass;c.removeClassName(e,g),c.addClassName(e,f),c.setClassName(a,this._options.openNodeClass,b)}else Ink.error("Ink.UI.TreeView: node",a,"is not a node!")},open:function(a){this._setNodeOpen(a,!0)},close:function(a){this._setNodeOpen(a,!1)},toggle:function(a){this.isOpen(a)?this.close(a):this.open(a)},_getChild:function(a){return e.select(this._options.children,a)[0]||null},_onClick:function(a){!this.isParent(a.currentTarget)||e.matchesSelector(a.target,this._options.node)||e.matchesSelector(a.target,this._options.children)||(this._options.stopDefault&&a.preventDefault(),this.toggle(a.currentTarget))}},a.createUIComponent(g),g}),Ink.createModule("Ink.UI.Upload","1",["Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Dom.Browser_1","Ink.UI.Common_1"],function(a,b,c,d){"use strict";var e=function(a){this.init(a)};e.prototype={init:function(a){this._options=Ink.extendObj({entry:void 0,maxDepth:10},a||{});try{this._read()}catch(b){Ink.error(b)}},_read:function(){if(!this._options.entry)return void Ink.error("You must specify the entry!");try{this._readDirectories()}catch(a){Ink.error(a)}},_readDirectories:function(){var a=[],b=!1,c=0,d=Ink.bind(function(e){var f=e.createReader();b=!0,f.readEntries(Ink.bind(function(e){if(e.length>0){for(var f=0,g=e.length;g>f;f++)a.push(e[f]),e[f].isDirectory&&(c=this.clearArray(e[f].fullPath.split("/")),c.shift(),c=c.length,c<=this._options.maxDepth&&d(e[f]));this._stopActivityTimeout&&clearTimeout(this._stopActivityTimeout),this._stopActivityTimeout=setTimeout(function(){b=!1},250)}e.length||(b=!1)},this),Ink.bind(function(a){this._options.readError(a,e)},this))},this);d(this._options.entry);var e,f=function(){return b?!1:(clearInterval(e),this._options.readComplete&&"function"==typeof this._options.readComplete&&this._options.readComplete(a),!0)};e=setInterval(Ink.bind(f,this),250)},clearArray:function(a){for(var b=a.length-1;b>=0;b--)("undefined"==typeof a[b]||null===a[b]||""===a[b])&&a.splice(b,1);return a}};var f={lists:[],items:[],create:function(a){var b;return a=String(a),this.lists.push({name:a}),b=this.lists.length-1},getItems:function(a){if(!a)return this.items;for(var b=[],c=0,d=this.items.length;d>c;c++)this.items[c].parentId===a&&b.push(this.items[c]);return b},purge:function(a,b){if("number"!=typeof a||isNaN(Number(a)))return!1;try{for(var c=this.items.length;c>=0;c--)this.items[c]&&a===this.items[c].parentId&&this.remove(this.items[c].parentId,this.items[c].pid);return b||this.lists.splice(a,1),!0}catch(d){return Ink.error("Purge: invalid id"),!1}},add:function(a,b,c){if(!this.lists[a])return!1;"object"!=typeof b&&(b=String(b));var d=parseInt(Math.round(1e5*Math.random())+""+Math.round(1e5*Math.random()),10);return c=c||0,this.items.push({parentId:a,item:b,priority:c||0,pid:d}),d},view:function(a,b){var c=this._searchByPid(a,b);return c===!1?!1:this.items[c]},remove:function(a,b){try{var c=this._searchByPid(a,b);return c===!1?!1:(this.items.splice(c,1),!0)}catch(d){return Ink.error("Remove: invalid id"),!1}},_searchByPid:function(a,b){if(!a&&"boolean"==typeof a||!b)return!1;if(a=parseInt(a,10),b=parseInt(b,10),isNaN(a)||isNaN(b))return!1;for(var c=0,d=this.items.length;d>c;c++)if(this.items[c].parentId===a&&this.items[c].pid===b)return c;return!1}},g=function(a){this.Upload=a,this.init()};g.prototype={init:function(){this._fileButton=this.Upload._options.fileButton,this._dropzone=this.Upload._options.dropzone,this._setDropEvent(),this._setFileButton()},_setDropEvent:function(){var a=this._dropzone;if(a)for(var b=0,c=a.length;c>b;b++)a[b].ondrop=Ink.bindEvent(this.Upload._dropEventHandler,this.Upload),a[b].ondragleave=Ink.bindEvent(this._onDragLeave,this),a[b].ondragend=Ink.bindEvent(this._onDragEndEventHandler,this),a[b].ondragdrop=Ink.bindEvent(this._onDragEndEventHandler,this),a[b].ondragenter=Ink.bindEvent(this._onDragEnterHandler,this),a[b].ondragover=Ink.bindEvent(this._onDragOverHandler,this)},_onDragEnterHandler:function(a){return a&&a.stopPropagation&&a.stopPropagation(),a&&a.preventDefault&&a.preventDefault(),a&&(a.returnValue=!1),this.Upload.publish("DragEnter",a),!1},_onDragOverHandler:function(a){return a?(a.preventDefault(),a.stopPropagation(),a.returnValue=!1,!0):!1},_onDragLeave:function(a){return this.Upload.publish("DragLeave",a)},_onDragEndEventHandler:function(a){return this.Upload.publish("DragEnd",a)},_setFileButton:function(){var b=this._fileButton;b&&a.observeMulti(b,"change",Ink.bindEvent(this._fileChangeHandler,this))},_fileChangeHandler:function(c){var d=a.element(c),e=d.files,f=b.findUpwardsByTag(d,"form");return e&&window.FormData&&"withCredentials"in new XMLHttpRequest?(this.Upload._addFilesToQueue(e),void(d.value="")):(f.parentNode.submit(),!1)}};var h=function(a){this.Queue=f,this.init(a),this._events={}};return h.prototype={init:function(a){if("string"==typeof a&&(a=b.data(d.elOrSelector(a,"1st argument"))),this._options=Ink.extendObj({dropzone:void 0,fileButton:void 0,fileFormName:"Ink_Filelist",endpoint:"",maxFilesize:300<<20,INVALID_FILE_NAME:void 0,extraData:{},useChunks:!1,chunkSize:4194304,minSizeToUseChunks:20971520,endpointChunk:"",endpointChunkCommit:"",foldersEnabled:!1,directoryMaxDepth:10},a||{}),this._queueId=f.create("Ink_UPLOAD"),this._queueRunning=!1,this._folders={},this._options.dropzone&&(this._options.dropzone=d.elsOrSelector(this._options.dropzone,"Ink.UI.Upload - dropzone")),this._options.fileButton&&(this._options.fileButton=d.elsOrSelector(this._options.fileButton,"Ink.UI.Upload - fileButton")),!this._options.dropzone&&!this._options.fileButton)throw new TypeError("Ink.UI.Upload: Specify a fileButton or a Dropzone!");new g(this)},_supportChunks:function(a){return this._options.useChunks&&"Blob"in window&&(new Blob).slice&&a>this._options.minSizeToUseChunks},_dropEventHandler:function(b){a.stop(b),this.publish("DropComplete",b.dataTransfer);var c=b.dataTransfer;if(!c||!c.files||!c.files.length)return!1;if(this._files=c.files,this._files=Array.prototype.slice.call(this._files||[],0),c.items&&c.items[0]&&c.items[0].webkitGetAsEntry){if(!this._options.foldersEnabled)return setTimeout(Ink.bind(this._addFilesToQueue,this,this._files),0);for(var d,e=[],f=b.dataTransfer.items.length-1;f>=0;f--)d=b.dataTransfer.items[f].webkitGetAsEntry(),d&&d.isDirectory&&(e.push(d),this._files[f].isDirectory=!0,this._files.splice(f,1));this._addFolderToQueue(e,Ink.bind(function(){setTimeout(Ink.bind(this._addFilesToQueue,this,this._files),0)},this))}else setTimeout(Ink.bind(this._addFilesToQueue,this,this._files),0);return!0},_addFolderToQueue:function(a,b){var c=[],d={};if(!a||!a.length)return b(),c;var f=function(a){for(var b=[],c=0,d=a.length;d>c;c++)a[c].isFile&&b.push(a[c]);return b},g=function(a,b){var d;return b=b||0,this._files[b]?"fileentry"!==this._files[b].constructor.name.toLowerCase()?g.apply(this,[a,++b]):void this._files[b].file(Ink.bind(function(c){d=this._files[b].fullPath,this._files[b]=c,this._files[b].hasParent=!0,this._files[b].fullPath||(this._files[b].fullPath=d),g.apply(this,[a,++b])},this),Ink.bind(function(){this._files.splice(b,1),g.apply(this,[a,b])},this)):(a(),c)},h=Ink.bind(function(i){return a[i]?void new e({entry:a[i],maxDepth:this._options.directoryMaxDepth,readComplete:Ink.bind(function(b){if(c=c.concat(f(b)),a[i]&&!(a[i].fullPath in this._folders)){this._folders[a[i].fullPath]={items:b,files:c,length:b.length,created:!1,root:!0};for(var e=0,g=b.length;g>e;e++)b[e].isFile||(b[e].fullPath in d?delete d[b[e].fullPath]:this._folders[b[e].fullPath]={created:!1,root:!1});h(++i)}},this),readError:Ink.bind(function(a,b){d[b.fullPath]={},d[b.fullPath].error=a},this)}):(this._files=this._files.concat(c),g.call(this,b),!1)},this);return h(0),c},_addFilesToQueue:function(a){for(var b,d,e,g=0,h=a.length;h>g;g++)b=a[g],b.isDirectory||null!==b&&(b.type||b.size%4096!==0||c.CHROME&&this._options.foldersEnabled)?b.size>this._options.maxFilesize?this.publish("MaxSizeFailure",b,this._options.maxFilesize):(d=parseInt(Math.round(1e5*Math.random())+""+Math.round(1e5*Math.random()),10),e={id:g,data:b,fileID:d,directory:b.isDirectory},f.add(this._queueId,e),this.publish("FileAddedToQueue",e)):this.publish("InvalidFile",b,"size");this._processQueue(!0),this._files=[]},_processQueue:function(a){if(this._queueRunning)return!1;this.running=0;var b=1,c=0,d,e=f.items.length;this._queueRunning=!0,this.interval=setInterval(Ink.bind(function(){if(f.items.length===c&&0===this.running&&(f.purge(this._queueId,!0),this._queueRunning=!1,clearInterval(this.interval),this.publish("QueueEnd",this._queueId,e)),d=f.getItems(this._queueId),this.runningb.chunk_offset){if(c.response){var e=JSON.parse(c.response),f=b.chunk_offset&&e.offset!==b.chunk_offset+this._options.chunkSize&&b.size!==e.offset;f?(a.cb&&a.cb(),this.publish("ErrorUpload",b,d)):(b.chunk_upload_id=e.upload_id,b.chunk_offset=e.offset,b.chunk_expires=e.expires,this._upload(a))}else a.cb&&a.cb(),this.publish("ErrorUpload",b,d);return c=null}return a.cb&&a.cb(),c.responseText&&c.status<400?this.publish("EndUpload",b,d,c.responseText):this.publish("ErrorUpload",b,d),c=null},this),c.onerror=Ink.bindEvent(function(){a.cb&&a.cb(),this.publish("ErrorUpload",b,d)},this),c.onabort=Ink.bindEvent(function(){a.cb&&a.cb(),this.publish("AbortUpload",b,d,{abortAll:Ink.bind(this.abortAll,this),abortOne:Ink.bind(this.abortOne,this)})},this)},abortAll:function(){return this._queueRunning?(clearInterval(this.interval),this._queueRunning=!1,f.purge(this._queueId,!0),!0):!1},abortOne:function(a,b){for(var c=f.getItems(0),d,e=0,g=c.length;g>e;e++)if(c[e].item.fileID===a)return d={id:c[e].item.fileID,name:c[e].item.data.name,size:c[e].item.data.size,hasParent:c[e].item.data.hasParent},f.remove(0,c[e].pid),b&&b(d),!0; diff --git a/dist/js/ink-all.min.js.map b/dist/js/ink-all.min.js.map index 06f46f047..593af92c4 100644 --- a/dist/js/ink-all.min.js.map +++ b/dist/js/ink-all.min.js.map @@ -1 +1 @@ -{"version":3,"file":"ink-all.min.js","sources":["../../src/js/Ink/1/lib.js","../../src/js/Ink/Net/Ajax/1/lib.js","../../src/js/Ink/Net/JsonP/1/lib.js","../../src/js/Ink/Dom/Browser/1/lib.js","../../src/js/Ink/Dom/Css/1/lib.js","../../src/js/Ink/Dom/Element/1/lib.js","../../src/js/Ink/Dom/Event/1/lib.js","../../src/js/Ink/Dom/FormSerialize/1/lib.js","../../src/js/Ink/Dom/Loaded/1/lib.js","../../src/js/Ink/Dom/Selector/1/lib.js","../../src/js/Ink/UI/Animate/1/lib.js","../../src/js/Ink/UI/Carousel/1/lib.js","../../src/js/Ink/UI/Close/1/lib.js","../../src/js/Ink/UI/Common/1/lib.js","../../src/js/Ink/UI/DatePicker/1/lib.js","../../src/js/Ink/UI/Draggable/1/lib.js","../../src/js/Ink/UI/Drawer/1/lib.js","../../src/js/Ink/UI/Dropdown/1/lib.js","../../src/js/Ink/UI/Droppable/1/lib.js","../../src/js/Ink/UI/FormValidator/1/lib.js","../../src/js/Ink/UI/FormValidator/2/lib.js","../../src/js/Ink/UI/ImageQuery/1/lib.js","../../src/js/Ink/UI/LazyLoad/1/lib.js","../../src/js/Ink/UI/Modal/1/lib.js","../../src/js/Ink/UI/Pagination/1/lib.js","../../src/js/Ink/UI/ProgressBar/1/lib.js","../../src/js/Ink/UI/SmoothScroller/1/lib.js","../../src/js/Ink/UI/SortableList/1/lib.js","../../src/js/Ink/UI/Spy/1/lib.js","../../src/js/Ink/UI/Stacker/1/lib.js","../../src/js/Ink/UI/Sticky/1/lib.js","../../src/js/Ink/UI/Swipe/1/lib.js","../../src/js/Ink/UI/Table/1/lib.js","../../src/js/Ink/UI/Tabs/1/lib.js","../../src/js/Ink/UI/TagField/1/lib.js","../../src/js/Ink/UI/Toggle/1/lib.js","../../src/js/Ink/UI/Tooltip/1/lib.js","../../src/js/Ink/UI/TreeView/1/lib.js","../../src/js/Ink/UI/Upload/1/lib.js","../../src/js/Ink/Util/Array/1/lib.js","../../src/js/Ink/Util/BinPack/1/lib.js","../../src/js/Ink/Util/Cookie/1/lib.js","../../src/js/Ink/Util/Date/1/lib.js","../../src/js/Ink/Util/Dumper/1/lib.js","../../src/js/Ink/Util/I18n/1/lib.js","../../src/js/Ink/Util/Json/1/lib.js","../../src/js/Ink/Util/String/1/lib.js","../../src/js/Ink/Util/Url/1/lib.js","../../src/js/Ink/Util/Validator/1/lib.js"],"names":["window","document","paths","modules","modulesLoadOrder","modulesRequested","pendingRMs","modulesWaitingForDeps","apply","Function","prototype","isEmptyObject","o","k","hasOwnProperty","Ink","VERSION","_checkPendingRequireModules","I","F","dep","mod","cb","pRMs","toApply","length","left","args","remaining","push","i","setTimeout","getPath","key","noLib","split","curKey","root","path","slice","join","test","setPath","rootURI","replace","loadScript","uri","contentType","indexOf","givenUri","this","Error","scriptEl","createElement","setAttribute","onerror","error","head","getElementsByTagName","appendChild","_loadLater","namespace","ns","returnParentAndKey","levels","nsobj","parent","f","getModule","version","createModule","deps","modFn","modAll","Array","call","arguments","moduleContent","_version","isInkModule","t","requireModules","cbFn","undefined","_moduleRenames","warn","Ink.UI.Aux_1","getModulesLoadOrder","getModuleScripts","mlo","unshift","map","m","getModuleURL","createExt","moduleName","dependencies","bind","fn","context","innerArgs","finalArgs","concat","bindMethod","object","methodName","bindEvent","event","id","getElementById","ss","selector","from","Dom","Selector","select","s","extendObj","destination","sources","len","property","Object","log","console","Ajax","url","options","init","globalOptions","parameters","requestHeaders","xMLHttpRequestWithCredentials","XMLHttpRequest","userOptions","asynchronous","cors","validateCors","debug","delay","evalJS","method","postBody","sanitizeJSON","signRequest","timeout","useCredentials","xhrProxy","onComplete","onCreate","onException","onFailure","onHeaders","onInit","onSuccess","onTimeout","globalParameters","paramsObjToStr","safeCall","urlLocation","_locationFromURL","isHTTP","_locationIsHTTP","isCrossDomain","_locationIsCrossDomain","location","requestHasBody","search","transport","getTransport","request","createElementNS","href","match","protocol","widget","split1","split2","protocol1","protocol2","colonOrSlash","host1","host2","usingXDomainReq","XDomainRequest","ActiveXObject","e","setHeaders","headers","Accept","Accept-Language","navigator","language","X-Requested-With","X-Ink-Version","headerReqName","overrideMimeType","userAgent","Connection","headerName","setRequestHeader","optParams","p","a","params","toString","isNaN","encodeURIComponent","pop","setParams","getHeader","name","getResponseHeader","getAllHeaders","getAllResponseHeaders","getResponse","r","headerJSON","responseJSON","timeTaken","Date","startTime","requestedUrl","readyState","responseText","responseXML","status","statusText","abort","clearTimeout","delayTimeout","stoTimeout","ex","finish","runStateChange","rs","getTime","responseContent","response","curStatus","isSuccess","headerContentType","evalJSON","mimeType","xmlDoc","DOMParser","parseFromString","xml","onreadystatechange","destroy","handlerName","value","nodeType","crossDomain","open","withCredentials","onload","send","isJSON","str","strJSON","sanitize","JSON","parse","eval","load","callback","ping","JsonP","failureObj","callbackParam","internalCallback","randVar","parseInt","Math","random","Net","_cleanUp","_addScriptTag","_addParamsToGet","hasQuestionMark","sep","pKey","pValue","parts","_getScriptContainer","body","documentElement","rnd_seed","_scriptEl","type","src","scriptCtn","_removeScriptTag","parentNode","removeChild","Browser","IE","GECKO","OPERA","SAFARI","KONQUEROR","CHROME","model","cssPrefix","domPrefix","detectBrowser","setDimensions","setReferrer","myWidth","myHeight","innerWidth","innerHeight","clientWidth","clientHeight","windowWidth","windowHeight","referrer","escape","_sniffUserAgent","sAgent","toLowerCase","rVersion","re","RegExp","reVersion","alert","getCs","defaultView","getComputedStyle","Css","addRemoveClassName","elm","className","addRemState","addClassName","removeClassName","classList","add","hasClassName","remove","elmClassName","setClassName","all","has","contains","blinkClass","element","negate","Number","toggleClassName","forceAdd","toggle","setOpacity","val","style","opacity","filter","_camelCase","_","$1","toUpperCase","getStyle","currentStyle","charAt","css","parseFloat","setStyle","cssText","prop","styleFloat","cssFloat","show","forceDisplayProperty","display","hide","showHide","forceShow","_getRefTag","firstElementChild","child","firstChild","nextSibling","appendStyleTag","force","styles","oldStyle","l","innerHTML","defStyle","refTag","styleStr","styleSheet","createTextNode","insertBefore","appendStylesheet","media","rel","_loadingCSSFiles","_loadedCSSFiles","appendStylesheetCb","cbs","linkEl","headEl","imgEl","_url","callbacks","decToHex","dec","normalizeTo2","rDec","gDec","g","bDec","b","rgb","hexToDec","hex","substr","getPropertyFromStylesheet","rule","getRuleFromStylesheet","getPropertyFromStylesheet2","rules","getRulesFromStylesheet","x","sheet","ri","rf","styleSheets","si","sf","cssRules","selectorText","res","getPropertiesFromRule","props","steps","pre","pos","substring","borderTopLeftRadius","borderBottomRightRadius","borderTopRightRadius","borderBottomLeftRadius","changeFontSize","delta","op","minVal","maxVal","that","TypeError","el","els","fontSize","rect","elem","dimensions","getBoundingClientRect","top","offsetTop","offsetLeft","createContextualFragmentSupport","createRange","Range","createContextualFragment","deleteThisTbodyToken","browserCreatesTbodies","div","InkElement","isDOMElement","get","create","tag","properties","parEl","scrollTo","scrollIntoView","elmOffset","elmTop","elmLeft","offsetParent","y","offset","positionedOffset","valueTop","valueLeft","tagName","position","doc","ownerDocument","docElem","box","clientTop","clientLeft","scrollTop","pageYOffset","scrollLeft","pageXOffset","scroll","_getPropPx","cs","n","c","getPropertyValue","offset2","hasAttribute","attr","getAttribute","insertAfter","newElm","targetElm","insertTop","insertBottom","textContent","node","text","innerText","lastChild","childNodes","nodeValue","setTextContent","isLink","hasAttributeNS","isAncestorOf","ancestor","compareDocumentPosition","descendantOf","descendant","lastElementChild","previousSibling","nextElementSibling","sibling","previousElementSibling","elementWidth","offsetWidth","elementHeight","offsetHeight","elementLeft","elementTop","elementDimensions","outerDimensions","bbox","right","bottom","inViewport","dims","partial","margin","viewportWidth","viewportHeight","isHidden","w","h","isVisible","clonePosition","cloneTo","cloneFrom","ellipsizeText","overflow","whiteSpace","textOverflow","findUpwardsHaving","boolTest","findUpwardsByClass","tst","cls","findUpwardsByTag","nodeName","findUpwardsById","findUpwardsBySelector","sel","matchesSelector","getChildrenText","removeIt","j","part","nodes","jLen","_trimString","String","data","trim","getSelectValues","selectEl","values","_normalizeData","d","data2","fillSelect","container","skipEmpty","defaultValue","containerEl","optionEl","fillRadios","insertAfterEl","splitEl","inputEl","checked","fillChecks","parentIndexOf","parentEl","childEl","children","nextSiblings","elements","siblings","index","previousSiblings","childElementCount","_wrapElements","TABLE","html","TBODY","THEAD","TFOOT","TR","_getWrapper","wrapper","wrapFunc","tds","tbody","appendHTML","prependHTML","setHTML","wrap","target","nextNode","unwrap","wrapperSelector","replacement","replaceChild","removeTextNodeChildren","prevEl","toRemove","htmlToFragment","range","createDocumentFragment","selectNode","fragment","tempElement","current","InkDomSelector","dataset","attrs","attributes","curAttr","curAttrName","curAttrValue","total","moveCursorTo","setSelectionRange","createTextRange","collapse","moveEnd","moveStart","pageWidth","xScroll","scrollMaxX","scrollWidth","self","pageHeight","yScroll","scrollMaxY","scrollHeight","bean","definition","win","old","namespaceRegex","nameRegex","addEvent","removeEvent","W3C_MODEL","eventSupport","ONE","str2arr","isString","isFunction","standardNativeEvents","w3cNativeEvents","nativeEvents","hash","events","customEvents","isAncestor","check","related","relatedTarget","prefix","mouseenter","base","condition","mouseleave","mousewheel","Event","commonProps","mouseProps","mouseWheelProps","keyProps","textProps","touchProps","messageProps","stateProps","overOutRegex","typeFixers","reg","fix","newEvent","keyCode","which","rightClick","button","pageX","pageY","clientX","clientY","typeFixerMap","isNative","parentWindow","originalEvent","isBean","srcElement","fixer","preventDefault","returnValue","stopPropagation","cancelBubble","stop","stopped","stopImmediatePropagation","isImmediatePropagationStopped","clone","currentTarget","ne","targetElement","RegEntry","wrappedHandler","eargs","findTarget","eventElement","__beanDel","ft","handler","original","namespaces","customType","once","removeListener","eventType","inNamespaces","checkNamespaces","matches","checkElement","checkOriginal","checkHandler","registry","forAll","pfx","list","entries","entry","put","del","splice","removed","selectorEngine","setSelectorEngine","querySelectorAll","rootListener","propertyName","listeners","listener","custom","attachEvent","detachEvent","rm","originalFn","orgType","handlers","delegate","array","fireListener","evt","createEvent","dispatchEvent","fireEvent","createEventObject","off","typeSpec","isTypeStr","on","types","first","delfn","one","fire","names","beanDel","noConflict","cleanup","CollectGarbage","InkEvent","KEY_BACKSPACE","KEY_TAB","KEY_RETURN","KEY_ESC","KEY_SPACE","KEY_LEFT","KEY_UP","KEY_RIGHT","KEY_DOWN","KEY_DELETE","KEY_HOME","KEY_END","KEY_PAGEUP","KEY_PAGEDOWN","KEY_INSERT","throttle","func","wait","throttled","now","timeDiff","lastCall","ev","delegationTarget","fromElement","toElement","findElement","elmTagName","observe","eventName","callBack","useCapture","addEventListener","observeOnce","onceBack","stopObserving","observeMulti","observeDelegated","cursor","Selector_1","removeEventListener","cancel","stopDefault","pointer","pointerX","pointerY","touches","isLeftClick","isRightClick","isMiddleClick","getCharFromKeyboardEvent","changeCasing","fromCharCode","shiftOn","shiftKey","InkArray","isArrayIsh","obj","isArray","toArray","FormSerialize","serialize","form","out","emptyArrayToken","pairs","asPairs","emptyArray","outputUnchecked","forEach","pair","_resultsInArray","emit","serializeEl","elNodeName","elType","multiple","didEmit","thisOption","inputs","_isSerialized","fillIn","map2","_objToPairs","_fillInPairs","groupBy","reduce","_fillInOne","firstOne","firstNodeName","firstType","isSelectMulti","_fillInBoolean","min","checkAttr","input","isChecked","inArray","Loaded","_contexts","run","cbQueue","done","checkState","_checkState","poll","_poll","ael","rem","det","wet","csf","alreadyLoaded","frameElement","doScroll","where","_ready","rnative","createCache","cache","keys","Expr","cacheLength","shift","markFunction","expando","assert","Sizzle","results","seed","groups","nid","newContext","newSelector","preferredDoc","setDocument","documentIsHTML","rquickExpr","exec","support","getElementsByClassName","qsa","rbuggyQSA","tokenize","rescape","toSelector","rsibling","qsaError","removeAttribute","rtrim","siblingCheck","cur","diff","sourceIndex","MAX_NEGATIVE","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","parseOnly","matched","tokens","soFar","preFilters","cached","tokenCache","preFilter","rcomma","rcombinators","matchExpr","addCombinator","matcher","combinator","dir","checkNonElements","doneName","outerCache","dirkey","dirruns","cachedruns","elementMatcher","matchers","condense","unmatched","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","elems","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","relative","implicitRelative","matchContext","matchAnyContext","outermostContext","matcherFromGroupMatchers","elementMatchers","setMatchers","matcherCachedRuns","bySet","byElement","superMatcher","expandContext","setMatched","matchedCount","outermost","contextBackup","find","dirrunsUnique","uniqueSort","contexts","token","runescape","funescape","compile","setFilters","getText","isXML","recompare","sortInput","rbuggyMatches","classCache","compilerCache","hasDuplicate","sortOrder","strundefined","arr","push_native","whitespace","characterEncoding","identifier","operators","pseudos","rpseudo","ridentifier","ID","CLASS","NAME","TAG","ATTR","PSEUDO","CHILD","needsContext","rinputs","rheader","rattributeQuotes","escaped","high","createComment","getByName","pass","getElementsByName","sortDetached","div1","attrHandle","attrId","getAttributeNode","tmp","mozMatchesSelector","webkitMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","adown","bup","compare","aup","ap","bp","expr","ret","specified","msg","duplicates","detectDuplicates","sortStable","sort","selectors","createPseudo",">"," ","+","~","excess","unquoted","pattern","operator","result","what","last","simple","forward","ofType","nodeIndex","start","useCache","pseudo","idx","not","lang","elemLang","focus","activeElement","hasFocus","tabIndex","enabled","disabled","selected","selectedIndex","empty","header","eq","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","group","filters","Common","Animate","BaseUIComponent","animationPrefix","animationEndEventName","animation","webkitAnimation","_name","_optionDefinition","trigger","duration","removeClass","onEnd","_init","_options","animate","_element","_animationPrefix","animationSupported","onAnimationEnd","animationName","elOrSelector","createUIComponent","Pagination","limitRange","max","Carousel","setTransitionProperty","newTransition","transitionProperty","oTransitionProperty","msTransitionProperty","mozTransitionProperty","webkitTransitionProperty","requestAnimationFrame","autoAdvance","axis","initialPage","spaceAfterLastSlide","keyboardSupport","pagination","onChange","swipe","_handlers","paginationChange","windowResize","_isY","ulEl","width","_ulEl","_currentPage","refit","_setUpPagination","_setUpAutoAdvance","size","perpendicular","_liEls","numSlides","contRect","_ctnLength","_elLength","_slidesPerPage","floor","isFinite","numPages","ceil","numPagesChanged","_numPages","_deltaLength","_IE7","_pagination","setSize","setPage","getPage","setOnChange","setCurrent","nextPage","slides","stl","_onTouchStart","_swipeData","ulRect","firstUlPos","inUlX","inUlY","_touchMoveIsFirstTouchMove","_onTouchMove","deltaY","deltaX","aDeltaY","abs","aDeltaX","_scrolling","_onAnimationFrame","pointerDelta","pointerPos","swipeData","elRect","newPos","_onTouchEnd","snapToNext","curPage","progressInPages","_onPaginationChange","pgn","_setPage","getCurrent","getPagination","page","_lengthToGo","isLastPage","_itemsInLastPage","previousPage","getSlidesPerPage","getTotalPages","getStageElm","getSlidesList","getTotalSlides","Close","Url","warnStub","constructor","stub","_componentOptions","elementIsOptional","elsOrSelector","isValidInstance","_validateInstance","registerInstance","_stubInstance","nothing","es6WeakMapSupport","instances","WeakMap","_reg","domRegistry","set","thing","Layouts","TINY","SMALL","MEDIUM","LARGE","XLARGE","isInteger","fieldName","required","fieldId","defaults","overrides","optionValue","lType","defaultVal","invalidThrow","_coerce_funcs","fromDataAttrs","dataAttrs","_coerce_from_string","_options_validate","invalid","quote","invalidStr","paramName","_options_validate_types","number","boolean","string","function","integer","round","stringify","childIndex","ajaxJSON","endpoint","message","currentLayout","v","detectorEl","hashSet","hashParams","getAnchorString","genQueryString","cleanChildren","storeIdAndClasses","fromEl","inObj","_id","classes","_classes","restoreIdAndClasses","toEl","_instanceId","_warnDoubleInstantiation","newInstance","getName","getInstance","nameWithoutVersion","inst","unregisterInstance","UIComponent","givenEl","getInstanceFromSelector","getInstanceIds","getInstances","destroyComponent","instance","err","_validate","_validationError","getOption","setOption","getElement","theConstructor","assertProp","propType","propVal","_oldProto","hideF","InkDate","clamp","dateishFromYMDString","YMD","dateishFromYMD","year","month","day","_year","_month","_day","dateishFromDate","date","getFullYear","getMonth","getDate","DatePicker","autoOpen","cleanText","closeText","pickerField","containerElement","cssClass","dateRange","displayInSelect","dayField","monthField","yearField","format","nextLinkText","ofText","onFocus","onMonthSelected","onSetDate","onYearSelected","prevLinkText","showClean","showClose","shy","startDate","startWeekDay","validDayFn","validMonthFn","validYearFn","nextValidDateFn","prevValidDateFn","yearRange",1,2,3,4,5,6,7,8,9,10,11,12,"wDay","_dateParsers","_hoverPicker","_picker","_setMinMax","setDate","_lang","_render","_listenToContainerObjectEvents","_containerObject","_renderSuperTopBar","calendarTop","_monthDescContainer","_monthPrev","_monthNext","_monthContainer","_monthSelector","_renderMonthSelector","_yearSelector","_appendDatePickerToDom","_renderMonth","_monthChanger","_ofText","_yearChanger","inline","_addOpenCloseEvents","_addDateChangeHandlersToInputs","fields","_updateDate","_showDefaultView","_inline","_hide","opener","cannotBe","ulSelector","mon","_renderMonthButton","liMonth","data-cal-month","appendTarget","parentIsControl","_wrapper","_wrapperIsControl","_superTopBar","_onClick","_onRelativeChangerClick","_onAbsoluteChangerClick","_showMonthSelector","_showYearSelector","_clean","_updateDescription","changeYear","change_year_next","change_year_prev","changeMonth","change_month_next","change_month_prev","_updateCal","elemData","calDay","calMonth","calYear","_changeYear","blur","noLimits","_min","noMinLimit","_max","noMaxLimit","MAX_VALUE","dates","rDate","each","noLim","lim","_daysInMonth","valid","_dateCmp","_fitDateToRange","_isValidDate","_dateWithinRange","_dateAboveMax","_dateBelowMin","oth","_dateCmpUntil","depth","_getPrevMonth","_getNextMonth","dataParsed","_parseDate","_setDate","inc","_incrementViewingYear","firstYear","thisYear","yearUl","prevYearLi","_getYearButton","nextYearLi","_acceptableYear","li","data-cal-year","_addMonthClassNames","dateStr","yearRegExp","validOneOrTwo","_isDate","_acceptableDay","_acceptableDateComponent","_acceptableMonth","userCb","_callUserCallbackBool","_writeDateInFormat","dateString","auxDate","objClicked","dt","_updateMonth","_y","_m","exceptions","incValue","_tryLeap","_getPrevYear","_getNextYear","atomName","directionName","advancer","maxOrMin","boundary","leapUserCb","_callUserCallbackDate","daysInThisMonth","_getNextDecade","decade","_getCurrentDecade","_getPrevDecade","_callUserCallbackBase","yyyy-mm-dd","yyyy/mm/dd","yy-mm-dd","yy/mm/dd","dd-mm-yyyy","dd/mm/yyyy","dd-mm-yy","dd/mm/yy","mm/dd/yyyy","mm-dd-yyyy","_getMonthCalendarHeader","_getDayButtons","_getFirstDayIndex","wDayFirst","getDay","daysInMonth","ul","firstDayIndex","_getDayButton","dayButton","_addMonthButtonClassNames","btn","toDisable","showMonth","isMonthRendered","between","Draggable","constraint","constraintElm","handle","revert","zIndex","fps","droppableProxy","mouseAnchor","dragClass","skipChildren","onStart","onDrag","elmStartPosition","active","dragged","prevCoords","placeholder","zindex","firstDrag","deltaMs","lastRunAt","_onStart","dragFacade","_onDragFacade","drag","_onDrag","end","_onEnd","selectStart","_getCoords","ps","_cloneStyle","dst","borderWidth","padding","height","tgtEl","originalPosition","marginTop","marginBottom","marginLeft","marginRight","visibility","delta2","ad","applyDelta","dragHandlerName","proxy","fs","backgroundColor","firstEl","mouseCoords","mPosX","mPosY","newX","newY","draggableSize","constTop","constBottom","constLeft","constRight","Droppable","updateAll","mouseCoords2","action","pt","Element","pageWideFocusListener","onlyWrapper","_removePageWideFocusListener","mouseIsDown","focusFirstFocusableElementInside","withTabIndex","lowestTabIndex","lowestTabIndexElm","ind","firstFocusable","sFocusableElms","elNotFound","Drawer","transitionSupport","transitions","WebkitTransitionProperty","styleProp","parentSelector","leftDrawer","leftTrigger","rightDrawer","rightTrigger","contentDrawer","mode","sides","validateSide","side","drawer","triggers","atLeastOneSide","errorMsg","drawerOption","triggerOption","_contentDrawers","_leftDrawer","_leftTriggers","_rightDrawer","_rightTriggers","_triggers","_isOpen","_direction","click","afterTransition","_afterTransition","_addEvents","clickedTrigger","_onTriggerClicked","clickedInContent","clickedInLink","close","_getRecentDrawer","direction","drawerEl","_transitionWillOccur","uselessValue","lastFocused","didFocus","insideDrawer","transitioning","Toggle","Dropdown","hoverOpen","dismissOnInsideClick","dismissOnOutsideClick","dismissAfter","onInsideClick","onOutsideClick","onOpen","onDismiss","_toggle","closeOnInsideClick","closeOnClick","onChangeState","newState","_openOrDismiss","_onMouseOver","getState","_openTimeout","_dismissTimeout","_onMouseOut","_onInsideClick","_handlerCall","dismiss","_onOutsideClick","foundElem","needle","foundTarget","callHandler","_doNotInformToggle","setState","hAddClassName","hRemoveClassName","_droppables","_draggables","cleanStyle","draggable","opt","hoverClass","hoverclass","accept","onHover","onDrop","onDropOut","namedEventHandlers","move","droppable","copy","cloneNode","_findDraggable","originalParent","elementData","_update","_findData","elms","update","coords","InkValidator","elementsWithSameName","everything","FormValidator","_flagMap","ink-fv-required","ink-fv-email","ink-fv-url","ink-fv-number","ink-fv-phone_pt","ink-fv-phone_cv","ink-fv-phone_mz","ink-fv-phone_ao","ink-fv-date","ink-fv-confirm","ink-fv-custom","confirmElms","hasConfirm","_errorClassName","_errorValidationClassName","_errorTypeWarningClassName","_errorTypeErrorClassName","validate","_free","onError","customFlag","confirmGroup","fail","_validateElements","_showError","_clearError","_clearCache","_getElements","formElms","curElm","totalElm","flag","flag2","oGroups","_makeConfirmGroups","errors","customErrors","_isValid","_isCustomValid","_validateConfirmGroups","curGroup","totalG","curFlag","tCustom","fieldType","inputType","_trim","aFormRadios","totalRadio","mail","isPTPhone","isCVPhone","isAOPhone","isMZPhone","validFormat","validValues","isDate","formElm","aFail","tFail","_showAnErrorOnElement","controlGroupElm","controlElm","errorClasses","_errorTypeClassName","aErrorLabel","control","aErrorLabel2","I18n","FormElement","validationFunctions","min_length","minSize","max_length","maxSize","exact_length","exactSize","email","fullCheck","ip","ipType","isIP","phone","phoneType","countryCode","credit_card","cardType","isCreditCard","alpha","supportSpaces","ascii","singleLineWhitespace","punctuation","unicode","unicodePunctuation","latin","latin1","latin1Punctuation","alpha_numeric","numbers","alpha_dash","dash","underscore","digit","positive","negative","decimalPlaces","decimal","decimalSeparator","leftDigits","decimalSep","maxDigits","numeric","minValue","maxValue","multipleOf","color","isColor","fieldToCompare","otherField","getFormElements","otherFieldValue","getValue","_rules","validationMessages","en_US","formvalidator.required","formvalidator.min_length","formvalidator.max_length","formvalidator.exact_length","formvalidator.email","formvalidator.url","formvalidator.ip","formvalidator.phone","formvalidator.credit_card","formvalidator.date","formvalidator.alpha","formvalidator.text","formvalidator.latin","formvalidator.alpha_numeric","formvalidator.alpha_dash","formvalidator.digit","formvalidator.integer","formvalidator.decimal","formvalidator.numeric","formvalidator.range","formvalidator.color","formvalidator.matches","formvalidator.validation_function_not_found","pt_PT","label","_errors","_value","_getLabel","_parseRules","rulesLength","paramStartPos","_addError","paramObj","field","i18nKey","getErrors","_formElements","doValidate","eventTrigger","neverSubmit","searchFor","beforeValidation","setRule","errorMessage","getKey","langObj","dictObj","append","getI18n","setI18n","i18n","appendI18n","setLanguage","getRules","_rootElement","_errorMessages","_markedErrorElements","getElements","formElements","formElement","_getOrCreateFormElementInstance","errorElement","errorElements","counter","controlGroupElement","controlElement","paragraph","errorArr","ImageQuery","retina","queries","onLoad","lastIndexOf","_filename","sortMulti","reverse","_onLoad","_onResize","_findCurrentQuery","getQuerySrc","query","devicePixelRatio","LazyLoad","item","source","scrollElement","touchEvents","onInsideViewport","onAfterAttributeChange","autoInit","_aData","_hasEvents","_activate","_getData","_onScrollThrottled","aElms","_onScroll","_removeEvents","_elInViewport","_userCallback","reload","upName","dimension","firstCharacter","maxName","Modal","opacitySupported","openModals","shadeClass","modalClass","triggerEvent","autoDisplay","markup","onShow","closeOnEscape","responsive","_onShadeClick","keyDown","_onKeyDown","resize","_markupMode","_modalDiv","_modalShadow","_contentContainer","setContentMarkup","triggerElements","_reposition","isPercentage","currentViewport","originalStatus","_resizeContainer","_shadeElement","alertsInTheModal","alertsLength","containerHeight","_modalHeader","_modalFooter","isOpen","compatMode","_contentElement","_waitForFade","keyValue","htmlEl","fadeChecks","fadeChecker","getContentElement","contentMarkup","tempHeader","tempFooter","toAdd","genAEl","aEl","wrapText","spanEl","totalItemCount","itemsPerPage","sideButtons","firstLabel","lastLabel","previousLabel","nextLabel","previousPageLabel","nextPageLabel","hashParameter","parentTag","childTag","wrapperClass","paginationClass","activeClass","disabledClass","hideClass","previousClass","previousPageClass","nextClass","nextPageClass","firstClass","lastClass","numberFormatter","autoWrap","_size","_calculateSize","_current","_itemLiEls","_generateMarkup","_updateItems","_observe","count","liEls","isSimpleToggle","liEl","_nextEl","pi","pf","_pageStart","_pageEnd","_page","_prevPageEl","hasPreviousPage","_nextPageEl","hasNextPage","_firstEl","isFirst","_lastEl","isLast","_prevEl","hasPrevious","hasNext","hasUlAlready","isChevron","isDotted","createLiEl","isPrev","isNext","isPrevPage","isNextPage","aElem","nr","sz","setSizeInItems","totalItems","pageNumber","isRelative","next","previous","getSize","ProgressBar","startValue","_elementBar","setValue","newValue","cancelAnimationFrame","SmoothScroller","speed","changeHash","endPos","interval","onDone","onClick","render","link","thisDocument","linkedDocument","activeLiSelector","activeLi","Events","SortableList","hasTouch","maxTouchPoints","msMaxTouchPoints","placeholderClass","draggedClass","draggingClass","dragSelector","handleSelector","moveSelector","swap","cancelMouseOut","down","_onDown","_onMove","up","_onUp","_isMoving","_down","_move","_up","stopMoving","_placeholder","_movePlaceholder","_addMovingClasses","touch","elementFromPoint","validateMove","droppedElement","_removeMovingClasses","target_position","placeholder_position","from_top","from_left","targetIndex","spyTargets","addSpied","spied","observeOnScroll","observingOnScroll","onScroll","onScrollForTarget","activeEl","findActiveElement","toDeactivate","menuLinkSelector","toActivate","closest","Infinity","closestIndex","bBox","Spy","Stacker","column","customBreakPoints","largeMax","largeMin","mediumMax","mediumMin","smallMax","smallMin","largeCols","mediumCols","smallCols","isOrdered","onRunCallback","onResizeCallback","onAPIReloadCallback","_aList","_curLayout","_runFirstTime","_getPageItemsToList","_canApplyLayoutChange","_applyLayoutChange","addItem","reloadItems","_removeDomItems","_setCurLayout","customBreakpoints","_getColumnsToShow","cols","curLayout","_aColumn","totalCols","aItems","aNewList","ii","countCol","Sticky","offsetBottom","topElement","stickyClass","inlineDimensions","inlinePosition","bottomElement","activateInLayouts","_dims","scrollTarget","_isDisabledInLayout","_getDims","unstick","_unstick","bottomOfSticky","maxBottomOfSticky","_stickTo","_inlineDimensions","_getBottomOffset","bottomOfViewport","toBottomOfDocument","oldPosition","oldWidth","dimensionsInStatic","Swipe","onMove","minDist","maxDist","minDuration","maxDuration","storeGesture","stopEvents","_supported","db","_isOn","_isMeOrParent","_pushGesture","_gesture","_time","changedTouches","_target","_t0","_p0","t1","gesture","p1","dr","dist","sqrt","time","overallMovement","overallTime","InkUrl","InkString","Json","maybeTurnIntoNumber","rNumber","cmp","numberishEnabledCmp","aValue","bValue","Table","sameSame","pageSize","caretUpClass","caretDownClass","createEndpointUrl","createEndpointURL","getDataFromEndPoint","getDataFromEndpoint","processJSONRows","rows","processJSONRow","processJSONField","processJSONHeaders","processJSONTotalRows","totalRows","getSortKey","allowResetSorting","visibleFields","tdClassNames","paginationOptions","_thead","tHead","createTHead","_headers","thClick","_originalFields","_sortableFields","_originalData","_data","_totalRows","_resetSortOrder","_addHeadersClasses","_setPagination","headerLabel","classNames","_onThClick","paginated","sortable","_invertSortOrder","_setSortOrderOfColumn","row","_paginate","sortAndReverse","isAscending","_sort","caretHtml","order","firstIndex","lastIndex","_registerFieldNames","_fieldIsVisible","userKey","keyFunction","columnIndex","columnName","trA","trB","elementA","elementB","_createHeadersFromJson","tr","insertRow","th","_createSingleHeaderFromJson","_createRowsFromJSON","trIndex","_createSingleRowFromJson","rowIndex","_createFieldFromJson","fieldData","processor","_elOrFieldData","processed","isNumber","setEndpoint","currentPage","paginationEl","pageNo","_getSortOrder","_getDataViaAjax","_getUrl","urlCreator","parseUrl","sortField","endpointUri","success","JSONData","_onAjaxSuccess","jsonResponse","_rowLength","Tabs","preventUrlChange","onBeforeChange","menuSelector","contentSelector","triggerEventsOnLoad","_menu","_initializeDom","_setFirstActive","contentTabs","activeMenuLink","_findLinkByHref","_changeTab","runCallbacks","activeTabs","_activeMenuTab","_activeSection","_activeMenuLink","_onTabClickedGeneric","doChangeTab","_onTabClicked","tabElm","_dehashify","changeTab","_hashify","links","disable","enable","activeTab","activeSection","TagField","enterKey","backspaceKey","isTruthy","buggySplit","splitFunction","nativeSplit","compliantExecNpcg","separator","limit","output","flags","ignoreCase","multiline","extended","sticky","lastLastIndex","separator2","lastLength","tags","tagQuery","tagQueryAsync","allowRepeated","maxTags","outSeparator","autoSplit","_readInput","_viewElm","_input","_tagsFromMarkup","_tags","_onKeyUp","_onBlur","_refocus","tagname","option","_tagsToMarkup","_addTag","_removeTag","spc","_onEnterKeyDown","_onBackspaceKeyDown","_removeConfirm","_unsetRemovingVisual","_setRemovingVisual","tagIndex","_removeRemovingVisualTimeout","canToggleAnAncestor","isAccordion","initialState","classNameOn","classNameOff","_targets","_accordionContainer","_constructing","_bindEvents","state","_onTriggerEvent","isAncestorOfClickedElement","some","thisOne","_firstTime","_updateAccordion","otherToggle","shades","ancestorOfTargets","shadesLength","_group","Tooltip","EachTooltip","transitionDurationName","transitionPropertyName","transitionTimingFunctionName","bodies","spacing","forever","template","templatefield","fade","tooltips","tooltip","_destroy","_oppositeDirections","_onMouseMove","_delayTimeout","_makeTooltip","mousePosition","_getOpt","_createTooltipElement","_removeTooltip","_fadeInTooltipElement","_placeTooltipElement","_onTooltipMouseOver","_getFloatOpt","outerHTML","_getIntOpt","fadeTime","mPos","_setPos","targetElementPos","tleft","ttop","centerh","centerv","tooltipDims","elementDims","maxX","maxY","_getWhereValueInsideViewport","arrow","tooltipLeft","tooltipTop","toBottom","toRight","toLeft","toTop","viewport","dataAttrVal","instanceOption","_getMousePosition","pageDims","_getPageXY","elmDims","scrollDim","_getScroll","cWidth","cHeight","dd","TreeView","parentClass","openNodeClass","openClass","closedClass","iconTag","isParent","_getIcon","_setNodeOpen","_getChild","beOpen","icon","DirectoryReader","maxDepth","_read","_readDirectories","running","_readEntries","currentEntry","createReader","readEntries","isDirectory","clearArray","fullPath","_stopActivityTimeout","readError","activity","checkActivity","clearInterval","readComplete","setInterval","Queue","lists","items","getItems","parentId","purge","keepList","pid","priority","view","_searchByPid","UI","Upload","_fileButton","fileButton","_dropzone","dropzone","_setDropEvent","_setFileButton","dropzones","ondrop","_dropEventHandler","ondragleave","_onDragLeave","ondragend","_onDragEndEventHandler","ondragdrop","ondragenter","_onDragEnterHandler","ondragover","_onDragOverHandler","publish","btns","_fileChangeHandler","files","FormData","_addFilesToQueue","_events","fileFormName","maxFilesize","INVALID_FILE_NAME","extraData","useChunks","chunkSize","minSizeToUseChunks","endpointChunk","endpointChunkCommit","foldersEnabled","directoryMaxDepth","_queueId","_queueRunning","_folders","_supportChunks","Blob","dataTransfer","_files","webkitGetAsEntry","folders","_addFolderToQueue","invalidFolders","getFiles","isFile","convertToFile","hasParent","getSubDirs","created","fileID","directory","_processQueue","internalUpload","queueLen","canceled","_doRequest","_upload","xhr","forceAbort","showError","lengthComputable","loaded","lastModifiedDate","upload","onprogress","chunk_offset","chunk_upload_id","fd","blob","upload_path","parentID","rootPath","invalidOffset","upload_id","chunk_expires","expires","onabort","abortAll","abortOne","subscribe","arrayProto","testedObject","outKey","latestGroup","initial","aKeys","shuffle","tmp1","rnd","mapFn","filtered","intersect","arr1","arr2","shared","J","convert","unique","newArr","step","insert","rLen","iLen","Packer","fit","blocks","block","findNode","splitNode","used","GrowingPacker","growNode","canGrowDown","canGrowRight","shouldGrowRight","shouldGrowDown","growRight","growDown","sorts","area","msort","maxside","criteria","BinPack","binPack","bl","packer","sorter","dims2","fitted","unfitted","filled","Cookie","cookie","_Cookie","aCookie","aItem","decodeURIComponent","domain","secure","sName","sExpires","sPath","sDomain","sSecure","oDate","sDate","valueOf","nDate","expiresString","toGMTString","hostname","cookieName","expiresDate","_months","_iMonth","janeiro","jan","fevereiro","fev","março","mar","abril","abr","maio","mai","junho","jun","julho","jul","agosto","ago","setembro","outubro","novembro","nov","dezembro","dez","_wDays","_d","_iWeek","week","segunda","seg","terça","ter","quarta","qua","quinta","qui","sexta","sex","sábado","sáb","domingo","dom","nDays","_date","iFormat","escapeChar","jsDate","jsFirstDay","jsThisDay","jsHour","jsDay","suffixes","suffix","UTC","jsYearStart","days","jsMonth","getYear","jsYear","getHours","jsMinute","getMinutes","jsSecond","getSeconds","getTimezoneOffset","jsMinZone","jsMinutes","jsDayName","jsMonthName","str_date","mList","objIndex","dayY","dayW","hour","hourD","sec","msec","ampm","diffM","diffH","pattr","_haveDatetime","_haveYear","_haveYDay","_haveDay","_haveMonth","_haveMonthDay","_haveOnlyDay","_haveWDay","_haveWeek","_haveWeekWDay","_haveOnlyWDay","_validDate","_noDate","_haveHour12","_haveHour24","_haveHour","_haveMin","_haveSec","_haveMSec","_haveMoreM","_haveMoreS","_haveDiffM","_haveDiffH","dList","gmt","aux","Dumper","_tab","_formatParam","param","formated","_outputFormat","_getTabs","numberOfTabs","tabs","_i","indent","_typeof","printDump","write","returnDump","alertDump","windowDump","dumperwindow","pattrText","funcOrVal","dict","testMode","_dicts","_dict","_testMode","_gLang","newTestMode","gLang","langGlobal","_gDict","pars","isObj","$2","$3","ntext","strSin","strPlur","ordinal","num","lastDig","ordDict","byLastDigit","alias","_gDicts","appendGlobal","twoDigits","function_call","cx","dateToISOString","toISOString","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","toFixed","InkJson","_nativeJSON","_convertToUnicode","_escape","theString","\b","\t","\n","\f","\r","\"","\\","charCodeAt","_toUnicode","unicodeString","inInt","theUnicode","_stringifyValue","toJSON","arrayString","objectString","convertToUnicode","reviver","walk","holder","SyntaxError","InkUtilString","_chars","_entities","_accentedChars","_accentedRemovedChars","_htmlUnsafeChars","<","&","'","ucFirst","firstWordOnly","replacer","stripTags","allowed","aAllowed","aNewAllowed","cleanedTag","strAllowed","reAllowed","aFoundTags","htmlEntitiesEncode","htmlEntitiesDecode","$0","utf8Encode","utfstring","shortString","words","resultstr","truncateString","utf8Decode","c2","c3","removeAccentedChars","newString","substrCount","haystack","htmlEscapeUnsafe","chars","normalizeWhitespace","toUnicode","unescape","es","hexNum","escapeText","txt","whiteList","txt2","C","escapedCharRegex","unescapeText","strcmp","str1","str2","packetize","maxLen","_keyStr","getUrl","getQueryString","aParams","queryStr","aQueryStr","pairVar","getAnchor","anchor","anchorStr","aAnchorStr","aURL","scheme","host","re1","re2","re3","regPort","tmpHost1","port","tmpHost2","tmpUserPass","user","urlObj","frag","currentScriptElement","aScripts","curScript","Validator","_countryCodes","_internacionalPT","_indicativosPT",21,22,231,232,233,234,235,236,238,239,241,242,243,244,245,249,251,252,253,254,255,256,258,259,261,262,263,265,266,268,269,271,272,273,274,275,276,277,278,279,281,282,283,284,285,286,289,291,292,295,296,91,93,96,92,707,760,800,808,30,"_internacionalCV","_indicativosCV",95,97,98,99,"_internacionalAO","_indicativosAO","_internacionalMZ","_indicativosMZ",82,84,"_internacionalTL","_indicativosTL","_characterGroups","asciiAlpha","latin1Alpha","unicodeAlpha","space","nicknamePunctuation","newline","asciiPunctuation","createRegExp","checkCharacterGroups","numb","thousandSep","returnNumber","maxExcl","minExcl","_isLeapYear","parser","emailValido","full","reHTTP","reUrl","aInd","strInd","re351","reSpecialChars","reInt","reValid","isPortuguesePhone","re238","re244","re258","isTLPhone","re670","isPhone","codPostal","cp1","cp2","returnBothResults","cPostalSep","cPostal4","cPostal3","parserCPostal","cPostal","yearIndex","monthIndex","dayIndex","dateParser","keyword","hexa","rgba","hsl","hsla","_creditCardSpecs","default","luhn","american express","diners club","discover","jcb","maestro","mastercard","visa","_luhn","checksum","dbl","creditCardType","ccLength"],"mappings":"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","sourcesContent":["/**\n * Ink Core.\n * @module Ink_1\n * This module provides the necessary methods to create and load the modules using Ink.\n */\n\n;(function(window, document) {\n\n 'use strict';\n\n // skip redefinition of Ink core\n if ('Ink' in window) { return; }\n\n\n // internal data\n\n /*\n * NOTE:\n * invoke Ink.setPath('Ink', '/Ink/'); before requiring local modules\n */\n var paths = {};\n var modules = {};\n var modulesLoadOrder = [];\n var modulesRequested = {};\n var pendingRMs = [];\n var modulesWaitingForDeps = {};\n\n var apply = Function.prototype.apply;\n\n // auxiliary fns\n var isEmptyObject = function(o) {\n /*jshint unused:false */\n if (typeof o !== 'object') { return false; }\n for (var k in o) {\n if (o.hasOwnProperty(k)) {\n return false;\n }\n }\n return true;\n };\n\n /**\n * @namespace Ink_1\n */\n\n window.Ink = {\n /**\n * @property {String} VERSION\n **/\n VERSION: '3.1.2',\n _checkPendingRequireModules: function() {\n var I, F, o, dep, mod, cb, pRMs = [];\n var toApply = [];\n for (I = 0, F = pendingRMs.length; I < F; ++I) {\n o = pendingRMs[I];\n\n if (!o) { continue; }\n\n for (dep in o.left) {\n if (o.left.hasOwnProperty(dep)) {\n mod = modules[dep];\n if (mod) {\n o.args[o.left[dep] ] = mod;\n delete o.left[dep];\n --o.remaining;\n }\n }\n }\n\n if (o.remaining > 0) {\n pRMs.push(o);\n } else {\n cb = o.cb;\n if (!cb) { continue; }\n delete o.cb; // to make sure I won't call this more than once!\n toApply.push([cb, o.args]);\n }\n }\n\n pendingRMs = pRMs;\n\n for (var i = 0; i < toApply.length; i++) {\n toApply[i][0].apply(false, toApply[i][1]);\n }\n\n if (pendingRMs.length > 0) {\n setTimeout( function() { Ink._checkPendingRequireModules(); }, 0 );\n }\n },\n\n /**\n * Get the full path of a module.\n * This method looks up the paths given in setPath (and ultimately the default Ink's path).\n *\n * @method getPath\n * @param {String} key Name of the module you want to get the path\n * @param {Boolean} [noLib] Flag to skip appending 'lib.js' to the returned path.\n *\n * @return {String} The URI to the module, according to what you added in setPath for the given `key`.\n */\n getPath: function(key, noLib) {\n var split = key.split(/[._]/g);\n var curKey;\n var i;\n var root;\n var path;\n\n // Look for Ink.Dom.Element.1, Ink.Dom.Element, Ink.Dom, Ink in this order.\n for (i = split.length; i >= 0; i -= 1) {\n curKey = split.slice(0, i + 1).join('.'); // See comment in setPath\n if (paths[curKey]) {\n root = curKey;\n break;\n }\n }\n\n if (root in paths) {\n path = paths[root];\n } else {\n return null;\n }\n\n if (!/\\/$/.test(path)) {\n path += '/';\n }\n if (i < split.length) {\n // Add the rest of the path. For example, if we found\n // paths['Ink.Dom'] to be 'http://example.com/Ink/Dom/',\n // we now add '/Element/' to get the full path.\n path += split.slice(i + 1).join('/') + '/';\n }\n if (!noLib) {\n path += 'lib.js';\n }\n return path;\n },\n\n /**\n * Sets the URL path for a namespace.\n * Use this to customize where requireModules and createModule will load dependencies from.\n * This can be useful to set your own CDN for dynamic module loading or simply to change your module folder structure\n *\n * @method setPath\n *\n * @param {String} key Module or namespace\n * @param {String} rootURI Base URL path and schema to be appended to the module or namespace\n * @return {void}\n *\n * @example\n * Ink.setPath('Ink', 'http://my-cdn/Ink/');\n * Ink.setPath('Lol', 'http://my-cdn/Lol/');\n *\n * // Loads from http://my-cdn/Ink/Dom/Whatever/lib.js\n * Ink.requireModules(['Ink.Dom.Whatever'], function () { ... });\n * // Loads from http://my-cdn/Lol/Whatever/lib.js\n * Ink.requireModules(['Lol.Whatever'], function () { ... });\n */\n setPath: function(key, rootURI) {\n // Replacing version separator with dot because the difference\n // between a submodule and a version doesn't matter here.\n // It would also overcomplicate the implementation of getPath\n paths[key.replace(/_/, '.')] = rootURI;\n },\n\n /**\n * Loads a script URL.\n * This creates a `script` tag in the `head` of the document.\n * Reports errors by listening to 'error' and 'readystatechange' events.\n *\n * @method loadScript\n * @param {String} uri Can be an external URL or a module name\n * @param {String} [contentType]='text/javascript' The `type` attribute of the new script tag.\n * @return {Element} The newly created script element.\n */\n loadScript: function(uri, contentType) {\n /*jshint evil:true */\n\n if (uri.indexOf('/') === -1) {\n var givenUri = uri; // For the error message\n uri = this.getPath(uri);\n if (uri === null) {\n throw new Error('Could not load script \"' + givenUri + '\". ' +\n 'Path not found in the registry. Did you misspell ' +\n 'the name, or forgot to call setPath()?');\n }\n }\n\n var scriptEl = document.createElement('script');\n scriptEl.setAttribute('type', contentType || 'text/javascript');\n scriptEl.setAttribute('src', uri);\n\n if ('onerror' in scriptEl) {\n scriptEl.onerror = function () {\n Ink.error(['Failed to load script from ', uri, '.'].join(''));\n };\n }\n\n var head = document.head ||\n document.getElementsByTagName('head')[0];\n\n if (head) {\n return head.appendChild(scriptEl);\n }\n },\n\n _loadLater: function (dep) {\n setTimeout(function () {\n if (modules[dep] || modulesRequested[dep] ||\n modulesWaitingForDeps[dep]) {\n return;\n }\n modulesRequested[dep] = true;\n Ink.loadScript(dep);\n }, 0);\n },\n\n /**\n * Defines a module namespace.\n *\n * @method namespace\n * @param {String} ns Namespace to define.\n * @param {Boolean} [returnParentAndKey] Flag to change the return value to an array containing the namespace parent and the namespace key\n * @return {Object|Array} Returns the created namespace object\n */\n namespace: function(ns, returnParentAndKey) {\n if (!ns || !ns.length) { return null; }\n\n var levels = ns.split('.');\n var nsobj = window;\n var parent;\n\n for (var i = 0, f = levels.length; i < f; ++i) {\n nsobj[ levels[i] ] = nsobj[ levels[i] ] || {};\n parent = nsobj;\n nsobj = nsobj[ levels[i] ];\n }\n\n if (returnParentAndKey) {\n return [\n parent,\n levels[i-1]\n ];\n }\n\n return nsobj;\n },\n\n /**\n * Loads a module.\n * A synchronous method to get the module from the internal registry.\n * It assumes the module is defined and loaded already!\n *\n * @method getModule\n * @param {String} mod Module name\n * @param {Number} [version] Version number of the module\n * @return {Object|Function} Module object or function, depending how the module is defined\n */\n getModule: function(mod, version) {\n var key = version ? [mod, '_', version].join('') : mod;\n return modules[key];\n },\n\n /**\n * Creates a new module.\n * Use this to wrap your code and benefit from the module loading used throughout the Ink library\n *\n * @method createModule\n * @param {String} mod Module name, separated by dots. Like Ink.Dom.Selector, Ink.UI.Modal\n * @param {Number} version Version number\n * @param {Array} deps Array of module names which are dependencies of the module being created. The order in which they are passed here will define the order they will be passed to the callback function.\n * @param {Function} modFn The callback function to be executed when all the dependencies are resolved. The dependencies are passed as arguments, in the same order they were declared. The function itself should return the module.\n * @return {void}\n * @sample Ink_1_createModule.html\n *\n */\n createModule: function(mod, version, deps, modFn) { // define\n if (typeof mod !== 'string') {\n throw new Error('module name must be a string!');\n }\n\n // validate version correctness\n if (!(typeof version === 'number' || (typeof version === 'string' && version.length > 0))) {\n throw new Error('version number missing!');\n }\n\n var modAll = [mod, '_', version].join('');\n\n modulesWaitingForDeps[modAll] = true;\n\n var cb = function() {\n //console.log(['createModule(', mod, ', ', version, ', [', deps.join(', '), '], ', !!modFn, ')'].join(''));\n\n // make sure module in not loaded twice\n if (modules[modAll]) {\n //console.warn(['Ink.createModule ', modAll, ': module has been defined already.'].join(''));\n return;\n }\n\n\n // delete related pending tasks\n delete modulesRequested[modAll];\n delete modulesRequested[mod];\n\n\n // run module's supplied factory\n var args = Array.prototype.slice.call(arguments);\n var moduleContent = modFn.apply(window, args);\n modulesLoadOrder.push(modAll);\n // console.log('** loaded module ' + modAll + '**');\n\n\n // set version\n if (typeof moduleContent === 'object') { // Dom.Css Dom.Event\n moduleContent._version = version;\n }\n else if (typeof moduleContent === 'function') {\n moduleContent.prototype._version = version; // if constructor\n moduleContent._version = version; // if regular function\n }\n\n\n // add to global namespace...\n var isInkModule = mod.indexOf('Ink.') === 0;\n var t;\n if (isInkModule) {\n t = Ink.namespace(mod, true); // for mod 'Ink.Dom.Css', t[0] gets 'Ink.Dom' object and t[1] 'Css'\n }\n\n\n // versioned\n modules[ modAll ] = moduleContent; // in modules\n delete modulesWaitingForDeps[ modAll ];\n\n if (isInkModule) {\n t[0][ t[1] + '_' + version ] = moduleContent; // in namespace\n }\n\n\n // unversioned\n modules[ mod ] = moduleContent; // in modules\n\n if (isInkModule) {\n if (isEmptyObject( t[0][ t[1] ] )) {\n t[0][ t[1] ] = moduleContent; // in namespace\n }\n // else {\n // console.warn(['Ink.createModule ', modAll, ': module has been defined already with a different version!'].join(''));\n // }\n }\n\n\n if (this) { // there may be pending requires expecting this module, check...\n Ink._checkPendingRequireModules();\n }\n };\n\n this.requireModules(deps, cb);\n },\n\n /**\n * Requires modules asynchronously\n * Use this to get modules, even if they're not loaded yet\n *\n * @method requireModules\n * @param {Array} deps Array of module names. The order in which they are passed here will define the order they will be passed to the callback function.\n * @param {Function} cbFn The callback function to be executed when all the dependencies are resolved. The dependencies are passed as arguments, in the same order they were declared.\n * @return {void}\n * @sample Ink_1_requireModules.html\n */\n requireModules: function(deps, cbFn) { // require\n //console.log(['requireModules([', deps.join(', '), '], ', !!cbFn, ')'].join(''));\n var i, f, o, dep, mod;\n f = deps && deps.length;\n o = {\n args: new Array(f),\n left: {},\n remaining: f,\n cb: cbFn\n };\n\n if (!(typeof deps === 'object' && deps.length !== undefined)) {\n throw new Error('Dependency list should be an array!');\n }\n if (typeof cbFn !== 'function') {\n throw new Error('Callback should be a function!');\n }\n\n for (i = 0; i < f; ++i) {\n if (Ink._moduleRenames[deps[i]]) {\n Ink.warn(deps[i] + ' was renamed to ' + Ink._moduleRenames[deps[i]]);\n dep = Ink._moduleRenames[deps[i]];\n } else {\n dep = deps[i];\n }\n\n // Because trailing commas in oldIE bring us undefined values here\n if (!dep) {\n --o.remaining;\n continue;\n }\n\n mod = modules[dep];\n if (mod) {\n o.args[i] = mod;\n --o.remaining;\n continue;\n }\n else if (!modulesRequested[dep]) {\n Ink._loadLater(dep);\n }\n o.left[dep] = i;\n }\n\n if (o.remaining > 0) {\n pendingRMs.push(o);\n }\n else {\n cbFn.apply(true, o.args);\n }\n },\n\n _moduleRenames: {\n 'Ink.UI.Aux_1': 'Ink.UI.Common_1'\n },\n\n /**\n * Lists loaded module names.\n * The list is ordered by loaded time (oldest module comes first)\n *\n * @method getModulesLoadOrder\n * @return {Array} returns the order in which modules were resolved and correctly loaded\n */\n getModulesLoadOrder: function() {\n return modulesLoadOrder.slice();\n },\n\n /**\n * Builds the markup needed to load the modules.\n * This method builds the script tags needed to load the currently used modules\n *\n * @method getModuleScripts\n * @uses getModulesLoadOrder\n * @return {String} The script markup\n */\n getModuleScripts: function() {\n var mlo = this.getModulesLoadOrder();\n mlo.unshift('Ink_1');\n mlo = mlo.map(function(m) {\n return [''].join('');\n });\n\n return mlo.join('\\n');\n },\n\n /**\n * Creates an Ink.Ext module\n *\n * Does exactly the same as createModule but creates the module in the Ink.Ext namespace\n *\n * @method createExt\n * @uses createModule\n * @param {String} moduleName Extension name\n * @param {String} version Extension version\n * @param {Array} dependencies Extension dependencies\n * @param {Function} modFn Function returning the extension\n * @return {void}\n * @sample Ink_1_createExt.html\n */\n createExt: function (moduleName, version, dependencies, modFn) {\n return Ink.createModule('Ink.Ext.' + moduleName, version, dependencies, modFn);\n },\n\n /**\n * Function.prototype.bind alternative/fallback.\n * Creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called.\n *\n * @method bind\n * @param {Function} fn The function\n * @param {Object} context The value to be passed as the this parameter to the target function when the bound function is called. If used as false, it preserves the original context and just binds the arguments.\n * @param {Mixed} [more...] Additional arguments will be sent to the original function as prefix arguments.\n * @return {Function} A copy of `fn` bound to the given `context`. Calling this function causes a call to `fn` with the new `context` and any `more` arguments.\n * @sample Ink_1_bind.html\n */\n bind: function(fn, context) {\n var args = Array.prototype.slice.call(arguments, 2);\n return function() {\n var innerArgs = Array.prototype.slice.call(arguments);\n var finalArgs = args.concat(innerArgs);\n return fn.apply(context === false ? this : context, finalArgs);\n };\n },\n\n /**\n * Function.prototype.bind alternative for class methods\n * See Ink.bind. The difference between `bindMethod` and `bind` is that `bindMethod` fetches a method from an object. It can be useful, for instance, to bind a function which is a property of an object returned by another function.\n *\n * @method bindMethod\n * @uses bind\n * @param {Object} object The object that contains the method to bind\n * @param {String} methodName The name of the method that will be bound\n * @param {Mixed} [more...] Additional arguments will be sent to the new method as prefix arguments.\n * @return {Function} See Ink.bind.\n * @sample Ink_1_bindMethod.html\n */\n bindMethod: function (object, methodName) {\n return Ink.bind.apply(Ink,\n [object[methodName], object].concat([].slice.call(arguments, 2)));\n },\n\n /**\n * Function.prototype.bind alternative for event handlers.\n * Same as bind but keeps first argument of the call the original event.\n * Set `context` to `false` to preserve the original context of the function and just bind the arguments.\n *\n * @method bindEvent\n * @param {Function} fn The function\n * @param {Object} context The value to be passed as the this parameter to the target\n * @param {Mixed} [more...] Additional arguments will be sent to the original function as prefix arguments\n * @return {Function} A function which will always call `fn` with the given event (or window.event, in IE) as the first argument.\n * @sample Ink_1_bindEvent.html\n */\n bindEvent: function(fn, context) {\n var args = Array.prototype.slice.call(arguments, 2);\n return function(event) {\n var finalArgs = args.slice();\n finalArgs.unshift(event || window.event);\n return fn.apply(context === false ? this : context, finalArgs);\n };\n },\n\n /**\n * Shorter alias to document.getElementById.\n * Just calls `document.getElementById(id)`, unless `id` happens to be an element.\n * If `id` is an element, `Ink.i` just returns it.\n *\n * You can use this in situations where you want to accept an element id, but a raw element is also okay.\n *\n * @method i\n * @param {String} id Element ID\n * @return {DOMElement|null} The element returned by `document.getElementById(id)` if `id` was a string, and `id` otherwise.\n * @sample Ink_1_i.html\n */\n i: function(id) {\n if(typeof(id) === 'string') {\n return document.getElementById(id) || null;\n }\n return id;\n },\n\n /**\n * Alias for Ink.Dom.Selector\n *\n * Using sizzle-specific selectors is NOT encouraged!\n *\n * @method ss\n * @uses Ink.Dom.Selector.select\n * @param {String} selector CSS3 selector string\n * @param {DOMElement} [from=document] Context element. If set to a DOM element, the `selector` will only look for descendants of this DOM Element.\n * @return {Array} array of DOMElements\n * @sample Ink_1_ss.html\n */\n ss: function(selector, from)\n {\n if(typeof(Ink.Dom) === 'undefined' || typeof(Ink.Dom.Selector) === 'undefined') {\n throw new Error('This method requires Ink.Dom.Selector');\n }\n return Ink.Dom.Selector.select(selector, (from || document));\n },\n\n /**\n * Selects elements like `Ink.ss`, but only returns the first element found.\n *\n * Using sizzle-specific selectors is NOT encouraged!\n *\n * @method s\n * @uses Ink.Dom.Selector.select\n * @param {String} selector CSS3 selector string\n * @param {DOMElement} [from=document] Context element. If set to a DOM element, the `selector` will only look for descendants of this DOM Element.\n * @return {DOMElement} The first element found which matches the `selector`, or `null` if nothing is found.\n * @sample Ink_1_s.html\n */\n s: function(selector, from)\n {\n if(typeof(Ink.Dom) === 'undefined' || typeof(Ink.Dom.Selector) === 'undefined') {\n throw new Error('This method requires Ink.Dom.Selector');\n }\n return Ink.Dom.Selector.select(selector, (from || document))[0] || null;\n },\n\n /**\n * Extends an object with another\n * Copy all of the properties in one or more source objects over to the destination object, and return the destination object. It's in-order, so the last source will override properties of the same name in previous arguments.\n *\n * @method extendObj\n * @param {Object} destination The object that will receive the new/updated properties\n * @param {Object} source The object whose properties will be copied over to the destination object\n * @param {Object} [more...] Additional source objects. The last source will override properties of the same name in the previous defined sources\n * @return {Object} destination object, enriched with defaults from the sources\n * @sample Ink_1_extendObj.html\n */\n extendObj: function(destination/*, source... */) {\n var sources = [].slice.call(arguments, 1);\n\n for (var i = 0, len = sources.length; i < len; i++) {\n if (!sources[i]) { continue; }\n for (var property in sources[i]) {\n if(Object.prototype.hasOwnProperty.call(sources[i], property)) {\n destination[property] = sources[i][property];\n }\n }\n }\n\n return destination;\n },\n\n /**\n * Calls native console.log if available.\n *\n * @method log\n * @param {Mixed} [more...] Arguments to be evaluated\n * @return {void}\n * @sample Ink_1_log.html\n **/\n log: function () {\n // IE does not have console.log.apply in IE10 emulated mode\n var console = window.console;\n if (console && console.log) {\n apply.call(console.log, console, arguments);\n }\n },\n\n /**\n * Calls native console.warn if available.\n *\n * @method warn\n * @param {Mixed} [more...] Arguments to be evaluated\n * @return {void}\n * @sample Ink_1_warn.html\n **/\n warn: function () {\n // IE does not have console.log.apply in IE10 emulated mode\n var console = window.console;\n if (console && console.warn) {\n apply.call(console.warn, console, arguments);\n }\n },\n\n /**\n * Calls native console.error if available.\n *\n * @method error\n * @param {Mixed} [more...] Arguments to be evaluated\n * @return {void}\n * @sample Ink_1_error.html\n **/\n error: function () {\n // IE does not have console.log.apply in IE10 emulated mode\n var console = window.console;\n if (console && console.error) {\n apply.call(console.error, console, arguments);\n }\n }\n };\n\n\n // TODO for debug - to detect pending stuff\n /*\n var failCount = {}; // fail count per module name\n var maxFails = 3; // times\n var checkDelta = 0.5; //seconds\n\n var tmpTmr = setInterval(function() {\n var mk = Object.keys(modulesRequested);\n var l = mk.length;\n\n if (l > 0) {\n // console.log('** waiting for modules: ' + mk.join(', ') + ' **');\n\n for (var i = 0, f = mk.length, k, v; i < f; ++i) {\n k = mk[i];\n v = failCount[k];\n failCount[k] = (v === undefined) ? 1 : ++v;\n\n if (v >= maxFails) {\n console.error('** Loading of module ' + k + ' failed! **');\n delete modulesRequested[k];\n }\n }\n }\n else {\n // console.log('** Module loads complete. **');\n clearInterval(tmpTmr);\n }\n }, checkDelta*1000);\n */\n}(window, document));\n","/**\n * Cross Browser Ajax requests\n * @module Ink.Net.Ajax_1\n * @version 1\n */\n\nInk.createModule('Ink.Net.Ajax', '1', [], function() {\n 'use strict';\n\n /**\n * Creates a new XMLHttpRequest object\n *\n * @class Ink.Net.Ajax\n * @constructor\n *\n * @param {String} url Request URL\n * @param {Object} [options] Request options, containing:\n * @param {Boolean} [options.asynchronous=true] If false, the request synchronous.\n * @param {String} [options.contentType] Content-type header to be sent. Defaults to 'application/x-www-form-urlencoded'\n * @param {Boolean} [options.cors] Flag to activate CORS. Set this to true if you're doing a cross-origin request\n * @param {Boolean} [options.validateCors] If this is set to `true`, perform a CORS request automatically based on the URL being cross-domain or not.\n * @param {Number} [options.delay] Artificial delay. If the request is completed faster than this delay, wait the remaining time before executing the callbacks\n * @param {Boolean|String} [options.evalJS=true] If the request Content-type header is application/json, evaluates the response and populates responseJSON. Use 'force' if you want to force the response evaluation, no matter what Content-type it's using.\n * @param {String} [options.method='POST'] HTTP request method. POST by default.\n * @param {Object|String} [options.parameters] Request parameters to be sent with the request\n * @param {String} [options.postBody] POST request body. If not specified, it's filled with the contents from parameters\n * @param {Object} [options.requestHeaders] Key-value pairs for additional request headers\n * @param {Boolean} [options.sanitizeJSON] Flag to sanitize the content of responseText before evaluation\n * @xparam {Boolean} [options.signRequest=false] Send a \"X-Requested-With: XMLHttpRequest\" header in the request.\n * @param {Number} [options.timeout] Request timeout in seconds\n * @param {String} [options.xhrProxy] URI for proxy service hosted on the same server as the web app, that can fetch documents from other domains. The service must pipe all input and output untouched (some input sanitization is allowed, like clearing cookies). e.g., requesting http://example.org/doc can become /proxy/http%3A%2F%2Fexample.org%2Fdoc The proxy service will be used for cross-domain requests, if set, else a network error is returned as exception.\n * @param {Function} [options.onComplete] Callback executed after the request is completed, regardless of what happened during the request.\n * @param {Function} [options.onCreate] Callback executed after object initialization but before the request is made\n * @param {Function} [options.onException] Callback executed if an exception occurs. Receives the exception as a parameter.\n * @param {Function} [options.onFailure] Callback executed if the request fails (requests with status codes different from 2xx)\n * @param {Function} [options.onHeaders] Callback executed when headers of the response arrive.\n * @param {Function} [options.onInit] Callback executed before any initialization\n * @param {Function} [options.onSuccess] Callback executed if the request is successful (requests with 2xx status codes)\n * @param {Function} [options.onTimeout] Callback executed if the request times out\n *\n * @sample Ink_Net_Ajax_1.html \n */\n var Ajax = function(url, options){\n this.init(url, options);\n };\n\n /**\n * Options for all requests. These can then be overriden for individual ones.\n */\n Ajax.globalOptions = {\n parameters: {},\n requestHeaders: {}\n };\n\n\n // IE10 does not need XDomainRequest\n var xMLHttpRequestWithCredentials = 'XMLHttpRequest' in window && 'withCredentials' in (new XMLHttpRequest());\n\n\n\n Ajax.prototype = {\n\n init: function(url, userOptions) {\n if (!url) {\n throw new Error(\"new Ink.Net.Ajax: Pass a url as the first argument!\");\n }\n var options = Ink.extendObj({\n asynchronous: true,\n contentType: 'application/x-www-form-urlencoded',\n cors: false,\n validateCors: false,\n debug: false,\n delay: 0,\n evalJS: true,\n method: 'POST',\n parameters: null,\n postBody: '',\n requestHeaders: null,\n sanitizeJSON: false,\n signRequest: false,\n timeout: 0,\n useCredentials: false,\n xhrProxy: '',\n onComplete: null,\n onCreate: null,\n onException: null,\n onFailure: null,\n onHeaders: null,\n onInit: null,\n onSuccess: null,\n onTimeout: null\n }, Ajax.globalOptions);\n\n if (userOptions && typeof userOptions === 'object') {\n options = Ink.extendObj(options, userOptions);\n\n\n if (typeof userOptions.parameters === 'object') {\n options.parameters = Ink.extendObj(Ink.extendObj({}, Ajax.globalOptions.parameters), userOptions.parameters);\n } else if (userOptions.parameters !== null) {\n var globalParameters = this.paramsObjToStr(Ajax.globalOptions.parameters);\n if (globalParameters) {\n options.parameters = userOptions.parameters + '&' + globalParameters;\n }\n }\n\n options.requestHeaders = Ink.extendObj({}, Ajax.globalOptions.requestHeaders);\n options.requestHeaders = Ink.extendObj(options.requestHeaders, userOptions.requestHeaders);\n }\n\n this.options = options;\n\n this.safeCall('onInit');\n\n this.url = url;\n\n var urlLocation = this._locationFromURL(url);\n this.isHTTP = this._locationIsHTTP(urlLocation);\n this.isCrossDomain = this._locationIsCrossDomain(urlLocation, location);\n\n this.requestHasBody = options.method.search(/^get|head$/i) < 0;\n\n if (this.options.validateCors === true) {\n this.options.cors = this.isCrossDomain;\n }\n\n if(this.options.cors) {\n this.isCrossDomain = false;\n }\n\n this.transport = this.getTransport();\n\n this.request();\n },\n\n /**\n * Returns a location object from an URL\n *\n * @method _locationFromUrl\n * @param {String} url Input url\n * @return {Location} An `` element with `href` set to the given URL.\n * @private\n **/\n _locationFromURL: function (url) {\n var urlLocation = document.createElementNS ?\n document.createElementNS('http://www.w3.org/1999/xhtml', 'a') :\n document.createElement('a');\n urlLocation.setAttribute('href', url);\n return urlLocation;\n },\n\n /**\n * Checks whether a location is HTTP or HTTPS\n *\n * @method locationIsHttp\n * @param {Location} urlLocation Location object or `` element representing the current location.\n * @return {Boolean} `true` if the location is HTTP or HTTPS, `false` otherwise.\n * @private\n */\n _locationIsHTTP: function (urlLocation) {\n return urlLocation.href.match(/^https?:/i) ? true : false;\n },\n\n /**\n * Checks whether a location is cross-domain from ours.\n *\n * @method _locationIsCrossDomain\n * @param {Location} urlLocation A Location object or an `` elemnt.\n * @param {Location} [location=window.location] A location representing this one. This argument only exists for testing. Don't use it.\n * @return {Boolean} `true` if the locations are in different domains (in which case we need to perform a cross-domain request)\n * @private\n */\n _locationIsCrossDomain: function (urlLocation, location) {\n // TODO because of oldIE compatibility, we can only use .href (the full URL), and none of the other useful properties one can find in Location elements. So we should just pass pure strings around. Not only here.\n location = location || window.location;\n if (!Ajax.prototype._locationIsHTTP(urlLocation) || location.protocol === 'widget:' || typeof window.widget === 'object') {\n return false;\n } else {\n var split1 = urlLocation.href.split('//');\n var split2 = location.href.split('//');\n\n if (split1.length === 1 || split2.length === 1) {\n // This occurs when there's no protocol string in either URL\n // Only happens in IE7 because setting the \"href\" of a link doesn't make that link show you the full URL when the URI is relative to this host.\n // So we have our answer.\n // If there's no protocol string\n // We know for sure that our `urlLocation` is relative\n // In which case, they are in the same domain.\n return false;\n }\n\n var protocol1 = split1[0];\n var protocol2 = split2[0];\n\n var colonOrSlash = /:|\\//; // Finds colons or slashes, which are the end of hostnames (without ports)\n\n var host1 = split1[1].split(colonOrSlash)[0];\n var host2 = split2[1].split(colonOrSlash)[0];\n\n return protocol1 !== protocol2 ||\n host1 !== host2;\n }\n },\n\n /**\n * Creates the appropriate XMLHttpRequest object, depending on our browser and whether we're trying to perform a cross-domain request.\n *\n * @method getTransport\n * @return {Object} XMLHttpRequest object\n * @private\n */\n getTransport: function()\n {\n /*global XDomainRequest:false, ActiveXObject:false */\n if (!xMLHttpRequestWithCredentials && this.options.cors && 'XDomainRequest' in window) {\n this.usingXDomainReq = true;\n return new XDomainRequest();\n }\n else if (typeof XMLHttpRequest !== 'undefined') {\n return new XMLHttpRequest();\n }\n else if (typeof ActiveXObject !== 'undefined') {\n try {\n return new ActiveXObject('Msxml2.XMLHTTP');\n } catch (e) {\n return new ActiveXObject('Microsoft.XMLHTTP');\n }\n } else {\n return null;\n }\n },\n\n /**\n * Set the necessary headers for an ajax request.\n *\n * @method setHeaders\n * @return {void}\n */\n setHeaders: function()\n {\n if (this.transport) {\n try {\n var headers = {\n \"Accept\": \"text/javascript,text/xml,application/xml,application/xhtml+xml,text/html,application/json;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1\",\n \"Accept-Language\": navigator.language,\n \"X-Requested-With\": \"XMLHttpRequest\",\n \"X-Ink-Version\": \"3\"\n };\n if (this.options.cors) {\n if (!this.options.signRequest) {\n delete headers['X-Requested-With'];\n }\n delete headers['X-Ink-Version'];\n }\n\n if (this.options.requestHeaders && typeof this.options.requestHeaders === 'object') {\n for(var headerReqName in this.options.requestHeaders) {\n if (this.options.requestHeaders.hasOwnProperty(headerReqName)) {\n headers[headerReqName] = this.options.requestHeaders[headerReqName];\n }\n }\n }\n\n if (this.transport.overrideMimeType && (navigator.userAgent.match(/Gecko\\/(\\d{4})/) || [0,2005])[1] < 2005) {\n headers.Connection = 'close';\n }\n\n for (var headerName in headers) {\n if(headers.hasOwnProperty(headerName)) {\n this.transport.setRequestHeader(headerName, headers[headerName]);\n }\n }\n } catch(e) {}\n }\n },\n\n /**\n * Converts an object with parameters to a querystring\n *\n * @method paramsObjToStr\n * @param {Object} optParams Parameters object, example: `{ a: 2, b: 3 }`\n * @return {String} A query string. Example: `'a=2&b=3'`\n * @private\n */\n paramsObjToStr: function(optParams) {\n var k, m, p, a, params = [];\n if (typeof optParams === 'object') {\n for (p in optParams){\n if (optParams.hasOwnProperty(p)) {\n a = optParams[p];\n if (Object.prototype.toString.call(a) === '[object Array]' && !isNaN(a.length)) {\n for (k = 0, m = a.length; k < m; k++) {\n params = params.concat([\n encodeURIComponent(p), '[]', '=',\n encodeURIComponent(a[k]), '&'\n ]);\n }\n }\n else {\n params = params.concat([\n encodeURIComponent(p), '=',\n encodeURIComponent(a), '&'\n ]);\n }\n }\n }\n if (params.length > 0) {\n params.pop();\n }\n }\n else\n {\n return optParams;\n }\n return params.join('');\n },\n\n /**\n * Set the url parameters for a GET request\n *\n * @method setParams\n * @return {void}\n * @private\n */\n setParams: function()\n {\n var params = null, optParams = this.options.parameters;\n\n if(typeof optParams === \"object\"){\n params = this.paramsObjToStr(optParams);\n } else {\n params = '' + optParams;\n }\n\n if(params){\n if(this.url.indexOf('?') > -1) {\n this.url = this.url.split('#')[0] + '&' + params;\n } else {\n this.url = this.url.split('#')[0] + '?' + params;\n }\n }\n },\n\n /**\n * Gets an HTTP header from the response\n *\n * @method getHeader\n * @param {String} name Header name\n * @return {String} Header content\n * @public\n */\n getHeader: function(name)\n {\n if (this.usingXDomainReq && name === 'Content-Type') {\n return this.transport.contentType;\n }\n try{\n return this.transport.getResponseHeader(name);\n } catch(e) {\n return null;\n }\n },\n\n /**\n * Gets all the HTTP headers from the response\n *\n * @method getAllHeaders\n * @return {String} The headers, each separated by a newline\n * @public\n */\n getAllHeaders: function()\n {\n try {\n return this.transport.getAllResponseHeaders();\n } catch(e) {\n return null;\n }\n },\n\n /**\n * Gets the ajax response object\n *\n * @method getResponse\n * @return {Object} The response object\n * @public\n */\n getResponse: function(){\n // setup our own stuff\n var t = this.transport,\n r = {\n headerJSON: null,\n responseJSON: null,\n getHeader: this.getHeader,\n getAllHeaders: this.getAllHeaders,\n request: this,\n transport: t,\n timeTaken: new Date() - this.startTime,\n requestedUrl: this.url\n };\n\n // setup things expected from the native object\n r.readyState = t.readyState;\n try { r.responseText = t.responseText; } catch(e) {}\n try { r.responseXML = t.responseXML; } catch(e) {}\n try { r.status = t.status; } catch(e) { r.status = 0; }\n try { r.statusText = t.statusText; } catch(e) { r.statusText = ''; }\n\n return r;\n },\n\n /**\n * Aborts the request if still running. No callbacks are called\n *\n * @method abort\n * @return {void}\n * @public\n */\n abort: function(){\n if (this.transport) {\n clearTimeout(this.delayTimeout);\n clearTimeout(this.stoTimeout);\n try { this.transport.abort(); } catch(ex) {}\n this.finish();\n }\n },\n\n /**\n * Executes the state changing phase of an ajax request\n *\n * @method runStateChange\n * @return {void}\n * @public\n */\n runStateChange: function()\n {\n var rs = this.transport.readyState;\n if (rs === 3) {\n if (this.isHTTP) {\n this.safeCall('onHeaders');\n }\n } else if (rs === 4 || this.usingXDomainReq) {\n\n if (this.options.asynchronous && this.options.delay && (this.startTime + this.options.delay > new Date().getTime())) {\n this.delayTimeout = setTimeout(Ink.bind(this.runStateChange, this), this.options.delay + this.startTime - new Date().getTime());\n return;\n }\n\n var responseJSON,\n responseContent = this.transport.responseText,\n response = this.getResponse(),\n curStatus = this.transport.status;\n\n if (this.isHTTP && !this.options.asynchronous) {\n this.safeCall('onHeaders');\n }\n\n clearTimeout(this.stoTimeout);\n\n if (curStatus === 0) {\n // Status 0 indicates network error for http requests.\n // For http less requests, 0 is always returned.\n if (this.isHTTP) {\n this.safeCall('onException', new Error('Ink.Net.Ajax: network error! (HTTP status 0)'));\n } else {\n curStatus = responseContent ? 200 : 404;\n }\n }\n else if (curStatus === 304) {\n curStatus = 200;\n }\n var isSuccess = this.usingXDomainReq || 200 <= curStatus && curStatus < 300;\n\n var headerContentType = this.getHeader('Content-Type') || '';\n if (this.options.evalJS &&\n (headerContentType.indexOf(\"application/json\") >= 0 || this.options.evalJS === 'force')){\n try {\n responseJSON = this.evalJSON(responseContent, this.sanitizeJSON);\n\n if(responseJSON){\n responseContent = response.responseJSON = responseJSON;\n }\n } catch(e){\n if (isSuccess) {\n // If the request failed, then this is perhaps an error page\n // so don't notify error.\n this.safeCall('onException', e);\n }\n }\n }\n\n if (this.usingXDomainReq && headerContentType.indexOf('xml') !== -1 && 'DOMParser' in window) {\n // http://msdn.microsoft.com/en-us/library/ie/ff975278(v=vs.85).aspx\n var mimeType;\n switch (headerContentType) {\n case 'application/xml':\n case 'application/xhtml+xml':\n case 'image/svg+xml':\n mimeType = headerContentType;\n break;\n default:\n mimeType = 'text/xml';\n }\n var xmlDoc = (new DOMParser()).parseFromString( this.transport.responseText, mimeType);\n this.transport.responseXML = xmlDoc;\n response.responseXML = xmlDoc;\n }\n\n if (this.transport.responseXML != null && response.responseJSON == null && this.transport.responseXML.xml !== \"\"){\n responseContent = this.transport.responseXML;\n }\n\n if (curStatus || this.usingXDomainReq) {\n if (isSuccess) {\n this.safeCall('onSuccess', response, responseContent);\n } else {\n this.safeCall('onFailure', response, responseContent);\n }\n this.safeCall('on'+curStatus, response, responseContent);\n }\n this.finish(response, responseContent);\n }\n },\n\n /**\n * Last step after XHR is complete. Call onComplete and cleanup object\n *\n * @method finish\n * @param {Mixed} response Response object as returned from getResponse().\n * @param {Mixed} responseContent Content of the response.\n * @return {void}\n * @private\n */\n finish: function(response, responseContent){\n if (response) {\n this.safeCall('onComplete', response, responseContent);\n }\n clearTimeout(this.stoTimeout);\n\n if (this.transport) {\n // IE6 sometimes barfs on this one\n try{ this.transport.onreadystatechange = null; } catch(e){}\n\n if (typeof this.transport.destroy === 'function') {\n // Stuff for Samsung.\n this.transport.destroy();\n }\n\n // Let XHR be collected.\n this.transport = null;\n }\n },\n\n /**\n * Safely calls a callback function.\n * Verifies that the callback is well defined and traps errors\n *\n * If you pass in an error as the second argument, it gets thrown if there is no default listener.\n *\n * @method safeCall\n * @param {Function} handlerName Name of the handler we wish to call\n * @param {Error} error This error gets reported to the console using Ink.error if there's no listener to `handlerName`.\n * @param {Mixed} [args...] Arguments to get passed to the `handlerName` handler.\n * @return {void}\n * @private\n */\n safeCall: function(handlerName /*[error or rest...]*/) {\n var error = arguments[1] instanceof Error ? arguments[1] : null;\n if (typeof this.options[handlerName] === 'function') {\n try {\n this.options[handlerName].apply(this, [].slice.call(arguments, 1));\n } catch(ex) {\n Ink.error('Ink.Net.Ajax: an error was raised while executing ' + handlerName + '.', ex);\n }\n } else if (error) {\n Ink.error('Ink.Net.Ajax: ' + error);\n }\n },\n\n /**\n * Sets a new request header for the next http request\n *\n * @method setRequestHeader\n * @param {String} name Header name.\n * @param {String} value New header value.\n * @return {void}\n * @public\n */\n setRequestHeader: function(name, value){\n if (!this.options.requestHeaders) {\n this.options.requestHeaders = {};\n }\n this.options.requestHeaders[name] = value;\n },\n\n /**\n * Executes the request\n *\n * @method request\n * @return {void}\n * @private\n */\n request: function()\n {\n if(this.transport) {\n var params = null;\n if(this.requestHasBody) {\n if(this.options.postBody !== null && this.options.postBody !== '') {\n params = this.options.postBody;\n this.setParams();\n } else if (this.options.parameters !== null && this.options.parameters !== ''){\n params = this.options.parameters;\n }\n\n if (typeof params === \"object\" && !params.nodeType) {\n params = this.paramsObjToStr(params);\n } else if (typeof params !== \"object\" && params !== null){\n params = '' + params;\n }\n\n if(this.options.contentType) {\n this.setRequestHeader('Content-Type', this.options.contentType);\n }\n } else {\n this.setParams();\n }\n\n var url = this.url;\n var method = this.options.method;\n var crossDomain = this.isCrossDomain;\n\n if (crossDomain && this.options.xhrProxy) {\n this.setRequestHeader('X-Url', url);\n url = this.options.xhrProxy + encodeURIComponent(url);\n crossDomain = false;\n }\n\n try {\n this.transport.open(method, url, this.options.asynchronous);\n } catch(e) {\n this.safeCall('onException', e);\n return this.finish(this.getResponse(), null);\n }\n\n this.setHeaders();\n\n this.safeCall('onCreate');\n\n if(this.options.timeout && !isNaN(this.options.timeout)) {\n this.stoTimeout = setTimeout(Ink.bind(function() {\n if(this.options.onTimeout) {\n this.safeCall('onTimeout');\n this.abort();\n }\n }, this), (this.options.timeout * 1000));\n }\n\n if(this.options.useCredentials && !this.usingXDomainReq) {\n this.transport.withCredentials = true;\n }\n\n if(this.options.asynchronous && !this.usingXDomainReq) {\n this.transport.onreadystatechange = Ink.bind(this.runStateChange, this);\n }\n else if (this.usingXDomainReq) {\n this.transport.onload = Ink.bind(this.runStateChange, this);\n }\n\n try {\n if (crossDomain) {\n // Need explicit handling because Mozila aborts\n // the script and Chrome fails silently.per the spec\n Ink.error('Ink.Net.Ajax: You are attempting to request a URL which is cross-domain from this one. To do this, you *must* enable the `cors` option!');\n return;\n } else {\n this.startTime = new Date().getTime();\n this.transport.send(params);\n }\n } catch(e) {\n this.safeCall('onException', e);\n return this.finish(this.getResponse(), null);\n }\n\n if(!this.options.asynchronous) {\n this.runStateChange();\n }\n }\n },\n\n /**\n * Checks if a given string is valid JSON\n *\n * @method isJSON\n * @param {String} str String to be evaluated\n * @return {Boolean} True if the string is valid JSON\n * @public\n */\n isJSON: function(str)\n {\n if (typeof str !== \"string\" || !str){ return false; }\n str = str.replace(/\\\\./g, '@').replace(/\"[^\"\\\\\\n\\r]*\"/g, '');\n return (/^[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]*$/).test(str);\n },\n\n /**\n * Evaluates a given string as JSON\n *\n * @method evalJSON\n * @param {String} strJSON String to be evaluated\n * @param {Boolean} sanitize Flag to sanitize the content\n * @return {Object} JSON content as an object\n * @public\n */\n evalJSON: function(strJSON, sanitize)\n {\n if (strJSON && (!sanitize || this.isJSON(strJSON))) {\n try {\n if (typeof JSON !== \"undefined\" && typeof JSON.parse !== 'undefined'){\n return JSON.parse(strJSON);\n }\n /*jshint evil:true */\n return eval('(' + strJSON + ')');\n } catch(e) {\n throw new Error('Ink.Net.Ajax: Bad JSON string. ' + e);\n }\n }\n return null;\n }\n };\n\n /**\n * Loads content from a given url through an XMLHttpRequest.\n *\n * Shortcut function for simple AJAX use cases. Works with JSON, XML and plain text.\n *\n * @method load\n * @param {String} url Request URL\n * @param {Function} callback Callback to be executed if the request is successful\n * @return {Object} XMLHttpRequest object\n * @public\n *\n * @sample Ink_Net_Ajax_load.html \n */\n Ajax.load = function(url, callback){\n var isCrossDomain = Ajax.prototype._locationIsCrossDomain(window.location, Ajax.prototype._locationFromURL(url));\n return new Ajax(url, {\n method: 'GET',\n cors: isCrossDomain,\n onSuccess: function(response){\n callback(response.responseJSON || response.responseText, response);\n }\n });\n };\n\n /**\n * Loads content from a given url through an XMLHttpRequest.\n * Shortcut function for simple AJAX use cases.\n *\n * @method ping\n * @param {String} url Request url\n * @param {Function} callback Callback to be executed if the request is successful\n * @public\n * @return {Object} XMLHttpRequest object\n */\n Ajax.ping = function(url, callback){\n var isCrossDomain = Ajax.prototype._locationIsCrossDomain(window.location, Ajax.prototype._locationFromURL(url));\n return new Ajax(url, {\n method: 'HEAD',\n cors: isCrossDomain,\n onSuccess: function(response){\n if (typeof callback === 'function'){\n callback(response);\n }\n }\n });\n };\n\n\n return Ajax;\n});\n","/**\n * Cross Browser JsonP requests\n * @module Ink.Net.JsonP_1\n * @version 1\n */\n\nInk.createModule('Ink.Net.JsonP', '1', [], function() {\n\n 'use strict';\n\n /**\n * Executes a JSONP request\n *\n * @class Ink.Net.JsonP\n * @constructor\n *\n * @param {String} uri Request URL\n * @param {Object} options Request options\n * @param {Function} options.onSuccess Success callback. Called with the JSONP response.\n * @param {Function} [options.onFailure] Failure callback. Called when there is a timeout.\n * @param {Object} [options.failureObj] Object to be passed as argument to failure callback\n * @param {Number} [options.timeout] Timeout for the request, in seconds. defaults to 10.\n * @param {Object} [options.params] Object with URL parameters.\n * @param {String} [options.callbackParam] URL parameter which gets the name of the JSONP function to call. defaults to 'jsoncallback'.\n * @param {String} [options.randVar] (Advanced, not recommended unless you know what you're doing) A string to append to the callback name. By default, generate a random number. Use an empty string if you already passed the correct name in the internalCallback option.\n * @param {String} [options.internalCallback] (Advanced) Name of the callback function stored in the Ink.Net.JsonP object (before it's prefixed).\n *\n * @sample Ink_Net_JsonP_1.html \n */\n var JsonP = function(uri, options) {\n this.init(uri, options);\n };\n\n JsonP.prototype = {\n\n init: function(uri, options) {\n this.options = Ink.extendObj( {\n onSuccess: undefined,\n onFailure: undefined,\n failureObj: {},\n timeout: 10,\n params: {},\n callbackParam: 'jsoncallback',\n internalCallback: '_cb',\n randVar: false\n }, options || {});\n\n if(this.options.randVar !== false) {\n this.randVar = this.options.randVar;\n } else {\n this.randVar = parseInt(Math.random() * 100000, 10);\n }\n\n this.options.internalCallback += this.randVar;\n\n this.uri = uri;\n\n // prevent SAPO legacy onComplete - make it onSuccess\n if(typeof(this.options.onComplete) === 'function') {\n this.options.onSuccess = this.options.onComplete;\n }\n\n if (typeof this.uri !== 'string') {\n throw new Error('Ink.Net.JsonP: Please define an URI');\n }\n\n if (typeof this.options.onSuccess !== 'function') {\n throw new Error('Ink.Net.JsonP: please define a callback function on option onSuccess!');\n }\n\n Ink.Net.JsonP[this.options.internalCallback] = Ink.bind(function() {\n this.options.onSuccess(arguments[0]);\n this._cleanUp();\n }, this);\n\n this.timeout = setTimeout(Ink.bind(function () {\n this.abort();\n if(typeof this.options.onFailure === 'function'){\n this.options.onFailure(this.options.failureObj);\n }\n }, this),\n this.options.timeout * 1000);\n\n this._addScriptTag();\n },\n\n /**\n * Abort the request, avoiding onSuccess or onFailure being called.\n * @method abort\n * @return {void}\n **/\n abort: function () {\n Ink.Net.JsonP[this.options.internalCallback] = Ink.bindMethod(this, '_cleanUp');\n },\n\n _addParamsToGet: function(uri, params) {\n var hasQuestionMark = uri.indexOf('?') !== -1;\n var sep, pKey, pValue, parts = [uri];\n\n for (pKey in params) {\n if (params.hasOwnProperty(pKey)) {\n if (!hasQuestionMark) { sep = '?'; hasQuestionMark = true; }\n else { sep = '&'; }\n pValue = params[pKey];\n if (typeof pValue !== 'number' && !pValue) { pValue = ''; }\n parts = parts.concat([sep, pKey, '=', encodeURIComponent(pValue)]);\n }\n }\n\n return parts.join('');\n },\n\n _getScriptContainer: function() {\n return document.body ||\n document.getElementsByTagName('body')[0] ||\n document.getElementsByTagName('head')[0] ||\n document.documentElement;\n },\n\n _addScriptTag: function() {\n // enrich options will callback and random seed\n this.options.params[this.options.callbackParam] = 'Ink.Net.JsonP.' + this.options.internalCallback;\n this.options.params.rnd_seed = this.randVar;\n this.uri = this._addParamsToGet(this.uri, this.options.params);\n // create script tag\n this._scriptEl = document.createElement('script');\n this._scriptEl.type = 'text/javascript';\n this._scriptEl.src = this.uri;\n var scriptCtn = this._getScriptContainer();\n scriptCtn.appendChild(this._scriptEl);\n },\n\n _cleanUp: function () {\n if (this.timeout) {\n window.clearTimeout(this.timeout);\n }\n delete this.options.onSuccess;\n delete this.options.onFailure;\n delete Ink.Net.JsonP[this.options.internalCallback];\n this._removeScriptTag();\n },\n\n _removeScriptTag: function() {\n if (!this._scriptEl) { return; /* already removed */ }\n this._scriptEl.parentNode.removeChild(this._scriptEl);\n delete this._scriptEl;\n }\n };\n\n return JsonP;\n\n});\n","/**\n * Browser Detection and User Agent sniffing\n * @module Ink.Dom.Browser_1\n * @version 1\n */\nInk.createModule('Ink.Dom.Browser', '1', [], function() {\n 'use strict'; \n\n /**\n * @namespace Ink.Dom.Browser\n * @version 1\n * @static\n * @example\n * \n */\n var Browser = {\n /**\n * True if the browser is Internet Explorer\n *\n * @property IE\n * @type {Boolean}\n * @public\n * @static\n */\n IE: false,\n\n /**\n * True if the browser is Gecko based\n *\n * @property GECKO\n * @type {Boolean}\n * @public\n * @static\n */\n GECKO: false,\n\n /**\n * True if the browser is Opera\n *\n * @property OPERA\n * @type {Boolean}\n * @public\n * @static\n */\n OPERA: false,\n\n /**\n * True if the browser is Safari\n *\n * @property SAFARI\n * @type {Boolean}\n * @public\n * @static\n */\n SAFARI: false,\n\n /**\n * True if the browser is Konqueror\n *\n * @property KONQUEROR\n * @type {Boolean}\n * @public\n * @static\n */\n KONQUEROR: false,\n\n /**\n * True if browser is Chrome\n *\n * @property CHROME\n * @type {Boolean}\n * @public\n * @static\n */\n CHROME: false,\n\n /**\n * The specific browser model.\n * False if it is unavailable.\n *\n * @property model\n * @type {Boolean|String}\n * @public\n * @static\n */\n model: false,\n\n /**\n * The browser version.\n * False if it is unavailable.\n *\n * @property version\n * @type {Boolean|String}\n * @public\n * @static\n */\n version: false,\n\n /**\n * The user agent string.\n * False if it is unavailable.\n *\n * @property userAgent\n * @type {Boolean|String}\n * @public\n * @static\n */\n userAgent: false,\n\n /**\n * The CSS prefix (-moz-, -webkit-, -ms-, ...)\n * False if it is unavailable \n *\n * @property cssPrefix \n * @type {Boolean|String}\n * @public \n * @static \n */\n cssPrefix: false, \n\n /**\n * The DOM prefix (Moz, Webkit, ms, ...)\n * False if it is unavailable \n * @property domPrefix \n * @type {Boolean|String}\n * @public \n * @static \n */\n domPrefix: false,\n\n /**\n * Initialization function for the Browser object.\n *\n * Is called automatically when this module is loaded, and calls setDimensions, setBrowser and setReferrer.\n *\n * @method init\n * @return {void}\n * @public\n */\n init: function() {\n this.detectBrowser();\n this.setDimensions();\n this.setReferrer();\n },\n\n /**\n * Retrieves and stores window dimensions in this object. Called automatically when this module is loaded.\n *\n * @method setDimensions\n * @return {void}\n * @public\n */\n setDimensions: function() {\n //this.windowWidth=window.innerWidth !== null? window.innerWidth : document.documentElement && document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body !== null ? document.body.clientWidth : null;\n //this.windowHeight=window.innerHeight != null? window.innerHeight : document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body != null? document.body.clientHeight : null;\n var myWidth = 0, myHeight = 0;\n if ( typeof window.innerWidth=== 'number' ) {\n myWidth = window.innerWidth;\n myHeight = window.innerHeight;\n } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {\n myWidth = document.documentElement.clientWidth;\n myHeight = document.documentElement.clientHeight;\n } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {\n myWidth = document.body.clientWidth;\n myHeight = document.body.clientHeight;\n }\n this.windowWidth = myWidth;\n this.windowHeight = myHeight;\n },\n\n /**\n * Stores the referrer. Called automatically when this module is loaded.\n *\n * @method setReferrer\n * @return {void}\n * @public\n */\n setReferrer: function() {\n if (document.referrer && document.referrer.length) {\n this.referrer = window.escape(document.referrer);\n } else {\n this.referrer = false;\n }\n },\n\n /**\n * Detects the browser and stores the found properties. Called automatically when this module is loaded.\n *\n * @method detectBrowser\n * @return {void}\n * @public\n */\n detectBrowser: function() {\n this._sniffUserAgent(navigator.userAgent);\n },\n\n _sniffUserAgent: function (sAgent) {\n this.userAgent = sAgent;\n\n sAgent = sAgent.toLowerCase();\n\n if (/applewebkit\\//.test(sAgent)) {\n this.cssPrefix = '-webkit-';\n this.domPrefix = 'Webkit';\n if(/(chrome|crios)\\//.test(sAgent)) {\n // Chrome\n this.CHROME = true;\n this.model = 'chrome';\n this.version = sAgent.replace(/(.*)chrome\\/([^\\s]+)(.*)/, \"$2\");\n } else {\n // Safari\n this.SAFARI = true;\n this.model = 'safari';\n var rVersion = /version\\/([^) ]+)/;\n if (rVersion.test(sAgent)) {\n this.version = sAgent.match(rVersion)[1];\n } else {\n this.version = sAgent.replace(/(.*)applewebkit\\/([^\\s]+)(.*)/, \"$2\");\n }\n }\n } else if (/opera/.test(sAgent)) {\n // Opera\n this.OPERA = true;\n this.model = 'opera';\n this.version = sAgent.replace(/(.*)opera.([^\\s$]+)(.*)/, \"$2\");\n this.cssPrefix = '-o-';\n this.domPrefix = 'O';\n } else if (/konqueror/.test(sAgent)) {\n // Konqueroh\n this.KONQUEROR = true;\n this.model = 'konqueror';\n this.version = sAgent.replace(/(.*)konqueror\\/([^;]+);(.*)/, \"$2\");\n this.cssPrefix = '-khtml-';\n this.domPrefix = 'Khtml';\n } else if (/(msie|trident)/i.test(sAgent)) {\n // MSIE\n this.IE = true;\n this.model = 'ie';\n if (/rv:((?:\\d|\\.)+)/.test(sAgent)) { // IE 11\n this.version = sAgent.match(/rv:((?:\\d|\\.)+)/)[1];\n } else {\n this.version = sAgent.replace(/(.*)\\smsie\\s([^;]+);(.*)/, \"$2\");\n }\n this.cssPrefix = '-ms-';\n this.domPrefix = 'ms';\n } else if (/gecko/.test(sAgent)) {\n // GECKO\n // Supports only:\n // Camino, Chimera, Epiphany, Minefield (firefox 3), Firefox, Firebird, Phoenix, Galeon,\n // Iceweasel, K-Meleon, SeaMonkey, Netscape, Songbird, Sylera,\n this.cssPrefix = '-moz-';\n this.domPrefix = 'Moz';\n\n this.GECKO = true;\n\n var re = /(camino|chimera|epiphany|minefield|firefox|firebird|phoenix|galeon|iceweasel|k\\-meleon|seamonkey|netscape|songbird|sylera)/;\n if(re.test(sAgent)) {\n this.model = sAgent.match(re)[1];\n this.version = sAgent.replace(new RegExp(\"(.*)\"+this.model+\"\\/([^;\\\\s$]+)(.*)\"), \"$2\");\n } else {\n // probably is mozilla\n this.model = 'mozilla';\n var reVersion = /(.*)rv:([^)]+)(.*)/;\n if(reVersion.test(sAgent)) {\n this.version = sAgent.replace(reVersion, \"$2\");\n }\n }\n }\n },\n\n /**\n * Debug function which displays browser (and Ink.Dom.Browser) information as an alert message.\n *\n * @method debug\n * @return {void}\n * @public\n * @sample Ink_Dom_Browser_1_debug.html\n */\n debug: function() {\n /*global alert:false */\n var str = \"known browsers: (ie, gecko, opera, safari, konqueror) \\n\";\n str += [this.IE, this.GECKO, this.OPERA, this.SAFARI, this.KONQUEROR] +\"\\n\";\n str += \"cssPrefix -> \"+this.cssPrefix+\"\\n\";\n str += \"domPrefix -> \"+this.domPrefix+\"\\n\";\n str += \"model -> \"+this.model+\"\\n\";\n str += \"version -> \"+this.version+\"\\n\";\n str += \"\\n\";\n str += \"original UA -> \"+this.userAgent;\n\n alert(str);\n }\n };\n\n Browser.init();\n\n return Browser;\n});\n","/**\n * CSS Utilities and toolbox\n * @module Ink.Dom.Css_1\n * @version 1\n */\n\nInk.createModule( 'Ink.Dom.Css', 1, [], function() {\n\n 'use strict';\n\n // getComputedStyle feature detection.\n var getCs = (\"defaultView\" in document) && (\"getComputedStyle\" in document.defaultView) ? document.defaultView.getComputedStyle : window.getComputedStyle;\n\n /**\n * @namespace Ink.Dom.Css\n * @static\n */\n\n var Css = {\n /**\n * Adds of removes a class.\n * Depending on addRemState, this method either adds a class if it's true or removes if if false.\n *\n * @method addRemoveClassName\n * @param {DOMElement|string} elm DOM element or element id\n * @param {string} className class name to add or remove.\n * @param {boolean} addRemState Whether to add or remove. `true` to add, `false` to remove.\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_addRemoveClassName.html \n */\n addRemoveClassName: function(elm, className, addRemState) {\n if (addRemState) {\n return this.addClassName(elm, className);\n }\n this.removeClassName(elm, className);\n },\n\n /**\n * Adds a class to a given element\n *\n * @method addClassName\n * @param {Element|String} elm Element or element id\n * @param {String|Array} className Class or classes to add. Examples: 'my-class', ['my-class', 'other-class'], 'my-class other-class'\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_addClassName.html\n */\n addClassName: function(elm, className) {\n elm = Ink.i(elm);\n if (!elm || !className) { return null; }\n className = ('' + className).split(/[, ]+/);\n var i = 0;\n var len = className.length;\n\n for (; i < len; i++) {\n // remove whitespace and ignore on empty string\n if (className[i].replace(/^\\s+|\\s+$/g, '')) {\n if (typeof elm.classList !== \"undefined\") {\n elm.classList.add(className[i]);\n } else if (!Css.hasClassName(elm, className[i])) {\n elm.className += (elm.className ? ' ' : '') + className[i];\n }\n }\n }\n },\n\n /**\n * Removes a class from a given element\n *\n * @method removeClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String|Array} className Class names to remove. You can either use a space separated string of classnames, comma-separated list or an array\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_removeClassName.html \n */\n removeClassName: function(elm, className) {\n elm = Ink.i(elm);\n if (!elm || !className) { return null; }\n \n className = ('' + className).split(/[, ]+/);\n var i = 0;\n var len = className.length;\n\n if (typeof elm.classList !== \"undefined\"){\n for (; i < len; i++) {\n elm.classList.remove(className[i]);\n }\n } else {\n var elmClassName = elm.className || '';\n var re;\n for (; i < len; i++) {\n re = new RegExp(\"(^|\\\\s+)\" + className[i] + \"(\\\\s+|$)\");\n elmClassName = elmClassName.replace(re, ' ');\n }\n elm.className = (elmClassName\n .replace(/^\\s+/, '')\n .replace(/\\s+$/, ''));\n }\n },\n\n /**\n * Alias to addRemoveClassName. \n * Utility function, saves many if/elses.\n *\n * @method setClassName\n * @uses addRemoveClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String|Array} className Class names to add\\remove. Comma separated, space separated or simply an Array\n * @param {Boolean} [add]=false Flag to switch behavior from removal to addition. true to add, false to remove\n * @return {void}\n * @public\n */\n setClassName: function(elm, className, add) {\n this.addRemoveClassName(elm, className, add || false);\n },\n\n /**\n * Checks if an element has a class.\n * This method verifies if an element has ONE of a list of classes. If the last argument is flagged as true, instead checks if the element has ALL the classes\n * \n * @method hasClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String|Array} className Class name(s) to test\n * @param {Boolean} [all=false] Irrelevant if only one `className` is passed. If `true`, check if the element contains ALL the CSS classes. If `false`, check whether the element contains ANY of the given classes.\n * @return {Boolean} `true` if a given class is applied to a given element, `false` if it isn't.\n * @public\n * @sample Ink_Dom_Css_hasClassName.html \n */\n hasClassName: function(elm, className, all) {\n elm = Ink.i(elm);\n if (!elm || !className) { return false; }\n\n className = ('' + className).split(/[, ]+/);\n var i = 0;\n var len = className.length;\n var has;\n var re;\n\n for ( ; i < len; i++) {\n if (typeof elm.classList !== \"undefined\"){\n has = elm.classList.contains(className[i]);\n } else {\n var elmClassName = elm.className;\n if (elmClassName === className[i]) {\n has = true;\n } else {\n re = new RegExp(\"(^|\\\\s)\" + className[i] + \"(\\\\s|$)\");\n has = re.test(elmClassName);\n }\n }\n if (has && !all) { return true; } // return if looking for any class\n if (!has && all) { return false; } // return if looking for all classes\n }\n\n if (all) {\n // if we got here, all classes were found so far\n return true;\n } else {\n // if we got here with all == false, no class was found\n return false;\n }\n },\n\n /**\n * Blinks a class from an element\n * Add and removes the class from the element with a timeout, so it blinks\n *\n * @method blinkClass\n * @uses addRemoveClassName\n * @param {Element|String} element DOM element or element id\n * @param {String|Array} className Class name(s) to blink\n * @param {Number} timeout timeout in ms between adding and removing, default 100 ms\n * @param {Boolean} negate is true, class is removed then added\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_blinkClass.html \n */\n blinkClass: function(element, className, timeout, negate){\n element = Ink.i(element);\n Css.addRemoveClassName(element, className, !negate);\n setTimeout(function() {\n Css.addRemoveClassName(element, className, negate);\n }, Number(timeout) || 100);\n },\n\n /**\n * Toggles a class name from a given element\n *\n * @method toggleClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} className Class name\n * @param {Boolean} [forceAdd] Flag to force adding the the classe names if they don't exist yet.\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_toggleClassName.html \n */\n toggleClassName: function(elm, className, forceAdd) {\n if (!elm || !className) { return false; }\n\n if (typeof forceAdd !== 'undefined') {\n return Css.addRemoveClassName(elm, className, forceAdd);\n } else if (typeof elm.classList !== \"undefined\" && !/[, ]/.test(className)) {\n elm = Ink.i(elm);\n if (elm !== null){\n elm.classList.toggle(className);\n }\n } else {\n if (Css.hasClassName(elm, className)) {\n Css.removeClassName(elm, className);\n } else {\n Css.addClassName(elm, className);\n }\n }\n },\n\n /**\n * Sets the opacity of given element \n *\n * @method setOpacity\n * @param {DOMElement|String} elm DOM element or element id\n * @param {Number} value allows 0 to 1(default mode decimal) or percentage (warning using 0 or 1 will reset to default mode)\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_setOpacity.html \n */\n setOpacity: function(elm, value) {\n elm = Ink.i(elm);\n if (elm !== null){\n var val = 1;\n\n if (!isNaN(Number(value))){\n if (value <= 0) { val = 0; }\n else if (value <= 1) { val = value; }\n else if (value <= 100) { val = value / 100; }\n else { val = 1; }\n }\n\n if (typeof elm.style.opacity !== 'undefined') {\n elm.style.opacity = val;\n }\n else {\n elm.style.filter = \"alpha(opacity:\"+(val*100|0)+\")\";\n }\n }\n },\n\n /**\n * Converts a css property name to a string in camelcase to be used with CSSStyleDeclaration.\n * @method _camelCase\n * @private\n * @param {String} str String to convert\n * @return {String} Converted string\n */\n _camelCase: function(str) {\n return str ? str.replace(/-(\\w)/g, function (_, $1) {\n return $1.toUpperCase();\n }) : str;\n },\n\n\n /**\n * Gets the value for an element's style attribute\n *\n * @method getStyle\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} style Which css attribute to fetch\n * @return {Mixed} Style value\n * @public\n * @sample Ink_Dom_Css_getStyle.html \n */\n getStyle: function(elm, style) {\n elm = Ink.i(elm);\n if (elm !== null && elm.style) {\n style = style === 'float' ? 'cssFloat': this._camelCase(style);\n\n var value = elm.style[style];\n\n if (getCs && (!value || value === 'auto')) {\n var css = getCs(elm, null);\n value = css ? css[style] : null;\n }\n else if (!value && elm.currentStyle) {\n value = elm.currentStyle[style];\n if (value === 'auto' && (style === 'width' || style === 'height')) {\n value = elm[\"offset\" + style.charAt(0).toUpperCase() + style.slice(1)] + \"px\";\n }\n }\n\n if (style === 'opacity') {\n return value ? parseFloat(value, 10) : 1.0;\n }\n else if (style === 'borderTopWidth' || style === 'borderBottomWidth' ||\n style === 'borderRightWidth' || style === 'borderLeftWidth' ) {\n if (value === 'thin') { return '1px'; }\n else if (value === 'medium') { return '3px'; }\n else if (value === 'thick') { return '5px'; }\n }\n\n return value === 'auto' ? null : value;\n }\n },\n\n\n /**\n * Adds CSS rules to an element's style attribute.\n *\n * @method setStyle\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} style Which css attribute to set\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_setStyle.html \n */\n setStyle: function(elm, style) {\n elm = Ink.i(elm);\n if (elm === null) { return; }\n if (typeof style === 'string') {\n elm.style.cssText += '; '+style;\n\n if (style.indexOf('opacity') !== -1) {\n this.setOpacity(elm, style.match(/opacity:\\s*(\\d?\\.?\\d*)/)[1]);\n }\n }\n else {\n for (var prop in style) {\n if (style.hasOwnProperty(prop)){\n if (prop === 'opacity') {\n this.setOpacity(elm, style[prop]);\n }\n else if (prop === 'float' || prop === 'cssFloat') {\n if (typeof elm.style.styleFloat === 'undefined') {\n elm.style.cssFloat = style[prop];\n }\n else {\n elm.style.styleFloat = style[prop];\n }\n } else {\n elm.style[prop] = style[prop];\n }\n }\n }\n }\n },\n\n\n /**\n * Shows an element.\n * Internally it unsets the display property of an element. You can force a specific display property using forceDisplayProperty\n *\n * @method show\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} [forceDisplayProperty] Css display property to apply on show\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_show.html \n */\n show: function(elm, forceDisplayProperty) {\n elm = Ink.i(elm);\n if (elm !== null) {\n elm.style.display = forceDisplayProperty || '';\n }\n },\n\n /**\n * Hides an element.\n *\n * @method hide\n * @param {DOMElement|String} elm DOM element or element id\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_hide.html \n */\n hide: function(elm) {\n elm = Ink.i(elm);\n if (elm !== null) {\n elm.style.display = 'none';\n }\n },\n\n /**\n * Shows or hides an element.\n * If the show parameter is true, it shows the element. Otherwise, hides it.\n *\n * @method showHide\n * @param {DOMElement|String} elm DOM element or element id\n * @param {boolean} [show]=false Whether to show or hide `elm`.\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_showHide.html \n */\n showHide: function(elm, show) {\n elm = Ink.i(elm);\n if (elm) {\n elm.style.display = show ? '' : 'none';\n }\n },\n\n /**\n * Toggles an element visibility.\n * \n * @method toggle\n * @param {DOMElement|String} elm DOM element or element id\n * @param {Boolean} forceShow Forces showing if element is hidden\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_toggle.html \n */\n toggle: function(elm, forceShow) {\n elm = Ink.i(elm);\n if (elm !== null) {\n if (typeof forceShow !== 'undefined') {\n if (forceShow === true) {\n this.show(elm);\n } else {\n this.hide(elm);\n }\n } else {\n if (this.getStyle(elm,'display').toLowerCase() === 'none') {\n this.show(elm);\n }\n else {\n this.hide(elm);\n }\n }\n }\n },\n\n _getRefTag: function(head){\n if (head.firstElementChild) {\n return head.firstElementChild;\n }\n\n for (var child = head.firstChild; child; child = child.nextSibling){\n if (child.nodeType === 1){\n return child;\n }\n }\n return null;\n },\n\n /**\n * Injects style tags with rules to the page.\n *\n * @method appendStyleTag\n * @param {String} selector The css selector for the rule\n * @param {String} style The content of the style rule\n * @param {Object} options Options for the tag\n * @param {String} [options.type]='text/css' File type\n * @param {Boolean} [options.force]=false If true, the style tag will be appended to end of head\n * @return {void}\n * @public\n * \n * @sample Ink_Dom_Css_appendStyleTag.html \n */\n appendStyleTag: function(selector, style, options){\n options = Ink.extendObj({\n type: 'text/css',\n force: false\n }, options || {});\n\n var styles = document.getElementsByTagName(\"style\"),\n oldStyle = false, setStyle = true, i, l;\n\n for (i=0, l=styles.length; i= 0) {\n setStyle = false;\n }\n }\n\n if (setStyle) {\n var defStyle = document.createElement(\"style\"),\n head = document.getElementsByTagName(\"head\")[0],\n refTag = false, styleStr = '';\n\n defStyle.type = options.type;\n\n styleStr += selector +\" {\";\n styleStr += style;\n styleStr += \"} \";\n\n if (typeof defStyle.styleSheet !== \"undefined\") {\n defStyle.styleSheet.cssText = styleStr;\n } else {\n defStyle.appendChild(document.createTextNode(styleStr));\n }\n\n if (options.force){\n head.appendChild(defStyle);\n } else {\n refTag = this._getRefTag(head);\n if (refTag){\n head.insertBefore(defStyle, refTag);\n }\n }\n }\n },\n\n /**\n * Injects an external link tag.\n * This method add a stylesheet to the head of a page\n *\n * @method appendStylesheet\n * @param {String} path File path\n * @param {Object} options Options for the tag\n * @param {String} [options.media='screen'] Media type\n * @param {String} [options.type='text/css'] File type\n * @param {Boolean} [options.force=false] If true, tag will be appended to end of head\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_appendStylesheet.html \n */\n appendStylesheet: function(path, options){\n options = Ink.extendObj({\n media: 'screen',\n type: 'text/css',\n force: false\n }, options || {});\n\n var refTag,\n style = document.createElement(\"link\"),\n head = document.getElementsByTagName(\"head\")[0];\n\n style.media = options.media;\n style.type = options.type;\n style.href = path;\n style.rel = \"Stylesheet\";\n\n if (options.force){\n head.appendChild(style);\n }\n else {\n refTag = this._getRefTag(head);\n if (refTag){\n head.insertBefore(style, refTag);\n }\n }\n },\n\n /**\n * Injects an external link tag.\n * Loads CSS via LINK element inclusion in HEAD (skips append if already there)\n *\n * Works similarly to appendStylesheet but:\n * supports optional callback which gets invoked once the CSS has been applied\n *\n * @method appendStylesheetCb\n * @param {String} cssURI URI of the CSS to load, if empty ignores and just calls back directly\n * @param {Function(cssURI)} [callback] optional callback which will be called once the CSS is loaded\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_appendStylesheetCb.html \n */\n _loadingCSSFiles: {},\n _loadedCSSFiles: {},\n appendStylesheetCb: function(url, callback) {\n if (!url) {\n return callback(url);\n }\n\n if (this._loadedCSSFiles[url]) {\n return callback(url);\n }\n\n var cbs = this._loadingCSSFiles[url];\n if (cbs) {\n return cbs.push(callback);\n }\n\n this._loadingCSSFiles[url] = [callback];\n\n var linkEl = document.createElement('link');\n linkEl.type = 'text/css';\n linkEl.rel = 'stylesheet';\n linkEl.href = url;\n\n var headEl = document.getElementsByTagName('head')[0];\n headEl.appendChild(linkEl);\n\n var imgEl = document.createElement('img');\n /*\n var _self = this;\n (function(_url) {\n imgEl.onerror = function() {\n //var url = this;\n var url = _url;\n _self._loadedCSSFiles[url] = true;\n var callbacks = _self._loadingCSSFiles[url];\n for (var i = 0, f = callbacks.length; i < f; ++i) {\n callbacks[i](url);\n }\n delete _self._loadingCSSFiles[url];\n };\n })(url);\n */\n imgEl.onerror = Ink.bindEvent(function(event, _url) {\n //var url = this;\n var url = _url;\n this._loadedCSSFiles[url] = true;\n var callbacks = this._loadingCSSFiles[url];\n for (var i = 0, f = callbacks.length; i < f; ++i) {\n callbacks[i](url);\n }\n delete this._loadingCSSFiles[url];\n }, this, url);\n imgEl.src = url;\n },\n\n /**\n * Converts decimal to hexadecimal values\n * Useful to convert colors to their hexadecimal representation.\n *\n * @method decToHex\n * @param {String} dec Either a single decimal value, an rgb(r, g, b) string or an Object with r, g and b properties\n * @return {String} Hexadecimal value\n * @sample Ink_Dom_Css_decToHex.html \n */\n decToHex: function(dec) {\n var normalizeTo2 = function(val) {\n if (val.length === 1) {\n val = '0' + val;\n }\n val = val.toUpperCase();\n return val;\n };\n\n if (typeof dec === 'object') {\n var rDec = normalizeTo2(parseInt(dec.r, 10).toString(16));\n var gDec = normalizeTo2(parseInt(dec.g, 10).toString(16));\n var bDec = normalizeTo2(parseInt(dec.b, 10).toString(16));\n return rDec+gDec+bDec;\n }\n else {\n dec += '';\n var rgb = dec.match(/\\((\\d+),\\s?(\\d+),\\s?(\\d+)\\)/);\n if (rgb !== null) {\n return normalizeTo2(parseInt(rgb[1], 10).toString(16)) +\n normalizeTo2(parseInt(rgb[2], 10).toString(16)) +\n normalizeTo2(parseInt(rgb[3], 10).toString(16));\n }\n else {\n return normalizeTo2(parseInt(dec, 10).toString(16));\n }\n }\n },\n\n /**\n * Converts hexadecimal values to decimal\n * Useful to use with CSS colors\n *\n * @method hexToDec\n * @param {String} hex hexadecimal Value with 6, 3, 2 or 1 characters\n * @return {Number} Object with properties r, g, b if length of number is >= 3 or decimal value instead.\n * @sample Ink_Dom_Css_hexToDec.html \n */\n hexToDec: function(hex){\n if (hex.indexOf('#') === 0) {\n hex = hex.substr(1);\n }\n if (hex.length === 6) { // will return object RGB\n return {\n r: parseInt(hex.substr(0,2), 16),\n g: parseInt(hex.substr(2,2), 16),\n b: parseInt(hex.substr(4,2), 16)\n };\n }\n else if (hex.length === 3) { // will return object RGB\n return {\n r: parseInt(hex.charAt(0) + hex.charAt(0), 16),\n g: parseInt(hex.charAt(1) + hex.charAt(1), 16),\n b: parseInt(hex.charAt(2) + hex.charAt(2), 16)\n };\n }\n else if (hex.length <= 2) { // will return int\n return parseInt(hex, 16);\n }\n },\n\n /**\n * Get a single property from a stylesheet.\n * Use this to obtain the value of a CSS property (searched from loaded CSS documents)\n *\n * @method getPropertyFromStylesheet\n * @param {String} selector a CSS rule. must be an exact match\n * @param {String} property a CSS property\n * @return {String} value of the found property, or null if it wasn't matched\n */\n getPropertyFromStylesheet: function(selector, property) {\n var rule = this.getRuleFromStylesheet(selector);\n if (rule) {\n return rule.style[property];\n }\n return null;\n },\n\n getPropertyFromStylesheet2: function(selector, property) {\n var rules = this.getRulesFromStylesheet(selector);\n /*\n rules.forEach(function(rule) {\n var x = rule.style[property];\n if (x !== null && x !== undefined) {\n return x;\n }\n });\n */\n var x;\n for(var i=0, t=rules.length; i < t; i++) {\n x = rules[i].style[property];\n if (x !== null && x !== undefined) {\n return x;\n }\n }\n return null;\n },\n\n getRuleFromStylesheet: function(selector) {\n var sheet, rules, ri, rf, rule;\n var s = document.styleSheets;\n if (!s) {\n return null;\n }\n\n for (var si = 0, sf = document.styleSheets.length; si < sf; ++si) {\n sheet = document.styleSheets[si];\n rules = sheet.rules ? sheet.rules : sheet.cssRules;\n if (!rules) { return null; }\n\n for (ri = 0, rf = rules.length; ri < rf; ++ri) {\n rule = rules[ri];\n if (!rule.selectorText) { continue; }\n if (rule.selectorText === selector) {\n return rule;\n }\n }\n }\n\n return null;\n },\n\n getRulesFromStylesheet: function(selector) {\n var res = [];\n var sheet, rules, ri, rf, rule;\n var s = document.styleSheets;\n if (!s) { return res; }\n\n for (var si = 0, sf = document.styleSheets.length; si < sf; ++si) {\n sheet = document.styleSheets[si];\n rules = sheet.rules ? sheet.rules : sheet.cssRules;\n if (!rules) {\n return null;\n }\n\n for (ri = 0, rf = rules.length; ri < rf; ++ri) {\n rule = rules[ri];\n if (!rule.selectorText) { continue; }\n if (rule.selectorText === selector) {\n res.push(rule);\n }\n }\n }\n\n return res;\n },\n\n getPropertiesFromRule: function(selector) {\n var rule = this.getRuleFromStylesheet(selector);\n var props = {};\n var prop, i, f;\n\n /*if (typeof rule.style.length === 'snumber') {\n for (i = 0, f = rule.style.length; i < f; ++i) {\n prop = this._camelCase( rule.style[i] );\n props[prop] = rule.style[prop];\n }\n }\n else { // HANDLES IE 8, FIREFOX RULE JOINING... */\n rule = rule.style.cssText;\n var parts = rule.split(';');\n var steps, val, pre, pos;\n for (i = 0, f = parts.length; i < f; ++i) {\n if (parts[i].charAt(0) === ' ') {\n parts[i] = parts[i].substring(1);\n }\n steps = parts[i].split(':');\n prop = this._camelCase( steps[0].toLowerCase() );\n val = steps[1];\n if (val) {\n val = val.substring(1);\n\n if (prop === 'padding' || prop === 'margin' || prop === 'borderWidth') {\n\n if (prop === 'borderWidth') { pre = 'border'; pos = 'Width'; }\n else { pre = prop; pos = ''; }\n\n if (val.indexOf(' ') !== -1) {\n val = val.split(' ');\n props[pre + 'Top' + pos] = val[0];\n props[pre + 'Bottom'+ pos] = val[0];\n props[pre + 'Left' + pos] = val[1];\n props[pre + 'Right' + pos] = val[1];\n }\n else {\n props[pre + 'Top' + pos] = val;\n props[pre + 'Bottom'+ pos] = val;\n props[pre + 'Left' + pos] = val;\n props[pre + 'Right' + pos] = val;\n }\n }\n else if (prop === 'borderRadius') {\n if (val.indexOf(' ') !== -1) {\n val = val.split(' ');\n props.borderTopLeftRadius = val[0];\n props.borderBottomRightRadius = val[0];\n props.borderTopRightRadius = val[1];\n props.borderBottomLeftRadius = val[1];\n }\n else {\n props.borderTopLeftRadius = val;\n props.borderTopRightRadius = val;\n props.borderBottomLeftRadius = val;\n props.borderBottomRightRadius = val;\n }\n }\n else {\n props[prop] = val;\n }\n }\n }\n //}\n //console.log(props);\n\n return props;\n },\n\n /**\n * Change the font size of elements.\n * Changes the font size of the elements which match the given CSS rule\n * For this function to work, the CSS file must be in the same domain than the host page, otherwise JS can't access it.\n *\n * @method changeFontSize\n * @param {String} selector CSS selector rule\n * @param {Number} delta Number of pixels to change on font-size\n * @param {String} [op] Supported operations are '+' and '*'. defaults to '+'\n * @param {Number} [minVal] If result gets smaller than minVal, change does not occurr\n * @param {Number} [maxVal] If result gets bigger than maxVal, change does not occurr\n * @return {void}\n * @public\n */\n changeFontSize: function(selector, delta, op, minVal, maxVal) {\n var that = this;\n Ink.requireModules(['Ink.Dom.Selector_1'], function(Selector) {\n var e;\n if (typeof selector !== 'string') { e = '1st argument must be a CSS selector rule.'; }\n else if (typeof delta !== 'number') { e = '2nd argument must be a number.'; }\n else if (op !== undefined && op !== '+' && op !== '*') { e = '3rd argument must be one of \"+\", \"*\".'; }\n else if (minVal !== undefined && (typeof minVal !== 'number' || minVal <= 0)) { e = '4th argument must be a positive number.'; }\n else if (maxVal !== undefined && (typeof maxVal !== 'number' || maxVal < maxVal)) { e = '5th argument must be a positive number greater than minValue.'; }\n if (e) { throw new TypeError(e); }\n\n var val, el, els = Selector.select(selector);\n if (minVal === undefined) { minVal = 1; }\n op = (op === '*') ? function(a,b){return a*b;} : function(a,b){return a+b;};\n for (var i = 0, f = els.length; i < f; ++i) {\n el = els[i];\n val = parseFloat( that.getStyle(el, 'fontSize'));\n val = op(val, delta);\n if (val < minVal) { continue; }\n if (typeof maxVal === 'number' && val > maxVal) { continue; }\n el.style.fontSize = val + 'px';\n }\n });\n }\n\n };\n\n return Css;\n\n});\n","/**\n * DOM Traversal and manipulation\n * @module Ink.Dom.Element_1\n * @version 1\n */\n\nInk.createModule('Ink.Dom.Element', 1, [], function() {\n\n 'use strict';\n\n var createContextualFragmentSupport = (\n typeof document.createRange === 'function' &&\n typeof window.Range.prototype.createContextualFragment === 'function');\n\n var deleteThisTbodyToken = 'Ink.Dom.Element tbody: ' + Math.random();\n var browserCreatesTbodies = (function () {\n var div = document.createElement('div');\n div.innerHTML = '';\n return div.getElementsByTagName('tbody').length !== 0;\n }());\n\n function rect(elem){\n var dimensions = {};\n try {\n dimensions = elem.getBoundingClientRect();\n } catch(e){\n dimensions = { top: elem.offsetTop, left: elem.offsetLeft };\n }\n return dimensions;\n }\n\n /**\n * @namespace Ink.Dom.Element_1\n */\n\n var InkElement = {\n\n /**\n * Checks if something is a DOM Element.\n *\n * @method isDOMElement\n * @static\n * @param {Mixed} o The object to be checked.\n * @return {Boolean} True if it's a valid DOM Element.\n * @public\n * @example\n * var el = Ink.s('#element');\n * if( InkElement.isDOMElement( el ) === true ){\n * // It is a DOM Element.\n * } else {\n * // It is NOT a DOM Element.\n * }\n */\n isDOMElement: function(o) {\n return o !== null && typeof o === 'object' && 'nodeType' in o && o.nodeType === 1;\n },\n\n /**\n * Shortcut for `document.getElementById`\n *\n * @method get\n * @param {String|DOMElement} elm Either an ID of an element, or an element.\n * @return {DOMElement|null} The DOM element with the given id or null when it was not found\n * @public\n * @sample Ink_Dom_Element_1_get.html\n */\n get: function(elm) {\n if(typeof elm !== 'undefined') {\n if(typeof elm === 'string') {\n return document.getElementById(elm);\n }\n return elm;\n }\n return null;\n },\n\n /**\n * Creates a DOM element.\n *\n * Just a shortcut for `document.createElement(tag)`, but with the second argument you can call additional functions present in Ink.Dom.Element.\n *\n * @method create\n * @param {String} tag Tag name\n * @param {Object} properties Object with properties to be set on the element. You can also call other functions in Ink.Dom.Element like this\n * @return {Element} The newly created element.\n * @public\n * @sample Ink_Dom_Element_1_create.html\n */\n create: function(tag, properties) {\n var el = document.createElement(tag);\n //Ink.extendObj(el, properties);\n if (properties) {\n for(var property in properties) {\n if(properties.hasOwnProperty(property)) {\n if (property in InkElement) {\n InkElement[property](el, properties[property]);\n } else {\n if(property === 'className' || property === 'class') {\n el.className = properties.className || properties['class'];\n } else {\n el.setAttribute(property, properties[property]);\n }\n }\n }\n }\n }\n return el;\n },\n\n /**\n * Removes a DOM Element\n *\n * @method remove\n * @param {Element} elm The element to remove\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_remove.html\n */\n remove: function(elm) {\n elm = Ink.i(elm);\n var parEl;\n if (elm && (parEl = elm.parentNode)) {\n parEl.removeChild(elm);\n }\n },\n\n /**\n * Scrolls the window to an element\n *\n * @method scrollTo\n * @param {DOMElement|String} elm Element where to scroll\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_scrollTo.html\n */\n scrollTo: function(elm) {\n elm = InkElement.get(elm);\n if(elm) {\n if (elm.scrollIntoView) {\n return elm.scrollIntoView();\n }\n\n var elmOffset = {},\n elmTop = 0, elmLeft = 0;\n\n do {\n elmTop += elm.offsetTop || 0;\n elmLeft += elm.offsetLeft || 0;\n\n elm = elm.offsetParent;\n } while(elm);\n\n elmOffset = {x: elmLeft, y: elmTop};\n\n window.scrollTo(elmOffset.x, elmOffset.y);\n }\n },\n\n /**\n * Gets the top offset of an element\n *\n * @method offsetTop\n * @uses Ink.Dom.Browser\n *\n * @param {DOMElement|String} elm Target element\n * @return {Number} Offset from the target element to the top of the document.\n * @public\n * @sample Ink_Dom_Element_1_offsetTop.html\n */\n offsetTop: function(elm) {\n return InkElement.offset(elm)[1];\n },\n\n /**\n * Gets the left offset of an element\n *\n * @method offsetLeft\n * @uses Ink.Dom.Browser\n *\n * @param {DOMElement|String} elm Target element\n * @return {Number} Offset from the target element to the left of the document\n * @public\n * @sample Ink_Dom_Element_1_offsetLeft.html\n */\n offsetLeft: function(elm) {\n return InkElement.offset(elm)[0];\n },\n\n /**\n * Gets the relative offset of an element\n *\n * @method positionedOffset\n * @param {Element|String} element Target element\n * @return {Array} Array with the element offsetleft and offsettop relative to the closest positioned ancestor\n * @public\n * @sample Ink_Dom_Element_1_positionedOffset.html\n */\n positionedOffset: function(element) {\n var valueTop = 0, valueLeft = 0;\n element = InkElement.get(element);\n do {\n valueTop += element.offsetTop || 0;\n valueLeft += element.offsetLeft || 0;\n element = element.offsetParent;\n if (element) {\n if (element.tagName.toLowerCase() === 'body') { break; }\n\n var value = element.style.position;\n if (!value && element.currentStyle) {\n value = element.currentStyle.position;\n }\n if ((!value || value === 'auto') && typeof getComputedStyle !== 'undefined') {\n var css = getComputedStyle(element, null);\n value = css ? css.position : null;\n }\n if (value === 'relative' || value === 'absolute') { break; }\n }\n } while (element);\n return [valueLeft, valueTop];\n },\n\n /**\n * Gets the cumulative offset for an element\n *\n * Returns the top left position of the element on the page\n *\n * @method offset\n * @uses Ink.Dom.Browser\n *\n * @method offset\n * @param {DOMElement|String} elm Target element\n * @return {[Number, Number]} Array with pixel distance from the target element to the top left corner of the document\n * @public\n * @sample Ink_Dom_Element_1_offset.html\n */\n offset: function(elm) {\n /*jshint boss:true */\n elm = Ink.i(elm);\n var res = [0, 0];\n var doc = elm.ownerDocument,\n docElem = doc.documentElement,\n box = rect(elm),\n body = doc.body,\n clientTop = docElem.clientTop || body.clientTop || 0,\n clientLeft = docElem.clientLeft || body.clientLeft || 0,\n scrollTop = doc.pageYOffset || docElem.scrollTop || body.scrollTop,\n scrollLeft = doc.pageXOffset || docElem.scrollLeft || body.scrollLeft,\n top = box.top + scrollTop - clientTop,\n left = box.left + scrollLeft - clientLeft;\n res = [left, top];\n return res;\n },\n\n /**\n * Gets the scroll of the element\n *\n * @method scroll\n * @param {DOMElement|String} [elm] Target element or document.body\n * @returns {Array} offset values for x and y scroll\n * @public\n * @sample Ink_Dom_Element_1_scroll.html\n */\n scroll: function(elm) {\n elm = elm ? Ink.i(elm) : document.body;\n return [\n ( ( !window.pageXOffset ) ? elm.scrollLeft : window.pageXOffset ),\n ( ( !window.pageYOffset ) ? elm.scrollTop : window.pageYOffset )\n ];\n },\n\n _getPropPx: function(cs, prop) {\n var n, c;\n var val = cs.getPropertyValue ? cs.getPropertyValue(prop) : cs[prop];\n if (!val) { n = 0; }\n else {\n c = val.indexOf('px');\n if (c === -1) { n = 0; }\n else {\n n = parseFloat(val, 10);\n }\n }\n\n //console.log([prop, ' \"', val, '\" ', n].join(''));\n\n return n;\n },\n\n /**\n * Alias for offset()\n *\n * @method offset2\n * @param {Element} el Element to be passed to `offset()`\n * @return {void}\n * @public\n * @deprecated Kept for historic reasons. Use offset() instead.\n */\n offset2: function(el) {\n return InkElement.offset(el);\n },\n\n /**\n * Checks if an element has an attribute\n *\n * @method hasAttribute\n * @param {Object} elm Target element\n * @param {String} attr Attribute name\n * @return {Boolean} Boolean based on existance of attribute\n * @sample Ink_Dom_Element_1_hasAttribute.html\n */\n hasAttribute: function(elm, attr){\n elm = Ink.i(elm);\n return elm.hasAttribute ? elm.hasAttribute(attr) : !!elm.getAttribute(attr);\n },\n /**\n * Inserts an element right after another\n *\n * @method insertAfter\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertAfter.html\n */\n insertAfter: function(newElm, targetElm) {\n /*jshint boss:true */\n if (targetElm = InkElement.get(targetElm)) {\n if (targetElm.nextSibling !== null) {\n targetElm.parentNode.insertBefore(newElm, targetElm.nextSibling);\n } else {\n targetElm.parentNode.appendChild(newElm);\n }\n }\n },\n\n /**\n * Inserts an element before another\n *\n * @method insertBefore\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertBefore.html\n */\n insertBefore: function (newElm, targetElm) {\n /*jshint boss:true */\n if ( (targetElm = InkElement.get(targetElm)) ) {\n targetElm.parentNode.insertBefore(newElm, targetElm);\n }\n },\n\n /**\n * Inserts an element as the first child of another\n *\n * @method insertTop\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertTop.html\n */\n insertTop: function(newElm,targetElm) {\n /*jshint boss:true */\n if (targetElm = InkElement.get(targetElm)) {\n if (targetElm.firstChild) {\n targetElm.insertBefore(newElm, targetElm.firstChild);\n } else {\n targetElm.appendChild(newElm);\n }\n }\n },\n\n /**\n * Inserts an element as the last child of another\n *\n * @method insertBottom\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertBottom.html\n */\n insertBottom: function(newElm, targetElm) {\n /*jshint boss:true */\n targetElm = Ink.i(targetElm);\n targetElm.appendChild(newElm);\n },\n\n /**\n * Retrieves textContent from node\n *\n * @method textContent\n * @param {DOMNode} node Where to retreive text from. Can be any node type.\n * @return {String} The text\n * @public\n * @sample Ink_Dom_Element_1_textContent.html\n */\n textContent: function(node){\n node = Ink.i(node);\n var text, k, cs, m;\n\n switch(node && node.nodeType) {\n case 9: /*DOCUMENT_NODE*/\n // IE quirks mode does not have documentElement\n return InkElement.textContent(node.documentElement || node.body && node.body.parentNode || node.body);\n\n case 1: /*ELEMENT_NODE*/\n text = ('textContent' in node) ? node.textContent : node.innerText;\n if (typeof text !== 'undefined') {\n return text;\n }\n /* falls through */\n case 11: /*DOCUMENT_FRAGMENT_NODE*/\n text = node.textContent;\n if (typeof text !== 'undefined') {\n return text;\n }\n\n if (node.firstChild === node.lastChild) {\n // Common case: 0 or 1 children\n return InkElement.textContent(node.firstChild);\n }\n\n text = [];\n cs = node.childNodes;\n for (k = 0, m = cs.length; k < m; ++k) {\n text.push( InkElement.textContent( cs[k] ) );\n }\n return text.join('');\n\n case 3: /*TEXT_NODE*/\n case 4: /*CDATA_SECTION_NODE*/\n return node.nodeValue;\n }\n return '';\n },\n\n /**\n * Replaces text content of a DOM Node\n * This method removes any child node previously present\n *\n * @method setTextContent\n * @param {Element} node Target node where the text will be added.\n * @param {String} text Text to be added on the node.\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_setTextContent.html\n */\n setTextContent: function(node, text){\n node = Ink.i(node);\n switch(node && node.nodeType)\n {\n case 1: /*ELEMENT_NODE*/\n if ('innerText' in node) {\n node.innerText = text;\n break;\n }\n /* falls through */\n case 11: /*DOCUMENT_FRAGMENT_NODE*/\n if ('textContent' in node) {\n node.textContent = text;\n break;\n }\n /* falls through */\n case 9: /*DOCUMENT_NODE*/\n while(node.firstChild) {\n node.removeChild(node.firstChild);\n }\n if (text !== '') {\n var doc = node.ownerDocument || node;\n node.appendChild(doc.createTextNode(text));\n }\n break;\n\n case 3: /*TEXT_NODE*/\n case 4: /*CDATA_SECTION_NODE*/\n node.nodeValue = text;\n break;\n }\n },\n\n /**\n * Checks if an element is a link\n *\n * @method isLink\n * @param {Element} element Element to check if it's a link.\n * @return {Boolean} Whether the element is a link.\n * @public\n * @sample Ink_Dom_Element_1_isLink.html\n */\n isLink: function(element){\n var b = element && element.nodeType === 1 && ((/^a|area$/i).test(element.tagName) ||\n element.hasAttributeNS && element.hasAttributeNS('http://www.w3.org/1999/xlink','href'));\n return !!b;\n },\n\n /**\n * Checks if a node is an ancestor of another\n *\n * @method isAncestorOf\n * @param {DOMNode} ancestor Ancestor node\n * @param {DOMNode} node Descendant node\n * @return {Boolean} Whether `ancestor` is an ancestor of `node`\n * @public\n * @sample Ink_Dom_Element_1_isAncestorOf.html\n */\n isAncestorOf: function(ancestor, node){\n /*jshint boss:true */\n if (!node || !ancestor) {\n return false;\n }\n if (node.compareDocumentPosition) {\n return (ancestor.compareDocumentPosition(node) & 0x10) !== 0;/*Node.DOCUMENT_POSITION_CONTAINED_BY*/\n }\n while (node = node.parentNode){\n if (node === ancestor){\n return true;\n }\n }\n return false;\n },\n\n /**\n * Checks if a node is descendant of another\n *\n * @method descendantOf\n * @param {DOMNode} node The ancestor\n * @param {DOMNode} descendant The descendant\n * @return {Boolean} `true` if 'descendant' is descendant of 'node'\n * @public\n * @sample Ink_Dom_Element_1_descendantOf.html\n */\n descendantOf: function(node, descendant){\n return node !== descendant && InkElement.isAncestorOf(node, descendant);\n },\n\n /**\n * Get first child element of another\n * @method firstElementChild\n * @param {DOMElement} elm Parent node\n * @return {DOMElement} the Element child\n * @public\n * @sample Ink_Dom_Element_1_firstElementChild.html\n */\n firstElementChild: function(elm){\n if(!elm) {\n return null;\n }\n if ('firstElementChild' in elm) {\n return elm.firstElementChild;\n }\n var child = elm.firstChild;\n while(child && child.nodeType !== 1) {\n child = child.nextSibling;\n }\n return child;\n },\n\n /**\n * Get the last child element of another\n * @method lastElementChild\n * @param {DOMElement} elm Parent node\n * @return {DOMElement} the Element child\n * @public\n * @sample Ink_Dom_Element_1_lastElementChild.html\n */\n lastElementChild: function(elm){\n if(!elm) {\n return null;\n }\n if ('lastElementChild' in elm) {\n return elm.lastElementChild;\n }\n var child = elm.lastChild;\n while(child && child.nodeType !== 1) {\n child = child.previousSibling;\n }\n return child;\n },\n\n /**\n * Get the first sibling element after the node\n *\n * @method nextElementSibling\n * @param {DOMNode} node The current node\n * @return {DOMElement|Null} The first sibling element after node or null if none is found\n * @public\n * @sample Ink_Dom_Element_1_nextElementSibling.html \n */\n nextElementSibling: function(node){\n var sibling = null;\n\n if(!node){ return sibling; }\n\n if(\"nextElementSibling\" in node){\n return node.nextElementSibling;\n } else {\n sibling = node.nextSibling;\n\n // 1 === Node.ELEMENT_NODE\n while(sibling && sibling.nodeType !== 1){\n sibling = sibling.nextSibling;\n }\n\n return sibling;\n }\n },\n\n /**\n * Get the first sibling element before the node\n *\n * @method previousElementSibling\n * @param {DOMNode} node The current node\n * @return {DOMElement|Null} The first element sibling before node or null if none is found\n * @public\n * @sample Ink_Dom_Element_1_previousElementSibling.html \n */\n previousElementSibling: function(node){\n var sibling = null;\n\n if(!node){ return sibling; }\n\n if(\"previousElementSibling\" in node){\n return node.previousElementSibling;\n } else {\n sibling = node.previousSibling;\n\n // 1 === Node.ELEMENT_NODE\n while(sibling && sibling.nodeType !== 1){\n sibling = sibling.previousSibling;\n }\n\n return sibling;\n }\n },\n\n /**\n * Get an element's width in pixels.\n *\n * @method elementWidth\n * @param {DOMElement|String} element Target DOM element or target ID\n * @return {Number} The element's width\n * @public\n * @sample Ink_Dom_Element_1_elementWidth.html \n */\n elementWidth: function(element) {\n if(typeof element === \"string\") {\n element = document.getElementById(element);\n }\n return element.offsetWidth;\n },\n\n /**\n * Get an element's height in pixels.\n *\n * @method elementHeight\n * @param {DOMElement|String} element DOM element or target ID\n * @return {Number} The element's height\n * @public\n * @sample Ink_Dom_Element_1_elementHeight.html \n */\n elementHeight: function(element) {\n if(typeof element === \"string\") {\n element = document.getElementById(element);\n }\n return element.offsetHeight;\n },\n\n /**\n * Deprecated. Alias for offsetLeft()\n *\n * @method elementLeft\n * @param {DOMElement|String} element DOM element or target ID\n * @return {Number} Element's left position\n */\n elementLeft: function(element) {\n return InkElement.offsetLeft(element);\n },\n\n /**\n * Deprecated. Alias for offsetTop()\n *\n * @method elementTop\n * @param {DOMElement|string} element Target DOM element or target ID\n * @return {Number} element's top position\n */\n elementTop: function(element) {\n return InkElement.offsetTop(element);\n },\n\n /**\n * Get an element's dimensions in pixels.\n *\n * @method elementDimensions\n * @param {DOMElement|string} element DOM element or target ID\n * @return {Array} Array with element's width and height\n * @sample Ink_Dom_Element_1_elementDimensions.html \n */\n elementDimensions: function(element) {\n element = Ink.i(element);\n return [element.offsetWidth, element.offsetHeight];\n },\n\n /**\n * Get the outer dimensions of an element in pixels.\n *\n * @method outerDimensions\n * @uses Ink.Dom.Css\n *\n * @param {DOMElement} element Target element\n * @return {Array} Array with element width and height.\n * @sample Ink_Dom_Element_1_outerDimensions.html \n */\n outerDimensions: function (element) {\n var bbox = rect(element);\n\n var Css = Ink.getModule('Ink.Dom.Css_1');\n var getStyle = Ink.bindMethod(Css, 'getStyle', element);\n\n return [\n bbox.right - bbox.left + parseFloat(getStyle('marginLeft') || 0) + parseFloat(getStyle('marginRight') || 0), // w\n bbox.bottom - bbox.top + parseFloat(getStyle('marginTop') || 0) + parseFloat(getStyle('marginBottom') || 0) // h\n ];\n },\n\n /**\n * Check if an element is inside the viewport\n *\n * @method inViewport\n * @param {DOMElement} element DOM Element\n * @param {Object} [options] Options object. If you pass a Boolean value here, it is interpreted as `options.partial`\n * @param {Boolean} [options.partial]=false Return `true` even if it is only partially visible.\n * @param {Number} [options.margin]=0 Consider a margin all around the viewport with `opts.margin` width a dead zone.\n * @return {Boolean} Whether the element is inside the viewport.\n * @public\n * @sample Ink_Dom_Element_1_inViewport.html \n */\n inViewport: function (element, options) {\n var dims = rect(Ink.i(element));\n if (typeof options === 'boolean') {\n options = {partial: options, margin: 0};\n }\n options = Ink.extendObj({ partial: false, margin: 0}, options || {});\n if (options.partial) {\n return dims.bottom + options.margin > 0 && // from the top\n dims.left - options.margin < InkElement.viewportWidth() && // from the right\n dims.top - options.margin < InkElement.viewportHeight() && // from the bottom\n dims.right + options.margin > 0; // from the left\n } else {\n return dims.top + options.margin > 0 && // from the top\n dims.right - options.margin < InkElement.viewportWidth() && // from the right\n dims.bottom - options.margin < InkElement.viewportHeight() && // from the bottom\n dims.left + options.margin > 0; // from the left\n }\n },\n\n /**\n * Check if an element is hidden.\n * Taken from Mootools Element extras ( https://gist.github.com/cheeaun/73342 )\n * Does not take into account visibility:hidden\n * @method isHidden\n * @param {DOMElement} element Element to check\n * @return {Boolean} Whether the element is hidden\n * @sample Ink_Dom_Element_1_isHidden.html \n */\n isHidden: function (element) {\n var w = element.offsetWidth, \n h = element.offsetHeight,\n force = (element.tagName.toLowerCase() === 'tr');\n\n var Css = Ink.getModule('Ink.Dom.Css_1');\n\n return (w===0 && h===0 && !force) ? true :\n (w!==0 && h!==0 && !force) ? false :\n Css.getStyle(element, 'display').toLowerCase() === 'none';\n },\n\n /**\n * Check if an element is visible \n *\n * @method isVisible\n * @uses isHidden\n * @param {DOMElement} element Element to check\n * @return {Boolean} Whether the element is visible\n * @sample Ink_Dom_Element_1_isVisible.html \n */\n isVisible: function (element) {\n return !this.isHidden(element);\n },\n\n /**\n * Clones an element's position to another\n *\n * @method clonePosition\n * @param {Element} cloneTo element to be position cloned\n * @param {Element} cloneFrom element to get the cloned position\n * @return {Element} The element with positionClone\n * @public\n * @sample Ink_Dom_Element_1_clonePosition.html \n */\n clonePosition: function(cloneTo, cloneFrom){\n var pos = InkElement.offset(cloneFrom);\n cloneTo.style.left = pos[0]+'px';\n cloneTo.style.top = pos[1]+'px';\n\n return cloneTo;\n },\n\n /**\n * Text-overflow: ellipsis emulation\n * Slices off a piece of text at the end of the element and adds the ellipsis so all text fits inside.\n *\n * @method ellipsizeText\n * @param {Element} element Element to modify text content\n * @param {String} [ellipsis='\\u2026'] String to append to the chopped text\n * @return {void}\n * @public\n */\n ellipsizeText: function(element/*, ellipsis*/){\n if ((element = Ink.i(element))) {\n element.style.overflow = 'hidden';\n element.style.whiteSpace = 'nowrap';\n element.style.textOverflow = 'ellipsis';\n }\n },\n\n /**\n * Finds the closest ancestor element matching your test function\n *\n * @method findUpwardsHaving\n * @param {Element} element Element to base the search from\n * @param {Function} boolTest Testing function\n * @return {Element|false} The matched element or false if did not match\n * @public\n * @sample Ink_Dom_Element_1_findUpwardsHaving.html \n */\n findUpwardsHaving: function(element, boolTest) {\n while (element && element.nodeType === 1) {\n if (boolTest(element)) {\n return element;\n }\n element = element.parentNode;\n }\n return false;\n },\n\n /**\n * Finds the closest ancestor by class name\n *\n * @method findUpwardsByClass\n * @uses findUpwardsHaving\n * @param {DOMElement} element Element to base the search from\n * @param {String} className Class name to search\n * @returns {DOMElement|false} The matched element or false if did not match\n * @public\n * @sample Ink_Dom_Element_1_findUpwardsByClass.html \n */\n findUpwardsByClass: function(element, className) {\n var re = new RegExp(\"(^|\\\\s)\" + className + \"(\\\\s|$)\");\n var tst = function(el) {\n var cls = el.className;\n return cls && re.test(cls);\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Finds the closest ancestor by tag name\n *\n * @method findUpwardsByTag\n * @param {DOMElement} element Element to base the search from\n * @param {String} tag Tag to search\n * @returns {DOMElement|false} the matched element or false if did not match\n * @sample Ink_Dom_Element_1_findUpwardsByTag.html \n */\n findUpwardsByTag: function(element, tag) {\n tag = tag.toUpperCase();\n var tst = function(el) {\n return el.nodeName && el.nodeName.toUpperCase() === tag;\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Finds the closest ancestor by id\n *\n * @method findUpwardsById\n * @param {HtmlElement} element Element to base the search from\n * @param {String} id ID to search\n * @returns {HtmlElement|false} The matched element or false if did not match\n * @sample Ink_Dom_Element_1_findUpwardsById.html \n */\n findUpwardsById: function(element, id) {\n var tst = function(el) {\n return el.id === id;\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Finds the closest ancestor by CSS selector\n *\n * @method findUpwardsBySelector\n * @param {HtmlElement} element Element to base the search from\n * @param {String} sel CSS selector\n * @returns {HtmlElement|false} The matched element or false if did not match\n * @sample Ink_Dom_Element_1_findUpwardsBySelector.html \n */\n findUpwardsBySelector: function(element, sel) {\n var Selector = Ink.getModule('Ink.Dom.Selector', '1');\n if (!Selector) {\n throw new Error('This method requires Ink.Dom.Selector');\n }\n var tst = function(el) {\n return Selector.matchesSelector(el, sel);\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Gets the trimmed text of an element\n *\n * @method getChildrenText\n * @param {DOMElement} el Element to base the search from\n * @param {Boolean} [removeIt] Flag to remove the text from the element\n * @return {String} Text found\n * @sample Ink_Dom_Element_1_getChildrenText.html \n */\n getChildrenText: function(el, removeIt) {\n var node,\n j,\n part,\n nodes = el.childNodes,\n jLen = nodes.length,\n text = '';\n\n if (!el) {\n return text;\n }\n\n for (j = 0; j < jLen; ++j) {\n node = nodes[j];\n if (!node) { continue; }\n if (node.nodeType === 3) { // TEXT NODE\n part = InkElement._trimString( String(node.data) );\n if (part.length > 0) {\n text += part;\n if (removeIt) { el.removeChild(node); }\n }\n else { el.removeChild(node); }\n }\n }\n\n return text;\n },\n\n /**\n * String trim implementation\n * Used by getChildrenText\n *\n * function _trimString\n * param {String} text\n * return {String} trimmed text\n */\n _trimString: function(text) {\n return (String.prototype.trim) ? text.trim() : text.replace(/^\\s*/, '').replace(/\\s*$/, '');\n },\n\n /**\n * Gets value of a select element\n *\n * @method getSelectValues\n * @param {DOMElement|String} select element\n * @return {Array} The selected values\n * @sample Ink_Dom_Element_1_getSelectValues.html \n */\n getSelectValues: function (select) {\n var selectEl = Ink.i(select);\n var values = [];\n for (var i = 0; i < selectEl.options.length; ++i) {\n values.push( selectEl.options[i].value );\n }\n return values;\n },\n\n\n /* used by fills */\n _normalizeData: function(data) {\n var d, data2 = [];\n for (var i = 0, f = data.length; i < f; ++i) {\n d = data[i];\n\n if (!(d instanceof Array)) { // if not array, wraps primitive twice: val -> [val, val]\n d = [d, d];\n }\n else if (d.length === 1) { // if 1 element array: [val] -> [val, val]\n d.push(d[0]);\n }\n data2.push(d);\n }\n return data2;\n },\n\n\n /**\n * Fills a select element with options\n *\n * @method fillSelect\n * @param {DOMElement|String} container Select element which will get filled\n * @param {Array} data Data to populate the component\n * @param {Boolean} [skipEmpty] Flag to skip empty option\n * @param {String|Number} [defaultValue] Initial selected value\n * @return {void}\n * @public\n *\n * @sample Ink_Dom_Element_1_fillSelect.html \n */\n fillSelect: function(container, data, skipEmpty, defaultValue) {\n var containerEl = Ink.i(container);\n if (!containerEl) { return; }\n\n containerEl.innerHTML = '';\n var d, optionEl;\n\n if (!skipEmpty) {\n // add initial empty option\n optionEl = document.createElement('option');\n optionEl.setAttribute('value', '');\n containerEl.appendChild(optionEl);\n }\n\n data = InkElement._normalizeData(data);\n\n for (var i = 0, f = data.length; i < f; ++i) {\n d = data[i];\n\n optionEl = document.createElement('option');\n optionEl.setAttribute('value', d[0]);\n if (d.length > 2) {\n optionEl.setAttribute('extra', d[2]);\n }\n optionEl.appendChild( document.createTextNode(d[1]) );\n\n if (d[0] === defaultValue) {\n optionEl.setAttribute('selected', 'selected');\n }\n\n containerEl.appendChild(optionEl);\n }\n },\n\n\n /**\n * Creates a set of radio buttons from an array of data\n *\n * @method fillRadios\n * @param {Element|String} insertAfterEl Element after which the input elements will be created\n * @param {String} name Name for the form field ([] is added if not present as a suffix)\n * @param {Array} data Data to populate the component\n * @param {Boolean} [skipEmpty] Flag to skip creation of empty options\n * @param {String|Number} [defaultValue] Initial selected value\n * @param {String} [splitEl] Name of element to add after each input element (example: 'br')\n * @return {DOMElement} Wrapper element around the radio buttons\n */\n fillRadios: function(insertAfterEl, name, data, skipEmpty, defaultValue, splitEl) {\n insertAfterEl = Ink.i(insertAfterEl);\n var containerEl = document.createElement('span');\n InkElement.insertAfter(containerEl, insertAfterEl);\n\n data = InkElement._normalizeData(data);\n\n /*\n if (name.substring(name.length - 1) !== ']') {\n name += '[]';\n }\n */\n\n var d, inputEl;\n\n if (!skipEmpty) {\n // add initial empty option\n inputEl = document.createElement('input');\n inputEl.setAttribute('type', 'radio');\n inputEl.setAttribute('name', name);\n inputEl.setAttribute('value', '');\n containerEl.appendChild(inputEl);\n if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); }\n }\n\n for (var i = 0; i < data.length; ++i) {\n d = data[i];\n\n inputEl = document.createElement('input');\n inputEl.setAttribute('type', 'radio');\n inputEl.setAttribute('name', name);\n inputEl.setAttribute('value', d[0]);\n containerEl.appendChild(inputEl);\n containerEl.appendChild( document.createTextNode(d[1]) );\n if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); }\n\n if (d[0] === defaultValue) {\n inputEl.checked = true;\n }\n }\n\n return containerEl;\n },\n\n\n /**\n * Creates set of checkbox buttons\n *\n * @method fillChecks\n * @param {Element|String} insertAfterEl Element after which the input elements will be created\n * @param {String} name Name for the form field ([] is added if not present as a suffix)\n * @param {Array} data Data to populate the component\n * @param {String|Number} [defaultValue] Initial selected value\n * @param {String} [splitEl] Name of element to add after each input element (example: 'br')\n * @return {Element} Wrapper element around the checkboxes\n * @public\n */\n fillChecks: function(insertAfterEl, name, data, defaultValue, splitEl) {\n insertAfterEl = Ink.i(insertAfterEl);\n var containerEl = document.createElement('span');\n InkElement.insertAfter(containerEl, insertAfterEl);\n\n data = InkElement._normalizeData(data);\n\n if (name.substring(name.length - 1) !== ']') {\n name += '[]';\n }\n\n var d, inputEl;\n\n for (var i = 0; i < data.length; ++i) {\n d = data[i];\n\n inputEl = document.createElement('input');\n inputEl.setAttribute('type', 'checkbox');\n inputEl.setAttribute('name', name);\n inputEl.setAttribute('value', d[0]);\n containerEl.appendChild(inputEl);\n containerEl.appendChild( document.createTextNode(d[1]) );\n if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); }\n\n if (d[0] === defaultValue) {\n inputEl.checked = true;\n }\n }\n\n return containerEl;\n },\n\n\n /**\n * Gets the index of an element relative to a parent\n *\n * @method parentIndexOf\n * @param {Element} [parentEl] childEl's parent. Deprecated.\n * @param {Element} childEl Child Element to look for\n * @return {Number} The index of the childEl inside parentEl. Returns -1 if it's not a direct child\n * @public\n * @sample Ink_Dom_Element_1_parentIndexOf.html \n */\n parentIndexOf: function(parentEl, childEl) {\n if (!childEl) {\n // one argument form\n childEl = parentEl;\n parentEl = parentEl.parentNode;\n }\n if (!parentEl) { return false; }\n for (var i = 0, f = parentEl.children.length; i < f; ++i) {\n if (parentEl.children[i] === childEl) {\n return i;\n }\n }\n return false;\n },\n\n\n /**\n * Gets the next siblings of an element\n *\n * @method nextSiblings\n * @param {String|DOMElement} elm Element\n * @return {Array} Array of next sibling elements\n * @sample Ink_Dom_Element_1_nextSiblings.html \n */\n nextSiblings: function(elm) {\n elm = Ink.i(elm);\n if(typeof(elm) === 'object' && elm !== null && elm.nodeType && elm.nodeType === 1) {\n var elements = [],\n siblings = elm.parentNode.children,\n index = InkElement.parentIndexOf(elm.parentNode, elm);\n\n for(var i = ++index, len = siblings.length; i\" + html + \"
\" + deleteThisTbodyToken + \"
\";\n } else {\n div.innerHTML = \"\" + html + \"
\";\n }\n return div.firstChild;\n },\n TBODY: function (div, html) {\n div.innerHTML = '' + html + '
';\n return div.firstChild.getElementsByTagName('tbody')[0];\n },\n THEAD: function (div, html) {\n div.innerHTML = '' + html + '
';\n return div.firstChild.getElementsByTagName('thead')[0];\n },\n TFOOT: function (div, html) {\n div.innerHTML = '' + html + '
';\n return div.firstChild.getElementsByTagName('tfoot')[0];\n },\n TR: function (div, html) {\n div.innerHTML = '' + html + '
';\n return div.firstChild.firstChild.firstChild;\n }\n },\n\n /**\n * Gets a wrapper DIV with a certain HTML content to be inserted inside another element.\n * This is necessary for appendHTML,prependHTML functions, because they need a container element to copy the children from.\n *\n * Works around IE table quirks\n * @method _getWrapper\n * @private\n * @param elm\n * @param html\n */\n _getWrapper: function (elm, html) {\n var nodeName = elm.nodeName && elm.nodeName.toUpperCase();\n var wrapper = document.createElement('div');\n var wrapFunc = InkElement._wrapElements[nodeName];\n\n if ( !wrapFunc ) {\n wrapper.innerHTML = html;\n return wrapper;\n }\n // special cases\n wrapper = wrapFunc(wrapper, html);\n // worst case: tbody auto-creation even when our HTML has a tbody.\n if (browserCreatesTbodies && nodeName === 'TABLE') {\n // terrible case. Deal with tbody creation too.\n var tds = wrapper.getElementsByTagName('td');\n for (var i = 0, len = tds.length; i < len; i++) {\n if (tds[i].innerHTML === deleteThisTbodyToken) {\n var tbody = tds[i].parentNode.parentNode;\n tbody.parentNode.removeChild(tbody);\n }\n }\n }\n return wrapper;\n },\n\n /**\n * Appends HTML to an element.\n * This method parses the html string and doesn't modify its contents\n *\n * @method appendHTML\n * @param {String|DOMElement} elm Element\n * @param {String} html Markup string\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_appendHTML.html \n */\n appendHTML: function(elm, html){\n elm = Ink.i(elm);\n if(elm !== null) {\n var wrapper = InkElement._getWrapper(elm, html);\n while (wrapper.firstChild) {\n elm.appendChild(wrapper.firstChild);\n }\n }\n },\n\n /**\n * Prepends HTML to an element.\n * This method parses the html string and doesn't modify its contents\n *\n * @method prependHTML\n * @param {String|Element} elm Element\n * @param {String} html Markup string to prepend\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_prependHTML.html \n */\n prependHTML: function(elm, html){\n elm = Ink.i(elm);\n if(elm !== null) {\n var wrapper = InkElement._getWrapper(elm, html);\n while (wrapper.lastChild) {\n elm.insertBefore(wrapper.lastChild, elm.firstChild);\n }\n }\n },\n\n /**\n * Sets the inner HTML of an element.\n *\n * @method setHTML\n * @param {String|DOMElement} elm Element\n * @param {String} html Markup string\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_setHTML.html \n */\n setHTML: function (elm, html) {\n elm = Ink.i(elm);\n if(elm !== null) {\n try {\n elm.innerHTML = html;\n } catch (e) {\n // Tables in IE7\n while (elm.firstChild) {\n elm.removeChild(elm.firstChild);\n }\n InkElement.appendHTML(elm, html);\n }\n }\n },\n\n /**\n * Wraps an element inside a container.\n *\n * The container may or may not be in the document yet.\n *\n * @method wrap\n * @param {String|Element} target Element to be wrapped\n * @param {String|Element} container Element to wrap the target\n * @return {Element} Container element\n * @public\n * @sample Ink_Dom_Element_1_wrap.html \n *\n * @example\n * before:\n *\n *
\n *\n * call this function to wrap #target with a wrapper div.\n *\n * InkElement.wrap('target', InkElement.create('div', {id: 'container'});\n * \n * after: \n *\n *
\n */\n wrap: function (target, container) {\n target = Ink.i(target);\n container = Ink.i(container);\n \n var nextNode = target.nextSibling;\n var parent = target.parentNode;\n\n container.appendChild(target);\n\n if (nextNode !== null) {\n parent.insertBefore(container, nextNode);\n } else {\n parent.appendChild(container);\n }\n\n return container;\n },\n\n /**\n * Places an element outside a wrapper.\n *\n * @method unwrap\n * @param {DOMElement} elem The element you're trying to unwrap. This should be an ancestor of the wrapper.\n * @param {String} [wrapperSelector] CSS Selector for the ancestor. Use this if your wrapper is not the direct parent of elem.\n * @return {void}\n * @sample Ink_Dom_Element_1_unwrap.html \n *\n * @example\n *\n * When you have this:\n *\n *
\n *
\n *
\n *\n * If you do this:\n *\n * InkElement.unwrap('unwrapMe');\n *\n * You get this:\n *\n *
\n *
\n * \n **/\n unwrap: function (elem, wrapperSelector) {\n elem = Ink.i(elem);\n var wrapper;\n if (typeof wrapperSelector === 'string') {\n wrapper = InkElement.findUpwardsBySelector(elem, wrapperSelector);\n } else if (typeof wrapperSelector === 'object' && wrapperSelector.tagName) {\n wrapper = InkElement.findUpwardsHaving(elem, function (ancestor) {\n return ancestor === wrapperSelector;\n });\n } else {\n wrapper = elem.parentNode;\n }\n if (!wrapper || !wrapper.parentNode) { return; }\n\n InkElement.insertBefore(elem, wrapper);\n },\n\n /**\n * Replaces an element with another.\n *\n * @method replace\n * @param {Element} element The element to be replaced.\n * @param {Element} replacement The new element.\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_replace.html \n *\n * @example\n * var newelement1 = InkElement.create('div');\n * // ...\n * replace(Ink.i('element1'), newelement1);\n */\n replace: function (element, replacement) {\n element = Ink.i(element);\n if(element !== null) {\n element.parentNode.replaceChild(replacement, element);\n }\n },\n\n /**\n * Removes direct text children.\n * Useful to remove nasty layout gaps generated by whitespace on the markup.\n *\n * @method removeTextNodeChildren\n * @param {Element} el Element to remove text from\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_removeTextNodeChildren.html \n */\n removeTextNodeChildren: function(el) {\n el = Ink.i(el);\n if(el !== null) {\n var prevEl, toRemove, parent = el;\n el = el.firstChild;\n while (el) {\n toRemove = (el.nodeType === 3);\n prevEl = el;\n el = el.nextSibling;\n if (toRemove) {\n parent.removeChild(prevEl);\n }\n }\n }\n },\n\n /**\n * Creates a documentFragment from an HTML string.\n *\n * @method htmlToFragment\n * @param {String} html HTML string\n * @return {DocumentFragment} DocumentFragment containing all of the elements from the html string\n * @sample Ink_Dom_Element_1_htmlToFragment.html \n */\n htmlToFragment: (createContextualFragmentSupport ?\n function(html){\n var range;\n\n if(typeof html !== 'string'){ return document.createDocumentFragment(); }\n\n range = document.createRange();\n\n // set the context to document.body (firefox does this already, webkit doesn't)\n range.selectNode(document.body);\n\n return range.createContextualFragment(html);\n } : function (html) {\n var fragment = document.createDocumentFragment(),\n tempElement,\n current;\n\n if(typeof html !== 'string'){ return fragment; }\n\n tempElement = document.createElement('div');\n tempElement.innerHTML = html;\n\n // append child removes elements from the original parent\n while( (current = tempElement.firstChild) ){ // intentional assignment\n fragment.appendChild(current);\n }\n\n return fragment;\n }),\n\n _camelCase: function(str)\n {\n return str ? str.replace(/-(\\w)/g, function (_, $1){\n return $1.toUpperCase();\n }) : str;\n },\n\n /**\n * Gets data attributes from an element\n *\n * @method data\n * @param {String|DOMElement} selector Element or CSS selector\n * @return {Object} Object with the data-* properties. If no data-attributes are present, an empty object is returned.\n * @sample Ink_Dom_Element_1_data.html \n */\n data: function(selector) {\n var el;\n if (typeof selector !== 'object' && typeof selector !== 'string') {\n throw '[Ink.Dom.Element.data] :: Invalid selector defined';\n }\n\n if (typeof selector === 'object') {\n el = selector;\n }\n else {\n var InkDomSelector = Ink.getModule('Ink.Dom.Selector', 1);\n if (!InkDomSelector) {\n throw \"[Ink.Dom.Element.data] :: this method requires Ink.Dom.Selector - v1\";\n }\n el = InkDomSelector.select(selector);\n if (el.length <= 0) {\n throw \"[Ink.Dom.Element.data] :: Can't find any element with the specified selector\";\n }\n el = el[0];\n }\n\n var dataset = {};\n var attrs = el.attributes || [];\n\n var curAttr, curAttrName, curAttrValue;\n if (attrs) {\n for (var i = 0, total = attrs.length; i < total; ++i) {\n curAttr = attrs[i];\n curAttrName = curAttr.name;\n curAttrValue = curAttr.value;\n if (curAttrName && curAttrName.indexOf('data-') === 0) {\n dataset[InkElement._camelCase(curAttrName.replace('data-', ''))] = curAttrValue;\n }\n }\n }\n\n return dataset;\n },\n\n /**\n * Move the cursor on an input or textarea element.\n * @method moveCursorTo\n * @param {Element} el Input or Textarea element\n * @param {Number} t Index of the character to move the cursor to\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_moveCursorTo.html \n */\n moveCursorTo: function(el, t) {\n el = Ink.i(el);\n if(el !== null) {\n if (el.setSelectionRange) {\n el.setSelectionRange(t, t);\n //el.focus();\n }\n else {\n var range = el.createTextRange();\n range.collapse(true);\n range.moveEnd( 'character', t);\n range.moveStart('character', t);\n range.select();\n }\n }\n },\n\n /**\n * Get the page's width.\n * @method pageWidth\n * @return {Number} Page width in pixels\n * @sample Ink_Dom_Element_1_pageWidth.html \n */\n pageWidth: function() {\n var xScroll;\n\n if (window.innerWidth && window.scrollMaxX) {\n xScroll = window.innerWidth + window.scrollMaxX;\n } else if (document.body.scrollWidth > document.body.offsetWidth){\n xScroll = document.body.scrollWidth;\n } else {\n xScroll = document.body.offsetWidth;\n }\n\n var windowWidth;\n\n if (window.self.innerWidth) {\n if(document.documentElement.clientWidth){\n windowWidth = document.documentElement.clientWidth;\n } else {\n windowWidth = window.self.innerWidth;\n }\n } else if (document.documentElement && document.documentElement.clientWidth) {\n windowWidth = document.documentElement.clientWidth;\n } else if (document.body) {\n windowWidth = document.body.clientWidth;\n }\n\n if(xScroll < windowWidth){\n return xScroll;\n } else {\n return windowWidth;\n }\n },\n\n /**\n * Get the page's height.\n * @method pageHeight\n * @return {Number} Page height in pixels\n * @sample Ink_Dom_Element_1_pageHeight.html \n */\n pageHeight: function() {\n var yScroll;\n\n if (window.innerHeight && window.scrollMaxY) {\n yScroll = window.innerHeight + window.scrollMaxY;\n } else if (document.body.scrollHeight > document.body.offsetHeight){\n yScroll = document.body.scrollHeight;\n } else {\n yScroll = document.body.offsetHeight;\n }\n\n var windowHeight;\n\n if (window.self.innerHeight) {\n windowHeight = window.self.innerHeight;\n } else if (document.documentElement && document.documentElement.clientHeight) {\n windowHeight = document.documentElement.clientHeight;\n } else if (document.body) {\n windowHeight = document.body.clientHeight;\n }\n\n if(yScroll < windowHeight){\n return windowHeight;\n } else {\n return yScroll;\n }\n },\n\n /**\n * Get the viewport's width.\n * @method viewportWidth\n * @return {Number} Viewport width in pixels\n * @sample Ink_Dom_Element_1_viewportWidth.html \n */\n viewportWidth: function() {\n if(typeof window.innerWidth !== \"undefined\") {\n return window.innerWidth;\n }\n if (document.documentElement && typeof document.documentElement.offsetWidth !== \"undefined\") {\n return document.documentElement.offsetWidth;\n }\n },\n\n /**\n * Get the viewport's height.\n * @method viewportHeight\n * @return {Number} Viewport height in pixels\n * @sample Ink_Dom_Element_1_viewportHeight.html \n */\n viewportHeight: function() {\n if (typeof window.innerHeight !== \"undefined\") {\n return window.innerHeight;\n }\n if (document.documentElement && typeof document.documentElement.offsetHeight !== \"undefined\") {\n return document.documentElement.offsetHeight;\n }\n },\n\n /**\n * Get the scroll's width.\n * @method scrollWidth\n * @return {Number} Scroll width\n */\n scrollWidth: function() {\n if (typeof window.self.pageXOffset !== 'undefined') {\n return window.self.pageXOffset;\n }\n if (typeof document.documentElement !== 'undefined' && typeof document.documentElement.scrollLeft !== 'undefined') {\n return document.documentElement.scrollLeft;\n }\n return document.body.scrollLeft;\n },\n\n /**\n * Get the scroll's height.\n * @method scrollHeight\n * @return {Number} Scroll height\n */\n scrollHeight: function() {\n if (typeof window.self.pageYOffset !== 'undefined') {\n return window.self.pageYOffset;\n }\n if (typeof document.documentElement !== 'undefined' && typeof document.documentElement.scrollTop !== 'undefined') {\n return document.documentElement.scrollTop;\n }\n return document.body.scrollTop;\n }\n };\n\n return InkElement;\n\n});\n","/**\n * Event management\n * @module Ink.Dom.Event_1\n * @version 1\n */\n\nInk.createModule('Ink.Dom.Event', 1, [], function() {\n /* jshint\n asi:true,\n strict:false,\n laxcomma:true,\n eqeqeq:false,\n laxbreak:true,\n boss:true,\n curly:false,\n expr:true\n */\n\n /**\n * @namespace Ink.Dom.Event_1\n * @static\n */\n\n /*!\n * Bean - copyright (c) Jacob Thornton 2011-2012\n * https://github.com/fat/bean\n * MIT license\n */\n var bean = (function (name, context, definition) {\n return definition()\n })('bean', this, function (name, context) {\n name = name || 'bean'\n context = context || this\n\n var win = window\n , old = context[name]\n , namespaceRegex = /[^\\.]*(?=\\..*)\\.|.*/\n , nameRegex = /\\..*/\n , addEvent = 'addEventListener'\n , removeEvent = 'removeEventListener'\n , doc = document || {}\n , root = doc.documentElement || {}\n , W3C_MODEL = root[addEvent]\n , eventSupport = W3C_MODEL ? addEvent : 'attachEvent'\n , ONE = {} // singleton for quick matching making add() do one()\n\n , slice = Array.prototype.slice\n , str2arr = function (s, d) { return s.split(d || ' ') }\n , isString = function (o) { return typeof o == 'string' }\n , isFunction = function (o) { return typeof o == 'function' }\n\n // events that we consider to be 'native', anything not in this list will\n // be treated as a custom event\n , standardNativeEvents =\n 'click dblclick mouseup mousedown contextmenu ' + // mouse buttons\n 'mousewheel mousemultiwheel DOMMouseScroll ' + // mouse wheel\n 'mouseover mouseout mousemove selectstart selectend ' + // mouse movement\n 'keydown keypress keyup ' + // keyboard\n 'orientationchange ' + // mobile\n 'focus blur change reset select submit ' + // form elements\n 'load unload beforeunload resize move DOMContentLoaded ' + // window\n 'readystatechange message ' + // window\n 'error abort scroll ' // misc\n // element.fireEvent('onXYZ'... is not forgiving if we try to fire an event\n // that doesn't actually exist, so make sure we only do these on newer browsers\n , w3cNativeEvents =\n 'show ' + // mouse buttons\n 'input invalid ' + // form elements\n 'touchstart touchmove touchend touchcancel ' + // touch\n 'gesturestart gesturechange gestureend ' + // gesture\n 'textinput' + // TextEvent\n 'readystatechange pageshow pagehide popstate ' + // window\n 'hashchange offline online ' + // window\n 'afterprint beforeprint ' + // printing\n 'dragstart dragenter dragover dragleave drag drop dragend ' + // dnd\n 'loadstart progress suspend emptied stalled loadmetadata ' + // media\n 'loadeddata canplay canplaythrough playing waiting seeking ' + // media\n 'seeked ended durationchange timeupdate play pause ratechange ' + // media\n 'volumechange cuechange ' + // media\n 'checking noupdate downloading cached updateready obsolete ' // appcache\n\n // convert to a hash for quick lookups\n , nativeEvents = (function (hash, events, i) {\n for (i = 0; i < events.length; i++) events[i] && (hash[events[i]] = 1)\n return hash\n }({}, str2arr(standardNativeEvents + (W3C_MODEL ? w3cNativeEvents : ''))))\n\n // custom events are events that we *fake*, they are not provided natively but\n // we can use native events to generate them\n , customEvents = (function () {\n var isAncestor = 'compareDocumentPosition' in root\n ? function (element, container) {\n return container.compareDocumentPosition && (container.compareDocumentPosition(element) & 16) === 16\n }\n : 'contains' in root\n ? function (element, container) {\n container = container.nodeType === 9 || container === window ? root : container\n return container !== element && container.contains(element)\n }\n : function (element, container) {\n while (element = element.parentNode) if (element === container) return 1\n return 0\n }\n , check = function (event) {\n var related = event.relatedTarget\n return !related\n ? related == null\n : (related !== this && related.prefix !== 'xul' && !/document/.test(this.toString())\n && !isAncestor(related, this))\n }\n\n return {\n mouseenter: { base: 'mouseover', condition: check }\n , mouseleave: { base: 'mouseout', condition: check }\n , mousewheel: { base: /Firefox/.test(navigator.userAgent) ? 'DOMMouseScroll' : 'mousewheel' }\n }\n }())\n\n // we provide a consistent Event object across browsers by taking the actual DOM\n // event object and generating a new one from its properties.\n , Event = (function () {\n // a whitelist of properties (for different event types) tells us what to check for and copy\n var commonProps = str2arr('altKey attrChange attrName bubbles cancelable ctrlKey currentTarget ' +\n 'detail eventPhase getModifierState isTrusted metaKey relatedNode relatedTarget shiftKey ' +\n 'srcElement target timeStamp type view which propertyName path')\n , mouseProps = commonProps.concat(str2arr('button buttons clientX clientY dataTransfer ' +\n 'fromElement offsetX offsetY pageX pageY screenX screenY toElement movementX movementY region'))\n , mouseWheelProps = mouseProps.concat(str2arr('wheelDelta wheelDeltaX wheelDeltaY wheelDeltaZ ' +\n 'axis')) // 'axis' is FF specific\n , keyProps = commonProps.concat(str2arr('char charCode key keyCode keyIdentifier ' +\n 'keyLocation location isComposing code'))\n , textProps = commonProps.concat(str2arr('data'))\n , touchProps = commonProps.concat(str2arr('touches targetTouches changedTouches scale rotation'))\n , messageProps = commonProps.concat(str2arr('data origin source'))\n , stateProps = commonProps.concat(str2arr('state'))\n , overOutRegex = /over|out/\n // some event types need special handling and some need special properties, do that all here\n , typeFixers = [\n { // key events\n reg: /key/i\n , fix: function (event, newEvent) {\n newEvent.keyCode = event.keyCode || event.which\n return keyProps\n }\n }\n , { // mouse events\n reg: /click|mouse(?!(.*wheel|scroll))|menu|drag|drop/i\n , fix: function (event, newEvent, type) {\n newEvent.rightClick = event.which === 3 || event.button === 2\n newEvent.pos = { x: 0, y: 0 }\n if (event.pageX || event.pageY) {\n newEvent.clientX = event.pageX\n newEvent.clientY = event.pageY\n } else if (event.clientX || event.clientY) {\n newEvent.clientX = event.clientX + doc.body.scrollLeft + root.scrollLeft\n newEvent.clientY = event.clientY + doc.body.scrollTop + root.scrollTop\n }\n if (overOutRegex.test(type)) {\n newEvent.relatedTarget = event.relatedTarget\n || event[(type == 'mouseover' ? 'from' : 'to') + 'Element']\n }\n return mouseProps\n }\n }\n , { // mouse wheel events\n reg: /mouse.*(wheel|scroll)/i\n , fix: function () { return mouseWheelProps }\n }\n , { // TextEvent\n reg: /^text/i\n , fix: function () { return textProps }\n }\n , { // touch and gesture events\n reg: /^touch|^gesture/i\n , fix: function () { return touchProps }\n }\n , { // message events\n reg: /^message$/i\n , fix: function () { return messageProps }\n }\n , { // popstate events\n reg: /^popstate$/i\n , fix: function () { return stateProps }\n }\n , { // everything else\n reg: /.*/\n , fix: function () { return commonProps }\n }\n ]\n , typeFixerMap = {} // used to map event types to fixer functions (above), a basic cache mechanism\n\n , Event = function (event, element, isNative) {\n if (!arguments.length) return\n event = event || ((element.ownerDocument || element.document || element).parentWindow || win).event\n this.originalEvent = event\n this.isNative = isNative\n this.isBean = true\n\n if (!event) return\n\n var type = event.type\n , target = event.target || event.srcElement\n , i, l, p, props, fixer\n\n this.target = target && target.nodeType === 3 ? target.parentNode : target\n\n if (isNative) { // we only need basic augmentation on custom events, the rest expensive & pointless\n fixer = typeFixerMap[type]\n if (!fixer) { // haven't encountered this event type before, map a fixer function for it\n for (i = 0, l = typeFixers.length; i < l; i++) {\n if (typeFixers[i].reg.test(type)) { // guaranteed to match at least one, last is .*\n typeFixerMap[type] = fixer = typeFixers[i].fix\n break\n }\n }\n }\n\n props = fixer(event, this, type)\n for (i = props.length; i--;) {\n if (!((p = props[i]) in this) && p in event) this[p] = event[p]\n }\n }\n }\n\n // preventDefault() and stopPropagation() are a consistent interface to those functions\n // on the DOM, stop() is an alias for both of them together\n Event.prototype.preventDefault = function () {\n if (this.originalEvent.preventDefault) this.originalEvent.preventDefault()\n else this.originalEvent.returnValue = false\n }\n Event.prototype.stopPropagation = function () {\n if (this.originalEvent.stopPropagation) this.originalEvent.stopPropagation()\n else this.originalEvent.cancelBubble = true\n }\n Event.prototype.stop = function () {\n this.preventDefault()\n this.stopPropagation()\n this.stopped = true\n }\n // stopImmediatePropagation() has to be handled internally because we manage the event list for\n // each element\n // note that originalElement may be a Bean#Event object in some situations\n Event.prototype.stopImmediatePropagation = function () {\n if (this.originalEvent.stopImmediatePropagation) this.originalEvent.stopImmediatePropagation()\n this.isImmediatePropagationStopped = function () { return true }\n }\n Event.prototype.isImmediatePropagationStopped = function () {\n return this.originalEvent.isImmediatePropagationStopped && this.originalEvent.isImmediatePropagationStopped()\n }\n Event.prototype.clone = function (currentTarget) {\n //TODO: this is ripe for optimisation, new events are *expensive*\n // improving this will speed up delegated events\n var ne = new Event(this, this.element, this.isNative)\n ne.currentTarget = currentTarget\n return ne\n }\n\n return Event\n }())\n\n // if we're in old IE we can't do onpropertychange on doc or win so we use doc.documentElement for both\n , targetElement = function (element, isNative) {\n return !W3C_MODEL && !isNative && (element === doc || element === win) ? root : element\n }\n\n /**\n * Bean maintains an internal registry for event listeners. We don't touch elements, objects\n * or functions to identify them, instead we store everything in the registry.\n * Each event listener has a RegEntry object, we have one 'registry' for the whole instance.\n */\n , RegEntry = (function () {\n // each handler is wrapped so we can handle delegation and custom events\n var wrappedHandler = function (element, fn, condition, args) {\n var call = function (event, eargs) {\n return fn.apply(element, args ? slice.call(eargs, event ? 0 : 1).concat(args) : eargs)\n }\n , findTarget = function (event, eventElement) {\n return fn.__beanDel ? fn.__beanDel.ft(event.target, element) : eventElement\n }\n , handler = condition\n ? function (event) {\n var target = findTarget(event, this) // deleated event\n if (condition.apply(target, arguments)) {\n if (event) event.currentTarget = target\n return call(event, arguments)\n }\n }\n : function (event) {\n if (fn.__beanDel) event = event.clone(findTarget(event)) // delegated event, fix the fix\n return call(event, arguments)\n }\n handler.__beanDel = fn.__beanDel\n return handler\n }\n\n , RegEntry = function (element, type, handler, original, namespaces, args, root) {\n var customType = customEvents[type]\n , isNative\n\n if (type == 'unload') {\n // self clean-up\n handler = once(removeListener, element, type, handler, original)\n }\n\n if (customType) {\n if (customType.condition) {\n handler = wrappedHandler(element, handler, customType.condition, args)\n }\n type = customType.base || type\n }\n\n this.isNative = isNative = nativeEvents[type] && !!element[eventSupport]\n this.customType = !W3C_MODEL && !isNative && type\n this.element = element\n this.type = type\n this.original = original\n this.namespaces = namespaces\n this.eventType = W3C_MODEL || isNative ? type : 'propertychange'\n this.target = targetElement(element, isNative)\n this[eventSupport] = !!this.target[eventSupport]\n this.root = root\n this.handler = wrappedHandler(element, handler, null, args)\n }\n\n // given a list of namespaces, is our entry in any of them?\n RegEntry.prototype.inNamespaces = function (checkNamespaces) {\n var i, j, c = 0\n if (!checkNamespaces) return true\n if (!this.namespaces) return false\n for (i = checkNamespaces.length; i--;) {\n for (j = this.namespaces.length; j--;) {\n if (checkNamespaces[i] == this.namespaces[j]) c++\n }\n }\n return checkNamespaces.length === c\n }\n\n // match by element, original fn (opt), handler fn (opt)\n RegEntry.prototype.matches = function (checkElement, checkOriginal, checkHandler) {\n return this.element === checkElement &&\n (!checkOriginal || this.original === checkOriginal) &&\n (!checkHandler || this.handler === checkHandler)\n }\n\n return RegEntry\n }())\n\n , registry = (function () {\n // our map stores arrays by event type, just because it's better than storing\n // everything in a single array.\n // uses '$' as a prefix for the keys for safety and 'r' as a special prefix for\n // rootListeners so we can look them up fast\n var map = {}\n\n // generic functional search of our registry for matching listeners,\n // `fn` returns false to break out of the loop\n , forAll = function (element, type, original, handler, root, fn) {\n var pfx = root ? 'r' : '$'\n if (!type || type == '*') {\n // search the whole registry\n for (var t in map) {\n if (t.charAt(0) == pfx) {\n forAll(element, t.substr(1), original, handler, root, fn)\n }\n }\n } else {\n var i = 0, l, list = map[pfx + type], all = element == '*'\n if (!list) return\n for (l = list.length; i < l; i++) {\n if ((all || list[i].matches(element, original, handler)) && !fn(list[i], list, i, type)) return\n }\n }\n }\n\n , has = function (element, type, original, root) {\n // we're not using forAll here simply because it's a bit slower and this\n // needs to be fast\n var i, list = map[(root ? 'r' : '$') + type]\n if (list) {\n for (i = list.length; i--;) {\n if (!list[i].root && list[i].matches(element, original, null)) return true\n }\n }\n return false\n }\n\n , get = function (element, type, original, root) {\n var entries = []\n forAll(element, type, original, null, root, function (entry) {\n return entries.push(entry)\n })\n return entries\n }\n\n , put = function (entry) {\n var has = !entry.root && !this.has(entry.element, entry.type, null, false)\n , key = (entry.root ? 'r' : '$') + entry.type\n ;(map[key] || (map[key] = [])).push(entry)\n return has\n }\n\n , del = function (entry) {\n forAll(entry.element, entry.type, null, entry.handler, entry.root, function (entry, list, i) {\n list.splice(i, 1)\n entry.removed = true\n if (list.length === 0) delete map[(entry.root ? 'r' : '$') + entry.type]\n return false\n })\n }\n\n // dump all entries, used for onunload\n , entries = function () {\n var t, entries = []\n for (t in map) {\n if (t.charAt(0) == '$') entries = entries.concat(map[t])\n }\n return entries\n }\n\n return { has: has, get: get, put: put, del: del, entries: entries }\n }())\n\n // we need a selector engine for delegated events, use querySelectorAll if it exists\n // but for older browsers we need Qwery, Sizzle or similar\n , selectorEngine\n , setSelectorEngine = function (e) {\n if (!arguments.length) {\n selectorEngine = doc.querySelectorAll\n ? function (s, r) {\n return r.querySelectorAll(s)\n }\n : function () {\n throw new Error('Bean: No selector engine installed') // eeek\n }\n } else {\n selectorEngine = e\n }\n }\n\n // we attach this listener to each DOM event that we need to listen to, only once\n // per event type per DOM element\n , rootListener = function (event, type) {\n if (!W3C_MODEL && type && event && event.propertyName != '_on' + type) return\n\n var listeners = registry.get(this, type || event.type, null, false)\n , l = listeners.length\n , i = 0\n\n event = new Event(event, this, true)\n if (type) event.type = type\n\n // iterate through all handlers registered for this type, calling them unless they have\n // been removed by a previous handler or stopImmediatePropagation() has been called\n for (; i < l && !event.isImmediatePropagationStopped(); i++) {\n if (!listeners[i].removed) listeners[i].handler.call(this, event)\n }\n }\n\n // add and remove listeners to DOM elements\n , listener = W3C_MODEL\n ? function (element, type, add) {\n // new browsers\n element[add ? addEvent : removeEvent](type, rootListener, false)\n }\n : function (element, type, add, custom) {\n // IE8 and below, use attachEvent/detachEvent and we have to piggy-back propertychange events\n // to simulate event bubbling etc.\n var entry\n if (add) {\n registry.put(entry = new RegEntry(\n element\n , custom || type\n , function (event) { // handler\n rootListener.call(element, event, custom)\n }\n , rootListener\n , null\n , null\n , true // is root\n ))\n if (custom && element['_on' + custom] == null) element['_on' + custom] = 0\n entry.target.attachEvent('on' + entry.eventType, entry.handler)\n } else {\n entry = registry.get(element, custom || type, rootListener, true)[0]\n if (entry) {\n entry.target.detachEvent('on' + entry.eventType, entry.handler)\n registry.del(entry)\n }\n }\n }\n\n , once = function (rm, element, type, fn, originalFn) {\n // wrap the handler in a handler that does a remove as well\n return function () {\n fn.apply(this, arguments)\n rm(element, type, originalFn)\n }\n }\n\n , removeListener = function (element, orgType, handler, namespaces) {\n var type = orgType && orgType.replace(nameRegex, '')\n , handlers = registry.get(element, type, null, false)\n , removed = {}\n , i, l\n\n for (i = 0, l = handlers.length; i < l; i++) {\n if ((!handler || handlers[i].original === handler) && handlers[i].inNamespaces(namespaces)) {\n // TODO: this is problematic, we have a registry.get() and registry.del() that\n // both do registry searches so we waste cycles doing this. Needs to be rolled into\n // a single registry.forAll(fn) that removes while finding, but the catch is that\n // we'll be splicing the arrays that we're iterating over. Needs extra tests to\n // make sure we don't screw it up. @rvagg\n registry.del(handlers[i])\n if (!removed[handlers[i].eventType] && handlers[i][eventSupport])\n removed[handlers[i].eventType] = { t: handlers[i].eventType, c: handlers[i].type }\n }\n }\n // check each type/element for removed listeners and remove the rootListener where it's no longer needed\n for (i in removed) {\n if (removed.hasOwnProperty(i)) {\n if (!registry.has(element, removed[i].t, null, false)) {\n // last listener of this type, remove the rootListener\n listener(element, removed[i].t, false, removed[i].c)\n }\n }\n }\n }\n\n // set up a delegate helper using the given selector, wrap the handler function\n , delegate = function (selector, fn) {\n //TODO: findTarget (therefore $) is called twice, once for match and once for\n // setting e.currentTarget, fix this so it's only needed once\n var findTarget = function (target, root) {\n var i, array = isString(selector) ? selectorEngine(selector, root) : selector\n for (; target && target !== root; target = target.parentNode) {\n for (i = array.length; i--;) {\n if (array[i] === target) return target\n }\n }\n }\n , handler = function (e) {\n var match = findTarget(e.target, this)\n if (match) fn.apply(match, arguments)\n }\n\n // __beanDel isn't pleasant but it's a private function, not exposed outside of Bean\n handler.__beanDel = {\n ft : findTarget // attach it here for customEvents to use too\n , selector : selector\n }\n return handler\n }\n\n , fireListener = W3C_MODEL ? function (isNative, type, element) {\n // modern browsers, do a proper dispatchEvent()\n var evt = doc.createEvent(isNative ? 'HTMLEvents' : 'UIEvents')\n evt[isNative ? 'initEvent' : 'initUIEvent'](type, true, true, win, 1)\n element.dispatchEvent(evt)\n } : function (isNative, type, element) {\n // old browser use onpropertychange, just increment a custom property to trigger the event\n element = targetElement(element, isNative)\n isNative ? element.fireEvent('on' + type, doc.createEventObject()) : element['_on' + type]++\n }\n\n /**\n * Public API: off(), on(), add(), (remove()), one(), fire(), clone()\n */\n\n /**\n * off(element[, eventType(s)[, handler ]])\n */\n , off = function (element, typeSpec, fn) {\n var isTypeStr = isString(typeSpec)\n , k, type, namespaces, i\n\n if (isTypeStr && typeSpec.indexOf(' ') > 0) {\n // off(el, 't1 t2 t3', fn) or off(el, 't1 t2 t3')\n typeSpec = str2arr(typeSpec)\n for (i = typeSpec.length; i--;)\n off(element, typeSpec[i], fn)\n return element\n }\n\n type = isTypeStr && typeSpec.replace(nameRegex, '')\n if (type && customEvents[type]) type = customEvents[type].base\n\n if (!typeSpec || isTypeStr) {\n // off(el) or off(el, t1.ns) or off(el, .ns) or off(el, .ns1.ns2.ns3)\n if (namespaces = isTypeStr && typeSpec.replace(namespaceRegex, '')) namespaces = str2arr(namespaces, '.')\n removeListener(element, type, fn, namespaces)\n } else if (isFunction(typeSpec)) {\n // off(el, fn)\n removeListener(element, null, typeSpec)\n } else {\n // off(el, { t1: fn1, t2, fn2 })\n for (k in typeSpec) {\n if (typeSpec.hasOwnProperty(k)) off(element, k, typeSpec[k])\n }\n }\n\n return element\n }\n\n /**\n * on(element, eventType(s)[, selector], handler[, args ])\n */\n , on = function(element, events, selector, fn) {\n var originalFn, type, types, i, args, entry, first\n\n //TODO: the undefined check means you can't pass an 'args' argument, fix this perhaps?\n if (selector === undefined && typeof events == 'object') {\n //TODO: this can't handle delegated events\n for (type in events) {\n if (events.hasOwnProperty(type)) {\n on.call(this, element, type, events[type])\n }\n }\n return\n }\n\n if (!isFunction(selector)) {\n // delegated event\n originalFn = fn\n args = slice.call(arguments, 4)\n fn = delegate(selector, originalFn, selectorEngine)\n } else {\n args = slice.call(arguments, 3)\n fn = originalFn = selector\n }\n\n types = str2arr(events)\n\n // special case for one(), wrap in a self-removing handler\n if (this === ONE) {\n fn = once(off, element, events, fn, originalFn)\n }\n\n for (i = types.length; i--;) {\n // add new handler to the registry and check if it's the first for this element/type\n first = registry.put(entry = new RegEntry(\n element\n , types[i].replace(nameRegex, '') // event type\n , fn\n , originalFn\n , str2arr(types[i].replace(namespaceRegex, ''), '.') // namespaces\n , args\n , false // not root\n ))\n if (entry[eventSupport] && first) {\n // first event of this type on this element, add root listener\n listener(element, entry.eventType, true, entry.customType)\n }\n }\n\n return element\n }\n\n /**\n * add(element[, selector], eventType(s), handler[, args ])\n *\n * Deprecated: kept (for now) for backward-compatibility\n */\n , add = function (element, events, fn, delfn) {\n return on.apply(\n null\n , !isString(fn)\n ? slice.call(arguments)\n : [ element, fn, events, delfn ].concat(arguments.length > 3 ? slice.call(arguments, 5) : [])\n )\n }\n\n /**\n * one(element, eventType(s)[, selector], handler[, args ])\n */\n , one = function () {\n return on.apply(ONE, arguments)\n }\n\n /**\n * fire(element, eventType(s)[, args ])\n *\n * The optional 'args' argument must be an array, if no 'args' argument is provided\n * then we can use the browser's DOM event system, otherwise we trigger handlers manually\n */\n , fire = function (element, type, args) {\n var types = str2arr(type)\n , i, j, l, names, handlers\n\n for (i = types.length; i--;) {\n type = types[i].replace(nameRegex, '')\n if (names = types[i].replace(namespaceRegex, '')) names = str2arr(names, '.')\n if (!names && !args && element[eventSupport]) {\n fireListener(nativeEvents[type], type, element)\n } else {\n // non-native event, either because of a namespace, arguments or a non DOM element\n // iterate over all listeners and manually 'fire'\n handlers = registry.get(element, type, null, false)\n args = [false].concat(args)\n for (j = 0, l = handlers.length; j < l; j++) {\n if (handlers[j].inNamespaces(names)) {\n handlers[j].handler.apply(element, args)\n }\n }\n }\n }\n return element\n }\n\n /**\n * clone(dstElement, srcElement[, eventType ])\n *\n * TODO: perhaps for consistency we should allow the same flexibility in type specifiers?\n */\n , clone = function (element, from, type) {\n var handlers = registry.get(from, type, null, false)\n , l = handlers.length\n , i = 0\n , args, beanDel\n\n for (; i < l; i++) {\n if (handlers[i].original) {\n args = [ element, handlers[i].type ]\n if (beanDel = handlers[i].handler.__beanDel) args.push(beanDel.selector)\n args.push(handlers[i].original)\n on.apply(null, args)\n }\n }\n return element\n }\n\n , bean = {\n 'on' : on\n , 'add' : add\n , 'one' : one\n , 'off' : off\n , 'remove' : off\n , 'clone' : clone\n , 'fire' : fire\n , 'Event' : Event\n , 'setSelectorEngine' : setSelectorEngine\n , 'noConflict' : function () {\n context[name] = old\n return this\n }\n }\n\n // for IE, clean up on unload to avoid leaks\n if (win.attachEvent) {\n var cleanup = function () {\n var i, entries = registry.entries()\n for (i in entries) {\n if (entries[i].type && entries[i].type !== 'unload') off(entries[i].element, entries[i].type)\n }\n win.detachEvent('onunload', cleanup)\n win.CollectGarbage && win.CollectGarbage()\n }\n win.attachEvent('onunload', cleanup)\n }\n\n // initialize selector engine to internal default (qSA or throw Error)\n setSelectorEngine(Ink.ss)\n\n return bean\n });\n\n /**\n * Keep this declaration here and off Bean as it extends the Event\n * object and some properties are readonly in strict mode\n */\n 'use strict';\n\n var InkEvent = {\n\n KEY_BACKSPACE: 8,\n KEY_TAB: 9,\n KEY_RETURN: 13,\n KEY_ESC: 27,\n KEY_SPACE: 32,\n KEY_LEFT: 37,\n KEY_UP: 38,\n KEY_RIGHT: 39,\n KEY_DOWN: 40,\n KEY_DELETE: 46,\n KEY_HOME: 36,\n KEY_END: 35,\n KEY_PAGEUP: 33,\n KEY_PAGEDOWN: 34,\n KEY_INSERT: 45,\n \n /**\n * Creates a throttled version of a function.\n * Returns a function which calls `func`, waiting at least `wait` milliseconds between calls. This is useful for events such as `scroll` or `resize`, which can be triggered too many times per second, slowing down the browser with needless function calls.\n *\n * *note:* This does not delay the first function call to the function.\n *\n * @method throttle\n * @param {Function} func Function to call. Arguments and context are both passed.\n * @param {Number} [wait]=0 Milliseconds to wait between calls.\n * @return {Function} A function throttled which will only be called at most every `wait` milliseconds.\n * @sample Ink_Dom_Event_1_throttle.html \n **/\n throttle: function (func, wait) {\n wait = wait || 0;\n var lastCall = 0; // Warning: This breaks on Jan 1st 1970 0:00\n var timeout;\n function throttled() {\n var now = +new Date();\n var timeDiff = now - lastCall;\n if (timeDiff >= wait) {\n lastCall = now;\n return func.apply(this, [].slice.call(arguments));\n } else {\n var that = this;\n var args = [].slice.call(arguments);\n\n if (timeout) {\n // Clear the old timeout because that one has old arguments\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(function () {\n timeout = null;\n return throttled.apply(that, args);\n }, wait - timeDiff);\n }\n }\n return throttled;\n },\n\n /**\n * Gets the event's target element.\n *\n * @method element\n * @param {Object} ev Event object\n * @return {Element} The target\n * @public\n * @sample Ink_Dom_Event_1_element.html \n */\n element: function(ev) {\n var node = ev.delegationTarget ||\n ev.target ||\n // IE stuff\n (ev.type === 'mouseout' && ev.fromElement) ||\n (ev.type === 'mouseleave' && ev.fromElement) ||\n (ev.type === 'mouseover' && ev.toElement) ||\n (ev.type === 'mouseenter' && ev.toElement) ||\n ev.srcElement ||\n null;\n return node && (node.nodeType === 3 || node.nodeType === 4) ? node.parentNode : node;\n },\n\n /**\n * Gets the event's related target element.\n *\n * @method relatedTarget\n * @param {Object} ev event object\n * @return {DOMNode} The related target\n * @sample Ink_Dom_Event_1_relatedTarget.html \n */\n relatedTarget: function(ev){\n var node = ev.relatedTarget ||\n // IE stuff\n (ev.type === 'mouseout' && ev.toElement) ||\n (ev.type === 'mouseleave' && ev.toElement) ||\n (ev.type === 'mouseover' && ev.fromElement) ||\n (ev.type === 'mouseenter' && ev.fromElement) ||\n null;\n return node && (node.nodeType === 3 || node.nodeType === 4) ? node.parentNode : node;\n },\n\n /**\n * Find closest ancestor element by tag name related to the event target.\n * Navigate up the DOM tree, looking for a tag with the name `elmTagName`.\n *\n * If such tag is not found, `document` is returned.\n *\n * @method findElement\n * @param {Object} ev Event object\n * @param {String} elmTagName Tag name to find\n * @param {Boolean} [force]=false Flag to skip returning `document` and to return `false` instead.\n * @return {DOMElement} the first element which matches given tag name or the document element if the wanted tag is not found\n * @sample Ink_Dom_Event_1_findElement.html \n */\n findElement: function(ev, elmTagName, force)\n {\n var node = this.element(ev);\n while(true) {\n if(node.nodeName.toLowerCase() === elmTagName.toLowerCase()) {\n return node;\n } else {\n node = node.parentNode;\n if(!node) {\n if(force) {\n return false;\n }\n return document;\n }\n if(!node.parentNode){\n if(force){ return false; }\n return document;\n }\n }\n }\n },\n\n /**\n * Attaches an event to element\n *\n * @method observe\n * @param {DOMElement|String} element Element id or element\n * @param {String} eventName Event name\n * @param {Function} callBack Receives the event object as a parameter. If you're manually firing custom events, check it's eventName property to make sure you're handling the right event.\n * @param {Boolean} [useCapture] Flag to change event listening from bubbling to capture.\n * @return {Function} The event handler used. Hang on to this if you want to `stopObserving` later.\n * @sample Ink_Dom_Event_1_observe.html \n */\n observe: function(element, eventName, callBack, useCapture) {\n element = Ink.i(element);\n if(element) {\n if(element.addEventListener) {\n element.addEventListener(eventName, callBack, !!useCapture);\n } else {\n element.attachEvent('on' + eventName, (callBack = Ink.bind(callBack, element)));\n }\n return callBack;\n }\n },\n\n /**\n * Like observe, but listen to the event only once.\n *\n * @method observeOnce\n * @param {DOMElement|String} element Element id or element\n * @param {String} eventName Event name\n * @param {Function} callBack Receives the event object as a parameter. If you're manually firing custom events, check it's eventName property to make sure you're handling the right event.\n * @param {Boolean} [useCapture] Flag to change event listening from bubbling to capture.\n * @return {Function} The event handler used. Hang on to this if you want to `stopObserving` later.\n * @sample Ink_Dom_Event_1_observeOnce.html \n */\n observeOnce: function (element, eventName, callBack, useCapture) {\n var onceBack = function () {\n InkEvent.stopObserving(element, eventName, handler);\n return callBack.apply(this, arguments);\n };\n var handler = InkEvent.observe(element, eventName, onceBack, useCapture);\n return handler;\n },\n\n /**\n * Attaches an event to a selector or array of elements.\n *\n * @method observeMulti\n * @param {Array|String} elements Array of elements which are going to be observed. A selector is acceptable too.\n * @param {String} eventName Event name\n * @param {Function} callBack Receives the event object as a parameter. If you're manually firing custom events, check it's eventName property to make sure you're handling the right event.\n * @param {Boolean} [useCapture] Flag change event listening from bubbling to capture.\n * @return {Function} The used callback.\n * @sample Ink_Dom_Event_1_observeMulti.html \n */\n observeMulti: function (elements, eventName, callBack, useCapture) {\n if (typeof elements === 'string') {\n elements = Ink.ss(elements);\n } else if ( /* is an element */ elements && elements.nodeType === 1) {\n elements = [elements];\n }\n if (!elements[0]) { return false; }\n\n for (var i = 0, len = elements.length; i < len; i++) {\n this.observe(elements[i], eventName, callBack, useCapture);\n }\n return callBack;\n },\n\n /**\n * Observes an event on an element and its descendants matching the selector.\n *\n * Requires Ink.Dom.Selector if you need to use a selector.\n *\n * @method observeDelegated\n * @param {Element|String} element Element to observe.\n * @param {String} eventName Event name to observe.\n * @param {String} selector Child element selector. When null, finds any element.\n * @param {Function} callback Callback to be called when the event is fired\n * @return {Function} The used callback, for ceasing to listen to the event later.\n * @public\n * @sample Ink_Dom_Event_1_observeDelegated.html \n **/\n observeDelegated: function (element, eventName, selector, callback) {\n return InkEvent.observe(element, eventName, function (event) {\n var fromElement = InkEvent.element(event);\n if (!fromElement || fromElement === element) { return; }\n\n var cursor = fromElement;\n\n // Go up the document tree until we hit the element itself.\n while (cursor !== element && cursor !== document && cursor) {\n if (Ink.Dom.Selector_1.matchesSelector(cursor, selector)) {\n event.delegationTarget = cursor;\n return callback(event);\n }\n cursor = cursor.parentNode;\n }\n });\n },\n\n /**\n * Removes an event attached to an element.\n *\n * @method stopObserving\n * @param {DOMElement|String} element Element id or element\n * @param {String} eventName Event name\n * @param {Function} callBack Callback function\n * @param {Boolean} [useCapture] Set to true if the event was being observed with useCapture set to true as well.\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stopObserving.html \n */\n stopObserving: function(element, eventName, callBack, useCapture) {\n element = Ink.i(element);\n\n if(element) {\n if(element.removeEventListener) {\n element.removeEventListener(eventName, callBack, !!useCapture);\n } else {\n element.detachEvent('on' + eventName, callBack);\n }\n }\n },\n\n /**\n * Stops event propagation and bubbling.\n *\n * @method stop\n * @param {Object} event Event handle\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stop.html \n */\n stop: function(event)\n {\n if(event.cancelBubble !== null) {\n event.cancelBubble = true;\n }\n if(event.stopPropagation) {\n event.stopPropagation();\n }\n if(event.preventDefault) {\n event.preventDefault();\n }\n if(window.attachEvent) {\n event.returnValue = false;\n }\n if(event.cancel !== null) {\n event.cancel = true;\n }\n },\n\n /**\n * Stops event propagation.\n *\n * @method stopPropagation\n * @param {Object} event Event handle\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stopPropagation.html \n */\n stopPropagation: function(event) {\n if(event.cancelBubble !== null) {\n event.cancelBubble = true;\n }\n if(event.stopPropagation) {\n event.stopPropagation();\n }\n },\n\n /**\n * Stops event default behaviour.\n *\n * @method stopDefault\n * @param {Object} event Event handle\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stopDefault.html \n */\n stopDefault: function(event)\n {\n if(event.preventDefault) {\n event.preventDefault();\n }\n if(window.attachEvent) {\n event.returnValue = false;\n }\n if(event.cancel !== null) {\n event.cancel = true;\n }\n },\n\n /**\n * Gets the pointer's coordinates from the event object.\n *\n * @method pointer\n * @param {Object} ev Event object\n * @return {Object} An object with the mouse X and Y position\n * @public\n * @sample Ink_Dom_Event_1_pointer.html \n */\n pointer: function(ev)\n {\n return {\n x: this.pointerX(ev),\n y: this.pointerY(ev)\n };\n },\n\n /**\n * Gets the pointer's X coordinate.\n *\n * @method pointerX\n * @param {Object} ev Event object\n * @return {Number} Mouse X position\n * @public\n */\n pointerX: function(ev)\n {\n return (ev.touches && ev.touches[0] && ev.touches[0].clientX) ||\n (ev.pageX) ||\n (ev.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));\n },\n\n /**\n * Gets the pointer's Y coordinate.\n *\n * @method pointerY\n * @param {Object} ev Event object\n * @return {Number} Mouse Y position\n * @public\n */\n pointerY: function(ev)\n {\n return (ev.touches && ev.touches[0] && ev.touches[0].clientY) ||\n (ev.pageY) ||\n (ev.clientY + (document.documentElement.scrollTop || document.body.scrollTop));\n },\n\n /**\n * Checks if an event is a left click.\n *\n * @method isLeftClick\n * @param {Object} ev Event object\n * @return {Boolean} True if the event is a left click\n * @public\n * @sample Ink_Dom_Event_1_isLeftClick.html \n */\n isLeftClick: function(ev) {\n if (window.addEventListener) {\n if(ev.button === 0){\n return true;\n } else if(ev.type === 'touchend' && ev.button === null){\n // [todo] do the above check for pointerEvents too\n return true;\n }\n }\n else {\n if(ev.button === 1){ return true; }\n }\n return false;\n },\n\n /**\n * Checks if an event is a right click.\n *\n * @method isRightClick\n * @param {Object} ev Event object\n * @return {Boolean} True if the event is a right click\n * @public\n * @sample Ink_Dom_Event_1_isRightClick.html \n */\n isRightClick: function(ev) {\n return (ev.button === 2);\n },\n\n /**\n * Checks if an event is a middle click.\n *\n * @method isMiddleClick\n * @param {Object} ev Event object\n * @return {Boolean} True if the event is a middle click\n * @public\n * @sample Ink_Dom_Event_1_isMiddleClick.html \n */\n isMiddleClick: function(ev) {\n if (window.addEventListener) {\n return (ev.button === 1);\n }\n else {\n return (ev.button === 4);\n }\n return false;\n },\n\n /**\n * Gets character from an event.\n *\n * @method getCharFromKeyboardEvent\n * @param {Object} event Keyboard event\n * @param {Boolean} [changeCasing] If true uppercases, if false lowercases, otherwise keeps casing\n * @return {String} Character representation of pressed key combination\n * @public\n * @sample Ink_Dom_Event_1_getCharFromKeyboardEvent.html \n */\n getCharFromKeyboardEvent: function(event, changeCasing) {\n var k = event.keyCode;\n var c = String.fromCharCode(k);\n\n var shiftOn = event.shiftKey;\n if (k >= 65 && k <= 90) { // A-Z\n if (typeof changeCasing === 'boolean') {\n shiftOn = changeCasing;\n }\n return (shiftOn) ? c : c.toLowerCase();\n }\n else if (k >= 96 && k <= 105) { // numpad digits\n return String.fromCharCode( 48 + (k-96) );\n }\n switch (k) {\n case 109: case 189: return '-';\n case 107: case 187: return '+';\n }\n return c;\n },\n\n debug: function(){}\n};\n\n/**\n * Lets you attach event listeners to both elements and objects.\n * http://github.com/fat/bean#on\n *\n * @method on\n * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object\n * @param {String} eventType An Event (or multiple events, space separated) to listen to\n * @param {String} [selector] A CSS DOM Element selector string to bind the listener to child elements matching the selector\n * @param {Function} [handler] The callback function\n * @param {Object} [args...] Additional arguments to pass to the callback function when triggered\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_on.html \n */\n\n/**\n * Alias for `on` but will only be executed once.\n * bean.one() is an alias for bean.on() except that the handler will only be executed once and then removed for the event type(s).\n * http://github.com/fat/bean#one\n *\n * @method one\n * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object\n * @param {String} eventType An Event (or multiple events, space separated) to listen to\n * @param {String} [selector] A CSS DOM Element selector string to bind the listener to child elements matching the selector\n * @param {Function} [handler] The callback function\n * @param [args...] Additional arguments to pass to the callback function when triggered\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_one.html \n */\n\n/**\n * Removes event handlers.\n * bean.off() is how you get rid of handlers once you no longer want them active. It's also a good idea to call off on elements before you remove them from your DOM; this gives Bean a chance to clean up some things and prevents memory leaks.\n * http://github.com/fat/bean#off\n *\n * @method off\n * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object\n * @param {String} eventType An Event (or multiple events, space separated) to remove\n * @param {Function} [handler] The specific callback function to remove\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_off.html \n */\n\n/**\n * Clones events from one object to another\n * bean.clone() is a method for cloning events from one DOM element or object to another.\n * http://github.com/fat/bean#clone\n *\n * @method clone\n * @param {DOMElement|Object} destElement An HTML DOM element or any JavaScript Object to copy events to\n * @param {String} srcElement An HTML DOM element or any JavaScript Object to copy events from\n * @param {String} [eventType] An Event (or multiple events, space separated) to clone\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_clone.html \n */\n\n/**\n * Triggers events.\n * http://github.com/fat/bean#fire\n *\n * @method fire\n * @param {DOMElement|Object} destElement An HTML DOM element or any JavaScript Object fire the event on\n * @param {String} eventType An Event (or multiple events, space separated) to fire\n * @param [args...] Additional arguments to pass to the callback function when triggered\n *\n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_fire.html \n */\n\nreturn Ink.extendObj(InkEvent, bean);\n\n});\n","/**\n * @module Ink.Dom.FormSerialize_1\n * Two way serialization of form data and javascript objects.\n * Valid applications are ad hoc AJAX/syndicated submission of forms, restoring form values from server side state, etc.\n */\n\nInk.createModule('Ink.Dom.FormSerialize', 1, ['Ink.Util.Array_1', 'Ink.Dom.Element_1', 'Ink.Dom.Selector_1'], function (InkArray, InkElement, Selector) {\n 'use strict';\n\n // Check whether something is not a string or a DOM element, but still has length.\n function isArrayIsh(obj) {\n return obj != null &&\n (!InkElement.isDOMElement(obj)) &&\n (InkArray.isArray(obj) || (typeof obj !== 'string' && typeof obj.length === 'number'));\n }\n\n function toArray(obj) {\n if (isArrayIsh(obj)) { return obj; }\n else { return [obj]; }\n }\n\n /**\n * @namespace Ink.Dom.FormSerialize\n * @static\n **/\n var FormSerialize = {\n\n /**\n * Serializes a form element into a JS object\n * It turns field *names* (not IDs!) into keys and field values into values.\n *\n * note: Multi-select and checkboxes with multiple values will result in arrays\n *\n * @method serialize\n * @param {DOMElement|String} form Form element to extract data\n * @param {Object} [options] Options object, containing:\n * @param {Boolean} [options.outputUnchecked=false] Whether to emit unchecked checkboxes and unselected radio buttons.\n * @return {Object} Map of fieldName -> String|String[]|Boolean\n * @sample Ink_Dom_FormSerialize_serialize.html \n */\n serialize: function(form, options) {\n options = options || {};\n var out = {};\n var emptyArrayToken = {}; // A hack so that empty select[multiple] elements appear although empty.\n\n var pairs = this.asPairs(form, { elements: true, emptyArray: emptyArrayToken, outputUnchecked: options.outputUnchecked });\n if (pairs == null) { return pairs; }\n InkArray.forEach(pairs, function (pair) {\n var name = pair[0].replace(/\\[\\]$/, '');\n var value = pair[1];\n var el = pair[2];\n\n if (value === emptyArrayToken) {\n out[name] = []; // It's an empty select[multiple]\n } else if (!(FormSerialize._resultsInArray(el) || /\\[\\]$/.test(pair[0]))) {\n out[name] = value;\n } else {\n out[name] = out[name] || [];\n out[name].push(value);\n }\n });\n\n return out;\n },\n\n /**\n * Like `serialize`, but returns an array of [fieldName, value] pairs.\n *\n * @method asPairs\n * @param {DOMElement|String} form Form element\n * @param {Object} [options] Options object, containing:\n * @param {Boolean} [options.elements] Instead of returning an array of [fieldName, value] pairs, return an array of [fieldName, value, fieldElement] triples.\n * @param {Boolean} [options.emptyArray] What to emit as the value of an empty select[multiple]. If you don't pass this option, nothing comes out.\n * @param {Boolean} [options.outputUnchecked=false] Whether to emit unchecked checkboxes and unselected radio buttons.\n * @return {Array} Array of [fieldName, value] pairs.\n **/\n asPairs: function (form, options) {\n var out = [];\n options = options || {};\n\n function emit(name, val, el) {\n if (options.elements) {\n out.push([name, val, el]);\n } else {\n out.push([name, val]);\n }\n }\n\n function serializeEl(el) {\n var elNodeName = el.nodeName.toLowerCase();\n var elType = (el.type + '').toLowerCase();\n\n if (elNodeName === 'select' && el.multiple) {\n var didEmit = false;\n InkArray.forEach(Selector.select('option:checked', el), function (thisOption) {\n emit(el.name, thisOption.value, el);\n didEmit = true;\n });\n if (!didEmit && 'emptyArray' in options) {\n emit(el.name, options.emptyArray, el);\n }\n } else if (elNodeName === 'input' && (elType === 'checkbox' || elType === 'radio') && options.outputUnchecked) {\n // It's an empty checkbox and we wouldn't emit it otherwise but the user asked for it using outputUnchecked\n emit(el.name, null, el);\n } else {\n emit(el.name, el.value, el);\n }\n }\n\n if ((form = Ink.i(form))) {\n var inputs = InkArray.filter(form.elements, function (elm) {\n return FormSerialize._isSerialized(elm, options);\n });\n for (var i = 0, len = inputs.length; i < len; i++) {\n serializeEl(inputs[i]);\n }\n return out;\n }\n\n return null;\n },\n\n /**\n * Sets form elements' values with values from an object\n *\n * Note: You can't set the values of an input with `type=\"file\"` (browser prohibits it)\n *\n * @method fillIn \n * @param {Element|String} form Form element to be populated\n * @param {Object|Array} map2 Mapping of fields to values contained in fields. Can be a hash (keys as names, strings or arrays for values), or an array of [name, value] pairs.\n * @return {void}\n * @sample Ink_Dom_FormSerialize_fillIn.html \n */\n fillIn: function(form, map2) {\n if (!(form = Ink.i(form))) { return null; }\n\n var pairs;\n\n if (typeof map2 === 'object' && !isArrayIsh(map2)) {\n pairs = FormSerialize._objToPairs(map2);\n } else if (isArrayIsh(map2)) {\n pairs = map2;\n } else {\n return null;\n }\n\n return FormSerialize._fillInPairs(form, pairs);\n },\n\n _objToPairs: function (obj) {\n var pairs = [];\n var val;\n for (var name in obj) if (obj.hasOwnProperty(name)) {\n val = toArray(obj[name]);\n for (var i = 0, len = val.length; i < len; i++) {\n pairs.push([name, val[i]]);\n }\n if (len === 0) {\n pairs.push([name, []]);\n }\n }\n return pairs;\n },\n\n _fillInPairs: function (form, pairs) {\n pairs = InkArray.groupBy(pairs, {\n key: function (pair) { return pair[0].replace(/\\[\\]$/, ''); }\n });\n\n // For each chunk...\n pairs = InkArray.map(pairs, function (pair) {\n // Join the items in the chunk by concatenating the values together and leaving the names alone\n var values = InkArray.reduce(pair, function (left, right) {\n return [null, left[1].concat([right[1]])];\n }, [null, []])[1];\n return [pair[0][0], values];\n });\n\n var name;\n var inputs;\n var values;\n for (var i = 0, len = pairs.length; i < len; i++) {\n name = pairs[i][0];\n\n if (name in form) {\n inputs = form[name];\n } else if ((name + '[]') in form) {\n inputs = form[name + '[]'];\n name = name + '[]';\n } else {\n continue;\n }\n\n inputs = toArray(inputs);\n values = pairs[i][1];\n\n FormSerialize._fillInOne(name, inputs, values);\n }\n },\n\n _fillInOne: function (name, inputs, values) {\n var firstOne = inputs[0];\n var firstNodeName = firstOne.nodeName.toLowerCase();\n var firstType = firstOne.getAttribute('type');\n firstType = firstType && firstType.toLowerCase();\n var isSelectMulti = firstNodeName === 'select' && InkElement.hasAttribute(firstOne, 'multiple');\n\n if (firstType === 'checkbox' || firstType === 'radio') {\n FormSerialize._fillInBoolean(inputs, values, 'checked');\n } else if (isSelectMulti) {\n FormSerialize._fillInBoolean(inputs[0].options, values, 'selected');\n } else {\n if (inputs.length !== values.length) {\n Ink.warn('Form had ' + inputs.length + ' inputs named \"' + name + '\", but received ' + values.length + ' values.');\n }\n\n for (var i = 0, len = Math.min(inputs.length, values.length); i < len; i += 1) {\n inputs[i].value = values[i];\n }\n }\n },\n\n _fillInBoolean: function (inputs, values, checkAttr /* 'selected' or 'checked' */) {\n InkArray.forEach(inputs, function (input) {\n var isChecked = InkArray.inArray(input.value, values);\n input[checkAttr] = isChecked;\n });\n },\n\n /**\n * Whether FormSerialize.serialize() should produce an array when looking at this element.\n * @method _resultsInArray\n * @private\n * @param element\n **/\n _resultsInArray: function (element) {\n var type = element.getAttribute('type');\n var nodeName = element.nodeName.toLowerCase();\n\n return type === 'checkbox' ||\n (nodeName === 'select' && InkElement.hasAttribute(element, 'multiple'));\n },\n\n _isSerialized: function (element, options) {\n options = options || {};\n if (!InkElement.isDOMElement(element)) { return false; }\n if (!InkElement.hasAttribute(element, 'name')) { return false; }\n\n var nodeName = element.nodeName.toLowerCase();\n\n if (!nodeName || nodeName === 'fieldset') { return false; }\n\n if (element.type === 'checkbox' || element.type === 'radio') {\n if (options.outputUnchecked) { return true; }\n return !!element.checked;\n }\n\n return true;\n }\n };\n\n return FormSerialize;\n});\n","/**\n * Execute code only when the DOM is loaded.\n * @module Ink.Dom.Loaded_1\n * @version 1\n */\n \nInk.createModule('Ink.Dom.Loaded', 1, [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Dom.Loaded_1\n **/\n var Loaded = {\n\n /**\n * Callbacks and their contexts. Array of 2-arrays.\n *\n * []\n *\n * @attribute _contexts Array\n * @private\n * \n */\n _contexts: [], // Callbacks' queue\n\n /**\n * Specify a function to execute when the DOM is fully loaded.\n *\n * @method run\n * @param {Object} [win]=window Window object to attach/add the event\n * @param {Function} fn Callback function to be executed after the DOM is ready\n * @return {void}\n * @public\n * @sample Ink_Dom_Loaded_run.html \n */\n run: function(win, fn) {\n if (!fn) {\n fn = win;\n win = window;\n }\n\n var context;\n\n for (var i = 0, len = this._contexts.length; i < len; i++) {\n if (this._contexts[i][0] === win) {\n context = this._contexts[i][1];\n break;\n }\n }\n if (!context) {\n context = {\n cbQueue: [],\n win: win,\n doc: win.document,\n root: win.document.documentElement,\n done: false,\n top: true\n };\n context.handlers = {\n checkState: Ink.bindEvent(this._checkState, this, context),\n poll: Ink.bind(this._poll, this, context)\n };\n this._contexts.push(\n [win, context] // Javascript Objects cannot map different windows to\n // different values.\n );\n }\n\n var ael = context.doc.addEventListener;\n context.add = ael ? 'addEventListener' : 'attachEvent';\n context.rem = ael ? 'removeEventListener' : 'detachEvent';\n context.pre = ael ? '' : 'on';\n context.det = ael ? 'DOMContentLoaded' : 'onreadystatechange';\n context.wet = context.pre + 'load';\n\n var csf = context.handlers.checkState;\n var alreadyLoaded = (\n /complete|loaded/.test(context.doc.readyState) &&\n context.win.location.toString() !== 'about:blank'); // https://code.google.com/p/chromium/issues/detail?id=32357\n\n if (alreadyLoaded){\n setTimeout(Ink.bind(function () {\n fn.call(context.win, 'lazy');\n }, this), 0);\n } else {\n context.cbQueue.push(fn);\n\n context.doc[context.add]( context.det , csf );\n context.win[context.add]( context.wet , csf );\n\n var frameElement = 1;\n try{\n frameElement = context.win.frameElement;\n } catch(e) {}\n if ( !ael && context.root && context.root.doScroll ) { // IE HACK\n try {\n context.top = !frameElement;\n } catch(e) { }\n if (context.top) {\n this._poll(context);\n }\n }\n }\n },\n\n /**\n * Function that will be running the callbacks after the page is loaded\n *\n * @method _checkState\n * @param {Event} event Triggered event\n * @private\n */\n _checkState: function(event, context) {\n if ( !event || (event.type === 'readystatechange' && !/complete|loaded/.test(context.doc.readyState))) {\n return;\n }\n var where = (event.type === 'load') ? context.win : context.doc;\n where[context.rem](context.pre+event.type, context.handlers.checkState, false);\n this._ready(context);\n },\n\n /**\n * Polls the load progress of the page to see if it has already loaded or not\n *\n * @method _poll\n * @private\n */\n\n /**\n * (old IE only) wait until a doScroll() call does not throw an error\n *\n * @method _poll\n * @private\n */\n _poll: function(context) {\n try {\n context.root.doScroll('left');\n } catch(e) {\n return setTimeout(context.handlers.poll, 50);\n }\n this._ready(context);\n },\n\n /**\n * Function that runs the callbacks from the queue when the document is ready.\n *\n * @method _ready\n * @private\n */\n _ready: function(context) {\n if (!context.done) {\n context.done = true;\n for (var i = 0; i < context.cbQueue.length; ++i) {\n context.cbQueue[i].call(context.win);\n }\n context.cbQueue = [];\n }\n }\n };\n\n return Loaded;\n\n});\n","/**\n * CSS selector engine\n * @module Ink.Dom.Selector_1\n * @version 1\n */\n \nInk.createModule('Ink.Dom.Selector', 1, [], function() {\n /*jshint forin:false, eqnull:true, noempty:false, expr:true, boss:true, maxdepth:false*/\n\t'use strict';\n\n/*!\n * Sizzle CSS Selector Engine\n * Copyright 2013 jQuery Foundation and other contributors\n * Released under the MIT license\n * http://sizzlejs.com/\n */\n\nvar i,\n\tcachedruns,\n\tExpr,\n\tgetText,\n\tisXML,\n\tcompile,\n\toutermostContext,\n\trecompare,\n\tsortInput,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + -(new Date()),\n\tpreferredDoc = window.document,\n\tsupport = {},\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\thasDuplicate = false,\n\tsortOrder = function() { return 0; },\n\n\t// General-purpose constants\n\tstrundefined = typeof undefined,\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Array methods\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf if we can't use a native one\n\tindexOf = arr.indexOf || function( elem ) {\n\t\tvar i = 0,\n\t\t\tlen = this.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( this[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\toperators = \"([*^$|!~]?=)\",\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:\" + operators + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\n\t// Prefer arguments quoted,\n\t// then not containing pseudos/brackets,\n\t// then attribute selectors/non-parenthetical expressions,\n\t// then anything else\n\t// These preferences are here to reduce the number of selectors\n\t// needing tokenize in the PSEUDO preFilter\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes.replace( 3, 8 ) + \")*)|.*)\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([\\\\x20\\\\t\\\\r\\\\n\\\\f>+~])\" + whitespace + \"*\" ),\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"NAME\": new RegExp( \"^\\\\[name=['\\\"]?(\" + characterEncoding + \")['\\\"]?\\\\]\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trsibling = /[\\x20\\t\\r\\n\\f]*[+~]/,\n\n\trnative = /^[^{]+\\{\\s*\\[native code/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trescape = /'|\\\\/g,\n\trattributeQuotes = /\\=[\\x20\\t\\r\\n\\f]*([^'\"\\]]*)[\\x20\\t\\r\\n\\f]*\\]/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = /\\\\([\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|.)/g,\n\tfunescape = function( _, escaped ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\treturn high !== high ?\n\t\t\tescaped :\n\t\t\t// BMP codepoint\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\n/*\n * For feature detection\n * @param {Function} fn The function to test for native support\n */\nfunction isNative( fn ) {\n\treturn rnative.test( fn + \"\" );\n}\n\n/*\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar cache,\n\t\tkeys = [];\n\n\treturn (cache = function( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key += \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key ] = value);\n\t});\n}\n\n/*\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/*\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( documentIsHTML && !seed ) {\n\n\t\t// Shortcuts\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && !rbuggyQSA.test(selector) ) {\n\t\t\told = true;\n\t\t\tnid = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType === 9 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/*\n * Detect xml\n * @param {Element|Object} elem An element or a document\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/*\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar doc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\n\t// Support tests\n\tdocumentIsHTML = !isXML( doc );\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Check if attributes should be retrieved by attribute nodes\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.innerHTML = \"\";\n\t\tvar type = typeof div.lastChild.getAttribute(\"multiple\");\n\t\t// IE8 returns a string for some attributes even when not present\n\t\treturn type !== \"boolean\" && type !== \"string\";\n\t});\n\n\t// Check if getElementsByClassName can be trusted\n\tsupport.getElementsByClassName = assert(function( div ) {\n\t\t// Opera can't find a second classname (in 9.6)\n\t\tdiv.innerHTML = \"\";\n\t\tif ( !div.getElementsByClassName || !div.getElementsByClassName(\"e\").length ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Safari 3.2 caches class attributes and doesn't catch changes\n\t\tdiv.lastChild.className = \"e\";\n\t\treturn div.getElementsByClassName(\"e\").length === 2;\n\t});\n\n\t// Check if getElementsByName privileges form controls or returns elements by ID\n\t// If so, assume (for broader support) that getElementById returns elements by name\n\tsupport.getByName = assert(function( div ) {\n\t\t// Inject content\n\t\tdiv.id = expando + 0;\n\t\t// Support: Windows 8 Native Apps\n\t\t// Assigning innerHTML with \"name\" attributes throws uncatchable exceptions\n\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx\n\t\tdiv.appendChild( document.createElement(\"a\") ).setAttribute( \"name\", expando );\n\t\tdiv.appendChild( document.createElement(\"i\") ).setAttribute( \"name\", expando );\n\t\tdocElem.appendChild( div );\n\n\t\t// Test\n\t\tvar pass = doc.getElementsByName &&\n\t\t\t// buggy browsers will return fewer than the correct 2\n\t\t\tdoc.getElementsByName( expando ).length === 2 +\n\t\t\t// buggy browsers will return more than the correct 0\n\t\t\tdoc.getElementsByName( expando + 0 ).length;\n\n\t\t// Cleanup\n\t\tdocElem.removeChild( div );\n\n\t\treturn pass;\n\t});\n\n\t// Support: Webkit<537.32\n\t// Detached nodes confoundingly follow *each other*\n\tsupport.sortDetached = assert(function( div1 ) {\n\t\treturn div1.compareDocumentPosition &&\n\t\t\t// Should return 1, but Webkit returns 4 (following)\n\t\t\t(div1.compareDocumentPosition( document.createElement(\"div\") ) & 1);\n\t});\n\n\t// IE6/7 return modified attributes\n\tExpr.attrHandle = assert(function( div ) {\n\t\tdiv.innerHTML = \"
\";\n\t\treturn div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&\n\t\t\tdiv.firstChild.getAttribute(\"href\") === \"#\";\n\t}) ?\n\t\t{} :\n\t\t{\n\t\t\t\"href\": function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"href\", 2 );\n\t\t\t},\n\t\t\t\"type\": function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"type\");\n\t\t\t}\n\t\t};\n\n\t// ID find and filter\n\tif ( support.getByName ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\n\t\t\t\treturn m ?\n\t\t\t\t\tm.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode(\"id\").value === id ?\n\t\t\t\t\t\t[m] :\n\t\t\t\t\t\tundefined :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t}\n\t\t} :\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Name\n\tExpr.find[\"NAME\"] = support.getByName && function( tag, context ) {\n\t\tif ( typeof context.getElementsByName !== strundefined ) {\n\t\t\treturn context.getElementsByName( name );\n\t\t}\n\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21),\n\t// no need to also add to buggyMatches since matches checks buggyQSA\n\t// A support test would require too much code (would include document ready)\n\trbuggyQSA = [ \":focus\" ];\n\n\tif ( (support.qsa = isNative(doc.querySelectorAll)) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdiv.innerHTML = \"\";\n\n\t\t\t// IE8 - Some boolean attributes are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:checked|disabled|ismap|multiple|readonly|selected|value)\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Opera 10-12/IE8 - ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tif ( div.querySelectorAll(\"[i^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:\\\"\\\"|'')\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = isNative(docElem.contains) || docElem.compareDocumentPosition ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t// Document order sorting\n\tsortOrder = docElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );\n\n\t\tif ( compare ) {\n\t\t\t// Disconnected nodes\n\t\t\tif ( compare & 1 ||\n\t\t\t\t(recompare && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t\tif ( a === doc || contains(preferredDoc, a) ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( b === doc || contains(preferredDoc, b) ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\t// Maintain original order\n\t\t\t\treturn sortInput ?\n\t\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t\t0;\n\t\t\t}\n\n\t\t\treturn compare & 4 ? -1 : 1;\n\t\t}\n\n\t\t// Not directly comparable, sort on existence of method\n\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\t} else if ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\t// rbuggyQSA always contains :focus, so no need for an existence check\n\tif ( support.matchesSelector && documentIsHTML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) {\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch(e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [elem] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\tvar val;\n\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tif ( documentIsHTML ) {\n\t\tname = name.toLowerCase();\n\t}\n\tif ( (val = Expr.attrHandle[ name ]) ) {\n\t\treturn val( elem );\n\t}\n\tif ( !documentIsHTML || support.attributes ) {\n\t\treturn elem.getAttribute( name );\n\t}\n\treturn ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?\n\t\tname :\n\t\tval && val.specified ? val.value : null;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n// Document sorting and removing duplicates\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\t// Compensate for sort limitations\n\trecompare = !support.sortDetached;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\treturn results;\n};\n\n/*\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns Returns -1 if a precedes b, 1 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n// Returns a function to use in pseudos for input types\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n// Returns a function to use in pseudos for buttons\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n// Returns a function to use in pseudos for positionals\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/*\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( ; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (see #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[5] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[4] ) {\n\t\t\t\tmatch[2] = match[4];\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeName ) {\n\t\t\tif ( nodeName === \"*\" ) {\n\t\t\t\treturn function() { return true; };\n\t\t\t}\n\n\t\t\tnodeName = nodeName.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\")) || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\n\t\t\t// not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t// Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === elem.type );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( tokens = [] );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar data, cache, outerCache,\n\t\t\t\tdirkey = dirruns + \" \" + doneName;\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {\n\t\t\t\t\t\t\tif ( (data = cache[1]) === true || data === cachedruns ) {\n\t\t\t\t\t\t\t\treturn data === true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcache = outerCache[ dir ] = [ dirkey ];\n\t\t\t\t\t\t\tcache[1] = matcher( elem, context, xml ) || cachedruns;\n\t\t\t\t\t\t\tif ( cache[1] === true ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\t// A counter to specify which element is currently being matched\n\tvar matcherCachedRuns = 0,\n\t\tbySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, expandContext ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tsetMatched = [],\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\toutermost = expandContext != null,\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", expandContext && context.parentNode || context ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t\tcachedruns = matcherCachedRuns;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t\tcachedruns = ++matcherCachedRuns;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !group ) {\n\t\t\tgroup = tokenize( selector );\n\t\t}\n\t\ti = group.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( group[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\t}\n\treturn cached;\n};\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tmatch = tokenize( selector );\n\n\tif ( !seed ) {\n\t\t// Try to minimize operations if there is only one group\n\t\tif ( match.length === 1 ) {\n\n\t\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t\ttokens = match[0] = match[0].slice( 0 );\n\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\t\tcontext.nodeType === 9 && documentIsHTML &&\n\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\t\tif ( !context ) {\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\n\t\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t\t}\n\n\t\t\t// Fetch a seed set for right-to-left matching\n\t\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\ttoken = tokens[i];\n\n\t\t\t\t// Abort if we hit a combinator\n\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\t\tif ( (seed = find(\n\t\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\t\trsibling.test( tokens[0].type ) && context.parentNode || context\n\t\t\t\t\t)) ) {\n\n\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\tcompile( selector, match )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector )\n\t);\n\treturn results;\n}\n\n// Deprecated\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\n// Check sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Initialize with the default document\nsetDocument();\n\n// Always assume the presence of duplicates if sort doesn't\n// pass them to our comparison function (as in Google Chrome).\n[0, 0].sort( sortOrder );\nsupport.detectDuplicates = hasDuplicate;\n\n// EXPOSE\n/*if ( typeof define === \"function\" && define.amd ) {\n\tdefine(function() { return Sizzle; });\n} else {\n\twindow.Sizzle = Sizzle;\n}*/\n// EXPOSE\n\n/**\n * @namespace Ink.Dom.Selector\n * @static\n */\n\n/**\n * Alias for the Sizzle selector engine\n *\n * @method select\n * @param {String} selector CSS selector to search for elements\n * @param {DOMElement} [context] By default the search is done in the document element. However, you can specify an element as search context\n * @param {Array} [results] By default this is considered an empty array. But if you want to merge it with other searches you did, pass their result array through here.\n * @return {Array} Array of resulting DOM Elements\n * @sample Ink_Dom_Selector_select.html\n */\n\n/**\n * Filters elements that match a CSS selector.\n *\n * @method matches\n * @param {String} selector CSS selector to search for elements\n * @param {Array} matches Elements to be 'matched' with\n * @return {Array} Elements that matched\n * @sample Ink_Dom_Selector_matches.html\n */\n\n/**\n * Checks if an element matches a given selector\n *\n * @method matchesSelector\n * @param {DOMElement} element Element to test\n * @param {String} selector CSS selector to test the element with\n * @return {Boolean} True if element matches the CSS selector\n * @sample Ink_Dom_Selector_matchesSelector.html \n */\n\nreturn {\n select: Sizzle,\n matches: Sizzle.matches,\n matchesSelector: Sizzle.matchesSelector\n};\n\n\n}); //( window );\n","/**\n * Animate.css Utility\n *\n * This module is a wrapper around animate.css's CSS classes to produce animation.\n * It contains options to ease common tasks, like listen to the \"animationend\" event with all necessary prefixes, remove the necessary class names when the animation finishes, or configure the duration of your animation with the necessary browser prefix.\n *\n * @module Ink.UI.Animate_1\n * @version 1\n */\n\nInk.createModule('Ink.UI.Animate', 1, ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Css_1'], function (Common, InkEvent, Css) {\n 'use strict';\n\n var animationPrefix = (function (el) {\n return ('animationName' in el.style) ? 'animation' :\n ('webkitAnimationName' in el.style) ? 'webkitAnimation' : null;\n }(document.createElement('div')));\n\n var animationEndEventName = {\n animation: 'animationend',\n webkitAnimation: 'webkitAnimationEnd'\n }[animationPrefix];\n\n /**\n * @class Ink.UI.Animate_1\n * @constructor\n *\n * @param {Element} element Animated element\n * @param {Object} options Options object\n * @param {String} options.animation Animation name\n * @param {String|Number} [options.duration] Duration name (fast|medium|slow) or duration in milliseconds. Defaults to 'medium'.\n * @param {Boolean} [options.removeClass] Flag to remove the CSS class when finished animating. Defaults to false.\n * @param {Function} [options.onEnd] Callback for the animation end\n *\n * @sample Ink_UI_Animate_1.html\n *\n **/\n function Animate() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n Animate._name = 'Animate_1';\n\n Animate._optionDefinition = {\n trigger: ['Element', null],\n duration: ['String', 'slow'], // Actually a string with a duration name, or a number of ms\n animation: ['String'],\n removeClass: ['Boolean', true],\n onEnd: ['Function', function () {}]\n };\n\n Animate.prototype._init = function () {\n if (!isNaN(parseInt(this._options.duration, 10))) {\n this._options.duration = parseInt(this._options.duration, 10);\n }\n\n if (this._options.trigger) {\n InkEvent.observe(this._options.trigger, 'click', Ink.bind(function () {\n this.animate();\n }, this)); // later\n } else {\n this.animate();\n }\n };\n\n Animate.prototype.animate = function () {\n Animate.animate(this._element, this._options.animation, this._options);\n };\n\n Ink.extendObj(Animate, {\n /**\n * Browser prefix for the CSS animations.\n *\n * @property _animationPrefix\n * @private\n **/\n _animationPrefix: animationPrefix,\n\n /**\n * Boolean which says whether this browser has CSS3 animation support.\n *\n * @property animationSupported\n **/\n animationSupported: !!animationPrefix,\n\n /**\n * Prefixed 'animationend' event name.\n *\n * @property animationEndEventName\n **/\n animationEndEventName: animationEndEventName,\n\n /**\n * Animate an element using one of the animate.css classes\n *\n * **Note: This is a utility method inside the `Animate` class, which you can access through `Animate.animate()`. Do not mix these up.**\n *\n * @static\n * @method animate\n * @param {Element} element Animated element\n * @param {String} animation Animation name\n * @param {Object} [options] Options object, containing:\n * @param {Function} [options.onEnd=null] Callback for animation end.\n * @param {Boolean} [options.removeClass=false] Whether to remove the Css class when finished.\n * @param {String|Number} [options.duration=medium] Duration name (the fast|medium|slow strings) or, duration in milliseconds.\n *\n * @return {void}\n * @public\n *\n * @sample Ink_UI_Animate_1_animate.html\n **/\n animate: function (element, animation, options) {\n element = Common.elOrSelector(element);\n\n if (typeof options === 'number' || typeof options === 'string') {\n options = { duration: options };\n } else if (!options) {\n options = {};\n }\n\n if (typeof arguments[3] === 'function') {\n options.onEnd = arguments[3];\n }\n\n if (typeof options.duration !== 'number' && typeof options.duration !== 'string') {\n options.duration = 400;\n }\n\n if (!Animate.animationSupported) {\n if (options.onEnd) {\n setTimeout(function () {\n options.onEnd(null);\n }, 0);\n }\n return;\n }\n\n if (typeof options.duration === 'number') {\n element.style[animationPrefix + 'Duration'] = options.duration + 'ms';\n } else if (typeof options.duration === 'string') {\n Css.addClassName(element, options.duration);\n }\n\n Css.addClassName(element, ['animated', animation]);\n\n function onAnimationEnd(event) {\n if (event.target !== element) { return; }\n if (event.animationName !== animation) { return; }\n if (options.onEnd) { options.onEnd(event); }\n if (options.removeClass) {\n Css.removeClassName(element, animation);\n }\n if (typeof options.duration === 'string') {\n Css.removeClassName(element, options.duration);\n }\n element.removeEventListener(animationEndEventName, onAnimationEnd, false);\n }\n\n element.addEventListener(animationEndEventName, onAnimationEnd, false);\n }\n });\n\n Common.createUIComponent(Animate);\n\n return Animate;\n});\n","/**\n * Flexible Carousel\n * @module Ink.UI.Carousel_1\n * @version 1\n */\n\nInk.createModule('Ink.UI.Carousel', '1',\n ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Css_1', 'Ink.Dom.Element_1', 'Ink.UI.Pagination_1', 'Ink.Dom.Browser_1', 'Ink.Dom.Selector_1'],\n function(Common, InkEvent, Css, InkElement, Pagination, Browser/*, Selector*/) {\n 'use strict';\n\n /*\n * TODO:\n * keyboardSupport\n */\n\n function limitRange(n, min, max) {\n return Math.min(max, Math.max(min, n));\n }\n\n var requestAnimationFrame = window.requestAnimationFrame ||\n function (cb) { return setTimeout(cb, 1000 / 30); };\n\n /**\n * @class Ink.UI.Carousel_1\n * @constructor\n *\n * @param {String|Element} selector DOM element or element id\n * @param {Object} [options] Carousel Options\n * @param {Integer} [options.autoAdvance] Milliseconds to wait before auto-advancing pages. Set to 0 to disable auto-advance. Defaults to 0.\n * @param {String} [options.axis] Axis of the carousel. Set to 'y' for a vertical carousel. Defaults to 'x'.\n * @param {Number} [options.initialPage] Initial index page of the carousel. Defaults to 0.\n * @param {Boolean} [options.spaceAfterLastSlide=true] If there are not enough slides to fill the full width of the last page, leave white space. Defaults to `true`.\n * @param {Boolean} [options.swipe] Enable swipe support if available. Defaults to true.\n * @param {Mixed} [options.pagination] Either an ul element to add pagination markup to or an `Ink.UI.Pagination` instance to use.\n * @param {Function} [options.onChange] Callback to be called when the page changes.\n *\n * @sample Ink_UI_Carousel_1.html\n */\n function Carousel() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n Carousel._name = 'Carousel_1';\n\n Carousel._optionDefinition = {\n autoAdvance: ['Integer', 0],\n axis: ['String', 'x'],\n initialPage: ['Integer', 0],\n spaceAfterLastSlide: ['Boolean', true],\n keyboardSupport:['Boolean', false],\n pagination: ['String', null],\n onChange: ['Function', null],\n onInit: ['Function', function () {}],\n swipe: ['Boolean', true]\n // TODO exponential swipe\n // TODO specify break point for next page when moving finger\n };\n\n Carousel.prototype = {\n _init: function () {\n this._handlers = {\n paginationChange: Ink.bindMethod(this, '_onPaginationChange'),\n windowResize: InkEvent.throttle(Ink.bindMethod(this, 'refit'), 200)\n };\n\n InkEvent.observe(window, 'resize', this._handlers.windowResize);\n\n this._isY = (this._options.axis === 'y');\n\n var ulEl = Ink.s('ul.stage', this._element);\n ulEl.style.width = '100%';\n this._ulEl = ulEl;\n\n InkElement.removeTextNodeChildren(ulEl);\n\n if (this._options.pagination == null) {\n this._currentPage = this._options.initialPage;\n }\n\n this.refit(); // recalculate this._numPages\n\n if (this._isY) {\n // Override white-space: no-wrap which is only necessary to make sure horizontal stuff stays horizontal, but breaks stuff intended to be vertical.\n this._ulEl.style.whiteSpace = 'normal';\n }\n\n if (this._options.swipe) {\n InkEvent.observe(this._element, 'touchstart', Ink.bindMethod(this, '_onTouchStart'));\n InkEvent.observe(this._element, 'touchmove', Ink.bindMethod(this, '_onTouchMove'));\n InkEvent.observe(this._element, 'touchend', Ink.bindMethod(this, '_onTouchEnd'));\n }\n\n this._setUpPagination();\n this._setUpAutoAdvance();\n\n this._options.onInit.call(this, this);\n },\n\n /**\n * Repositions elements around.\n * Measure the carousel once again, adjusting the involved elements' sizes. This is called automatically when the window resizes, in order to cater for changes from responsive media queries, for instance.\n *\n * @method refit\n * @return {void}\n * @public\n */\n refit: function() {\n var _isY = this._isY;\n\n var size = function (elm, perpendicular) {\n if (!elm) { return 0; }\n\n if (!perpendicular) {\n return InkElement.outerDimensions(elm)[_isY ? 1 : 0];\n } else {\n return InkElement.outerDimensions(elm)[_isY ? 0 : 1];\n }\n };\n\n this._liEls = Ink.ss('li.slide', this._ulEl);\n var numSlides = this._liEls.length;\n\n var contRect = this._ulEl.getBoundingClientRect();\n this._ctnLength = _isY ? contRect.bottom - contRect.top : contRect.right - contRect.left;\n this._elLength = size(this._liEls[0]);\n this._slidesPerPage = Math.floor( this._ctnLength / this._elLength ) || 1;\n if (!isFinite(this._slidesPerPage)) { this._slidesPerPage = 1; }\n\n var numPages = Math.ceil( numSlides / this._slidesPerPage );\n var numPagesChanged = this._numPages !== numPages;\n this._numPages = numPages;\n this._deltaLength = this._slidesPerPage * this._elLength;\n \n this._IE7();\n\n if (this._pagination && numPagesChanged) {\n this._pagination.setSize(this._numPages);\n }\n this.setPage(limitRange(this.getPage(), 0, this._numPages - 1));\n },\n\n _setUpPagination: function () {\n if (this._options.pagination) {\n if (Common.isDOMElement(this._options.pagination) ||\n typeof this._options.pagination === 'string') {\n // if dom element or css selector string...\n this._pagination = new Pagination(this._options.pagination, {\n size: this._numPages,\n onChange: this._handlers.paginationChange\n });\n } else {\n // assumes instantiated pagination\n this._pagination = this._options.pagination;\n this._pagination.setOnChange(this._handlers.paginationChange);\n this._pagination.setSize(this._numPages);\n }\n this._pagination.setCurrent(this._options.initialPage || 0);\n } else {\n this._currentPage = this._options.initialPage || 0;\n }\n },\n\n _setUpAutoAdvance: function () {\n if (!this._options.autoAdvance) { return; }\n var self = this;\n\n setTimeout(function autoAdvance() {\n self.nextPage(true /* wrap */);\n setTimeout(autoAdvance, self._options.autoAdvance);\n }, this._options.autoAdvance);\n },\n\n /**\n * Refits elements for IE7 because it doesn't support inline-block.\n *\n * @method _IE7\n * @private\n */\n _IE7: function () {\n if (Browser.IE && '' + Browser.version.split('.')[0] === '7') {\n // var numPages = this._numPages;\n var slides = Ink.ss('li.slide', this._ulEl);\n var stl = function (prop, val) {slides[i].style[prop] = val; };\n for (var i = 0, len = slides.length; i < len; i++) {\n stl('position', 'absolute');\n stl(this._isY ? 'top' : 'left', (i * this._elLength) + 'px');\n }\n }\n },\n\n _onTouchStart: function (event) {\n if (event.touches.length > 1) { return; }\n\n this._swipeData = {\n x: InkEvent.pointerX(event),\n y: InkEvent.pointerY(event)\n };\n\n var ulRect = this._ulEl.getBoundingClientRect();\n\n this._swipeData.firstUlPos = ulRect[this._isY ? 'top' : 'left'];\n\n this._swipeData.inUlX = this._swipeData.x - ulRect.left;\n this._swipeData.inUlY = this._swipeData.y - ulRect.top;\n\n setTransitionProperty(this._ulEl, 'none');\n\n this._touchMoveIsFirstTouchMove = true;\n },\n\n _onTouchMove: function (event) {\n if (event.touches.length > 1) { return; /* multitouch event, not my problem. */ }\n\n var pointerX = InkEvent.pointerX(event);\n var pointerY = InkEvent.pointerY(event);\n\n var deltaY = this._swipeData.y - pointerY;\n var deltaX = this._swipeData.x - pointerX;\n\n if (this._touchMoveIsFirstTouchMove) {\n var aDeltaY = Math.abs(deltaY);\n var aDeltaX = Math.abs(deltaX);\n\n this._touchMoveIsFirstTouchMove = undefined;\n this._scrolling = this._isY ?\n aDeltaX > aDeltaY :\n aDeltaY > aDeltaX ;\n\n if (!this._scrolling) {\n this._onAnimationFrame();\n }\n }\n\n if (!this._scrolling && this._swipeData) {\n InkEvent.stopDefault(event);\n\n this._swipeData.pointerDelta = this._isY ? deltaY : deltaX;\n this._swipeData.pointerPos = this._isY ? pointerY : pointerX;\n }\n },\n\n _onAnimationFrame: function () {\n var swipeData = this._swipeData;\n\n if (!swipeData || this._scrolling || this._touchMoveIsFirstTouchMove) { return; }\n\n var elRect = this._element.getBoundingClientRect();\n\n var newPos;\n\n if (!this._isY) {\n newPos = swipeData.pointerPos - swipeData.inUlX - elRect.left;\n } else {\n newPos = swipeData.pointerPos - swipeData.inUlY - elRect.top;\n }\n\n this._ulEl.style[this._isY ? 'top' : 'left'] = newPos + 'px';\n\n requestAnimationFrame(Ink.bindMethod(this, '_onAnimationFrame'));\n },\n\n _onTouchEnd: function (event) {\n if (this._swipeData && this._swipeData.pointerPos && !this._scrolling && !this._touchMoveIsFirstTouchMove) {\n var snapToNext = 0.1; // swipe 10% of the way to change page\n\n var pointerDelta = this._swipeData.pointerDelta;\n\n var curPage = this.getPage();\n\n // How many pages were advanced? May be fractional.\n var progressInPages = pointerDelta / this._elLength / this._slidesPerPage;\n\n // Have we advanced enough to change page?\n if (Math.abs(progressInPages) > snapToNext) {\n curPage += Math[ pointerDelta < 0 ? 'floor' : 'ceil' ](progressInPages);\n }\n\n curPage = limitRange(curPage, 0, this._numPages - 1);\n\n // If something used to calculate progressInPages was zero, we get NaN here.\n if (!isNaN(curPage)) {\n this.setPage(curPage);\n }\n\n InkEvent.stopDefault(event);\n }\n\n setTransitionProperty(this._ulEl, null /* transition: left, top */);\n this._swipeData = null;\n this._touchMoveIsFirstTouchMove = undefined;\n this._scrolling = undefined;\n },\n\n _onPaginationChange: function(pgn) {\n this._setPage(pgn.getCurrent());\n },\n\n /**\n * Gets the current page index\n * @method getPage\n * @return {Number} The current page number\n * @public\n **/\n getPage: function () {\n if (this._pagination) {\n return this._pagination.getCurrent();\n } else {\n return this._currentPage || 0;\n }\n },\n\n /**\n * Gets the Ink Pagination element this carousel is using.\n * @method getPagination\n * @return {Pagination} The pagination instance, if any. Otherwise, `null`.\n * @public\n **/\n getPagination: function () {\n return this._pagination || null;\n },\n\n /**\n * Sets the current page index\n * @method setPage\n * @param {Number} page Index of the destination page.\n * @param {Boolean} [wrap=false] Flag to activate circular counting (for example, if you set the page to `5` and there are only 4 pages, you're actually going to the first page).\n * @return {void}\n * @public\n **/\n setPage: function (page, wrap) {\n if (wrap) {\n // Pages outside the range [0..this._numPages] are wrapped.\n page = page % this._numPages;\n if (page < 0) { page = this._numPages - page; }\n }\n page = limitRange(page, 0, this._numPages - 1);\n\n if (page === this._currentPage) {\n if (this._swipeData) {\n this._setPage(page); // Just advance the view.\n }\n return;\n }\n\n if (this._pagination) {\n this._pagination.setCurrent(page); // _setPage is called by pagination because it listens to its Change event.\n } else {\n this._setPage(page);\n }\n },\n\n _setPage: function (page) {\n var _lengthToGo = page * this._deltaLength;\n var isLastPage = page === (this._numPages - 1);\n\n if (!this._options.spaceAfterLastSlide && isLastPage && page > 0) { \n var _itemsInLastPage = this._liEls.length - (page * this._slidesPerPage);\n if(_itemsInLastPage < this._slidesPerPage) {\n _lengthToGo = ((page - 1) * this._deltaLength) + (_itemsInLastPage * this._elLength);\n }\n }\n\n this._ulEl.style[ this._isY ? 'top' : 'left'] =\n ['-', (_lengthToGo / this._ctnLength) * 100, '%'].join('');\n\n if (this._options.onChange) {\n this._options.onChange.call(this, page);\n }\n\n this._currentPage = page;\n },\n\n /**\n * Goes to the next page\n * @method nextPage\n * @param {Boolean} [wrap=false] Flag to loop from last page to first page.\n * @return {void}\n * @public\n **/\n nextPage: function (wrap) {\n this.setPage(this.getPage() + 1, wrap);\n },\n\n /**\n * Goes to the previous page\n * @method previousPage\n * @param {Boolean} [wrap=false] Flag to loop from first page to last page.\n * @return {void}\n * @public\n **/\n previousPage: function (wrap) { this.setPage(this.getPage() - 1, wrap); },\n\n /**\n * Returns how many slides fit into a page\n * @method getSlidesPerPage\n * @return {Number} The number of slides per page\n * @public\n */\n getSlidesPerPage: function() {\n return this._slidesPerPage;\n },\n\n /**\n * Get the amount of pages in the carousel.\n * @method getTotalPages\n * @return {Number} The number of pages\n * @public\n */\n getTotalPages: function() {\n return this._numPages;\n },\n\n /**\n * Get the stage element (your UL with the class \".stage\").\n * @method getStageElm\n * @public\n * @return {Element} Stage element\n **/\n getStageElm: function() {\n return this._ulEl;\n },\n\n /**\n * Get a list of your slides (elements with the \".slide\" class inside your stage)\n * @method getSlidesList\n * @return {Element[]} Array containing the slides.\n * @public\n */\n getSlidesList: function() {\n return this._liEls;\n },\n\n /**\n * Get the total number of slides\n * @method getTotalSlides\n * @return {Number} The number of slides\n * @public\n */\n getTotalSlides: function() {\n return this.getSlidesList().length;\n }\n };\n\n function setTransitionProperty(el, newTransition) {\n el.style.transitionProperty =\n el.style.oTransitionProperty =\n el.style.msTransitionProperty =\n el.style.mozTransitionProperty =\n el.style.webkitTransitionProperty = newTransition;\n }\n\n Common.createUIComponent(Carousel);\n\n return Carousel;\n\n});\n","/**\n * Closing utilities\n * @module Ink.UI.Close_1\n * @version 1\n */\nInk.createModule('Ink.UI.Close', '1', ['Ink.Dom.Event_1','Ink.Dom.Element_1'], function(InkEvent, InkElement) {\n 'use strict';\n\n /**\n * Subscribes clicks on the document.body.\n * Whenever an element with the classes \".ink-close\" or \".ink-dismiss\" is clicked, this module finds an ancestor \".ink-alert\" or \".ink-alert-block\" element and removes it from the DOM.\n * This module should be created only once per page.\n * \n * @class Ink.UI.Close\n * @constructor\n * @example\n * \n *\n * @sample Ink_UI_Close_1.html\n */\n function Close() {\n InkEvent.observe(document.body, 'click', function(ev) {\n var el = InkEvent.element(ev);\n\n el = InkElement.findUpwardsByClass(el, 'ink-close') ||\n InkElement.findUpwardsByClass(el, 'ink-dismiss');\n\n if (!el) {\n return; // ink-close or ink-dismiss class not found\n }\n\n var toRemove = InkElement.findUpwardsByClass(el, 'ink-alert') ||\n InkElement.findUpwardsByClass(el, 'ink-alert-block') ||\n el;\n\n if (toRemove) {\n InkEvent.stop(ev);\n InkElement.remove(toRemove);\n }\n });\n }\n\n Close._name = 'Close_1';\n\n return Close;\n});\n","/**\n * Auxiliar utilities for UI Modules\n * @module Ink.UI.Common_1\n * @version 1\n */\n \nInk.createModule('Ink.UI.Common', '1', ['Ink.Dom.Element_1', 'Ink.Net.Ajax_1','Ink.Dom.Css_1','Ink.Dom.Selector_1','Ink.Util.Url_1'], function(InkElement, Ajax,Css,Selector,Url) {\n\n 'use strict';\n\n var nothing = {} /* a marker, for reference comparison. */;\n\n var keys = Object.keys || function (obj) {\n var ret = [];\n for (var k in obj) if (obj.hasOwnProperty(k)) {\n ret.push(k);\n }\n return ret;\n };\n\n var es6WeakMapSupport = 'WeakMap' in window;\n var instances = es6WeakMapSupport ? new WeakMap() : null;\n // Old Registry\n var _reg = [];\n var domRegistry = {\n get: function get(el) {\n return es6WeakMapSupport ?\n instances.get(el) :\n _reg[el.getAttribute('__InkInstance')];\n },\n set: function set(el, thing) {\n if (es6WeakMapSupport) {\n instances.set(el, thing);\n } else {\n el.setAttribute('__InkInstance', _reg.push(thing) - 1);\n }\n }\n };\n\n /**\n * @namespace Ink.UI.Common_1\n */\n\n var Common = {\n\n /**\n * Supported Ink Layouts\n *\n * @property Layouts\n * @type Object\n * @readOnly\n */\n Layouts: {\n TINY: 'tiny',\n SMALL: 'small',\n MEDIUM: 'medium',\n LARGE: 'large',\n XLARGE: 'xlarge'\n },\n\n /**\n * Checks if an item is a valid DOM Element.\n *\n * @method isDOMElement\n * @static\n * @param {Mixed} o The object to be checked.\n * @return {Boolean} True if it's a valid DOM Element.\n * @example\n * var el = Ink.s('#element');\n * if( Ink.UI.Common.isDOMElement( el ) === true ){\n * // It is a DOM Element.\n * } else {\n * // It is NOT a DOM Element.\n * }\n */\n isDOMElement: InkElement.isDOMElement,\n\n /**\n * Checks if an item is a valid integer.\n *\n * @method isInteger\n * @static\n * @param {Mixed} n The value to be checked.\n * @return {Boolean} True if it's a valid integer.\n * @example\n * var value = 1;\n * if( Ink.UI.Common.isInteger( value ) === true ){\n * // It is an integer.\n * } else {\n * // It is NOT an integer.\n * }\n */\n isInteger: function(n) {\n return (typeof n === 'number' && n % 1 === 0);\n },\n\n /**\n * Gets a DOM Element. \n *\n * @method elOrSelector\n * @static\n * @param {Element|String} elOrSelector DOM Element or CSS Selector\n * @param {String} fieldName The name of the field. Commonly used for debugging.\n * @return {Element} Returns the Element passed or the first result of the CSS Selector. Otherwise it throws an exception.\n * @example\n * // In case there are several .myInput, it will retrieve the first found\n * var el = Ink.UI.Common.elOrSelector('.myInput','My Input');\n */\n elOrSelector: function(elOrSelector, fieldName) {\n if (!Common.isDOMElement(elOrSelector)) {\n var t = Selector.select(elOrSelector);\n if (t.length === 0) {\n Ink.warn(fieldName + ' must either be a DOM Element or a selector expression!\\nThe script element must also be after the DOM Element itself.');\n return null;\n }\n return t[0];\n }\n return elOrSelector;\n },\n\n /**\n * Like `elOrSelector` but returns an array of elements.\n *\n * @method elsOrSelector\n *\n * @static\n * @param {Element|Array|String} elsOrSelector DOM Element, array of DOM Elements, or CSS Selector\n * @param {String} [fieldName] The name of the field. Used for the error shown when no elements are found.\n * @param {Boolean} required If this is true, throw an error instead of returning an empty array.\n * @return {Array} The selected Elements, or the given Elements\n * @example\n * var elements = Ink.UI.Common.elsOrSelector('input.my-inputs', 'My Input');\n */\n elsOrSelector: function(elsOrSelector, fieldName, required) {\n var ret;\n if (typeof elsOrSelector === 'string') {\n ret = Selector.select(elsOrSelector);\n } else if (Common.isDOMElement(elsOrSelector)) {\n ret = [elsOrSelector];\n } else if (elsOrSelector && typeof elsOrSelector === 'object' && typeof elsOrSelector.length === 'number') {\n ret = elsOrSelector;\n }\n\n if (ret && ret.length) {\n return ret;\n } else {\n if (required) {\n throw new TypeError(fieldName + ' must either be a DOM Element, an Array of elements, or a selector expression!\\nThe script element must also be after the DOM Element itself.');\n } else {\n return [];\n }\n }\n },\n\n /**\n * Gets options an object and element's metadata.\n *\n * The element's data attributes take precedence. Values from the element's data-atrributes are coerced into the required type.\n *\n * @method options\n *\n * @param {Object} [fieldId] Name to be used in error reports.\n * @param {Object} defaults Object with the options' types and defaults.\n * @param {Object} overrides Options to override the defaults. Usually passed when instantiating an UI module.\n * @param {Element} [element] Element with data-attributes\n * @return {Object} An object containing all the option values.\n *\n * @example\n *\n * this._options = Ink.UI.Common.options('MyComponent', {\n * 'anobject': ['Object', null], // Defaults to null\n * 'target': ['Element', null],\n * 'stuff': ['Number', 0.1],\n * 'stuff2': ['Integer', 0],\n * 'doKickFlip': ['Boolean', false],\n * 'targets': ['Elements'], // Required option since no default was given\n * 'onClick': ['Function', null]\n * }, options || {}, elm)\n *\n * @example\n *\n * ### Note about booleans\n *\n * Here is how options are read from the markup\n * data-attributes, for several values`data-a-boolean`.\n *\n * Options considered true:\n *\n * - `data-a-boolean=\"true\"`\n * - (Every other value which is not on the list below.)\n * \n * Options considered false:\n *\n * - `data-a-boolean=\"false\"`\n * - `data-a-boolean=\"\"`\n * - `data-a-boolean`\n *\n * Options which go to default:\n *\n * - (no attribute). When `data-a-boolean` is ommitted, the\n * option is not considered true nor false, and as such\n * defaults to what is in the `defaults` argument.\n *\n **/\n options: function (fieldId, defaults, overrides, element) {\n // TODO Change Common.options's signature? the below looks better, more manageable\n // var options = Common.options({\n // element: this._element,\n // modName: constructor._name,\n // options: constructor._optionDefinition,\n // defaults: constructor._globalDefaults\n // });\n\n if (typeof fieldId !== 'string') {\n element = overrides;\n overrides = defaults;\n defaults = fieldId;\n fieldId = '';\n }\n overrides = overrides || {};\n var out = {};\n var dataAttrs = element ? InkElement.data(element) : {};\n var fromDataAttrs;\n var type;\n var lType;\n var defaultVal;\n\n var invalidStr = function (str) {\n if (fieldId) { str = fieldId + ': \"' + ('' + str).replace(/\"/, '\\\\\"') + '\"'; }\n return str;\n };\n\n var quote = function (str) {\n return '\"' + ('' + str).replace(/\"/, '\\\\\"') + '\"';\n };\n\n var invalidThrow = function (str) {\n throw new Error(invalidStr(str));\n };\n\n var invalid = function (str) {\n Ink.error(invalidStr(str) + '. Ignoring option.');\n };\n\n function optionValue(key) {\n type = defaults[key][0];\n lType = type.toLowerCase();\n defaultVal = defaults[key].length === 2 ? defaults[key][1] : nothing;\n\n if (!type) {\n invalidThrow('Ink.UI.Common.options: Always specify a type!');\n }\n if (!(lType in Common._coerce_funcs)) {\n invalidThrow('Ink.UI.Common.options: ' + defaults[key][0] + ' is not a valid type. Use one of ' + keys(Common._coerce_funcs).join(', '));\n\n }\n if (!defaults[key].length || defaults[key].length > 2) {\n invalidThrow('the \"defaults\" argument must be an object mapping option names to [typestring, optional] arrays.');\n }\n\n if (key in dataAttrs) {\n fromDataAttrs = Common._coerce_from_string(lType, dataAttrs[key], key, fieldId);\n // (above can return `nothing`)\n } else {\n fromDataAttrs = nothing;\n }\n\n if (fromDataAttrs !== nothing) {\n if (!Common._options_validate(fromDataAttrs, lType)) {\n invalid('(' + key + ' option) Invalid ' + lType + ' ' + quote(fromDataAttrs));\n return defaultVal;\n } else {\n return fromDataAttrs;\n }\n } else if (key in overrides) {\n return overrides[key];\n } else if (defaultVal !== nothing) {\n return defaultVal;\n } else {\n invalidThrow('Option ' + key + ' is required!');\n }\n }\n\n for (var key in defaults) {\n if (defaults.hasOwnProperty(key)) {\n out[key] = optionValue(key);\n }\n }\n\n return out;\n },\n\n _coerce_from_string: function (type, val, paramName, fieldId) {\n if (type in Common._coerce_funcs) {\n return Common._coerce_funcs[type](val, paramName, fieldId);\n } else {\n return val;\n }\n },\n\n _options_validate: function (val, type) {\n if (type in Common._options_validate_types) {\n return Common._options_validate_types[type].call(Common, val);\n } else {\n // 'object' options cannot be passed through data-attributes.\n // Json you say? Not any good to embed in HTML.\n return false;\n }\n },\n\n _coerce_funcs: (function () {\n var ret = {\n element: function (val) {\n return Common.elOrSelector(val, '');\n },\n elements: function (val) {\n return Common.elsOrSelector(val, '', false /*not required, so don't throw an exception now*/);\n },\n object: function (val) { return val; },\n number: function (val) { return parseFloat(val); },\n 'boolean': function (val) {\n return !(val === 'false' || val === '' || val === null);\n },\n string: function (val) { return val; },\n 'function': function (val, paramName, fieldId) {\n Ink.error(fieldId + ': You cannot specify the option \"' + paramName + '\" through data-attributes because it\\'s a function');\n return nothing;\n }\n };\n ret['float'] = ret.integer = ret.number;\n return ret;\n }()),\n\n _options_validate_types: (function () {\n var types = {\n string: function (val) {\n return typeof val === 'string';\n },\n number: function (val) {\n return typeof val === 'number' && !isNaN(val) && isFinite(val);\n },\n integer: function (val) {\n return val === Math.round(val);\n },\n element: function (val) {\n return Common.isDOMElement(val);\n },\n elements: function (val) {\n return val && typeof val === 'object' && typeof val.length === 'number' && val.length;\n },\n 'boolean': function (val) {\n return typeof val === 'boolean';\n },\n object: function () { return true; }\n };\n types['float'] = types.number;\n return types;\n }()),\n\n /**\n * Deep copy (clone) an object.\n * Note: The object cannot have referece loops.\n *\n * @method clone\n * @static\n * @deprecated\n * @param {Object} o The object to be cloned/copied.\n * @return {Object} Returns the result of the clone/copy.\n * @example\n * var originalObj = {\n * key1: 'value1',\n * key2: 'value2',\n * key3: 'value3'\n * };\n * var cloneObj = Ink.UI.Common.clone( originalObj );\n */\n clone: function(o) {\n try {\n return JSON.parse( JSON.stringify(o) );\n } catch (ex) {\n throw new Error('Given object cannot have loops!');\n }\n },\n\n\n /**\n * Gets an element's one-base index relative to its parent.\n *\n * Deprecated. Use Ink.Dom.Element.parentIndexOf instead.\n *\n * @method childIndex\n * @deprecated\n * @static\n * @param {Element} childEl Valid DOM Element.\n * @return {Number} Numerical position of an element relatively to its parent.\n * @example\n * \n *
    \n *
  • One
  • \n *
  • Two
  • \n *
  • Three
  • \n *
  • Four
  • \n *
\n *\n * \n */\n childIndex: InkElement.parentIndexOf,\n\n /**\n * AJAX JSON request shortcut method\n * It provides a more convenient way to do an AJAX request and expect a JSON response.It also offers a callback option, as third parameter, for better async handling.\n *\n * @method ajaxJSON\n * @static\n * @async\n * @param {String} endpoint Valid URL to be used as target by the request.\n * @param {Object} params This field is used in the thrown Exception to identify the parameter.\n * @param {Function} cb Callback for the request.\n * @return {void}\n * @public\n * @example\n * // In case there are several .myInput, it will retrieve the first found\n * var el = Ink.UI.Common.elOrSelector('.myInput','My Input');\n */\n ajaxJSON: function(endpoint, params, cb) {\n new Ajax(\n endpoint,\n {\n evalJS: 'force',\n method: 'POST',\n parameters: params,\n\n onSuccess: function( r) {\n try {\n r = r.responseJSON;\n if (r.status !== 'ok') {\n throw 'server error: ' + r.message;\n }\n cb(null, r);\n } catch (ex) {\n cb(ex);\n }\n },\n\n onFailure: function() {\n cb('communication failure');\n }\n }\n );\n },\n\n\n /**\n * Gets the current Ink layout.\n *\n * @method currentLayout\n * @static\n * @return {String} A string representation of the current layout name.\n * @public\n * @example\n * var inkLayout = Ink.UI.Common.currentLayout();\n * if (inkLayout === 'small') {\n * // ...\n * }\n */\n currentLayout: function() {\n var i, f, k, v, el, detectorEl = Selector.select('#ink-layout-detector')[0];\n if (!detectorEl) {\n detectorEl = document.createElement('div');\n detectorEl.id = 'ink-layout-detector';\n for (k in Common.Layouts) {\n if (Common.Layouts.hasOwnProperty(k)) {\n v = Common.Layouts[k];\n el = document.createElement('div');\n el.className = 'show-' + v + ' hide-all';\n el.setAttribute('data-ink-layout', v);\n detectorEl.appendChild(el);\n }\n }\n document.body.appendChild(detectorEl);\n }\n\n for (i = 0, f = detectorEl.children.length; i < f; ++i) {\n el = detectorEl.children[i];\n if (Css.getStyle(el, 'display') === 'block') {\n return el.getAttribute('data-ink-layout');\n }\n }\n\n return 'large';\n },\n\n\n /**\n * Sets the location's hash (window.location.hash).\n *\n * @method hashSet\n * @static\n * @param {Object} o Object with the info to be placed in the location's hash.\n * @return {void}\n * @example\n * // It will set the location's hash like: #key1=value1&key2=value2&key3=value3\n * Ink.UI.Common.hashSet({\n * key1: 'value1',\n * key2: 'value2',\n * key3: 'value3'\n * });\n */\n hashSet: function(o) {\n if (typeof o !== 'object') { throw new TypeError('o should be an object!'); }\n var hashParams = Url.getAnchorString();\n hashParams = Ink.extendObj(hashParams, o);\n window.location.hash = Url.genQueryString('', hashParams).substring(1);\n },\n\n /**\n * Removes children nodes from a given object.\n * This method was initially created to help solve a problem in Internet Explorer(s) that occurred when trying to set the innerHTML of some specific elements like 'table'.\n *\n * @method cleanChildren\n * @static\n * @param {Element} parentEl Valid DOM Element\n * @return {void}\n * @public\n * @example\n * \n *
    \n *
  • One
  • \n *
  • Two
  • \n *
  • Three
  • \n *
  • Four
  • \n *
\n *\n * \n *\n * \n *
    \n */\n cleanChildren: function(parentEl) {\n if( !Common.isDOMElement(parentEl) ){\n throw new Error('Please provide a valid DOMElement');\n }\n InkElement.setHTML(parentEl, '');\n },\n\n /**\n * Stores the id and/or classes of an element in an object.\n *\n * @method storeIdAndClasses\n * @static\n * @param {Element} fromEl Valid DOM Element to get the id and classes from.\n * @param {Object} inObj Object where the id and classes will be saved.\n * @return {void}\n * @public\n * @example\n *
    \n *\n * \n */\n storeIdAndClasses: function(fromEl, inObj) {\n if( !Common.isDOMElement(fromEl) ){\n throw 'Please provide a valid Element as first parameter';\n }\n\n var id = fromEl.id;\n if (id) {\n inObj._id = id;\n }\n\n var classes = fromEl.className;\n if (classes) {\n inObj._classes = classes;\n }\n },\n\n /**\n * Sets the id and className properties of an element based \n *\n * @method restoreIdAndClasses\n * @static\n * @param {Element} toEl Valid DOM Element to set the id and classes on.\n * @param {Object} inObj Object where the id and classes to be set are. This method uses the same format as the one given in `storeIdAndClasses`\n * @return {void}\n * @public\n * @example\n *
    \n *\n * \n *\n * \n *
    \n */\n restoreIdAndClasses: function(toEl, inObj) {\n\n if( !Common.isDOMElement(toEl) ){\n throw 'Please provide a valid Element as first parameter';\n }\n\n if (inObj._id && toEl.id !== inObj._id) {\n toEl.id = inObj._id;\n }\n\n if (inObj._classes && toEl.className.indexOf(inObj._classes) === -1) {\n if (toEl.className) { toEl.className += ' ' + inObj._classes; }\n else { toEl.className = inObj._classes; }\n }\n\n if (inObj._instanceId && !toEl.getAttribute('data-instance')) {\n toEl.setAttribute('data-instance', inObj._instanceId);\n }\n },\n\n _warnDoubleInstantiation: function (elm, newInstance) {\n var instances = Common.getInstance(elm);\n\n if (getName(newInstance) === '') { return; }\n if (!instances) { return; }\n\n var nameWithoutVersion = getName(newInstance);\n\n if (!nameWithoutVersion) { return; }\n\n for (var i = 0, len = instances.length; i < len; i++) {\n if (nameWithoutVersion === getName(instances[i])) {\n // Yes, I am using + to concatenate and , to split\n // arguments.\n //\n // Elements can't be concatenated with strings, but if\n // they are passed in an argument, modern debuggers will\n // pretty-print them and make it easy to find them in the\n // element inspector.\n //\n // On the other hand, if strings are passed as different\n // arguments, they get pretty printed. And the pretty\n // print of a string has quotes around it.\n //\n // If some day people find out that strings are not\n // just text and they start preserving contextual\n // information, then by all means change this to a\n // regular concatenation.\n //\n // But they won't. So don't change this.\n Ink.warn('Creating more than one ' + nameWithoutVersion + 'for the same element.',\n '(Was creating a ' + nameWithoutVersion + ' on:', elm, ').');\n return false;\n }\n }\n\n function getName(thing) {\n return ((thing.constructor && (thing.constructor._name)) ||\n thing._name ||\n '').replace(/_.*?$/, '');\n }\n\n return true;\n },\n\n /**\n * Saves an object (which should inherit BaseUIComponent) in the registry, associated with an element. You can retrieve it later by calling getInstance.\n *\n * This won't allow two instances of the same class to be created on a single element. It will fail and print a warning to the console if you try to do it. That is a common error when using Ink.\n *\n * @method registerInstance\n * @static\n * @param {Object} inst Object to be registered\n * @param {Element} [el=inst._element] Element to associate with `inst`. Defaults to `_element` property of `inst`.\n * @return {Boolean} `true` if we could create the instance, `false` otherwise.\n */\n registerInstance: function(inst, el) {\n if (!inst) { return; }\n\n if (!el) { el = inst._element; }\n\n if (!Common.isDOMElement(el)) { throw new TypeError('Ink.UI.Common.registerInstance: The element passed in is not a DOM element!'); }\n\n // [todo] this belongs in the BaseUIComponent's initialization\n if (Common._warnDoubleInstantiation(el, inst) === false) {\n return false;\n }\n\n var instances = domRegistry.get(el);\n\n if (!instances) {\n instances = [];\n domRegistry.set(el, instances);\n }\n\n instances.push(inst);\n\n return true;\n },\n\n /**\n * Unregisters (removes from the registry) a UI component instance from whatever element it's on.\n *\n * @method unregisterInstance\n * @static\n * @param {String} inst Instance to be unregistered.\n * @return {void}\n * @public\n */\n unregisterInstance: function(inst) {\n if (!inst || !inst._element) { return; }\n var instances = domRegistry.get(inst._element);\n for (var i = 0, len = instances.length; i < len; i++) {\n if (instances[i] === inst) {\n instances.splice(i, 1);\n }\n }\n },\n\n /**\n * Gets an UI component instance from an element.\n *\n * This function is already available in the UI components' classes themselves. You can call Modal.getInstance() and retrieve a modal.\n *\n * @method getInstance\n * @static\n * @param {String|Element} el Element from which we want the instances. A selector is okay.\n * @param {BaseUIComponent} [UIComponent] If you pass an Ink UI component class (Like Ink.UI.Modal or Ink.UI.Carousel), this won't return an array of all instances associated with the element. Instead it will return only the object which is an instance of that class.\n * @return {Object|Array} Returns an array containing all the instances in that element.\n * @public\n */\n getInstance: function(el, UIComponent) {\n var givenEl = el; // So we can warn it later.\n\n el = Common.elOrSelector(el);\n\n if (!Common.isDOMElement(el)) {\n Ink.warn('Ink.UI.Common: getInstance called on non-element (' + givenEl + ')');\n return [];\n }\n\n var instances = domRegistry.get(el);\n\n if (!instances) {\n instances = [];\n }\n\n if (typeof UIComponent !== 'function') {\n return instances;\n }\n\n for (var i = 0, len = instances.length; i < len; i++) {\n if (instances[i] instanceof UIComponent) {\n return instances[i];\n }\n }\n\n return null;\n },\n\n /**\n * Gets an instance based on a selector.\n *\n * @method getInstanceFromSelector\n * @static\n * @param {String} selector CSS selector to get the instances from. This function will only use the *first* element.\n * @return {Object|Array} Returns an array of the instances in the selected element.\n * @public\n */\n getInstanceFromSelector: function(selector) {\n return Common.getInstance(selector);\n },\n\n /**\n * Gets all the instance ids\n *\n * @method getInstanceIds\n * @static\n * @return {Array} Collection of instance ids\n */\n getInstanceIds: function() {\n if( _reg.length > 0 ) return _reg;\n var res = [];\n for (var id in instances) {\n if (instances.hasOwnProperty(id)) {\n res.push( id );\n }\n }\n return res;\n },\n\n /**\n * Gets all the instances\n *\n * @method getInstances\n * @static\n * @return {Array} Collection of existing instances.\n * @public\n */\n getInstances: function() {\n if( _reg.length > 0 ) return _reg;\n var res = [];\n for (var id in instances) {\n if (instances.hasOwnProperty(id)) {\n res.push( instances[id] );\n }\n }\n return res;\n },\n\n /**\n * Boilerplate method to destroy a component.\n * Components should copy this method as its destroy method and modify it.\n *\n * @method destroyComponent\n * @return {void}\n * @public\n * @static\n */\n destroyComponent: function() {\n Common.unregisterInstance(this);\n this._element.parentNode.removeChild(this._element);\n }\n };\n\n\n\n\n /**\n * Ink UI Base Class\n **/\n\n function warnStub() {\n /* jshint validthis: true */\n if (!this || this === window || typeof this.constructor !== 'function') { return; }\n Ink.warn('You called a method on an incorrectly instantiated ' + this.constructor._name + ' component. Check the warnings above to see what went wrong.');\n }\n\n function stub(prototype, obj) {\n for (var k in prototype) if (prototype.hasOwnProperty(k)) {\n if (k === 'constructor') { continue; }\n if (typeof obj[k] === 'function') {\n obj[k] = warnStub;\n }\n }\n }\n\n /**\n * Ink UI Base Class\n *\n * You don't use this class directly, or inherit from it directly.\n *\n * See createUIComponent() (in this module) for how to create a UI component and inherit from this. It's not plain old JS inheritance, for several reasons.\n *\n * @class Ink.UI.Common.BaseUIComponent\n * @constructor\n *\n * @param {Element|String} element Element to associate this UI component with. It's the element you can get later using `comp.getElement()`\n * @param {Object} [options] Options to pass to the component. You should see your specific UI component for this information.\n * @public\n **/\n function BaseUIComponent(element, options) {\n var constructor = this.constructor;\n var _name = constructor._name;\n\n if (!this || this === window) {\n throw new Error('Use \"new InkComponent()\" instead of \"InkComponent()\"');\n }\n\n if (this && !(this instanceof BaseUIComponent)) {\n throw new Error('You forgot to call Ink.UI.Common.createUIComponent() on this module!');\n }\n\n if (!element && !constructor._componentOptions.elementIsOptional) {\n Ink.error(new Error(_name + ': You need to pass an element or a selector as the first argument to \"new ' + _name + '()\"'));\n return;\n } else {\n this._element = Common.elsOrSelector(element,\n _name + ': An element with the selector \"' + element + '\" was not found!')[0];\n }\n\n if (!this._element && !constructor._componentOptions.elementIsOptional) {\n isValidInstance = false;\n Ink.error(new Error(element + ' does not match an element on the page. You need to pass a valid selector to \"new ' + _name + '\".'));\n }\n\n this._options = Common.options(_name, constructor._optionDefinition, options, this._element);\n\n var isValidInstance = BaseUIComponent._validateInstance(this) === true;\n\n if (isValidInstance && typeof this._init === 'function') {\n try {\n this._init.apply(this, arguments);\n } catch(e) {\n isValidInstance = false;\n Ink.error(e);\n }\n }\n\n if (!isValidInstance) {\n BaseUIComponent._stubInstance(this, constructor, _name);\n } else if (this._element) {\n Common.registerInstance(this);\n }\n }\n\n /**\n * Calls the `instance`'s _validate() method so it can validate itself.\n *\n * Returns false if the method exists, was called, but no Error was returned or thrown.\n *\n * @method _validateInstance\n * @private\n */\n BaseUIComponent._validateInstance = function (instance) {\n var err;\n\n if (typeof instance._validate !== 'function') { return true; }\n\n try {\n err = instance._validate();\n } catch (e) {\n err = e;\n }\n\n if (err instanceof Error) {\n instance._validationError = err;\n return false;\n }\n\n return true;\n };\n\n\n /**\n * Replaces every method in the instance with stub functions which just call Ink.warn().\n *\n * This avoids breaking the page when there are errors.\n *\n * @method _stubInstance\n * @param instance\n * @param constructor\n * @param name\n * @private\n */\n BaseUIComponent._stubInstance = function (instance, constructor, name) {\n stub(constructor.prototype, instance);\n stub(BaseUIComponent.prototype, instance);\n Ink.warn(name + ' was not correctly created. ' + (instance._validationError || ''));\n };\n\n // TODO BaseUIComponent.setGlobalOptions = function () {}\n // TODO BaseUIComponent.createMany = function (selector) {}\n BaseUIComponent.getInstance = function (elOrSelector) {\n elOrSelector = Common.elOrSelector(elOrSelector);\n return Common.getInstance(elOrSelector, this /* get instance by constructor */);\n };\n\n Ink.extendObj(BaseUIComponent.prototype, {\n /**\n * Get an UI component's option's value.\n *\n * @method getOption\n * @param {String} name The option's name.\n * @return {Mixed} The option value, or undefined if nothing is found.\n *\n * @example\n *\n * var myUIComponent = new Modal('#element', { trigger: '#trigger' }); // or anything else inheriting BaseUIComponent\n * myUIComponent.getOption('trigger'); // -> The trigger element (not the selector string, mind you)\n *\n **/\n getOption: function (name) {\n if (this.constructor && !(name in this.constructor._optionDefinition)) {\n Ink.error('\"' + name + '\" is not an option for ' + this.constructor._name);\n return undefined;\n }\n\n return this._options[name];\n },\n\n /**\n * Sets an option's value.\n *\n * @method getOption\n * @param {String} name Name of the option.\n * @param {Mixed} value New option value.\n * @return {void}\n * @public\n *\n * @example\n *\n * var myUIComponent = new Modal(...);\n * myUIComponent.setOption('trigger', '#some-element');\n **/\n setOption: function (name, value) {\n if (this.constructor && !(name in this.constructor._optionDefinition)) {\n Ink.error('\"' + name + ' is not an option for ' + this.constructor._name);\n return;\n }\n\n this._options[name] = value;\n },\n\n /**\n * Get the element associated with an UI component (IE the one you used in the constructor)\n *\n * @method getElement\n * @return {Element} The component's element.\n *\n * @example\n * var myUIComponent = new Modal('#element'); // or anything else inheriting BaseUIComponent\n * myUIComponent.getElement(); // -> The '#element' (not the selector string, mind you).\n *\n **/\n getElement: function () {\n return this._element;\n }\n });\n\n Common.BaseUIComponent = BaseUIComponent;\n\n /**\n * Take a constructor, and make it an Ink UI component.\n *\n * Makes it inherit BaseUIComponent, makes sure it has the basic properties Ink.UI.Common needs it to have, adds the necessary static methods, sets its options, etc.\n *\n * @method createUIComponent\n * @param {Function} theConstructor UI component constructor. It should have an _init function in its prototype, an _optionDefinition object, and a _name property indicating its name.\n * @param {Object} [options] Options hash, containing:\n * @param {Boolean} [options.elementIsOptional=false] Whether the element argument is optional (For example, when the component might work on existing markup or create its own).\n * @return {void}\n * @public\n **/\n Common.createUIComponent = function createUIComponent(theConstructor, options) {\n theConstructor._componentOptions = options || {};\n\n function assert(test, msg) {\n if (!test) {\n throw new Error('Ink.UI_1.createUIComponent: ' + msg);\n }\n }\n\n function assertProp(prop, propType, message) {\n var propVal = theConstructor[prop];\n // Check that the property was passed\n assert(typeof propVal !== 'undefined',\n theConstructor + ' doesn\\'t have a \"' + prop + '\" property. ' + message);\n // Check that its type is correct\n assert(propType && typeof propVal === propType,\n 'typeof ' + theConstructor + '.' + prop + ' is not \"' + propType + '\". ' + message);\n }\n\n assert(typeof theConstructor === 'function',\n 'constructor argument is not a function!');\n\n assertProp('_name', 'string', 'This property is used for error ' +\n 'messages. Set it to the full module path and version (Ink.My.Module_1).');\n assertProp('_optionDefinition', 'object', 'This property contains the ' +\n 'option names, types and defaults. See Ink.UI.Common.options() for reference.');\n\n // Extend the instance methods and props\n var _oldProto = theConstructor.prototype;\n\n if (typeof Object.create === 'function') {\n theConstructor.prototype = Object.create(BaseUIComponent.prototype);\n } else {\n theConstructor.prototype = (function hideF() {\n function F() {}\n F.prototype = BaseUIComponent.prototype;\n return new F();\n }());\n }\n\n Ink.extendObj(theConstructor.prototype, _oldProto);\n theConstructor.prototype.constructor = theConstructor;\n // Extend static methods\n Ink.extendObj(theConstructor, BaseUIComponent);\n };\n\n return Common;\n\n});\n","/**\n * Date selector\n * @module Ink.UI.DatePicker_1\n * @version 1\n */\n\nInk.createModule('Ink.UI.DatePicker', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1','Ink.Util.Date_1', 'Ink.Dom.Browser_1'], function(Common, Event, Css, InkElement, Selector, InkArray, InkDate ) {\n 'use strict';\n\n // Clamp a number into a min/max limit\n function clamp(n, min, max) {\n if (n > max) { n = max; }\n if (n < min) { n = min; }\n\n return n;\n }\n\n function dateishFromYMDString(YMD) {\n var split = YMD.split('-');\n return dateishFromYMD(+split[0], +split[1] - 1, +split[2]);\n }\n\n function dateishFromYMD(year, month, day) {\n return {_year: year, _month: month, _day: day};\n }\n\n function dateishFromDate(date) {\n return {_year: date.getFullYear(), _month: date.getMonth(), _day: date.getDate()};\n }\n\n /**\n * @class Ink.UI.DatePicker\n * @constructor\n * @version 1\n *\n * @param {String|Element} selector Datepicker element\n * @param {Object} [options] Options\n * @param {Boolean} [options.autoOpen] Flag to automatically open the datepicker.\n * @param {String} [options.cleanText] Text for the clean button. Defaults to 'Clear'.\n * @param {String} [options.closeText] Text for the close button. Defaults to 'Close'.\n * @param {String} [options.cssClass] CSS class to be applied on the datepicker\n * @param {String|Element} [options.pickerField] (if not using in an input[type=\"text\"]) Element which displays the DatePicker when clicked. Defaults to an \"open\" link.\n * @param {String} [options.dateRange] Enforce limits to year, month and day for the Date, ex: '1990-08-25:2020-11'\n * @param {Boolean} [options.displayInSelect] Flag to display the component in a select element.\n * @param {String|Element} [options.dayField] (if using options.displayInSelect) `select` field with days.\n * @param {String|Element} [options.monthField] (if using options.displayInSelect) `select` field with months.\n * @param {String|Element} [options.yearField] (if using options.displayInSelect) `select` field with years.\n * @param {String} [options.format] Date format string\n * @param {Object} [options.month] Hash of month names. Defaults to english month names. January is 1.\n * @param {String} [options.nextLinkText] Text for the previous button. Defaults to '«'.\n * @param {String} [options.ofText] Text to show between month and year. Defaults to ' of '.\n * @param {Boolean} [options.onFocus] If the datepicker should open when the target element is focused. Defaults to true.\n * @param {Function} [options.onMonthSelected] Callback to execute when the month is selected.\n * @param {Function} [options.onSetDate] Callback to execute when the date is set.\n * @param {Function} [options.onYearSelected] Callback to execute when the year is selected.\n * @param {String} [options.position] Position for the datepicker. Either 'right' or 'bottom'. Defaults to 'right'.\n * @param {String} [options.prevLinkText] Text for the previous button. Defaults to '«'.\n * @param {Boolean} [options.showClean] If the clean button should be visible. Defaults to true.\n * @param {Boolean} [options.showClose] If the close button should be visible. Defaults to true.\n * @param {Boolean} [options.shy] If the datepicker should hide automatically when the user clicks outside. Defaults to true.\n * @param {String} [options.startDate] Date to define initial month. Must be in yyyy-mm-dd format.\n * @param {Number} [options.startWeekDay] First day of the week. Sunday is zero. Defaults to 1 (Monday).\n * @param {Function} [options.validYearFn] Callback to execute when 'rendering' the month (in the month view)\n * @param {Function} [options.validMonthFn] Callback to execute when 'rendering' the month (in the month view)\n * @param {Function} [options.validDayFn] Callback to execute when 'rendering' the day (in the month view)\n * @param {Function} [options.nextValidDateFn] Function to calculate the next valid date, given the current. Useful when there's invalid dates or time frames.\n * @param {Function} [options.prevValidDateFn] Function to calculate the previous valid date, given the current. Useful when there's invalid dates or time frames.\n * @param {Object} [options.wDay] Hash of week day names. Sunday is 0. Defaults to { 0:'Sunday', 1:'Monday', etc...\n * @param {String} [options.yearRange] Enforce limits to year for the Date, ex: '1990:2020' (deprecated)\n *\n * @sample Ink_UI_DatePicker_1.html\n */\n function DatePicker() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n DatePicker._name = 'DatePicker_1';\n\n DatePicker._optionDefinition = {\n autoOpen: ['Boolean', false],\n cleanText: ['String', 'Clear'],\n closeText: ['String', 'Close'],\n pickerField: ['Element', null],\n containerElement:['Element', null],\n cssClass: ['String', 'ink-calendar bottom'],\n dateRange: ['String', null],\n \n // use this in a \n *\n * By applying this UI class to the above input, you get a tag field with the tags \"initial\" and \"value\". The class preserves the original input element. It remains hidden and is updated with new tag information dynamically, so regular HTML form logic still applies.\n *\n * Below \"input\" refers to the current value of the input tag (updated as the user enters text, of course), and \"output\" refers to the value which this class writes back to said input tag.\n *\n * @class Ink.UI.TagField\n * @version 1\n * @constructor\n * @param {String|Element} element Selector or DOM Input Element.\n * @param {Object} [options] Options object\n * @param {String|Array} [options.tags] Initial tags in the input\n * @param {Boolean} [options.allowRepeated] Flag to allow user to input several tags. Defaults to true.\n * @param {RegExp} [options.separator] Split the input by this RegExp. Defaults to /[,;(space)]+/g (spaces, commas and semicolons)\n * @param {String} [options.outSeparator] Use this string to separate each tag from the next in the output. Defaults to ','.\n * @param {Boolean} [options.autoSplit] Flag to activate tag creation when the user types a separator. Defaults to true.\n * @param {Integer} [options.maxTags] Maximum number of tags allowed. Set to -1 for no limit. Defaults to -1.\n * @example\n */\n function TagField() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n TagField._name = 'TagField_1';\n\n TagField._optionDefinition = {\n tags: ['String', []],\n tagQuery: ['Object', null],\n tagQueryAsync: ['Object', null],\n allowRepeated: ['Boolean', false],\n maxTags: ['Integer', -1],\n outSeparator: ['String', ','],\n separator: ['String', /[,; ]+/g],\n autoSplit: ['Boolean', true]\n };\n\n TagField.prototype = {\n /**\n * Init function called by the constructor\n * \n * @method _init\n * @private\n */\n _init: function() {\n var o = this._options;\n if (typeof o.separator === 'string') {\n o.separator = new RegExp(o.separator, 'g');\n }\n\n if (typeof o.tags === 'string') {\n // coerce to array using the separator\n o.tags = this._readInput(o.tags);\n }\n\n Css.addClassName(this._element, 'hide-all');\n\n this._viewElm = InkElement.create('div', {\n className: 'ink-tagfield',\n insertAfter: this._element\n });\n\n this._input = InkElement.create('input', {\n type: 'text',\n className: 'new-tag-input',\n insertBottom: this._viewElm\n });\n\n var tags = [].concat(o.tags, this._tagsFromMarkup(this._element));\n\n this._tags = [];\n\n InkArray.each(tags, Ink.bindMethod(this, '_addTag'));\n\n InkEvent.observe(this._input, 'keyup', Ink.bindEvent(this._onKeyUp, this));\n InkEvent.observe(this._input, 'change', Ink.bindEvent(this._onKeyUp, this));\n InkEvent.observe(this._input, 'keydown', Ink.bindEvent(this._onKeyDown, this));\n InkEvent.observe(this._input, 'blur', Ink.bindEvent(this._onBlur, this));\n InkEvent.observe(this._viewElm, 'click', Ink.bindEvent(this._refocus, this));\n },\n\n destroy: function () {\n InkElement.remove(this._viewElm);\n Css.removeClassName(this._element, 'hide-all');\n },\n\n _tagsFromMarkup: function (element) {\n var tagname = element.tagName.toLowerCase();\n if (tagname === 'input') {\n return this._readInput(element.value);\n } else if (tagname === 'select') {\n return InkArray.map(element.getElementsByTagName('option'), function (option) {\n return InkElement.textContent(option);\n });\n } else {\n throw new Error('Cannot read tags from a ' + tagname + ' tag. Unknown tag');\n }\n },\n\n _tagsToMarkup: function (tags, element) {\n var tagname = element.tagName.toLowerCase();\n if (tagname === 'input') {\n if (this._options.separator) {\n element.value = tags.join(this._options.outSeparator);\n }\n } else if (tagname === 'select') {\n element.innerHTML = '';\n InkArray.each(tags, function (tag) {\n var opt = InkElement.create('option', {selected: 'selected'});\n InkElement.setTextContent(opt, tag);\n element.appendChild(opt);\n });\n } else {\n throw new Error('TagField: Cannot read tags from a ' + tagname + ' tag. Unknown tag');\n }\n },\n\n _addTag: function (tag) {\n if (this._options.maxTags !== -1 &&\n this._tags.length >= this._options.maxTags) {\n return;\n }\n if ((!this._options.allowRepeated &&\n InkArray.inArray(tag, this._tags, tag)) || !tag) {\n return false;\n }\n var elm = InkElement.create('span', {\n className: 'ink-tag',\n setTextContent: tag + ' '\n });\n\n var remove = InkElement.create('span', {\n className: 'remove fa fa-times',\n insertBottom: elm\n });\n InkEvent.observe(remove, 'click', Ink.bindEvent(this._removeTag, this, null));\n\n var spc = document.createTextNode(' ');\n\n this._tags.push(tag);\n this._viewElm.insertBefore(elm, this._input);\n this._viewElm.insertBefore(spc, this._input);\n this._tagsToMarkup(this._tags, this._element);\n },\n\n _readInput: function (text) {\n if (this._options.separator) {\n return InkArray.filter(text.split(this._options.separator), isTruthy);\n } else {\n return [text];\n }\n },\n\n _onKeyUp: function () { // TODO control input box size\n if (!this._options.autoSplit) {\n return;\n }\n\n var split;\n if (!buggySplit) {\n split = this._input.value.split(this._options.separator);\n } else {\n split = splitFunction(this._input.value, this._options.separator);\n }\n\n if (split.length <= 1) {\n return;\n }\n var last = split[split.length - 1];\n split = split.splice(0, split.length - 1);\n split = InkArray.filter(split, isTruthy);\n \n InkArray.each(split, Ink.bind(this._addTag, this));\n this._input.value = last;\n },\n\n _onKeyDown: function (event) {\n if (event.which === enterKey) {\n return this._onEnterKeyDown(event);\n } else if (event.which === backspaceKey) {\n return this._onBackspaceKeyDown();\n } else if (this._removeConfirm) {\n // user pressed another key, cancel removal from a backspace key\n this._unsetRemovingVisual(this._tags.length - 1);\n }\n },\n\n /**\n * When the user presses backspace twice on the empty input, we delete the last tag on the field.\n * @method onBackspaceKeyDown\n * @return {void}\n * @private\n */\n _onBackspaceKeyDown: function () {\n if (this._input.value) { return; }\n\n if (this._removeConfirm) {\n this._unsetRemovingVisual(this._tags.length - 1);\n this._removeTag(this._tags.length - 1);\n this._removeConfirm = null;\n } else {\n this._setRemovingVisual(this._tags.length - 1);\n }\n },\n\n _onEnterKeyDown: function (event) {\n var tag = this._input.value;\n if (tag) {\n this._addTag(tag);\n this._input.value = '';\n }\n InkEvent.stopDefault(event);\n },\n\n _onBlur: function () {\n this._addTag(this._input.value);\n this._input.value = '';\n },\n\n /* For when the user presses backspace.\n * Set the style of the tag so that it seems like it's going to be removed\n * if they press backspace again. */\n _setRemovingVisual: function (tagIndex) {\n var elm = this._viewElm.children[tagIndex];\n if (!elm) { return; }\n\n Css.addClassName(elm, 'tag-deleting');\n\n this._removeRemovingVisualTimeout = setTimeout(Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex), 4000);\n InkEvent.observe(this._input, 'blur', Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex));\n this._removeConfirm = true;\n },\n _unsetRemovingVisual: function (tagIndex) {\n var elm = this._viewElm.children[tagIndex];\n if (elm) {\n Css.removeClassName(elm, 'tag-deleting');\n clearTimeout(this._removeRemovingVisualTimeout);\n }\n this._removeConfirm = null;\n },\n\n _removeTag: function (event) {\n var index;\n if (typeof event === 'object') { // click event on close button\n var elm = InkEvent.element(event).parentNode;\n index = InkElement.parentIndexOf(this._viewElm, elm);\n } else if (typeof event === 'number') { // manual removal\n index = event;\n }\n this._tags = InkArray.remove(this._tags, index, 1);\n InkElement.remove(this._viewElm.children[index]);\n this._tagsToMarkup(this._tags, this._element);\n },\n\n _refocus: function (event) {\n this._input.focus();\n InkEvent.stop(event);\n return false;\n }\n };\n\n Common.createUIComponent(TagField);\n\n return TagField;\n});\n","/**\n * Toggle the visibility of elements.\n * @module Ink.UI.Toggle_1\n * @version 1\n */\n\n Ink.createModule('Ink.UI.Toggle', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, InkEvent, Css, InkElement, Selector, InkArray ) {\n 'use strict';\n\n /**\n * *Important note: Do NOT use this as a dropdown! Use Ink.UI.Dropdown for that.*\n *\n * You need two elements to use Toggle: the `trigger` element, and the `target` element (or elements). The default behaviour is to toggle the `target`(s) when you click the `trigger`.\n *\n * The toggle has a state. It is either \"on\" or \"off\". It works by switching between the CSS classes in `classNameOn` and `classNameOff` according to the current state.\n *\n * When you initialize the Toggle, it will check if the targets are visible to figure out what the initial state is. You can force the toggle to consider itself turned \"on\" or \"off\" by setting the `initialState` option to `true` or `false`, respectively.\n *\n * You can get the current state of the Toggle by calling `getState`, or by checking if your `trigger` element has the \"active\" class.\n * The state can be changed through JavaScript. Just call `setState(true)`\n * to turn the Toggle on (or `setState(false)` to turn it off).\n *\n * @class Ink.UI.Toggle\n * @constructor\n * @version 1\n * @param {String|Element} selector Trigger element. By clicking this, the target (or targets) are triggered.\n * @param {Object} [options] Options object, containing:\n *\n * @param {String} options.target CSS Selector that specifies the elements that this component will toggle\n * @param {Boolean} [options.isAccordion] Set this to true to signal that this toggle is part of an accordion with other toggles. The toggles of an accordion must be common descendants of an element with the class \"accordion\". If they're not, Ink will warn you about this on the console.\n * @param {String} [options.classNameOn] CSS class to toggle when on. Defaults to 'show-all'.\n * @param {String} [options.classNameOff] CSS class to toggle when off. Defaults to 'hide-all'.\n * @param {String} [options.triggerEvent] Event that will trigger the toggling. Defaults to 'click'.\n * @param {Boolean} [options.closeOnClick] Flag to toggle the targe off when clicking outside the toggled content. Defaults to true.\n * @param {Boolean} [options.canToggleAnAncestor] Set to true if you want the toggle to target ancestors of itself. Defaults to false.\n * @param {String} [options.closeOnInsideClick] Toggle off when a child element matching this selector is clicked. Set to null to deactivate the check. Defaults to 'a[href]'.\n * @param {Boolean} [options.initialState] Flag to define initial state. false: off, true: on, null: markup. Defaults to null.\n * @param {Function} [options.onChangeState] Callback when the toggle state changes. Return `false` to cancel the event.\n *\n * @sample Ink_UI_Toggle_1_constructor.html\n */\n function Toggle(){\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n Toggle._name = 'Toggle_1';\n\n Toggle._optionDefinition = {\n target: ['Elements'],\n triggerEvent: ['String', 'click'],\n closeOnClick: ['Boolean', true],\n canToggleAnAncestor: ['Boolean', false],\n isAccordion: ['Boolean', false],\n initialState: ['Boolean', null], // May be true, false, or null to be what it is right now\n classNameOn: ['String', 'show-all'],\n classNameOff: ['String', 'hide-all'],\n closeOnInsideClick: ['String', 'a[href]'], // closes the toggle when a target is clicked and it is a link\n onChangeState: ['Function', null]\n };\n\n Toggle.prototype = {\n\n /**\n * Init function called by the constructor\n *\n * @method _init\n * @private\n */\n _init: function(){\n var i, len;\n\n this._targets = Common.elsOrSelector(this._options.target);\n\n // Boolean option handling\n this._options.closeOnClick = this._options.closeOnClick;\n // Actually a throolean\n if (this._options.initialState === null) {\n this._options.initialState = Css.hasClassName(this._targets[0], this._options.classNameOn);\n }\n\n if (this._options.classNameOn !== 'show-all' || this._options.classNameOff !== 'hide-all') {\n for (i = 0, len = this._targets.length; i < len; i++) {\n Css.removeClassName(this._targets[i], 'show-all');\n Css.removeClassName(this._targets[i], 'hide-all');\n }\n }\n\n if (this._options.isAccordion) {\n this._accordionContainer = InkElement.findUpwardsByClass(\n this._element, 'accordion');\n if (!this._accordionContainer) {\n Ink.warn('Ink.UI.Toggle_1: This toggle has the isToggle option set to `true`, but is not a descendant of an element with the class \"accordion\"! Because of this, it won\\'t be able to find other toggles in the same accordion and cooperate with them.');\n }\n }\n\n this._constructing = true;\n\n this._bindEvents();\n\n if (this._options.initialState !== null) {\n this.setState(this._options.initialState, true);\n } else {\n // Add initial classes matching the current \"display\" of the object.\n var state = Css.getStyle(this._targets[0], 'display') !== 'none';\n this.setState(state, true);\n }\n // Aditionally, remove any inline \"display\" style.\n for (i = 0, len = this._targets.length; i < len; i++) {\n if (this._targets[i].style.display) {\n this._targets[i].style.display = ''; // becomes default\n }\n }\n\n this._element.setAttribute('data-is-toggle-trigger', 'true');\n\n this._constructing = false;\n },\n\n /**\n * @method _bindEvents\n * @private\n */\n _bindEvents: function () {\n if ( this._options.triggerEvent ) {\n InkEvent.on(\n this._element,\n this._options.triggerEvent,\n Ink.bind(this._onTriggerEvent, this));\n }\n if( this._options.closeOnClick ){\n InkEvent.observe( document, 'click', Ink.bind(this._onOutsideClick, this));\n }\n if( this._options.closeOnInsideClick ) {\n var sel = this._options.closeOnInsideClick;\n if (sel.toString() === 'true') {\n sel = '*';\n }\n InkEvent.observeMulti(this._targets, 'click', Ink.bind(function (e) {\n if ( InkElement.findUpwardsBySelector(InkEvent.element(e), sel) ) {\n this.setState(false, true);\n }\n }, this));\n }\n },\n\n /**\n * Event handler. It's responsible for handling the `triggerEvent` as defined in the options.\n *\n * This will trigger the toggle.\n *\n * @method _onTriggerEvent\n * @param {Event} event\n * @private\n */\n _onTriggerEvent: function( event ){\n // When the togglee is a child of the toggler, we get the togglee's events here. We have to check that this event is for us.\n var target = InkEvent.element(event);\n\n var isAncestorOfClickedElement = InkArray.some(this._targets, function (thisOne) {\n return thisOne === target || InkElement.isAncestorOf(thisOne, target);\n });\n\n if (!this._options.canToggleAnAncestor && isAncestorOfClickedElement) {\n return;\n }\n\n var has = this.getState();\n this.setState(!has, true);\n if (!has && this._firstTime) {\n this._firstTime = false;\n }\n\n InkEvent.stopDefault(event);\n },\n\n /**\n * Be compatible with accordions\n *\n * @method _updateAccordion\n **/\n _updateAccordion: function () {\n if (!this._accordionContainer) { return; }\n if (this.getState() === false) { return; }\n\n var elms = Selector.select('[data-is-toggle-trigger]', this._accordionContainer);\n for (var i = 0; i < elms.length; i++) {\n var otherToggle = Toggle.getInstance(elms[i]);\n if (otherToggle && (otherToggle !== this) && otherToggle.getState() === true) {\n otherToggle.setState(false, true);\n }\n }\n },\n\n /**\n * Click handler. Will handle clicks outside the toggle component.\n *\n * @method _onOutsideClick\n * @param {Event} event\n * @private\n */\n _onOutsideClick: function( event ){\n var tgtEl = InkEvent.element(event);\n var shades;\n\n if (!InkElement.isAncestorOf(document.documentElement, tgtEl)) {\n // Because if the element was removed while the click event was\n // bubbling, we can't tell where it came from\n return;\n }\n\n if (InkElement.findUpwardsBySelector(tgtEl, '[data-is-toggle-trigger=\"true\"]')) { return; }\n\n var ancestorOfTargets = InkArray.some(this._targets, function (target) {\n return InkElement.isAncestorOf(target, tgtEl) || target === tgtEl;\n });\n\n if( (this._element === tgtEl) || InkElement.isAncestorOf(this._element, tgtEl) || ancestorOfTargets) {\n return;\n } else if( (shades = Ink.ss('.ink-shade')).length ) {\n var shadesLength = shades.length;\n\n for( var i = 0; i < shadesLength; i++ ){\n if( InkElement.isAncestorOf(shades[i],tgtEl) && InkElement.isAncestorOf(shades[i],this._element) ){\n return;\n }\n }\n }\n\n this.setState(false, true); // dismiss\n },\n\n /**\n * Sets the state of the toggle. (on/off)\n *\n * @method setState\n * @param {Boolean} on New state (on/off)\n * @param {Boolean} callHandler Whether to call the onChangeState handler.\n * @return {void}\n */\n setState: function (on, callHandler) {\n if (on === this.getState() && !this._constructing) { return; }\n\n var i, len;\n if (this._group && on) {\n for (i = 0, len = this._group.length; i < len; i++) {\n if (this._group[i].getState() === true) {\n this._group[i].setState(false, true);\n }\n }\n }\n\n if (callHandler && typeof this._options.onChangeState === 'function') {\n var ret = this._options.onChangeState(on);\n if (ret === false) { return false; } // Canceled by the event handler\n }\n for (i = 0, len = this._targets.length; i < len; i++) {\n Css.addRemoveClassName(this._targets[i], this._options.classNameOn, on);\n Css.addRemoveClassName(this._targets[i], this._options.classNameOff, !on);\n }\n Css.addRemoveClassName(this._element, 'active', on);\n\n if (this._accordionContainer) {\n this._updateAccordion();\n }\n },\n\n /**\n * Gets the state of the toggle. (on/off)\n *\n * @method getState\n *\n * @return {Boolean} whether the toggle is toggled on.\n */\n getState: function () {\n return Css.hasClassName(this._element, 'active');\n }\n };\n\n Common.createUIComponent(Toggle);\n\n return Toggle;\n});\n","/**\n * Content Tooltips\n * @module Ink.UI.Tooltip_1\n * @version 1\n */\nInk.createModule('Ink.UI.Tooltip', '1', ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1', 'Ink.Dom.Selector_1', 'Ink.Util.Array_1', 'Ink.Dom.Css_1', 'Ink.Dom.Browser_1'], function (Common, InkEvent, InkElement, Selector, InkArray, Css) {\n 'use strict';\n\n /**\n * Tooltips are useful as a means to display information about functionality while avoiding clutter.\n *\n * Tooltips show up when you hover elements which \"have\" tooltips.\n *\n * This class will \"give\" a tooltip to many elements, selected by its first argument (`target`). This is contrary to the other UI modules in Ink, which are created once per element.\n *\n * You can define options either through the second argument of the Tooltip constructor, or as data-attributes in each `target` element. Options set through data-attributes all start with \"data-tip\", and override options passed into the Tooltip constructor.\n *\n * @class Ink.UI.Tooltip\n * @constructor\n *\n * @param {Element|String} target Target element or selector of elements, to display the tooltips on.\n * @param {Object} [options] Options object\n * @param {String} [options.text] Text content for the tooltip.\n * @param {String} [options.html] HTML for the tooltip. Same as above, but won't escape HTML.\n * @param {String} [options.where] Positioning for the tooltip. Options are 'up', 'down', 'left', 'right', 'mousemove' (follows the cursor), and 'mousefix' (stays fixed). Defaults to 'up'.\n * \n * @param {String} [options.color] Color of the tooltip. Options are red, orange, blue, green and black. Default is white.\n * @param {Number} [options.fade] Number of seconds to fade in/out. Defaults to 0.3.\n * @param {Boolean} [options.forever] Flag to prevent the tooltip from being erased when the mouse hovers away from the target.\n * @param {Number} [options.timeout] Number of seconds the tooltip will stay open. Useful together with options.forever. Defaults to 0.\n * @param {Number} [options.delay] Time the tooltip waits until it is displayed. Useful to avoid getting the attention of the user unnecessarily\n * @param {Element|Selector} [options.template] Element or selector containing HTML to be cloned into the tooltips. Can be a hidden element, because CSS `display` is set to `block`.\n * @param {String} [options.templatefield] Selector within the template element to choose where the text is inserted into the tooltip. Useful when a wrapper DIV is required.\n * @param {Number} [options.left] Spacing from the target to the tooltip, when `where` is `mousemove` or `mousefix`. Defaults to 10.\n * @param {Number} [options.top] Spacing from the target to the tooltip, when `where` is `mousemove` or `mousefix`. Defaults to 10.\n * @param {Number} [options.spacing] Spacing between the tooltip and the target element, when `where` is not `mousemove` or `mousefix`. Defaults to 8.\n * \n * @sample Ink_UI_Tooltip_1.html\n */\n function Tooltip(element, options) {\n this._init(element, options || {});\n }\n\n function EachTooltip(root, elm) {\n this._init(root, elm);\n }\n\n var transitionDurationName,\n transitionPropertyName,\n transitionTimingFunctionName;\n (function () { // Feature detection\n var test = document.createElement('DIV');\n var names = ['transition', 'oTransition', 'msTransition', 'mozTransition',\n 'webkitTransition'];\n for (var i = 0; i < names.length; i++) {\n if (typeof test.style[names[i] + 'Duration'] !== 'undefined') {\n transitionDurationName = names[i] + 'Duration';\n transitionPropertyName = names[i] + 'Property';\n transitionTimingFunctionName = names[i] + 'TimingFunction';\n break;\n }\n }\n }());\n\n // Body or documentElement\n var bodies = document.getElementsByTagName('body');\n var body = bodies.length ? bodies[0] : document.documentElement;\n\n Tooltip.prototype = {\n _init: function(element, options) {\n var elements;\n\n this.options = Ink.extendObj({\n where: 'up',\n zIndex: 10000,\n left: 10,\n top: 10,\n spacing: 8,\n forever: 0,\n color: '',\n timeout: 0,\n delay: 0,\n template: null,\n templatefield: null,\n fade: 0.3,\n text: ''\n }, options || {});\n\n if (typeof element === 'string') {\n elements = Selector.select(element);\n } else if (typeof element === 'object') {\n elements = [element];\n } else {\n throw 'Element expected';\n }\n\n this.tooltips = [];\n\n for (var i = 0, len = elements.length; i < len; i++) {\n this.tooltips[i] = new EachTooltip(this, elements[i]);\n }\n },\n /**\n * Destroys the tooltips created by this instance\n *\n * @method destroy\n * @return {void}\n * @public\n */\n destroy: function () {\n InkArray.each(this.tooltips, function (tooltip) {\n tooltip._destroy();\n });\n this.tooltips = null;\n this.options = null;\n }\n };\n\n EachTooltip.prototype = {\n _oppositeDirections: {\n left: 'right',\n right: 'left',\n up: 'down',\n down: 'up'\n },\n _init: function(root, elm) {\n InkEvent.observe(elm, 'mouseover', Ink.bindEvent(this._onMouseOver, this));\n InkEvent.observe(elm, 'focus', Ink.bindEvent(this._onMouseOver, this));\n InkEvent.observe(elm, 'mouseout', Ink.bindEvent(this._onMouseOut, this));\n InkEvent.observe(elm, 'blur', Ink.bindEvent(this._onMouseOut, this));\n InkEvent.observe(elm, 'mousemove', Ink.bindEvent(this._onMouseMove, this));\n\n this.root = root;\n this.element = elm;\n this._delayTimeout = null;\n this.tooltip = null;\n\n Common.registerInstance(this, this.element);\n },\n _makeTooltip: function (mousePosition) {\n if (!this._getOpt('text') &&\n !this._getOpt('html') &&\n !InkElement.hasAttribute(this.element, 'title')) {\n return false;\n }\n\n var tooltip = this._createTooltipElement();\n\n if (this.tooltip) {\n this._removeTooltip();\n }\n\n this.tooltip = tooltip;\n\n this._fadeInTooltipElement(tooltip);\n this._placeTooltipElement(tooltip, mousePosition);\n\n InkEvent.observe(tooltip, 'mouseover', Ink.bindEvent(this._onTooltipMouseOver, this));\n\n var timeout = this._getFloatOpt('timeout');\n if (timeout) {\n setTimeout(Ink.bind(function () {\n if (this.tooltip === tooltip) {\n this._removeTooltip();\n }\n }, this), timeout * 1000);\n }\n },\n _createTooltipElement: function () {\n var template = this._getOpt('template'), // User template instead of our HTML\n templatefield = this._getOpt('templatefield'),\n \n tooltip, // The element we float\n field; // Element where we write our message. Child or same as the above\n\n if (template) { // The user told us of a template to use. We copy it.\n var temp = document.createElement('DIV');\n temp.innerHTML = Common.elOrSelector(template, 'options.template').outerHTML;\n tooltip = temp.firstChild;\n \n if (templatefield) {\n field = Selector.select(templatefield, tooltip);\n if (field) {\n field = field[0];\n } else {\n throw 'options.templatefield must be a valid selector within options.template';\n }\n } else {\n field = tooltip; // Assume same element if user did not specify a field\n }\n } else { // We create the default structure\n tooltip = document.createElement('DIV');\n Css.addClassName(tooltip, 'ink-tooltip');\n Css.addClassName(tooltip, this._getOpt('color'));\n\n field = document.createElement('DIV');\n Css.addClassName(field, 'content');\n\n tooltip.appendChild(field);\n }\n \n if (this._getOpt('html')) {\n field.innerHTML = this._getOpt('html');\n } else if (this._getOpt('text')) {\n InkElement.setTextContent(field, this._getOpt('text'));\n } else {\n InkElement.setTextContent(field, this.element.getAttribute('title'));\n }\n tooltip.style.display = 'block';\n tooltip.style.position = 'absolute';\n tooltip.style.zIndex = this._getIntOpt('zIndex');\n\n return tooltip;\n },\n _fadeInTooltipElement: function (tooltip) {\n var fadeTime = this._getFloatOpt('fade');\n if (transitionDurationName && fadeTime) {\n tooltip.style.opacity = '0';\n tooltip.style[transitionDurationName] = fadeTime + 's';\n tooltip.style[transitionPropertyName] = 'opacity';\n tooltip.style[transitionTimingFunctionName] = 'ease-in-out';\n setTimeout(function () {\n tooltip.style.opacity = '1';\n }, 0); // Wait a tick\n }\n },\n _placeTooltipElement: function (tooltip, mousePosition) {\n var where = this._getOpt('where');\n\n if (mousePosition === null && (where === 'mousemove' || where === 'mousefix')) {\n // When there are no mouse coords available (focus event)\n where = 'up';\n }\n\n if (where === 'mousemove' || where === 'mousefix') {\n var mPos = mousePosition;\n this._setPos(mPos[0], mPos[1]);\n body.appendChild(tooltip);\n } else if (where.match(/(up|down|left|right)/)) {\n body.appendChild(tooltip);\n var targetElementPos = InkElement.offset(this.element);\n var tleft = targetElementPos[0],\n ttop = targetElementPos[1];\n\n var centerh = (InkElement.elementWidth(this.element) / 2) - (InkElement.elementWidth(tooltip) / 2),\n centerv = (InkElement.elementHeight(this.element) / 2) - (InkElement.elementHeight(tooltip) / 2);\n var spacing = this._getIntOpt('spacing');\n\n var tooltipDims = InkElement.elementDimensions(tooltip);\n var elementDims = InkElement.elementDimensions(this.element);\n\n var maxX = InkElement.scrollWidth() + InkElement.viewportWidth();\n var maxY = InkElement.scrollHeight() + InkElement.viewportHeight();\n \n where = this._getWhereValueInsideViewport(where, {\n left: tleft - tooltipDims[0],\n right: tleft + tooltipDims[0],\n top: ttop + tooltipDims[1],\n bottom: ttop + tooltipDims[1]\n }, {\n right: maxX,\n bottom: maxY\n });\n \n if (where === 'up') {\n ttop -= tooltipDims[1];\n ttop -= spacing;\n tleft += centerh;\n } else if (where === 'down') {\n ttop += elementDims[1];\n ttop += spacing;\n tleft += centerh;\n } else if (where === 'left') {\n tleft -= tooltipDims[0];\n tleft -= spacing;\n ttop += centerv;\n } else if (where === 'right') {\n tleft += elementDims[0];\n tleft += spacing;\n ttop += centerv;\n }\n \n var arrow = null;\n if (where.match(/(up|down|left|right)/)) {\n arrow = document.createElement('SPAN');\n Css.addClassName(arrow, 'arrow');\n Css.addClassName(arrow, this._oppositeDirections[where]);\n tooltip.appendChild(arrow);\n }\n\n var tooltipLeft = tleft;\n var tooltipTop = ttop;\n\n var toBottom = (tooltipTop + tooltipDims[1]) - maxY;\n var toRight = (tooltipLeft + tooltipDims[0]) - maxX;\n var toLeft = 0 - tooltipLeft;\n var toTop = 0 - tooltipTop;\n\n if (toBottom > 0) {\n if (arrow) { arrow.style.top = (tooltipDims[1] / 2) + toBottom + 'px'; }\n tooltipTop -= toBottom;\n } else if (toTop > 0) {\n if (arrow) { arrow.style.top = (tooltipDims[1] / 2) - toTop + 'px'; }\n tooltipTop += toTop;\n } else if (toRight > 0) {\n if (arrow) { arrow.style.left = (tooltipDims[0] / 2) + toRight + 'px'; }\n tooltipLeft -= toRight;\n } else if (toLeft > 0) {\n if (arrow) { arrow.style.left = (tooltipDims[0] / 2) - toLeft + 'px'; }\n tooltipLeft += toLeft;\n }\n\n tooltip.style.left = tooltipLeft + 'px';\n tooltip.style.top = tooltipTop + 'px';\n }\n },\n\n /**\n * Get a value for \"where\" (left/right/up/down) which doesn't put the\n * tooltip off the screen\n *\n * @method _getWhereValueInsideViewport\n * @param where {String} \"where\" value which was given by the user and we might change\n * @param bbox {BoundingBox} A bounding box like what you get from getBoundingClientRect ({top, bottom, left, right}) with pixel positions from the top left corner of the viewport.\n * @param viewport {BoundingBox} Bounding box for the viewport. \"top\" and \"left\" are omitted because these coordinates are relative to the top-left corner of the viewport so they are zero.\n *\n * @TODO: we can't use getBoundingClientRect in this case because it returns {0,0,0,0} on our uncreated tooltip.\n */\n _getWhereValueInsideViewport: function (where, bbox, viewport) {\n if (where === 'left' && bbox.left < 0) {\n return 'right';\n } else if (where === 'right' && bbox.right > viewport.right) {\n return 'left';\n } else if (where === 'up' && bbox.top < 0) {\n return 'down';\n } else if (where === 'down' && bbox.bottom > viewport.bottom) {\n return 'up';\n }\n\n return where;\n },\n _removeTooltip: function() {\n var tooltip = this.tooltip;\n if (!tooltip) {return;}\n\n var remove = Ink.bind(InkElement.remove, {}, tooltip);\n\n if (this._getOpt('where') !== 'mousemove' && transitionDurationName) {\n tooltip.style.opacity = 0;\n // remove() will operate on correct tooltip, although this.tooltip === null then\n setTimeout(remove, this._getFloatOpt('fade') * 1000);\n } else {\n remove();\n }\n this.tooltip = null;\n },\n _getOpt: function (option) {\n var dataAttrVal = InkElement.data(this.element)[InkElement._camelCase('tip-' + option)];\n if (dataAttrVal /* either null or \"\" may signify the absense of this attribute*/) {\n return dataAttrVal;\n }\n var instanceOption = this.root.options[option];\n if (typeof instanceOption !== 'undefined') {\n return instanceOption;\n }\n },\n _getIntOpt: function (option) {\n return parseInt(this._getOpt(option), 10);\n },\n _getFloatOpt: function (option) {\n return parseFloat(this._getOpt(option), 10);\n },\n _destroy: function () {\n if (this.tooltip) {\n InkElement.remove(this.tooltip);\n }\n this.root = null; // Cyclic reference = memory leaks\n this.element = null;\n this.tooltip = null;\n },\n _onMouseOver: function(e) {\n // on IE < 10 you can't access the mouse event not even a tick after it fired\n var mousePosition;\n if (e.type !== 'mouseover') {\n // No mouse coords available\n mousePosition = null;\n } else {\n mousePosition = this._getMousePosition(e);\n }\n var delay = this._getFloatOpt('delay');\n if (delay) {\n this._delayTimeout = setTimeout(Ink.bind(function () {\n if (!this.tooltip) {\n this._makeTooltip(mousePosition);\n }\n this._delayTimeout = null;\n }, this), delay * 1000);\n } else {\n this._makeTooltip(mousePosition);\n }\n },\n _onMouseMove: function(e) {\n if (this._getOpt('where') === 'mousemove' && this.tooltip) {\n var mPos = this._getMousePosition(e);\n this._setPos(mPos[0], mPos[1]);\n }\n },\n _onMouseOut: function () {\n if (!this._getIntOpt('forever')) {\n this._removeTooltip();\n }\n if (this._delayTimeout) {\n clearTimeout(this._delayTimeout);\n this._delayTimeout = null;\n }\n },\n _onTooltipMouseOver: function () {\n if (this.tooltip) { // If tooltip is already being removed, this has no effect\n this._removeTooltip();\n }\n },\n _setPos: function(left, top) {\n left += this._getIntOpt('left');\n top += this._getIntOpt('top');\n var pageDims = this._getPageXY();\n if (this.tooltip) {\n var elmDims = [InkElement.elementWidth(this.tooltip), InkElement.elementHeight(this.tooltip)];\n var scrollDim = this._getScroll();\n\n if((elmDims[0] + left - scrollDim[0]) >= (pageDims[0] - 20)) {\n left = (left - elmDims[0] - this._getIntOpt('left') - 10);\n }\n if((elmDims[1] + top - scrollDim[1]) >= (pageDims[1] - 20)) {\n top = (top - elmDims[1] - this._getIntOpt('top') - 10);\n }\n\n this.tooltip.style.left = left + 'px';\n this.tooltip.style.top = top + 'px';\n }\n },\n _getPageXY: function() {\n var cWidth = 0;\n var cHeight = 0;\n if( typeof( window.innerWidth ) === 'number' ) {\n cWidth = window.innerWidth;\n cHeight = window.innerHeight;\n } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {\n cWidth = document.documentElement.clientWidth;\n cHeight = document.documentElement.clientHeight;\n } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {\n cWidth = document.body.clientWidth;\n cHeight = document.body.clientHeight;\n }\n return [parseInt(cWidth, 10), parseInt(cHeight, 10)];\n },\n _getScroll: function() {\n var dd = document.documentElement, db = document.body;\n if (dd && (dd.scrollLeft || dd.scrollTop)) {\n return [dd.scrollLeft, dd.scrollTop];\n } else if (db) {\n return [db.scrollLeft, db.scrollTop];\n } else {\n return [0, 0];\n }\n },\n _getMousePosition: function(e) {\n return [parseInt(InkEvent.pointerX(e), 10), parseInt(InkEvent.pointerY(e), 10)];\n }\n };\n\n return Tooltip;\n});\n","/**\n * Elements in a tree structure\n * @module Ink.UI.TreeView_1\n * @version 1\n */\nInk.createModule('Ink.UI.TreeView', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, Event, Css, Element, Selector, InkArray ) {\n 'use strict';\n\n\n /**\n * Shows elements in a tree structure which can be expanded and contracted.\n * A TreeView is built with \"node\"s and \"children\". \"node\"s are `li` tags, and \"children\" are `ul` tags.\n * You can build your TreeView out of a regular UL and LI element structure which you already use to display lists with several levels.\n * If you want a node to be open when the TreeView is built, just add the data-open=\"true\" attribute to it.\n * \n * @class Ink.UI.TreeView\n * @constructor\n * @version 1\n * @param {String|Element} selector Element or selector.\n * @param {String} [options] Options object, containing:\n * @param {String} [options.node] Selector for the nodes. Defaults to 'li'.\n * @param {String} [options.children] Selector for the children. Defaults to 'ul'.\n * @param {String} [options.parentClass] CSS classes to be added to parent nodes. Defaults to 'parent'.\n * @param {String} [options.openClass] CSS classes to be added to the icon when a parent is open. Defaults to 'fa fa-minus-circle'.\n * @param {String} [options.closedClass] CSS classes to be added to the icon when a parent is closed. Defaults to 'fa fa-plus-circle'.\n * @param {String} [options.hideClass] CSS Class to toggle visibility of the children. Defaults to 'hide-all'.\n * @param {String} [options.iconTag] The name of icon tag. The component tries to find a tag with that name as a direct child of the node. If it doesn't find it, it creates it. Defaults to 'i'.\n * @param {Boolean} [options.stopDefault] Flag to stops the default behavior of the click handler. Defaults to true.\n * @example\n * \n * \n * \n * @sample Ink_UI_TreeView_1.html\n */\n function TreeView() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n TreeView._name = 'TreeView_1';\n\n TreeView._optionDefinition = {\n 'node': ['String', 'li'],\n 'children': ['String','ul'],\n 'parentClass': ['String','parent'],\n 'openNodeClass': ['String', 'open'],\n 'openClass': ['String','fa fa-minus-circle'],\n 'closedClass': ['String','fa fa-plus-circle'],\n 'hideClass': ['String','hide-all'],\n 'iconTag': ['String', 'i'],\n 'stopDefault' : ['Boolean', true]\n };\n\n TreeView.prototype = {\n /**\n * Init function called by the constructor. Sets the necessary event handlers.\n * \n * @method _init\n * @private\n */\n _init: function(){\n this._handlers = {\n click: Ink.bindEvent(this._onClick,this)\n };\n\n Event.on(this._element, 'click', this._options.node, this._handlers.click);\n\n InkArray.each(Ink.ss(this._options.node, this._element), Ink.bind(function(item){\n if( this.isParent(item) ) {\n Css.addClassName(item, this._options.parentClass);\n\n var isOpen = this.isOpen(item);\n if( !this._getIcon(item) ){\n Element.create(this._options.iconTag, { insertTop: item });\n }\n\n this._setNodeOpen(item, isOpen);\n }\n },this));\n },\n\n _getIcon: function (node) {\n return Ink.s('> ' + this._options.iconTag, node);\n },\n\n /**\n * Checks if a node is open.\n *\n * @method isOpen\n * @param {Element} node The tree node to check\n * @return {Boolean} Whether the node is open.\n **/\n isOpen: function (node) {\n if (!this._getChild(node)) {\n throw new Error('not a node!');\n }\n\n return node.getAttribute('data-open') === 'true' ||\n Css.hasClassName(node, this._options.openNodeClass);\n },\n\n /**\n * Checks if a node is a parent.\n *\n * @method isParent\n * @param {Element} node Node to check\n * @return {Boolean} Whether `node` is a parent.\n **/\n isParent: function (node) {\n return Css.hasClassName(node, this._options.parentClass) ||\n this._getChild(node) != null;\n },\n\n _setNodeOpen: function (node, beOpen) {\n var child = this._getChild(node);\n if (child) {\n Css.setClassName(child, this._options.hideClass, !beOpen);\n var icon = this._getIcon(node);\n\n node.setAttribute('data-open', beOpen);\n\n /*\n * Don't refactor this to\n *\n * setClassName(el, className, status); setClassName(el, className, !status);\n *\n * because it won't work with multiple classes.\n *\n * Doing:\n * setClassName(el, 'fa fa-whatever', true);setClassName(el, 'fa fa-whatever-else', false);\n *\n * will remove 'fa' although it is a class we want.\n */\n\n var toAdd = beOpen ? this._options.openClass : this._options.closedClass;\n var toRemove = beOpen ? this._options.closedClass : this._options.openClass;\n Css.removeClassName(icon, toRemove);\n Css.addClassName(icon, toAdd);\n\n Css.setClassName(node, this._options.openNodeClass, beOpen);\n } else {\n Ink.error('Ink.UI.TreeView: node', node, 'is not a node!');\n }\n },\n\n /**\n * Opens one of the tree nodes\n *\n * Make sure you pass the node's Element\n * @method open\n * @param {Element} node The node you wish to open.\n * @return {void}\n **/\n open: function (node) {\n this._setNodeOpen(node, true);\n },\n\n /**\n * Closes one of the tree nodes\n *\n * Make sure you pass the node's Element\n * @method close\n * @param {Element} node The node you wish to close.\n * @return {void}\n **/\n close: function (node) {\n this._setNodeOpen(node, false);\n },\n\n /**\n * Toggles a node state\n *\n * @method toggle\n * @param {Element} node The node to toggle.\n * @return {void}\n **/\n toggle: function (node) {\n if (this.isOpen(node)) {\n this.close(node);\n } else {\n this.open(node);\n }\n },\n\n /**\n * @method _getChild\n **/\n _getChild: function (node) {\n return Selector.select(this._options.children, node)[0] || null;\n },\n\n /**\n * Handles the click event (as specified in the _init function).\n * \n * @method _onClick\n * @param {Event} ev DOM click event.\n * @return {void}\n * @private\n */\n _onClick: function(ev){\n /**\n * Summary:\n * If the clicked element is a \"node\" as defined in the options, will check if it has any \"child\".\n * If so, will toggle its state and stop the event's default behavior if the stopDefault option is true.\n **/\n\n if (!this.isParent(ev.currentTarget) ||\n Selector.matchesSelector(ev.target, this._options.node) ||\n Selector.matchesSelector(ev.target, this._options.children)) {\n return;\n }\n\n if (this._options.stopDefault){\n ev.preventDefault();\n }\n\n this.toggle(ev.currentTarget);\n }\n };\n\n Common.createUIComponent(TreeView);\n\n return TreeView;\n});\n","Ink.createModule('Ink.UI.Upload', '1', [\n 'Ink.Dom.Event_1',\n 'Ink.Dom.Element_1',\n 'Ink.Dom.Browser_1',\n 'Ink.UI.Common_1'\n], function(Event, Element, Browser, Common) {\n 'use strict';\n\n var DirectoryReader = function(options) {\n this.init(options);\n };\n\n DirectoryReader.prototype = {\n init: function(options) {\n this._options = Ink.extendObj({\n entry: undefined,\n maxDepth: 10\n }, options || {});\n\n try {\n this._read();\n } catch(e) {\n Ink.error(e);\n }\n },\n\n\n _read: function() {\n if(!this._options.entry) {\n Ink.error('You must specify the entry!');\n return;\n }\n\n try {\n this._readDirectories();\n } catch(e) {\n Ink.error(e);\n }\n },\n\n\n _readDirectories: function() {\n var entries = [],\n running = false,\n maxDepth = 0;\n\n /* TODO return as tree because much better well */\n var _readEntries = Ink.bind(function(currentEntry) {\n var dir = currentEntry.createReader();\n running = true;\n\n dir.readEntries(Ink.bind(function(res) {\n if(res.length > 0) {\n for(var i = 0, len = res.length; i=0; i--) {\n if(typeof(arr[i]) === 'undefined' || arr[i] === null || arr[i] === '') {\n arr.splice(i, 1);\n }\n }\n return arr;\n }\n };\n\n var Queue = {\n lists: [],\n items: [],\n\n\n /**\n * Create new queue list\n * @function create\n * @public\n * @param {String} list name\n * @param {Function} function to iterate on items\n * @return {Object} list id\n */\n create: function(name) {\n var id;\n name = String(name);\n this.lists.push({name: name});\n id = this.lists.length - 1;\n return id;\n },\n\n\n getItems: function(parentId) {\n if(!parentId) {\n return this.items;\n }\n var items = [];\n for(var i = 0, len = this.items.length; i=0; i--) {\n if(this.items[i] && id === this.items[i].parentId) {\n this.remove(this.items[i].parentId, this.items[i].pid);\n }\n }\n if(!keepList) {\n this.lists.splice(id, 1);\n }\n return true;\n } catch(e) {\n Ink.error('Purge: invalid id');\n return false;\n }\n },\n\n\n /**\n * add an item to a list\n * @function add\n * @public\n * @param {String} name\n * @param {Object} item\n * @return {Number} pid\n */\n add: function(parentId, item, priority) {\n if(!this.lists[parentId]) {\n return false;\n }\n if(typeof(item) !== 'object') {\n item = String(item);\n }\n\n var pid = parseInt(Math.round(Math.random() * 100000) + \"\" + Math.round(Math.random() * 100000), 10);\n priority = priority || 0;\n\n this.items.push({parentId: parentId, item: item, priority: priority || 0, pid: pid});\n return pid;\n },\n\n\n /**\n * View list\n * @function view\n * @public\n * @param {Number} list id\n * @param {Number} process id\n * @return {Object} item\n */\n view: function(parentId, pid) {\n var id = this._searchByPid(parentId, pid);\n if(id === false) {\n return false;\n }\n return this.items[id];\n },\n\n\n /**\n * Remove an item\n * @function remove\n * @public\n * @param {Object} item\n * @return {Object|Boolean} removed item or false if not found\n */\n remove: function(parentId, pid) {\n try {\n var id = this._searchByPid(parentId, pid);\n if(id === false) {\n return false;\n }\n this.items.splice(id, 1);\n return true;\n } catch(e) {\n Ink.error('Remove: invalid id');\n return false;\n }\n },\n\n _searchByPid: function(parentId, pid) {\n if(!parentId && typeof(parentId) === 'boolean' || !pid) {\n return false;\n }\n\n parentId = parseInt(parentId, 10);\n pid = parseInt(pid, 10);\n\n if(isNaN(parentId) || isNaN(pid)) {\n return false;\n }\n\n for(var i = 0, len = this.items.length; i this._options.minSizeToUseChunks;\n },\n\n\n _dropEventHandler: function(ev) {\n Event.stop(ev);\n\n this.publish('DropComplete', ev.dataTransfer);\n\n var data = ev.dataTransfer;\n\n if(!data || !data.files || !data.files.length) {\n return false;\n }\n\n this._files = data.files;\n this._files = Array.prototype.slice.call(this._files || [], 0);\n\n // check if webkitGetAsEntry exists on first item\n if(data.items && data.items[0] && data.items[0].webkitGetAsEntry) {\n if(!this._options.foldersEnabled) {\n return setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);\n }\n var entry, folders = [];\n for(var i = ev.dataTransfer.items.length-1; i>=0; i--) {\n entry = ev.dataTransfer.items[i].webkitGetAsEntry();\n if(entry && entry.isDirectory) {\n folders.push(entry);\n this._files[i].isDirectory = true;\n this._files.splice(i, 1);\n }\n }\n // starting callback hell\n this._addFolderToQueue(folders, Ink.bind(function() {\n setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);\n }, this));\n } else {\n setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);\n }\n\n return true;\n },\n\n\n _addFolderToQueue: function(folders, cb) {\n var files = [], invalidFolders = {};\n\n if(!folders || !folders.length) {\n cb();\n return files;\n }\n\n var getFiles = function(entries) {\n var files = [];\n for(var i = 0, len = entries.length; i this._options.maxFilesize) {\n this.publish('MaxSizeFailure', file, this._options.maxFilesize);\n continue;\n }\n\n fileID = parseInt(Math.round(Math.random() * 100000) + \"\" + Math.round(Math.random() * 100000), 10);\n o = { id: i, data: file, fileID: fileID, directory: file.isDirectory };\n Queue.add(this._queueId, o);\n\n this.publish('FileAddedToQueue', o);\n }\n this._processQueue(true);\n this._files = [];\n },\n\n\n _processQueue: function(internalUpload) {\n if(this._queueRunning) {\n return false;\n }\n\n this.running = 0;\n var max = 1, i = 0, items,\n queueLen = Queue.items.length;\n this._queueRunning = true;\n\n this.interval = setInterval(Ink.bind(function() {\n if(Queue.items.length === i && this.running === 0) {\n Queue.purge(this._queueId, true);\n this._queueRunning = false;\n clearInterval(this.interval);\n this.publish('QueueEnd', this._queueId, queueLen);\n }\n\n items = Queue.getItems(this._queueId);\n\n if(this.running < max && items[i]) {\n if(!items[i].canceled) {\n _doRequest.call(this, items[i].pid, items[i].item.data, items[i].item.fileID, items[i].item.directory, internalUpload);\n this.running++;\n i++;\n } else {\n var j = i;\n while(items[j] && items[j].canceled) {\n i++;\n j++;\n }\n }\n return true;\n }\n return false;\n }, this), 100);\n\n\n var _doRequest = function(pid, data, fileID, directory, internalUpload) {\n var o = {\n file: data,\n fileID: fileID,\n cb: Ink.bind(function() {\n this.running--;\n }, this)\n };\n if(internalUpload) {\n if(directory) {\n // do magic\n o.cb();\n } else {\n this._upload(o);\n }\n }\n };\n\n return true;\n },\n\n\n _upload: function(o) {\n var file = o.file,\n xhr = new XMLHttpRequest(),\n fileID = o.fileID;\n\n this.publish('BeforeUpload', file, this._options.extraData, fileID, xhr, this._supportChunks(file.size));\n\n var forceAbort = function(showError) {\n if(o.cb && typeof(o.cb === 'function')) {\n o.cb();\n }\n\n this.publish('OnProgress', {\n length: file.size,\n lengthComputable: true,\n loaded: file.size,\n total: file.size\n }, file, fileID);\n this.publish('EndUpload', file, fileID, (showError ? { error: true } : true));\n this.publish('InvalidFile', file, 'name');\n xhr.abort();\n };\n\n if(this._options.INVALID_FILE_NAME && this._options.INVALID_FILE_NAME instanceof RegExp) {\n if(this._options.INVALID_FILE_NAME.test(o.file.name)) {\n forceAbort.call(this);\n return;\n }\n }\n\n // If file was renamed, abort it\n // FU OPERA: Opera always return lastModified date as null\n if(!file.lastModifiedDate && !Ink.Dom.Browser.OPERA) {\n forceAbort.call(this, true);\n return;\n }\n\n xhr.upload.onprogress = Ink.bind(this.publish, this, 'OnProgress', file, fileID);\n\n var endpoint, method;\n if(this._supportChunks(file.size)) {\n if(file.size <= file.chunk_offset) {\n endpoint = this._options.endpointChunkCommit;\n method = 'POST';\n } else {\n endpoint = this._options.endpointChunk;\n if(file.chunk_upload_id) {\n endpoint += '?upload_id=' + file.chunk_upload_id;\n }\n if(file.chunk_offset) {\n endpoint += '&offset=' + file.chunk_offset;\n }\n method = 'PUT';\n }\n } else {\n endpoint = this._options.endpoint;\n method = 'POST';\n }\n\n xhr.open(method, endpoint, true);\n xhr.withCredentials = true;\n xhr.setRequestHeader(\"x-requested-with\", \"XMLHttpRequest\");\n if(this._supportChunks(file.size)) {\n xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n }\n\n var fd = new FormData(),\n blob;\n\n if(\"Blob\" in window && typeof Blob === 'function') {\n blob = new Blob([file], { type: file.type });\n if(this._supportChunks(file.size)) {\n file.chunk_offset = file.chunk_offset || 0;\n blob = blob.slice(file.chunk_offset, file.chunk_offset + this._options.chunkSize);\n } else {\n fd.append(this._options.fileFormName, blob, file.name);\n }\n } else {\n fd.append(this._options.fileFormName, file);\n }\n\n if(!this._supportChunks(file.size)) {\n for(var k in this._options.extraData) {\n if(this._options.extraData.hasOwnProperty(k)) {\n fd.append(k, this._options.extraData[k]);\n }\n }\n } else {\n fd.append('upload_id', file.chunk_upload_id);\n fd.append('path', file.upload_path);\n }\n\n if(!file.hasParent) {\n if(!this._supportChunks(file.size)) {\n xhr.send(fd);\n } else {\n if(file.size <= file.chunk_offset) {\n xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name);\n } else {\n xhr.send(blob);\n }\n }\n } else {\n this.publish('cbCreateFolder', file.parentID, file.fullPath, this._options.extraData, this._folders, file.rootPath, Ink.bind(function() {\n if(!this._supportChunks(file.size)) {\n xhr.send(fd);\n } else {\n if(file.size <= file.chunk_offset) {\n xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name);\n } else {\n xhr.send(blob);\n }\n }\n }, this));\n }\n\n\n xhr.onload = Ink.bindEvent(function() {\n /* jshint boss:true */\n if(this._supportChunks(file.size) && file.size > file.chunk_offset) {\n if(xhr.response) {\n var response = JSON.parse(xhr.response);\n\n // check expected offset\n var invalidOffset = file.chunk_offset && response.offset !== (file.chunk_offset + this._options.chunkSize) && file.size !== response.offset;\n if(invalidOffset) {\n if(o.cb) {\n o.cb();\n }\n this.publish('ErrorUpload', file, fileID);\n } else {\n file.chunk_upload_id = response.upload_id;\n file.chunk_offset = response.offset;\n file.chunk_expires = response.expires;\n this._upload(o);\n }\n } else {\n if(o.cb) {\n o.cb();\n }\n this.publish('ErrorUpload', file, fileID);\n }\n return (xhr = null);\n }\n\n if(o.cb) {\n o.cb();\n }\n\n if(xhr.responseText && xhr['status'] < 400) {\n this.publish('EndUpload', file, fileID, xhr.responseText);\n } else {\n this.publish('ErrorUpload', file, fileID);\n }\n return (xhr = null);\n }, this);\n\n\n xhr.onerror = Ink.bindEvent(function() {\n if(o.cb) {\n o.cb();\n }\n this.publish('ErrorUpload', file, fileID);\n }, this);\n\n xhr.onabort = Ink.bindEvent(function() {\n if(o.cb) {\n o.cb();\n }\n this.publish('AbortUpload', file, fileID, {\n abortAll: Ink.bind(this.abortAll, this),\n abortOne: Ink.bind(this.abortOne, this)\n });\n }, this);\n },\n\n\n abortAll: function() {\n if(!this._queueRunning) {\n return false;\n }\n clearInterval(this.interval);\n this._queueRunning = false;\n Queue.purge(this._queueId, true);\n return true;\n },\n\n abortOne: function(id, cb) {\n var items = Queue.getItems(0),\n o;\n for(var i = 0, len = items.length; i [ [1, 1], [2, 2], [3], [1] ]\n * InkArray.groupBy([1.1, 1.2, 2.1], { key: Math.floor }) // -> [ [1.1, 1.2], [2.1] ]\n * InkArray.groupBy([1.1, 1.2, 2.1], { key: Math.floor, pairs: true }) // -> [ [1, [1.1, 1.2]], [2, [2.1]] ]\n *\n **/\n groupBy: function (arr, options) {\n options = options || {};\n var ret = [];\n var latestGroup;\n function eq(a, b) {\n return outKey(a) === outKey(b);\n }\n function outKey(item) {\n if (typeof options.key === 'function') {\n return options.key(item);\n } else {\n return item;\n }\n }\n\n for (var i = 0, len = arr.length; i < len; i++) {\n latestGroup = [arr[i]];\n\n // Chunkin'\n while ((i + 1 < len) && eq(arr[i], arr[i + 1])) {\n latestGroup.push(arr[i + 1]);\n i++;\n }\n\n if (options.pairs) {\n ret.push([outKey(arr[i]), latestGroup]);\n } else {\n ret.push(latestGroup);\n }\n }\n return ret;\n },\n\n /**\n * Replacement for Array.prototype.reduce.\n *\n * Uses Array.prototype.reduce if available.\n *\n * Produces a single result from a list of values by calling an \"aggregator\" function.\n *\n * Falls back to Array.prototype.reduce if available.\n *\n * @method reduce\n * @param {Array} array Input array to be reduced.\n * @param {Function} callback `function (previousValue, currentValue, index, all) { return {Mixed} }` to execute for each value.\n * @param {Mixed} initial Object used as the first argument to the first call of `callback`\n * @return {Mixed} Reduced array.\n *\n * @example\n * var sum = InkArray.reduce([1, 2, 3], function (a, b) { return a + b; }); // -> 6\n */\n reduce: function (array, callback, initial) {\n if (arrayProto.reduce) {\n return arrayProto.reduce.apply(array, arrayProto.slice.call(arguments, 1));\n }\n\n // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Polyfill\n var t = Object( array ), len = t.length >>> 0, k = 0, value;\n if ( arguments.length >= 3 ) {\n value = initial;\n } else {\n while ( k < len && !(k in t) ) k++;\n if ( k >= len )\n throw new TypeError('Reduce of empty array with no initial value');\n value = t[ k++ ];\n }\n for ( ; k < len ; k++ ) {\n if ( k in t ) {\n value = callback( value, t[k], k, t );\n }\n }\n return value;\n },\n\n /**\n * Checks if a value exists in array\n *\n * @method inArray\n * @public\n * @static\n * @param {Mixed} value Value to check\n * @param {Array} arr Array to search in\n * @return {Boolean} True if value exists in the array\n * @sample Ink_Util_Array_inArray.html\n */\n inArray: function(value, arr) {\n if (typeof arr === 'object') {\n for (var i = 0, f = arr.length; i < f; ++i) {\n if (arr[i] === value) {\n return true;\n }\n }\n }\n return false;\n },\n\n /**\n * Sorts an array of objects by an object property\n *\n * @method sortMulti\n * @param {Array} arr Array of objects to sort\n * @param {String} key Property to sort by\n * @return {Array|Boolean} False if it's not an array, returns a sorted array if it's an array.\n * @public\n * @static\n * @sample Ink_Util_Array_sortMulti.html\n */\n sortMulti: function(arr, key) {\n if (typeof arr === 'undefined' || arr.constructor !== Array) { return false; }\n if (typeof key !== 'string') { return arr.sort(); }\n if (arr.length > 0) {\n if (typeof(arr[0][key]) === 'undefined') { return false; }\n arr.sort(function(a, b){\n var x = a[key];\n var y = b[key];\n return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n });\n }\n return arr;\n },\n\n /**\n * Gets the indexes of a value in an array\n *\n * @method keyValue\n * @param {String} value Value to search for.\n * @param {Array} arr Array to run the search in.\n * @param {Boolean} [first] Flag to stop the search at the first match. It also returns an index number instead of an array of indexes.\n * @return {Boolean|Number|Array} False for no matches. Array of matches or first match index.\n * @public\n * @static\n * @sample Ink_Util_Array_keyValue.html\n */\n keyValue: function(value, arr, first) {\n if (typeof value !== 'undefined' && typeof arr === 'object' && this.inArray(value, arr)) {\n var aKeys = [];\n for (var i = 0, f = arr.length; i < f; ++i) {\n if (arr[i] === value) {\n if (typeof first !== 'undefined' && first === true) {\n return i;\n } else {\n aKeys.push(i);\n }\n }\n }\n return aKeys;\n }\n return false;\n },\n\n /**\n * Shuffles an array.\n *\n * @method shuffle\n * @param {Array} arr Array to shuffle\n * @return {Array|Boolean} Shuffled Array or false if not an array.\n * @public\n * @static\n * @sample Ink_Util_Array_shuffle.html\n */\n shuffle: function(arr) {\n if (typeof(arr) !== 'undefined' && arr.constructor !== Array) { return false; }\n var total = arr.length,\n tmp1 = false,\n rnd = false;\n\n while (total--) {\n rnd = Math.floor(Math.random() * (total + 1));\n tmp1 = arr[total];\n arr[total] = arr[rnd];\n arr[rnd] = tmp1;\n }\n return arr;\n },\n\n /**\n * Runs a function through each of the elements of an array.\n *\n * Uses Array.prototype.forEach if available.\n *\n * @method forEach\n * @param {Array} array The array to be cycled/iterated\n * @param {Function} callback The function receives as arguments the value, index and array.\n * @param {Mixed} context The value of `this` inside the `callback` you passed.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Array_forEach.html\n */\n forEach: function(array, callback, context) {\n if (arrayProto.forEach) {\n return arrayProto.forEach.call(array, callback, context);\n }\n for (var i = 0, len = array.length >>> 0; i < len; i++) {\n callback.call(context, array[i], i, array);\n }\n },\n\n /**\n * Alias for backwards compatibility. See forEach\n *\n * @method each\n * @param {Mixed} [forEachArguments] (see forEach)\n * @return {void} (see forEach)\n */\n each: function () {\n InkArray.forEach.apply(InkArray, arrayProto.slice.call(arguments));\n },\n\n /**\n * Runs a function for each item in the array.\n * Uses Array.prototype.map if available.\n * That function will receive each item as an argument and its return value will change the corresponding array item.\n * @method map\n * @param {Array} array The array to map over\n * @param {Function} mapFn The map function. Will take `(item, index, array)` as arguments and the `this` value will be the `context` argument you pass to this function.\n * @param {Object} [context] Object to be `this` in the map function.\n * @return {Array} A copy of the original array, with all of its items processed by the map function.\n *\n * @sample Ink_Util_Array_map.html\n */\n map: function (array, mapFn, context) {\n if (arrayProto.map) {\n return arrayProto.map.call(array, mapFn, context);\n }\n var mapped = new Array(len);\n for (var i = 0, len = array.length >>> 0; i < len; i++) {\n mapped[i] = mapFn.call(context, array[i], i, array);\n }\n return mapped;\n },\n\n /**\n * Filters an array based on a truth test.\n * This method runs a test function on all the array values and returns a new array with all the values that pass the test.\n * @method filter\n * @param {Array} array The array to filter\n * @param {Function} test A test function taking `(item, index, array)`\n * @param {Object} [context] Object to be `this` in the test function.\n * @return {Array} Returns the filtered array\n *\n * @sample Ink_Util_Array_filter.html\n */\n filter: function (array, test, context) {\n if (arrayProto.filter) {\n return arrayProto.filter.call(array, test, context);\n }\n var filtered = [],\n val = null;\n for (var i = 0, len = array.length; i < len; i++) {\n val = array[i]; // it might be mutated\n if (test.call(context, val, i, array)) {\n filtered.push(val);\n }\n }\n return filtered;\n },\n\n /**\n * Checks if some element in the array passes a truth test\n *\n * @method some\n * @param {Array} arr The array to iterate through\n * @param {Function} cb The callback to be called on the array's elements. It receives the value, the index and the array as arguments.\n * @param {Object} context Object of the callback function\n * @return {Boolean} True if the callback returns true at any point, false otherwise\n * @public\n * @static\n * @sample Ink_Util_Array_some.html\n */\n some: function(arr, cb, context){\n\n if (arr === null){\n throw new TypeError('First argument is invalid.');\n }\n\n var t = Object(arr);\n var len = t.length >>> 0;\n if (typeof cb !== \"function\"){ throw new TypeError('Second argument must be a function.'); }\n\n for (var i = 0; i < len; i++) {\n if (i in t && cb.call(context, t[i], i, t)){ return true; }\n }\n\n return false;\n },\n\n /**\n * Compares the values of two arrays and return the matches\n *\n * @method intersect\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n * @return {Array} Empty array if one of the arrays is false (or do not intersect) | Array with the intersected values\n * @public\n * @static\n * @sample Ink_Util_Array_intersect.html\n */\n intersect: function(arr1, arr2) {\n if (!arr1 || !arr2 || arr1 instanceof Array === false || arr2 instanceof Array === false) {\n return [];\n }\n\n var shared = [];\n for (var i = 0, I = arr1.length; i 0) {\n for (x = start; x < stop; x += step) {\n r.push(x);\n }\n } else {\n for (x = start; x > stop; x += step) {\n r.push(x);\n }\n }\n\n return r;\n },\n\n /**\n * Inserts a value on a specified index\n *\n * @method insert\n * @param {Array} arr Array where the value will be inserted\n * @param {Number} idx Index of the array where the value should be inserted\n * @param {Mixed} value Value to be inserted\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Array_insert.html\n */\n insert: function(arr, idx, value) {\n arr.splice(idx, 0, value);\n },\n\n /**\n * Removes a range of values from the array\n *\n * @method remove\n * @param {Array} arr Array where the value will be removed\n * @param {Number} from Index of the array where the removal will start removing.\n * @param {Number} rLen Number of items to be removed from the index onwards.\n * @return {Array} An array with the remaining values\n * @public\n * @static\n * @sample Ink_Util_Array_remove.html\n */\n remove: function(arr, from, rLen){\n var output = [];\n\n for(var i = 0, iLen = arr.length; i < iLen; i++){\n if(i >= from && i < from + rLen){\n continue;\n }\n\n output.push(arr[i]);\n }\n\n return output;\n }\n };\n\n return InkArray;\n\n});\n","/**\n * Binary Packing algorithm implementation\n * @module Ink.Util.BinPack_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.BinPack', '1', [], function() {\n\n 'use strict';\n\n /*jshint boss:true */\n\n // https://github.com/jakesgordon/bin-packing/\n\n /*\n Copyright (c) 2011, 2012, 2013 Jake Gordon and contributors\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\n\n\n var Packer = function(w, h) {\n this.init(w, h);\n };\n\n Packer.prototype = {\n\n init: function(w, h) {\n this.root = { x: 0, y: 0, w: w, h: h };\n },\n\n fit: function(blocks) {\n var n, node, block;\n for (n = 0; n < blocks.length; ++n) {\n block = blocks[n];\n if (node = this.findNode(this.root, block.w, block.h)) {\n block.fit = this.splitNode(node, block.w, block.h);\n }\n }\n },\n\n findNode: function(root, w, h) {\n if (root.used) {\n return this.findNode(root.right, w, h) || this.findNode(root.down, w, h);\n }\n else if ((w <= root.w) && (h <= root.h)) {\n return root;\n }\n else {\n return null;\n }\n },\n\n splitNode: function(node, w, h) {\n node.used = true;\n node.down = { x: node.x, y: node.y + h, w: node.w, h: node.h - h };\n node.right = { x: node.x + w, y: node.y, w: node.w - w, h: h };\n return node;\n }\n\n };\n\n\n\n var GrowingPacker = function() {};\n\n GrowingPacker.prototype = {\n\n fit: function(blocks) {\n var n, node, block, len = blocks.length;\n var w = len > 0 ? blocks[0].w : 0;\n var h = len > 0 ? blocks[0].h : 0;\n this.root = { x: 0, y: 0, w: w, h: h };\n for (n = 0; n < len ; n++) {\n block = blocks[n];\n if (node = this.findNode(this.root, block.w, block.h)) {\n block.fit = this.splitNode(node, block.w, block.h);\n }\n else {\n block.fit = this.growNode(block.w, block.h);\n }\n }\n },\n\n findNode: function(root, w, h) {\n if (root.used) {\n return this.findNode(root.right, w, h) || this.findNode(root.down, w, h);\n }\n else if ((w <= root.w) && (h <= root.h)) {\n return root;\n }\n else {\n return null;\n }\n },\n\n splitNode: function(node, w, h) {\n node.used = true;\n node.down = { x: node.x, y: node.y + h, w: node.w, h: node.h - h };\n node.right = { x: node.x + w, y: node.y, w: node.w - w, h: h };\n return node;\n },\n\n growNode: function(w, h) {\n var canGrowDown = (w <= this.root.w);\n var canGrowRight = (h <= this.root.h);\n\n var shouldGrowRight = canGrowRight && (this.root.h >= (this.root.w + w)); // attempt to keep square-ish by growing right when height is much greater than width\n var shouldGrowDown = canGrowDown && (this.root.w >= (this.root.h + h)); // attempt to keep square-ish by growing down when width is much greater than height\n\n if (shouldGrowRight) {\n return this.growRight(w, h);\n }\n else if (shouldGrowDown) {\n return this.growDown(w, h);\n }\n else if (canGrowRight) {\n return this.growRight(w, h);\n }\n else if (canGrowDown) {\n return this.growDown(w, h);\n }\n else {\n return null; // need to ensure sensible root starting size to avoid this happening\n }\n },\n\n growRight: function(w, h) {\n this.root = {\n used: true,\n x: 0,\n y: 0,\n w: this.root.w + w,\n h: this.root.h,\n down: this.root,\n right: { x: this.root.w, y: 0, w: w, h: this.root.h }\n };\n var node;\n if (node = this.findNode(this.root, w, h)) {\n return this.splitNode(node, w, h);\n }\n else {\n return null;\n }\n },\n\n growDown: function(w, h) {\n this.root = {\n used: true,\n x: 0,\n y: 0,\n w: this.root.w,\n h: this.root.h + h,\n down: { x: 0, y: this.root.h, w: this.root.w, h: h },\n right: this.root\n };\n var node;\n if (node = this.findNode(this.root, w, h)) {\n return this.splitNode(node, w, h);\n }\n else {\n return null;\n }\n }\n\n };\n\n\n\n var sorts = {\n random: function() { return Math.random() - 0.5; },\n w: function(a, b) { return b.w - a.w; },\n h: function(a, b) { return b.h - a.h; },\n a: function(a, b) { return b.area - a.area; },\n max: function(a, b) { return Math.max(b.w, b.h) - Math.max(a.w, a.h); },\n min: function(a, b) { return Math.min(b.w, b.h) - Math.min(a.w, a.h); },\n height: function(a, b) { return sorts.msort(a, b, ['h', 'w']); },\n width: function(a, b) { return sorts.msort(a, b, ['w', 'h']); },\n area: function(a, b) { return sorts.msort(a, b, ['a', 'h', 'w']); },\n maxside: function(a, b) { return sorts.msort(a, b, ['max', 'min', 'h', 'w']); },\n msort: function(a, b, criteria) { /* sort by multiple criteria */\n var diff, n;\n for (n = 0; n < criteria.length; ++n) {\n diff = sorts[ criteria[n] ](a, b);\n if (diff !== 0) {\n return diff;\n }\n }\n return 0;\n }\n };\n\n\n\n // end of Jake's code\n\n\n\n // aux, used to display blocks in unfitted property\n var toString = function() {\n return [this.w, ' x ', this.h].join('');\n };\n\n\n\n /**\n * Binary Packing algorithm implementation\n *\n * Based on the work of Jake Gordon\n *\n * see https://github.com/jakesgordon/bin-packing/\n *\n * @namespace Ink.Util.BinPack\n * @version 1\n * @static\n */\n var BinPack = {\n\n /**\n * @method binPack\n * @param {Object} o Options\n * @param {Array} o.blocks Array of items with width and height integer attributes.\n * @param {Array} [o.dimensions] Flag to fix container dimensions\n * @param {String} [o.sorter] Sorting function. One of: random, height, width, area, maxside\n * @return {Object} Returns an object containing container dimensions, filled ratio, fitted blocks, unfitted blocks and all blocks\n * @static\n */\n binPack: function(o) {\n var i, f, bl;\n\n\n\n // calculate area if not there already\n for (i = 0, f = o.blocks.length; i < f; ++i) {\n bl = o.blocks[i];\n if (! ('area' in bl) ) {\n bl.area = bl.w * bl.h;\n }\n }\n\n\n\n // apply algorithm\n var packer = o.dimensions ? new Packer(o.dimensions[0], o.dimensions[1]) : new GrowingPacker();\n\n if (!o.sorter) { o.sorter = 'maxside'; }\n\n o.blocks.sort( sorts[ o.sorter ] );\n\n packer.fit(o.blocks);\n\n var dims2 = [packer.root.w, packer.root.h];\n\n\n\n // layout is done here, generating report data...\n var fitted = [];\n var unfitted = [];\n\n for (i = 0, f = o.blocks.length; i < f; ++i) {\n bl = o.blocks[i];\n if (bl.fit) {\n fitted.push(bl);\n }\n else {\n bl.toString = toString; // TO AID SERIALIZATION\n unfitted.push(bl);\n }\n }\n\n var area = dims2[0] * dims2[1];\n var fit = 0;\n for (i = 0, f = fitted.length; i < f; ++i) {\n bl = fitted[i];\n fit += bl.area;\n }\n\n return {\n dimensions: dims2,\n filled: fit / area,\n blocks: o.blocks,\n fitted: fitted,\n unfitted: unfitted\n };\n }\n };\n\n\n\n return BinPack;\n\n});","/**\n * Cookie Utilities\n * @module Ink.Util.Cookie_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Cookie', '1', [], function() {\n 'use strict';\n\n /**\n * @namespace Ink.Util.Cookie_1\n */\n var Cookie = {\n\n /**\n * Gets an object with the current page cookies, or a specific cookie if you specify the `name`.\n *\n * @method get\n * @param {String} [name] The cookie name.\n * @return {String|Object} If the name is specified, it returns the value of that key. Otherwise it returns the full cookie object\n * @public\n * @static\n * @sample Ink_Util_Cookie_get.html\n */\n get: function(name)\n {\n var cookie = document.cookie || false;\n\n var _Cookie = {};\n\n if(cookie) {\n cookie = cookie.replace(new RegExp(\"; \", \"g\"), ';');\n\n var aCookie = cookie.split(';');\n var aItem = [];\n if(aCookie.length > 0) {\n for(var i=0; i < aCookie.length; i++) {\n aItem = aCookie[i].split('=');\n if(aItem.length === 2) {\n _Cookie[aItem[0]] = decodeURIComponent(aItem[1]);\n }\n }\n }\n if(name) {\n if(typeof(_Cookie[name]) !== 'undefined') {\n return _Cookie[name];\n } else {\n return null;\n }\n }\n }\n return _Cookie;\n },\n\n /**\n * Sets a cookie.\n *\n * @method set\n * @param {String} name Cookie name.\n * @param {String} value Cookie value.\n * @param {Number} [expires] Number of seconds the cookie will be valid for.\n * @param {String} [path] Path for the cookie. Defaults to '/'.\n * @param {String} [domain] Domain for the cookie. Defaults to current hostname.\n * @param {Boolean} [secure] Flag for secure. Default 'false'.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Cookie_set.html\n */\n set: function(name, value, expires, path, domain, secure)\n {\n var sName;\n if(!name || value===false || typeof(name) === 'undefined' || typeof(value) === 'undefined') {\n return false;\n } else {\n sName = name+'='+encodeURIComponent(value);\n }\n var sExpires = false;\n var sPath = false;\n var sDomain = false;\n var sSecure = false;\n\n if(expires && typeof(expires) !== 'undefined' && !isNaN(expires)) {\n var oDate = new Date();\n var sDate = (parseInt(Number(oDate.valueOf()), 10) + (Number(parseInt(expires, 10)) * 1000));\n\n var nDate = new Date(sDate);\n var expiresString = nDate.toGMTString();\n\n var re = new RegExp(\"([^\\\\s]+)(\\\\s\\\\d\\\\d)\\\\s(\\\\w\\\\w\\\\w)\\\\s(.*)\");\n expiresString = expiresString.replace(re, \"$1$2-$3-$4\");\n\n sExpires = 'expires='+expiresString;\n } else {\n if(typeof(expires) !== 'undefined' && !isNaN(expires) && Number(parseInt(expires, 10))===0) {\n sExpires = '';\n } else {\n sExpires = 'expires=Thu, 01-Jan-2037 00:00:01 GMT';\n }\n }\n\n if(path && typeof(path) !== 'undefined') {\n sPath = 'path='+path;\n } else {\n sPath = 'path=/';\n }\n\n if(domain) {\n sDomain = 'domain='+domain;\n } else if (/\\./.test(window.location.hostname)) {\n // When trying to set domain=localhost or any other domain\n // without dots, setting the cookie fails.\n // Anyways, the cookies are bound to the current domain by default so let it be.\n sDomain = 'domain='+window.location.hostname;\n }\n\n if(secure && typeof(secure) !== 'undefined') {\n sSecure = secure;\n } else {\n sSecure = false;\n }\n\n document.cookie = sName +\n '; ' + sExpires +\n '; ' + sPath +\n (sDomain ? '; ' + sDomain : '') +\n '; ' + sSecure;\n },\n\n /**\n * Deletes a cookie.\n *\n * @method remove\n * @param {String} cookieName Cookie name.\n * @param {String} [path] Path of the cookie. Defaults to '/'.\n * @param {String} [domain] Domain of the cookie. Defaults to current hostname.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Cookie_remove.html\n */\n remove: function(cookieName, path, domain) {\n var expiresDate = -1;\n\n this.set(cookieName, 'deleted', expiresDate, path, domain);\n }\n };\n\n return Cookie;\n\n});\n","/**\n * Date utility functions\n * @module Ink.Util.Date_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Date', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Date_1 \n */\n var InkDate = {\n\n /**\n * Function that returns the string representation of the month [PT only]\n *\n * @method _months\n * @param {Number} index Month javascript (0 to 11)\n * @return {String} The month's name\n * @private\n * @static\n * @example\n * console.log( InkDate._months(0) ); // Result: Janeiro\n */\n _months: function(index){\n var _m = ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];\n return _m[index];\n },\n\n /**\n * Function that returns the month [PT only] ( 0 to 11 )\n *\n * @method _iMonth\n * @param {String} month Month javascript (0 to 11)\n * @return {Number} The month's number\n * @private\n * @static\n * @example\n * console.log( InkDate._iMonth('maio') ); // Result: 4\n */\n _iMonth : function( month )\n {\n if ( Number( month ) ) { return +month - 1; }\n return {\n 'janeiro' : 0 ,\n 'jan' : 0 ,\n 'fevereiro' : 1 ,\n 'fev' : 1 ,\n 'março' : 2 ,\n 'mar' : 2 ,\n 'abril' : 3 ,\n 'abr' : 3 ,\n 'maio' : 4 ,\n 'mai' : 4 ,\n 'junho' : 5 ,\n 'jun' : 5 ,\n 'julho' : 6 ,\n 'jul' : 6 ,\n 'agosto' : 7 ,\n 'ago' : 7 ,\n 'setembro' : 8 ,\n 'set' : 8 ,\n 'outubro' : 9 ,\n 'out' : 9 ,\n 'novembro' : 10 ,\n 'nov' : 10 ,\n 'dezembro' : 11 ,\n 'dez' : 11\n }[ month.toLowerCase( ) ];\n } ,\n\n /**\n * Function that returns the representation the day of the week [PT Only]\n *\n * @method _wDays\n * @param {Number} index Week's day index\n * @return {String} The week's day name\n * @private\n * @static\n * @example\n * console.log( InkDate._wDays(0) ); // Result: Domingo\n */\n _wDays: function(index){\n var _d = ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'];\n return _d[index];\n },\n\n /**\n * Function that returns day of the week in javascript 1 to 7\n *\n * @method _iWeek\n * @param {String} week Week's day name\n * @return {Number} The week's day index\n * @private\n * @static\n * @example\n * console.log( InkDate._iWeek('quarta') ); // Result: 3\n */\n _iWeek: function( week )\n {\n if ( Number( week ) ) { return +week || 7; }\n return {\n 'segunda' : 1 ,\n 'seg' : 1 ,\n 'terça' : 2 ,\n 'ter' : 2 ,\n 'quarta' : 3 ,\n 'qua' : 3 ,\n 'quinta' : 4 ,\n 'qui' : 4 ,\n 'sexta' : 5 ,\n 'sex' : 5 ,\n 'sábado' : 6 ,\n 'sáb' : 6 ,\n 'domingo' : 7 ,\n 'dom' : 7\n }[ week.toLowerCase( ) ];\n },\n\n /**\n * Function that returns the number of days of a given month (m) on a given year (y)\n *\n * @method _daysInMonth\n * @param {Number} _m Month\n * @param {Number} _y Year\n * @return {Number} Number of days of a give month on a given year\n * @private\n * @static\n * @example\n * console.log( InkDate._daysInMonth(2,2013) ); // Result: 28\n */\n _daysInMonth: function(_m,_y){\n var nDays;\n\n if(_m===1 || _m===3 || _m===5 || _m===7 || _m===8 || _m===10 || _m===12)\n {\n nDays= 31;\n }\n else if ( _m===4 || _m===6 || _m===9 || _m===11)\n {\n nDays = 30;\n }\n else\n {\n if((_y%400===0) || (_y%4===0 && _y%100!==0))\n {\n nDays = 29;\n }\n else\n {\n nDays = 28;\n }\n }\n return nDays;\n },\n\n /**\n * Formats a date object.\n * This works exactly as php date() function. http://php.net/manual/en/function.date.php\n *\n * @method get\n * @param {String} format The format in which the date it will be formatted.\n * @param {Date} [_date] The date to format. Can receive unix timestamp or a date object. Defaults to current time.\n * @return {String} Formatted date\n * @public\n * @static\n * @sample Ink_Util_Date_get.html \n */\n get: function(format, _date){\n /*jshint maxcomplexity:65 */\n if(typeof(format) === 'undefined' || format === ''){\n format = \"Y-m-d\";\n }\n\n\n var iFormat = format.split(\"\");\n var result = new Array(iFormat.length);\n var escapeChar = \"\\\\\";\n var jsDate;\n\n if (typeof(_date) === 'undefined'){\n jsDate = new Date();\n } else if (typeof(_date)==='number'){\n jsDate = new Date(_date*1000);\n } else {\n jsDate = new Date(_date);\n }\n\n var jsFirstDay, jsThisDay, jsHour;\n /* This switch is presented in the same order as in php date function (PHP 5.2.2) */\n for (var i = 0; i < iFormat.length; i++) {\n switch(iFormat[i]) {\n case escapeChar:\n result[i] = iFormat[i+1];\n i++;\n break;\n\n\n /* DAY */\n case \"d\": /* Day of the month, 2 digits with leading zeros; ex: 01 to 31 */\n var jsDay = jsDate.getDate();\n result[i] = (String(jsDay).length > 1) ? jsDay : \"0\" + jsDay;\n break;\n\n case \"D\": /* A textual representation of a day, three letters; Seg to Dom */\n result[i] = this._wDays(jsDate.getDay()).substring(0, 3);\n break;\n\n case \"j\": /* Day of the month without leading zeros; ex: 1 to 31 */\n result[i] = jsDate.getDate();\n break;\n\n case \"l\": /* A full textual representation of the day of the week; Domingo to Sabado */\n result[i] = this._wDays(jsDate.getDay());\n break;\n\n case \"N\": /* ISO-8601 numeric representation of the day of the week; 1 (Segunda) to 7 (Domingo) */\n result[i] = jsDate.getDay() || 7;\n break;\n\n case \"S\": /* English ordinal suffix for the day of the month, 2 characters; st, nd, rd or th. Works well with j */\n var temp = jsDate.getDate();\n var suffixes = [\"st\", \"nd\", \"rd\"];\n var suffix = \"\";\n\n if (temp >= 11 && temp <= 13) {\n result[i] = \"th\";\n } else {\n result[i] = (suffix = suffixes[String(temp).substr(-1) - 1]) ? (suffix) : (\"th\");\n }\n break;\n\n case \"w\": /* Numeric representation of the day of the week; 0 (for Sunday) through 6 (for Saturday) */\n result[i] = jsDate.getDay();\n break;\n\n case \"z\": /* The day of the year (starting from 0); 0 to 365 */\n jsFirstDay = Date.UTC(jsDate.getFullYear(), 0, 0);\n jsThisDay = Date.UTC(jsDate.getFullYear(), jsDate.getMonth(), jsDate.getDate());\n result[i] = Math.floor((jsThisDay - jsFirstDay) / (1000 * 60 * 60 * 24));\n break;\n\n /* WEEK */\n case \"W\": /* ISO-8601 week number of year, weeks starting on Monday; ex: 42 (the 42nd week in the year) */\n var jsYearStart = new Date( jsDate.getFullYear( ) , 0 , 1 );\n jsFirstDay = jsYearStart.getDay() || 7;\n\n var days = Math.floor( ( jsDate - jsYearStart ) / ( 24 * 60 * 60 * 1000 ) + 1 );\n\n result[ i ] = Math.ceil( ( days - ( 8 - jsFirstDay ) ) / 7 ) + 1;\n break;\n\n\n /* MONTH */\n case \"F\": /* A full textual representation of a month, such as Janeiro or Marco; Janeiro a Dezembro */\n result[i] = this._months(jsDate.getMonth());\n break;\n\n case \"m\": /* Numeric representation of a month, with leading zeros; 01 to 12 */\n var jsMonth = String(jsDate.getMonth() + 1);\n result[i] = (jsMonth.length > 1) ? jsMonth : \"0\" + jsMonth;\n break;\n\n case \"M\": /* A short textual representation of a month, three letters; Jan a Dez */\n result[i] = this._months(jsDate.getMonth()).substring(0,3);\n break;\n\n case \"n\": /* Numeric representation of a month, without leading zeros; 1 a 12 */\n result[i] = jsDate.getMonth() + 1;\n break;\n\n case \"t\": /* Number of days in the given month; ex: 28 */\n result[i] = this._daysInMonth(jsDate.getMonth()+1,jsDate.getYear());\n break;\n\n /* YEAR */\n case \"L\": /* Whether it's a leap year; 1 if it is a leap year, 0 otherwise. */\n var jsYear = jsDate.getFullYear();\n result[i] = (jsYear % 4) ? false : ( (jsYear % 100) ? true : ( (jsYear % 400) ? false : true ) );\n break;\n\n case \"o\": /* ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. */\n throw '\"o\" not implemented!';\n\n case \"Y\": /* A full numeric representation of a year, 4 digits; 1999 */\n result[i] = jsDate.getFullYear();\n break;\n\n case \"y\": /* A two digit representation of a year; 99 */\n result[i] = String(jsDate.getFullYear()).substring(2);\n break;\n\n /* TIME */\n case \"a\": /* Lowercase Ante meridiem and Post meridiem; am or pm */\n result[i] = (jsDate.getHours() < 12) ? \"am\" : \"pm\";\n break;\n\n case \"A\": /* Uppercase Ante meridiem and Post meridiem; AM or PM */\n result[i] = (jsDate.getHours < 12) ? \"AM\" : \"PM\";\n break;\n\n case \"B\": /* Swatch Internet time; 000 through 999 */\n throw '\"B\" not implemented!';\n\n case \"g\": /* 12-hour format of an hour without leading zeros; 1 to 12 */\n jsHour = jsDate.getHours();\n result[i] = (jsHour <= 12) ? jsHour : (jsHour - 12);\n break;\n\n case \"G\": /* 24-hour format of an hour without leading zeros; 1 to 23 */\n result[i] = String(jsDate.getHours());\n break;\n\n case \"h\": /* 12-hour format of an hour with leading zeros; 01 to 12 */\n jsHour = String(jsDate.getHours());\n jsHour = (jsHour <= 12) ? jsHour : (jsHour - 12);\n result[i] = (jsHour.length > 1) ? jsHour : \"0\" + jsHour;\n break;\n\n case \"H\": /* 24-hour format of an hour with leading zeros; 01 to 24 */\n jsHour = String(jsDate.getHours());\n result[i] = (jsHour.length > 1) ? jsHour : \"0\" + jsHour;\n break;\n\n case \"i\": /* Minutes with leading zeros; 00 to 59 */\n var jsMinute = String(jsDate.getMinutes());\n result[i] = (jsMinute.length > 1) ? jsMinute : \"0\" + jsMinute;\n break;\n\n case \"s\": /* Seconds with leading zeros; 00 to 59; */\n var jsSecond = String(jsDate.getSeconds());\n result[i] = (jsSecond.length > 1) ? jsSecond : \"0\" + jsSecond;\n break;\n\n case \"u\": /* Microseconds */\n throw '\"u\" not implemented!';\n\n\n /* TIMEZONE */\n\n case \"e\": /* Timezone identifier */\n throw '\"e\" not implemented!';\n\n case \"I\": /* \"1\" if Daylight Savings Time, \"0\" otherwise. Works only on the northern hemisphere */\n jsFirstDay = new Date(jsDate.getFullYear(), 0, 1);\n result[i] = (jsDate.getTimezoneOffset() !== jsFirstDay.getTimezoneOffset()) ? (1) : (0);\n break;\n\n case \"O\": /* Difference to Greenwich time (GMT) in hours */\n var jsMinZone = jsDate.getTimezoneOffset();\n var jsMinutes = jsMinZone % 60;\n jsHour = String(((jsMinZone - jsMinutes) / 60) * -1);\n\n if (jsHour.charAt(0) !== \"-\") {\n jsHour = \"+\" + jsHour;\n }\n\n jsHour = (jsHour.length === 3) ? (jsHour) : (jsHour.replace(/([+\\-])(\\d)/, \"$1\" + 0 + \"$2\"));\n result[i] = jsHour + jsMinutes + \"0\";\n break;\n\n case \"P\": /* Difference to Greenwich time (GMT) with colon between hours and minutes */\n throw '\"P\" not implemented!';\n\n case \"T\": /* Timezone abbreviation */\n throw '\"T\" not implemented!';\n\n case \"Z\": /* Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. */\n result[i] = jsDate.getTimezoneOffset() * 60;\n break;\n\n\n /* FULL DATE/TIME */\n\n case \"c\": /* ISO 8601 date */\n throw '\"c\" not implemented!';\n\n case \"r\": /* RFC 2822 formatted date */\n var jsDayName = this._wDays(jsDate.getDay()).substr(0, 3);\n var jsMonthName = this._months(jsDate.getMonth()).substr(0, 3);\n result[i] = jsDayName + \", \" + jsDate.getDate() + \" \" + jsMonthName + this.get(\" Y H:i:s O\",jsDate);\n break;\n\n case \"U\": /* Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) */\n result[i] = Math.floor(jsDate.getTime() / 1000);\n break;\n\n default:\n result[i] = iFormat[i];\n }\n }\n\n return result.join('');\n\n },\n\n /**\n * Creates a date object based on a format string.\n * This works exactly as php date() function. http://php.net/manual/en/function.date.php\n *\n * @method set\n * @param {String} [format] The format in which the date will be formatted. Defaults to 'Y-m-d'\n * @param {String} str_date The date formatted.\n * @return {Date} Date object based on the formatted date and format\n * @public\n * @static\n * @sample Ink_Util_Date_set.html \n */\n set : function( format , str_date ) {\n if ( typeof str_date === 'undefined' ) { return ; }\n if ( typeof format === 'undefined' || format === '' ) { format = \"Y-m-d\"; }\n\n var iFormat = format.split(\"\");\n var result = new Array( iFormat.length );\n var escapeChar = \"\\\\\";\n var mList;\n\n var objIndex = {\n year : undefined ,\n month : undefined ,\n day : undefined ,\n dayY : undefined ,\n dayW : undefined ,\n week : undefined ,\n hour : undefined ,\n hourD : undefined ,\n min : undefined ,\n sec : undefined ,\n msec : undefined ,\n ampm : undefined ,\n diffM : undefined ,\n diffH : undefined ,\n date : undefined\n };\n\n var matches = 0;\n\n /* This switch is presented in the same order as in php date function (PHP 5.2.2) */\n for ( var i = 0; i < iFormat.length; i++) {\n switch( iFormat[ i ] ) {\n case escapeChar:\n result[i] = iFormat[ i + 1 ];\n i++;\n break;\n\n /* DAY */\n case \"d\": /* Day of the month, 2 digits with leading zeros; ex: 01 to 31 */\n result[ i ] = '(\\\\d{2})';\n objIndex.day = { original : i , match : matches++ };\n break;\n\n case \"j\": /* Day of the month without leading zeros; ex: 1 to 31 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.day = { original : i , match : matches++ };\n break;\n\n case \"D\": /* A textual representation of a day, three letters; Seg to Dom */\n result[ i ] = '([\\\\wá]{3})';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"l\": /* A full textual representation of the day of the week; Domingo to Sabado */\n result[i] = '([\\\\wá]{5,7})';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"N\": /* ISO-8601 numeric representation of the day of the week; 1 (Segunda) to 7 (Domingo) */\n result[ i ] = '(\\\\d)';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"w\": /* Numeric representation of the day of the week; 0 (for Sunday) through 6 (for Saturday) */\n result[ i ] = '(\\\\d)';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"S\": /* English ordinal suffix for the day of the month, 2 characters; st, nd, rd or th. Works well with j */\n result[ i ] = '\\\\w{2}';\n break;\n\n case \"z\": /* The day of the year (starting from 0); 0 to 365 */\n result[ i ] = '(\\\\d{1,3})';\n objIndex.dayY = { original : i , match : matches++ };\n break;\n\n /* WEEK */\n case \"W\": /* ISO-8601 week number of year, weeks starting on Monday; ex: 42 (the 42nd week in the year) */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.week = { original : i , match : matches++ };\n break;\n\n /* MONTH */\n case \"F\": /* A full textual representation of a month, such as Janeiro or Marco; Janeiro a Dezembro */\n result[ i ] = '([\\\\wç]{4,9})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"M\": /* A short textual representation of a month, three letters; Jan a Dez */\n result[ i ] = '(\\\\w{3})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"m\": /* Numeric representation of a month, with leading zeros; 01 to 12 */\n result[ i ] = '(\\\\d{2})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"n\": /* Numeric representation of a month, without leading zeros; 1 a 12 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"t\": /* Number of days in the given month; ex: 28 */\n result[ i ] = '\\\\d{2}';\n break;\n\n /* YEAR */\n case \"L\": /* Whether it's a leap year; 1 if it is a leap year, 0 otherwise. */\n result[ i ] = '\\\\w{4,5}';\n break;\n\n case \"o\": /* ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. */\n throw '\"o\" not implemented!';\n\n case \"Y\": /* A full numeric representation of a year, 4 digits; 1999 */\n result[ i ] = '(\\\\d{4})';\n objIndex.year = { original : i , match : matches++ };\n break;\n\n case \"y\": /* A two digit representation of a year; 99 */\n result[ i ] = '(\\\\d{2})';\n if ( typeof objIndex.year === 'undefined' || iFormat[ objIndex.year.original ] !== 'Y' ) {\n objIndex.year = { original : i , match : matches++ };\n }\n break;\n\n /* TIME */\n case \"a\": /* Lowercase Ante meridiem and Post meridiem; am or pm */\n result[ i ] = '(am|pm)';\n objIndex.ampm = { original : i , match : matches++ };\n break;\n\n case \"A\": /* Uppercase Ante meridiem and Post meridiem; AM or PM */\n result[ i ] = '(AM|PM)';\n objIndex.ampm = { original : i , match : matches++ };\n break;\n\n case \"B\": /* Swatch Internet time; 000 through 999 */\n throw '\"B\" not implemented!';\n\n case \"g\": /* 12-hour format of an hour without leading zeros; 1 to 12 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.hourD = { original : i , match : matches++ };\n break;\n\n case \"G\": /* 24-hour format of an hour without leading zeros; 1 to 23 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.hour = { original : i , match : matches++ };\n break;\n\n case \"h\": /* 12-hour format of an hour with leading zeros; 01 to 12 */\n result[ i ] = '(\\\\d{2})';\n objIndex.hourD = { original : i , match : matches++ };\n break;\n\n case \"H\": /* 24-hour format of an hour with leading zeros; 01 to 24 */\n result[ i ] = '(\\\\d{2})';\n objIndex.hour = { original : i , match : matches++ };\n break;\n\n case \"i\": /* Minutes with leading zeros; 00 to 59 */\n result[ i ] = '(\\\\d{2})';\n objIndex.min = { original : i , match : matches++ };\n break;\n\n case \"s\": /* Seconds with leading zeros; 00 to 59; */\n result[ i ] = '(\\\\d{2})';\n objIndex.sec = { original : i , match : matches++ };\n break;\n\n case \"u\": /* Microseconds */\n throw '\"u\" not implemented!';\n\n /* TIMEZONE */\n case \"e\": /* Timezone identifier */\n throw '\"e\" not implemented!';\n\n case \"I\": /* \"1\" if Daylight Savings Time, \"0\" otherwise. Works only on the northern hemisphere */\n result[i] = '\\\\d';\n break;\n\n case \"O\": /* Difference to Greenwich time (GMT) in hours */\n result[ i ] = '([-+]\\\\d{4})';\n objIndex.diffH = { original : i , match : matches++ };\n break;\n\n case \"P\": /* Difference to Greenwich time (GMT) with colon between hours and minutes */\n throw '\"P\" not implemented!';\n\n case \"T\": /* Timezone abbreviation */\n throw '\"T\" not implemented!';\n\n case \"Z\": /* Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. */\n result[ i ] = '(\\\\-?\\\\d{1,5})';\n objIndex.diffM = { original : i , match : matches++ };\n break;\n\n /* FULL DATE/TIME */\n case \"c\": /* ISO 8601 date */\n throw '\"c\" not implemented!';\n\n case \"r\": /* RFC 2822 formatted date */\n result[ i ] = '([\\\\wá]{3}, \\\\d{1,2} \\\\w{3} \\\\d{4} \\\\d{2}:\\\\d{2}:\\\\d{2} [+\\\\-]\\\\d{4})';\n objIndex.date = { original : i , match : matches++ };\n break;\n\n case \"U\": /* Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) */\n result[ i ] = '(\\\\d{1,13})';\n objIndex.date = { original : i , match : matches++ };\n break;\n\n default:\n result[ i ] = iFormat[ i ];\n }\n }\n\n var pattr = new RegExp( result.join('') );\n\n try {\n mList = str_date.match( pattr );\n if ( !mList ) { return; }\n }\n catch ( e ) { return ; }\n\n var _haveDatetime = typeof objIndex.date !== 'undefined';\n\n var _haveYear = typeof objIndex.year !== 'undefined';\n\n var _haveYDay = typeof objIndex.dayY !== 'undefined';\n\n var _haveDay = typeof objIndex.day !== 'undefined';\n var _haveMonth = typeof objIndex.month !== 'undefined';\n var _haveMonthDay = _haveMonth && _haveDay;\n var _haveOnlyDay = !_haveMonth && _haveDay;\n\n var _haveWDay = typeof objIndex.dayW !== 'undefined';\n var _haveWeek = typeof objIndex.week !== 'undefined';\n var _haveWeekWDay = _haveWeek && _haveWDay;\n var _haveOnlyWDay = !_haveWeek && _haveWDay;\n\n var _validDate = _haveYDay || _haveMonthDay || !_haveYear && _haveOnlyDay || _haveWeekWDay || !_haveYear && _haveOnlyWDay;\n var _noDate = !_haveYear && !_haveYDay && !_haveDay && !_haveMonth && !_haveWDay && !_haveWeek;\n\n var _haveHour12 = typeof objIndex.hourD !== 'undefined' && typeof objIndex.ampm !== 'undefined';\n var _haveHour24 = typeof objIndex.hour !== 'undefined';\n var _haveHour = _haveHour12 || _haveHour24;\n\n var _haveMin = typeof objIndex.min !== 'undefined';\n var _haveSec = typeof objIndex.sec !== 'undefined';\n var _haveMSec = typeof objIndex.msec !== 'undefined';\n\n var _haveMoreM = !_noDate || _haveHour;\n var _haveMoreS = _haveMoreM || _haveMin;\n\n var _haveDiffM = typeof objIndex.diffM !== 'undefined';\n var _haveDiffH = typeof objIndex.diffH !== 'undefined';\n //var _haveGMT = _haveDiffM || _haveDiffH;\n var hour;\n var min;\n\n if ( _haveDatetime ) {\n if ( iFormat[ objIndex.date.original ] === 'U' ) {\n return new Date( +mList[ objIndex.date.match + 1 ] * 1000 );\n }\n\n var dList = mList[ objIndex.date.match + 1 ].match( /\\w{3}, (\\d{1,2}) (\\w{3}) (\\d{4}) (\\d{2}):(\\d{2}):(\\d{2}) ([+\\-]\\d{4})/ );\n hour = +dList[ 4 ] + ( +dList[ 7 ].slice( 0 , 3 ) );\n min = +dList[ 5 ] + ( dList[ 7 ].slice( 0 , 1 ) + dList[ 7 ].slice( 3 ) ) / 100 * 60;\n\n return new Date( dList[ 3 ] , this._iMonth( dList[ 2 ] ) , dList[ 1 ] , hour , min , dList[ 6 ] );\n }\n\n var _d = new Date( );\n var year;\n var month;\n var day;\n var sec;\n var msec;\n var gmt;\n\n if ( !_validDate && !_noDate ) { return ; }\n\n if ( _validDate ) {\n if ( _haveYear ) {\n var _y = _d.getFullYear( ) - 50 + '';\n year = mList[ objIndex.year.match + 1 ];\n if ( iFormat[ objIndex.year.original ] === 'y' ) {\n year = +_y.slice( 0 , 2 ) + ( year >= ( _y ).slice( 2 ) ? 0 : 1 ) + year;\n }\n } else {\n year = _d.getFullYear();\n }\n\n if ( _haveYDay ) {\n month = 0;\n day = mList[ objIndex.dayY.match + 1 ];\n } else if ( _haveDay ) {\n if ( _haveMonth ) {\n month = this._iMonth( mList[ objIndex.month.match + 1 ] );\n } else {\n month = _d.getMonth( );\n }\n\n day = mList[ objIndex.day.match + 1 ];\n } else {\n month = 0;\n\n var week;\n if ( _haveWeek ) {\n week = mList[ objIndex.week.match + 1 ];\n } else {\n week = this.get( 'W' , _d );\n }\n\n day = ( week - 2 ) * 7 + ( 8 - ( ( new Date( year , 0 , 1 ) ).getDay( ) || 7 ) ) + this._iWeek( mList[ objIndex.week.match + 1 ] );\n }\n\n if ( month === 0 && day > 31 ) {\n var aux = new Date( year , month , day );\n month = aux.getMonth( );\n day = aux.getDate( );\n }\n }\n else {\n year = _d.getFullYear( );\n month = _d.getMonth( );\n day = _d.getDate( );\n }\n\n if ( _haveHour12 ) { hour = +mList[ objIndex.hourD.match + 1 ] + ( mList[ objIndex.ampm.match + 1 ] === 'pm' ? 12 : 0 ); }\n else if ( _haveHour24 ) { hour = mList[ objIndex.hour.match + 1 ]; }\n else if ( _noDate ) { hour = _d.getHours( ); }\n else { hour = '00'; }\n\n if ( _haveMin ) { min = mList[ objIndex.min.match + 1 ]; }\n else if ( !_haveMoreM ) { min = _d.getMinutes( ); }\n else { min = '00'; }\n\n if ( _haveSec ) { sec = mList[ objIndex.sec.match + 1 ]; }\n else if ( !_haveMoreS ) { sec = _d.getSeconds( ); }\n else { sec = '00'; }\n\n if ( _haveMSec ) { msec = mList[ objIndex.msec.match + 1 ]; }\n else { msec = '000'; }\n\n if ( _haveDiffH ) { gmt = mList[ objIndex.diffH.match + 1 ]; }\n else if ( _haveDiffM ) { gmt = String( -1 * mList[ objIndex.diffM.match + 1 ] / 60 * 100 ).replace( /^(\\d)/ , '+$1' ).replace( /(^[\\-+])(\\d{3}$)/ , '$10$2' ); }\n else { gmt = '+0000'; }\n\n return new Date( year, month, day, hour, min, sec );\n }\n };\n\n\n return InkDate;\n\n});\n","/**\n * Dump/Profiling Utilities\n * @module Ink.Util.Dumper_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Dumper', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Dumper_1 \n */\n\n var Dumper = {\n\n /**\n * Hex code for the 'tab'\n * \n * @property _tab\n * @type {String}\n * @private\n * @readOnly\n * @static\n *\n */\n _tab: '\\xA0\\xA0\\xA0\\xA0',\n\n /**\n * Function that returns the argument passed formatted\n *\n * @method _formatParam\n * @param {Mixed} param The thing to format.\n * @return {String} The argument passed formatted\n * @private\n * @static\n */\n _formatParam: function(param)\n {\n var formated = '';\n\n switch(typeof(param)) {\n case 'string':\n formated = '(string) '+param;\n break;\n case 'number':\n formated = '(number) '+param;\n break;\n case 'boolean':\n formated = '(boolean) '+param;\n break;\n case 'object':\n if(param !== null) {\n if(param.constructor === Array) {\n formated = 'Array \\n{\\n' + this._outputFormat(param, 0) + '\\n}';\n } else {\n formated = 'Object \\n{\\n' + this._outputFormat(param, 0) + '\\n}';\n }\n } else {\n formated = 'null';\n }\n break;\n default:\n formated = false;\n }\n\n return formated;\n },\n\n /**\n * Function that returns the tabs concatenated\n *\n * @method _getTabs\n * @param {Number} numberOfTabs Number of Tabs\n * @return {String} Tabs concatenated\n * @private\n * @static\n */\n _getTabs: function(numberOfTabs)\n {\n var tabs = '';\n for(var _i = 0; _i < numberOfTabs; _i++) {\n tabs += this._tab;\n }\n return tabs;\n },\n\n /**\n * Function that formats the parameter to display.\n *\n * @method _outputFormat\n * @param {Mixed} param The thing to format.\n * @param {Number} indent Indentation level.\n * @return {String} The parameter passed formatted to displat\n * @private\n * @static\n */\n _outputFormat: function(param, indent)\n {\n var formated = '';\n //var _strVal = false;\n var _typeof = false;\n for(var key in param) {\n if(param[key] !== null) {\n if(typeof(param[key]) === 'object' && (param[key].constructor === Array || param[key].constructor === Object)) {\n if(param[key].constructor === Array) {\n _typeof = 'Array';\n } else if(param[key].constructor === Object) {\n _typeof = 'Object';\n }\n formated += this._tab + this._getTabs(indent) + '[' + key + '] => '+_typeof+'\\n';\n formated += this._tab + this._getTabs(indent) + '{\\n';\n formated += this._outputFormat(param[key], indent + 1) + this._tab + this._getTabs(indent) + '}\\n';\n } else if(param[key].constructor === Function) {\n continue;\n } else {\n formated = formated + this._tab + this._getTabs(indent) + '[' + key + '] => ' + param[key] + '\\n';\n }\n } else {\n formated = formated + this._tab + this._getTabs(indent) + '[' + key + '] => null \\n';\n }\n }\n return formated;\n },\n\n /**\n * Prints variable structure.\n *\n * @method printDump\n * @param {Mixed} param Variable to be dumped.\n * @param {DOMElement|String} [target] Element to print the dump on.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Dumper_printDump.html \n */\n printDump: function(param, target)\n {\n /*jshint evil:true */\n if(!target || typeof(target) === 'undefined') {\n document.write('
    '+this._formatParam(param)+'
    ');\n } else {\n if(typeof(target) === 'string') {\n document.getElementById(target).innerHTML = '
    ' + this._formatParam(param) + '
    ';\n } else if(typeof(target) === 'object') {\n target.innerHTML = '
    '+this._formatParam(param)+'
    ';\n } else {\n throw \"TARGET must be an element or an element ID\";\n }\n }\n },\n\n /**\n * Get a variable's structure.\n *\n * @method returnDump\n * @param {Mixed} param Variable to get the structure.\n * @return {String} The variable's structure.\n * @public\n * @static\n * @sample Ink_Util_Dumper_returnDump.html \n */\n returnDump: function(param)\n {\n return this._formatParam(param);\n },\n\n /**\n * Alert a variable's structure.\n *\n * @method alertDump\n * @param {Mixed} param Variable to be dumped.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Dumper_alertDump.html \n */\n alertDump: function(param)\n {\n window.alert(this._formatParam(param).replace(/()(Array|Object)(<\\/b>)/g, \"$2\"));\n },\n\n /**\n * Prints the variable structure to a new window.\n *\n * @method windowDump\n * @param {Mixed} param Variable to be dumped.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Dumper_windowDump.html \n */\n windowDump: function(param)\n {\n var dumperwindow = 'dumperwindow_'+(Math.random() * 10000);\n var win = window.open('',\n dumperwindow,\n 'width=400,height=300,left=50,top=50,status,menubar,scrollbars,resizable'\n );\n win.document.open();\n win.document.write('
    '+this._formatParam(param)+'
    ');\n win.document.close();\n win.focus();\n }\n\n };\n\n return Dumper;\n\n});\n","/**\n * Internationalization Utilities \n * @module Ink.Util.I18n_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.I18n', '1', [], function () {\n 'use strict';\n\n var pattrText = /\\{(?:(\\{.*?})|(?:%s:)?(\\d+)|(?:%s)?|([\\w-]+))}/g;\n\n var funcOrVal = function( ret , args ) {\n if ( typeof ret === 'function' ) {\n return ret.apply(this, args);\n } else if (typeof ret !== undefined) {\n return ret;\n } else {\n return '';\n }\n };\n\n /**\n * You can use this module to internationalize your applications. It roughly emulates GNU gettext's API.\n *\n * @class Ink.Util.I18n\n * @constructor\n *\n * @param {Object} dict Object mapping language codes (in the form of `pt_PT`, `pt_BR`, `fr`, `en_US`, etc.) to their `dictionaries`\n * @param {String} [lang='pt_PT'] language code of the target language\n * @param {Boolean} [testMode=false] Sets the test mode (see `testMode()`) on construction.\n *\n * @sample Ink_Util_I18n_1.html\n */\n var I18n = function( dict , lang , testMode ) {\n if ( !( this instanceof I18n ) ) { return new I18n( dict , lang , testMode ); }\n\n this.reset( )\n .lang( lang )\n .testMode( testMode )\n .append( dict || { } , lang );\n };\n\n I18n.prototype = {\n reset: function( ) {\n this._dicts = [ ];\n this._dict = { };\n this._testMode = false;\n this._lang = this._gLang;\n\n return this;\n },\n /**\n * Adds translation strings for the helper to use.\n *\n * @method append\n * @param {Object} dict Object containing language objects identified by their language code\n * @return {I18n} (itself)\n *\n * @sample Ink_Util_I18n_1_append.html\n */\n append: function( dict ) {\n this._dicts.push( dict );\n\n this._dict = Ink.extendObj(this._dict , dict[ this._lang ] );\n\n return this;\n },\n /**\n * Gets or sets the language.\n * If there are more dictionaries available in cache, they will be loaded.\n *\n * @method lang\n * @param {String} [lang] Language code to set this instance to. Omit this argument if you want to get the language code instead.\n * @return {String|I18n} The language code, if called without arguments, or this I18n instance if called with an argument.\n */\n lang: function( lang ) {\n if ( !arguments.length ) { return this._lang; }\n\n if ( lang && this._lang !== lang ) {\n this._lang = lang;\n\n this._dict = { };\n\n for ( var i = 0, l = this._dicts.length; i < l; i++ ) {\n this._dict = Ink.extendObj( this._dict , this._dicts[ i ][ lang ] || { } );\n }\n }\n\n return this;\n },\n /**\n * Sets or unsets test mode.\n * In test mode, unknown strings are wrapped in `[ ... ]`. This is useful for debugging your application and to make sure all your translation keys are in place.\n *\n * @method testMode\n * @param {Boolean} [newTestMode] Flag to set the test mode state. Omit this argument to *get* the current testMode instead.\n * @return {String|I18n} The current testMode, if called without arguments, or this I18n instance if called with an argument.\n *\n */\n testMode: function( newTestMode ) {\n if ( !arguments.length ) { return !!this._testMode; }\n\n if ( newTestMode !== undefined ) { this._testMode = !!newTestMode; }\n\n return this;\n },\n\n /**\n * Gest a key from the current dictionary\n *\n * @method getKey\n * @param {String} key Key you wish to get from the dictionary.\n * @return {Mixed} The object which happened to be in the current language dictionary on the given key.\n *\n * @sample Ink_Util_I18n_1_getKey.html\n */\n getKey: function( key ) {\n var ret;\n var gLang = this._gLang;\n var lang = this._lang;\n \n if ( key in this._dict ) {\n ret = this._dict[ key ];\n } else {\n I18n.langGlobal( lang );\n \n ret = this._gDict[ key ];\n \n I18n.langGlobal( gLang );\n }\n \n return ret;\n },\n\n /**\n * Translates a string.\n * Given a translation key, return a translated string, with replaced parameters.\n * When a translated string is not available, the original string is returned unchanged.\n *\n * @method text\n * @param {String} str Key to look for in i18n dictionary (which is returned verbatim if unknown)\n * @param {Object} [namedParms] Named replacements. Replaces {named} with values in this object.\n * @param {String} [args] Replacement #1 (replaces first {} and all {1})\n * @param {String} [arg2] Replacement #2 (replaces second {} and all {2})\n * @param {String} [argn...] Replacement #n (replaces nth {} and all {n})\n *\n * @return {String} Translated string.\n *\n * @sample Ink_Util_I18n_1_text.html\n */\n text: function( str /*, replacements...*/ ) {\n if ( typeof str !== 'string' ) { return; } // Backwards-compat\n\n var pars = Array.prototype.slice.call( arguments , 1 );\n var idx = 0;\n var isObj = typeof pars[ 0 ] === 'object';\n\n var original = this.getKey( str );\n if ( original === undefined ) { original = this._testMode ? '[' + str + ']' : str; }\n if ( typeof original === 'number' ) { original += ''; }\n\n if (typeof original === 'string') {\n original = original.replace( pattrText , function( m , $1 , $2 , $3 ) {\n var ret =\n $1 ? $1 :\n $2 ? pars[ $2 - ( isObj ? 0 : 1 ) ] :\n $3 ? pars[ 0 ][ $3 ] || '' :\n pars[ (idx++) + ( isObj ? 1 : 0 ) ];\n return funcOrVal( ret , [idx].concat(pars) );\n });\n return original;\n }\n \n return (\n typeof original === 'function' ? original.apply( this , pars ) :\n original instanceof Array ? funcOrVal( original[ pars[ 0 ] ] , pars ) :\n typeof original === 'object' ? funcOrVal( original[ pars[ 0 ] ] , pars ) :\n '');\n },\n\n /**\n * Translates and pluralizes text.\n * Given a singular string, a plural string and a number, translates either the singular or plural string.\n *\n * @method ntext\n *\n * @param {String} strSin Word to use when count is 1\n * @param {String} strPlur Word to use otherwise\n * @param {Number} count Number which defines which word to use\n * @param {Mixed} [args...] Extra arguments, to be passed to `text()`\n *\n * @return {String} Pluralized text string.\n *\n * @sample Ink_Util_I18n_1_ntext.html\n */\n ntext: function( strSin , strPlur , count ) {\n var pars = Array.prototype.slice.apply( arguments );\n var original;\n\n if ( pars.length === 2 && typeof strPlur === 'number' ) {\n original = this.getKey( strSin );\n if ( !( original instanceof Array ) ) { return ''; }\n\n pars.splice( 0 , 1 );\n original = original[ strPlur === 1 ? 0 : 1 ];\n } else {\n pars.splice( 0 , 2 );\n original = count === 1 ? strSin : strPlur;\n }\n\n return this.text.apply( this , [ original ].concat( pars ) );\n },\n\n /**\n * Gets the ordinal suffix of a number.\n *\n * This works by using transforms (in the form of Objects or Functions) passed into the function or found in the special key `_ordinals` in the active language dictionary.\n *\n * @method ordinal\n *\n * @param {Number} num Input number\n * @param {Object|Function} [options]={} Dictionaries for translating. Each of these options' fallback is found in the current language's dictionary. The lookup order is the following: `exceptions`, `byLastDigit`, `default`. Each of these may be either an `Object` or a `Function`. If it's a function, it is called (with `number` and `digit` for any function except for byLastDigit, which is called with the `lastDigit` of the number in question), and if the function returns a string, that is used. If it's an object, the property is looked up using `obj[prop]`. If what is found is a string, it is used directly.\n * @param {Object|Function} [options.byLastDigit]={} If the language requires the last digit to be considered, mappings of last digits to ordinal suffixes can be created here.\n * @param {Object|Function} [options.exceptions]={} Map unique, special cases to their ordinal suffixes.\n *\n * @returns {String} Ordinal suffix for `num`.\n *\n * @sample Ink_Util_I18n_1_ordinal.html\n **/\n ordinal: function( num ) {\n if ( num === undefined ) { return ''; }\n\n var lastDig = +num.toString( ).slice( -1 );\n\n var ordDict = this.getKey( '_ordinals' );\n if ( ordDict === undefined ) { return ''; }\n\n if ( typeof ordDict === 'string' ) { return ordDict; }\n\n var ret;\n\n if ( typeof ordDict === 'function' ) {\n ret = ordDict( num , lastDig );\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n if ( 'exceptions' in ordDict ) {\n ret = typeof ordDict.exceptions === 'function' ? ordDict.exceptions( num , lastDig ) :\n num in ordDict.exceptions ? funcOrVal( ordDict.exceptions[ num ] , [num , lastDig] ) :\n undefined;\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n if ( 'byLastDigit' in ordDict ) {\n ret = typeof ordDict.byLastDigit === 'function' ? ordDict.byLastDigit( lastDig , num ) :\n lastDig in ordDict.byLastDigit ? funcOrVal( ordDict.byLastDigit[ lastDig ] , [lastDig , num] ) :\n undefined;\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n if ( 'default' in ordDict ) {\n ret = funcOrVal( ordDict['default'] , [ num , lastDig ] );\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n return '';\n },\n\n /**\n * Create an alias.\n *\n * Returns an alias to this I18n instance. It contains the I18n methods documented here, but is also a function. If you call it, it just calls `text()`. This is commonly assigned to \"_\".\n *\n * @method alias\n * @returns {Function} an alias to `text()` on this instance. You can also access the rest of the translation API through this alias.\n *\n * @sample Ink_Util_I18n_1_alias.html\n */\n alias: function( ) {\n var ret = Ink.bind( I18n.prototype.text , this );\n ret.ntext = Ink.bind( I18n.prototype.ntext , this );\n ret.append = Ink.bind( I18n.prototype.append , this );\n ret.ordinal = Ink.bind( I18n.prototype.ordinal , this );\n ret.testMode = Ink.bind( I18n.prototype.testMode , this );\n\n return ret;\n }\n };\n\n /**\n * Resets I18n global state (global dictionaries, and default language for instances)\n *\n * @method reset\n * @return {void}\n * @static\n *\n **/\n I18n.reset = function( ) {\n I18n.prototype._gDicts = [ ];\n I18n.prototype._gDict = { };\n I18n.prototype._gLang = 'pt_PT';\n };\n I18n.reset( );\n\n /**\n * Adds a dictionary to be used in all I18n instances for the corresponding language.\n *\n * @method appendGlobal\n * @static\n *\n * @param {Object} dict Dictionary to be added\n * @param {String} lang Language fo the dictionary being added\n * @return {void}\n *\n */\n I18n.appendGlobal = function( dict , lang ) {\n if ( lang ) {\n if ( !( lang in dict ) ) {\n var obj = { };\n\n obj[ lang ] = dict;\n\n dict = obj;\n }\n\n if ( lang !== I18n.prototype._gLang ) { I18n.langGlobal( lang ); }\n }\n\n I18n.prototype._gDicts.push( dict );\n\n Ink.extendObj( I18n.prototype._gDict , dict[ I18n.prototype._gLang ] );\n };\n\n /**\n * Gets or sets the current default language of I18n instances.\n *\n * @method langGlobal\n * @param {String} [lang] the new language for all I18n instances. Omit this argument if you wish to *get* the current default language instead.\n *\n * @static\n *\n * @return {String} language code, or nothing if not used as a setter.\n */\n I18n.langGlobal = function( lang ) {\n if ( !arguments.length ) { return I18n.prototype._gLang; }\n\n if ( lang && I18n.prototype._gLang !== lang ) {\n I18n.prototype._gLang = lang;\n\n I18n.prototype._gDict = { };\n\n for ( var i = 0, l = I18n.prototype._gDicts.length; i < l; i++ ) {\n Ink.extendObj( I18n.prototype._gDict , I18n.prototype._gDicts[ i ][ lang ] || { } );\n }\n }\n };\n\n return I18n;\n});","/**\n * JSON Utilities\n * @module Ink.Util.Json_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Json', '1', [], function() {\n 'use strict';\n\n var function_call = Function.prototype.call;\n var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n\n function twoDigits(n) {\n var r = '' + n;\n if (r.length === 1) {\n return '0' + r;\n } else {\n return r;\n }\n }\n\n var dateToISOString = Date.prototype.toISOString ?\n Ink.bind(function_call, Date.prototype.toISOString) :\n function(date) {\n // Adapted from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString\n return date.getUTCFullYear() +\n '-' + twoDigits( date.getUTCMonth() + 1 ) +\n '-' + twoDigits( date.getUTCDate() ) +\n 'T' + twoDigits( date.getUTCHours() ) +\n ':' + twoDigits( date.getUTCMinutes() ) +\n ':' + twoDigits( date.getUTCSeconds() ) +\n '.' + String( (date.getUTCMilliseconds()/1000).toFixed(3) ).slice( 2, 5 ) +\n 'Z';\n };\n\n /**\n * Use this class to convert JSON strings to JavaScript objects\n * `.parse()` and also to do the opposite operation `.stringify()`.\n * Internally, the standard JSON implementation is used if available\n * Otherwise, the functions mimic the standard implementation.\n *\n * Here's how to produce JSON from an existing object:\n * \n * Ink.requireModules(['Ink.Util.Json_1'], function (Json) {\n * var obj = {\n * key1: 'value1',\n * key2: 'value2',\n * keyArray: ['arrayValue1', 'arrayValue2', 'arrayValue3']\n * };\n * Json.stringify(obj); // The above object as a JSON string\n * });\n *\n * And here is how to parse JSON:\n *\n * Ink.requireModules(['Ink.Util.Json_1'], function (Json) {\n * var source = '{\"key\": \"value\", \"array\": [true, null, false]}';\n * Json.parse(source); // The above JSON string as an object\n * });\n *\n * @namespace Ink.Util.Json_1 \n * @static\n * \n */\n var InkJson = {\n _nativeJSON: window.JSON || null,\n\n _convertToUnicode: false,\n\n // Escape characters so as to embed them in JSON strings\n _escape: function (theString) {\n var _m = { '\\b': '\\\\b', '\\t': '\\\\t', '\\n': '\\\\n', '\\f': '\\\\f', '\\r': '\\\\r', '\"': '\\\\\"', '\\\\': '\\\\\\\\' };\n\n if (/[\"\\\\\\x00-\\x1f]/.test(theString)) {\n theString = theString.replace(/([\\x00-\\x1f\\\\\"])/g, function(a, b) {\n var c = _m[b];\n if (c) {\n return c;\n }\n c = b.charCodeAt();\n return '\\\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);\n });\n }\n\n return theString;\n },\n\n // A character conversion map\n _toUnicode: function (theString)\n {\n if(!this._convertToUnicode) {\n return this._escape(theString);\n } else {\n var unicodeString = '';\n var inInt = false;\n var theUnicode = false;\n var i = 0;\n var total = theString.length;\n while(i < total) {\n inInt = theString.charCodeAt(i);\n if( (inInt >= 32 && inInt <= 126) ||\n //(inInt >= 48 && inInt <= 57) ||\n //(inInt >= 65 && inInt <= 90) ||\n //(inInt >= 97 && inInt <= 122) ||\n inInt === 8 ||\n inInt === 9 ||\n inInt === 10 ||\n inInt === 12 ||\n inInt === 13 ||\n inInt === 32 ||\n inInt === 34 ||\n inInt === 47 ||\n inInt === 58 ||\n inInt === 92) {\n\n if(inInt === 34 || inInt === 92 || inInt === 47) {\n theUnicode = '\\\\'+theString.charAt(i);\n } else if(inInt === 8) {\n theUnicode = '\\\\b';\n } else if(inInt === 9) {\n theUnicode = '\\\\t';\n } else if(inInt === 10) {\n theUnicode = '\\\\n';\n } else if(inInt === 12) {\n theUnicode = '\\\\f';\n } else if(inInt === 13) {\n theUnicode = '\\\\r';\n } else {\n theUnicode = theString.charAt(i);\n }\n } else {\n if(this._convertToUnicode) {\n theUnicode = theString.charCodeAt(i).toString(16)+''.toUpperCase();\n while (theUnicode.length < 4) {\n theUnicode = '0' + theUnicode;\n }\n theUnicode = '\\\\u' + theUnicode;\n } else {\n theUnicode = theString.charAt(i);\n }\n }\n unicodeString += theUnicode;\n\n i++;\n }\n\n return unicodeString;\n }\n\n },\n\n _stringifyValue: function(param) {\n if (typeof param === 'string') {\n return '\"' + this._toUnicode(param) + '\"';\n } else if (typeof param === 'number' && (isNaN(param) || !isFinite(param))) { // Unusable numbers go null\n return 'null';\n } else if (typeof param === 'undefined' || param === null) { // And so does undefined\n return 'null';\n } else if (typeof param.toJSON === 'function') {\n var t = param.toJSON();\n if (typeof t === 'string') {\n return '\"' + this._escape(t) + '\"';\n } else {\n return this._escape(t.toString());\n }\n } else if (typeof param === 'number' || typeof param === 'boolean') { // These ones' toString methods return valid JSON.\n return '' + param;\n } else if (typeof param === 'function') {\n return 'null'; // match JSON.stringify\n } else if (param.constructor === Date) {\n return '\"' + this._escape(dateToISOString(param)) + '\"';\n } else if (param.constructor === Array) {\n var arrayString = '';\n for (var i = 0, len = param.length; i < len; i++) {\n if (i > 0) {\n arrayString += ',';\n }\n arrayString += this._stringifyValue(param[i]);\n }\n return '[' + arrayString + ']';\n } else { // Object\n var objectString = '';\n for (var k in param) {\n if ({}.hasOwnProperty.call(param, k)) {\n if (objectString !== '') {\n objectString += ',';\n }\n objectString += '\"' + this._escape(k) + '\": ' + this._stringifyValue(param[k]);\n }\n }\n return '{' + objectString + '}';\n }\n },\n\n /**\n * Serializes a JSON object into a string.\n *\n * @method stringify\n * @param {Object} input Data to be serialized into JSON\n * @param {Boolean} convertToUnicode When `true`, converts string contents to unicode \\uXXXX\n * @return {String} Serialized string\n *\n * @sample Ink_Util_Json_stringify.html \n */\n stringify: function(input, convertToUnicode) {\n this._convertToUnicode = !!convertToUnicode;\n if(!this._convertToUnicode && this._nativeJSON) {\n return this._nativeJSON.stringify(input);\n }\n return this._stringifyValue(input); // And recurse.\n },\n \n /**\n * Parses a JSON text through a function\n * \n * @method parse\n * @param text {String} Input string\n * @param reviver {Function} Function receiving `(key, value)`, and `this`=(containing object), used to walk objects.\n * \n * @return {Object} JSON object\n *\n * @sample Ink_Util_Json_parse.html \n */\n /* From https://github.com/douglascrockford/JSON-js/blob/master/json.js */\n parse: function (text, reviver) {\n /*jshint evil:true*/\n\n// The parse method takes a text and an optional reviver function, and returns\n// a JavaScript value if the text is a valid JSON text.\n\n var j;\n\n function walk(holder, key) {\n\n// The walk method is used to recursively walk the resulting structure so\n// that modifications can be made.\n\n var k, v, value = holder[key];\n if (value && typeof value === 'object') {\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = walk(value, k);\n if (v !== undefined) {\n value[k] = v;\n } else {\n delete value[k];\n }\n }\n }\n }\n return reviver.call(holder, key, value);\n }\n\n\n// Parsing happens in four stages. In the first stage, we replace certain\n// Unicode characters with escape sequences. JavaScript handles many characters\n// incorrectly, either silently deleting them, or treating them as line endings.\n\n text = String(text);\n cx.lastIndex = 0;\n if (cx.test(text)) {\n text = text.replace(cx, function (a) {\n return '\\\\u' +\n ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n });\n }\n\n// In the second stage, we run the text against regular expressions that look\n// for non-JSON patterns. We are especially concerned with '()' and 'new'\n// because they can cause invocation, and '=' because it can cause mutation.\n// But just to be safe, we want to reject all unexpected forms.\n\n// We split the second stage into 4 regexp operations in order to work around\n// crippling inefficiencies in IE's and Safari's regexp engines. First we\n// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we\n// replace all simple value tokens with ']' characters. Third, we delete all\n// open brackets that follow a colon or comma or that begin the text. Finally,\n// we look to see that the remaining characters are only whitespace or ']' or\n// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.\n\n if (/^[\\],:{}\\s]*$/\n .test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')\n .replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']')\n .replace(/(?:^|:|,)(?:\\s*\\[)+/g, ''))) {\n\n// In the third stage we use the eval function to compile the text into a\n// JavaScript structure. The '{' operator is subject to a syntactic ambiguity\n// in JavaScript: it can begin a block or an object literal. We wrap the text\n// in parens to eliminate the ambiguity.\n\n j = eval('(' + text + ')');\n\n// In the optional fourth stage, we recursively walk the new structure, passing\n// each name/value pair to a reviver function for possible transformation.\n\n return typeof reviver === 'function' ?\n walk({'': j}, '') :\n j;\n }\n\n// If the text is not JSON parseable, then a SyntaxError is thrown.\n\n throw new SyntaxError('JSON.parse');\n }\n };\n\n return InkJson;\n});\n","/**\n * String Utilities\n * @module Ink.Util.String_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.String', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.String_1 \n */\n var InkUtilString = {\n\n /**\n * List of special chars\n * \n * @property _chars\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _chars: ['&','à','á','â','ã','ä','å','æ','ç','è','é',\n 'ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô',\n 'õ','ö','ø','ù','ú','û','ü','ý','þ','ÿ','À',\n 'Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë',\n 'Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö',\n 'Ø','Ù','Ú','Û','Ü','Ý','Þ','€','\\\"','ß','<',\n '>','¢','£','¤','¥','¦','§','¨','©','ª','«',\n '¬','\\xad','®','¯','°','±','²','³','´','µ','¶',\n '·','¸','¹','º','»','¼','½','¾'],\n\n /**\n * List of the special characters' html entities\n * \n * @property _entities\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _entities: ['amp','agrave','aacute','acirc','atilde','auml','aring',\n 'aelig','ccedil','egrave','eacute','ecirc','euml','igrave',\n 'iacute','icirc','iuml','eth','ntilde','ograve','oacute',\n 'ocirc','otilde','ouml','oslash','ugrave','uacute','ucirc',\n 'uuml','yacute','thorn','yuml','Agrave','Aacute','Acirc',\n 'Atilde','Auml','Aring','AElig','Ccedil','Egrave','Eacute',\n 'Ecirc','Euml','Igrave','Iacute','Icirc','Iuml','ETH','Ntilde',\n 'Ograve','Oacute','Ocirc','Otilde','Ouml','Oslash','Ugrave',\n 'Uacute','Ucirc','Uuml','Yacute','THORN','euro','quot','szlig',\n 'lt','gt','cent','pound','curren','yen','brvbar','sect','uml',\n 'copy','ordf','laquo','not','shy','reg','macr','deg','plusmn',\n 'sup2','sup3','acute','micro','para','middot','cedil','sup1',\n 'ordm','raquo','frac14','frac12','frac34'],\n\n /**\n * List of accented chars\n * \n * @property _accentedChars\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _accentedChars:['à','á','â','ã','ä','å',\n 'è','é','ê','ë',\n 'ì','í','î','ï',\n 'ò','ó','ô','õ','ö',\n 'ù','ú','û','ü',\n 'ç','ñ',\n 'À','Á','Â','Ã','Ä','Å',\n 'È','É','Ê','Ë',\n 'Ì','Í','Î','Ï',\n 'Ò','Ó','Ô','Õ','Ö',\n 'Ù','Ú','Û','Ü',\n 'Ç','Ñ'],\n\n /**\n * List of the accented chars (above), but without the accents\n * \n * @property _accentedRemovedChars\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _accentedRemovedChars:['a','a','a','a','a','a',\n 'e','e','e','e',\n 'i','i','i','i',\n 'o','o','o','o','o',\n 'u','u','u','u',\n 'c','n',\n 'A','A','A','A','A','A',\n 'E','E','E','E',\n 'I','I','I','I',\n 'O','O','O','O','O',\n 'U','U','U','U',\n 'C','N'],\n /**\n * Object that contains the basic HTML unsafe chars, as keys, and their HTML entities as values\n * \n * @property _htmlUnsafeChars\n * @type {Object}\n * @private\n * @readOnly\n * @static\n */\n _htmlUnsafeChars:{'<':'<','>':'>','&':'&','\"':'"',\"'\":'''},\n\n /**\n * Capitalizes a word.\n * If param as more than one word, it converts first letter of all words that have more than 2 letters\n *\n * @method ucFirst\n * @param {String} string String to capitalize.\n * @param {Boolean} [firstWordOnly]=false Flag to capitalize only the first word.\n * @return {String} Camel cased string.\n * @public\n * @static\n * @sample Ink_Util_String_ucFirst.html \n */\n ucFirst: function(string, firstWordOnly) {\n var replacer = firstWordOnly ? /(^|\\s)(\\w)(\\S{2,})/ : /(^|\\s)(\\w)(\\S{2,})/g;\n return string ? String(string).replace(replacer, function(_, $1, $2, $3){\n return $1 + $2.toUpperCase() + $3.toLowerCase();\n }) : string;\n },\n\n /**\n * Trims whitespace from strings\n *\n * @method trim\n * @param {String} string String to be trimmed\n * @return {String} Trimmed string\n * @public\n * @static\n * @sample Ink_Util_String_trim.html \n */\n trim: function(string)\n {\n if (typeof string === 'string') {\n return string.replace(/^\\s+|\\s+$|\\n+$/g, '');\n }\n return string;\n },\n\n /**\n * Strips HTML tags from strings\n *\n * @method stripTags\n * @param {String} string String to strip tags from.\n * @param {String} allowed Comma separated list of allowed tags.\n * @return {String} Stripped string\n * @public\n * @static\n * @sample Ink_Util_String_stripTags.html \n */\n stripTags: function(string, allowed)\n {\n if (allowed && typeof allowed === 'string') {\n var aAllowed = InkUtilString.trim(allowed).split(',');\n var aNewAllowed = [];\n var cleanedTag = false;\n for(var i=0; i < aAllowed.length; i++) {\n if(InkUtilString.trim(aAllowed[i]) !== '') {\n cleanedTag = InkUtilString.trim(aAllowed[i].replace(/(<|\\>)/g, '').replace(/\\s/, ''));\n aNewAllowed.push('(<'+cleanedTag+'\\\\s[^>]+>|<(\\\\s|\\\\/)?(\\\\s|\\\\/)?'+cleanedTag+'>)');\n }\n }\n var strAllowed = aNewAllowed.join('|');\n var reAllowed = new RegExp(strAllowed, \"i\");\n\n var aFoundTags = string.match(new RegExp(\"<[^>]*>\", \"g\"));\n\n for(var j=0; j < aFoundTags.length; j++) {\n if(!aFoundTags[j].match(reAllowed)) {\n string = string.replace((new RegExp(aFoundTags[j], \"gm\")), '');\n }\n }\n return string;\n } else {\n return string.replace(/<[^\\>]+\\>/g, '');\n }\n },\n\n /**\n * Encodes string into HTML entities.\n *\n * @method htmlEntitiesEncode\n * @param {String} string Input string.\n * @return {String} HTML encoded string.\n * @public\n * @static\n * @sample Ink_Util_String_htmlEntitiesEncode.html \n */\n htmlEntitiesEncode: function(string)\n {\n if (string && string.replace) {\n var re = false;\n for (var i = 0; i < InkUtilString._chars.length; i++) {\n re = new RegExp(InkUtilString._chars[i], \"gm\");\n string = string.replace(re, '&' + InkUtilString._entities[i] + ';');\n }\n }\n return string;\n },\n\n /**\n * Decodes string from HTML entities.\n *\n * @method htmlEntitiesDecode\n * @param {String} string String to be decoded\n * @return {String} Decoded string\n * @public\n * @static\n * @sample Ink_Util_String_htmlEntitiesDecode.html \n */\n htmlEntitiesDecode: function(string)\n {\n if (string && string.replace) {\n var re = false;\n for (var i = 0; i < InkUtilString._entities.length; i++) {\n re = new RegExp(\"&\"+InkUtilString._entities[i]+\";\", \"gm\");\n string = string.replace(re, InkUtilString._chars[i]);\n }\n string = string.replace(/&#[^;]+;?/g, function($0){\n if ($0.charAt(2) === 'x') {\n return String.fromCharCode(parseInt($0.substring(3), 16));\n }\n else {\n return String.fromCharCode(parseInt($0.substring(2), 10));\n }\n });\n }\n return string;\n },\n\n /**\n * Encode a string to UTF-8.\n *\n * @method utf8Encode\n * @param {String} string String to be encoded\n * @return {String} string UTF-8 encoded string\n * @public\n * @static\n */\n utf8Encode: function(string) {\n /*jshint bitwise:false*/\n string = string.replace(/\\r\\n/g,\"\\n\");\n var utfstring = \"\";\n\n for (var n = 0; n < string.length; n++) {\n\n var c = string.charCodeAt(n);\n\n if (c < 128) {\n utfstring += String.fromCharCode(c);\n }\n else if((c > 127) && (c < 2048)) {\n utfstring += String.fromCharCode((c >> 6) | 192);\n utfstring += String.fromCharCode((c & 63) | 128);\n }\n else {\n utfstring += String.fromCharCode((c >> 12) | 224);\n utfstring += String.fromCharCode(((c >> 6) & 63) | 128);\n utfstring += String.fromCharCode((c & 63) | 128);\n }\n\n }\n return utfstring;\n },\n\n /**\n * Truncates a string without breaking words. Inserts an ellipsis HTML entity at the end of the string if it's too long.\n *\n * @method shortString\n * @param {String} str String to truncate\n * @param {Number} n Number of chars of the short string\n * @return {String} Truncated string, or the original `str` if it's shorter than `n`\n * @public\n * @static\n * @sample Ink_Util_String_shortString.html \n */\n shortString: function(str,n) {\n var words = str.split(' ');\n var resultstr = '';\n for(var i = 0; i < words.length; i++ ){\n if((resultstr + words[i] + ' ').length>=n){\n resultstr += '…';\n break;\n }\n resultstr += words[i] + ' ';\n }\n return resultstr;\n },\n\n /**\n * Truncates a string, breaking words and adding ... at the end.\n *\n * @method truncateString\n * @param {String} str String to truncate\n * @param {Number} length Limit for the returned string, ellipsis included.\n * @return {String} Truncated String\n * @public\n * @static\n * @sample Ink_Util_String_truncateString.html \n */\n truncateString: function(str, length) {\n if(str.length - 1 > length) {\n return str.substr(0, length - 1) + \"\\u2026\";\n } else {\n return str;\n }\n },\n\n /**\n * Decodes a string from UTF-8.\n *\n * @method utf8Decode\n * @param {String} string String to be decoded\n * @return {String} Decoded string\n * @public\n * @static\n */\n utf8Decode: function(string) {\n /*jshint bitwise:false*/\n var ret = \"\";\n var i = 0, c = 0, c2 = 0, c3 = 0;\n\n while ( i < string.length ) {\n\n c = string.charCodeAt(i);\n\n if (c < 128) {\n ret += String.fromCharCode(c);\n i++;\n }\n else if((c > 191) && (c < 224)) {\n c2 = string.charCodeAt(i+1);\n ret += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n i += 2;\n }\n else {\n c2 = string.charCodeAt(i+1);\n c3 = string.charCodeAt(i+2);\n ret += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n i += 3;\n }\n\n }\n return ret;\n },\n\n /**\n * Removes all accented characters from a string.\n *\n * @method removeAccentedChars\n * @param {String} string String to remove accents from\n * @return {String} String without accented chars\n * @public\n * @static\n * @sample Ink_Util_String_removeAccentedChars.html \n */\n removeAccentedChars: function(string)\n {\n var newString = string;\n var re = false;\n for (var i = 0; i < InkUtilString._accentedChars.length; i++) {\n re = new RegExp(InkUtilString._accentedChars[i], \"gm\");\n newString = newString.replace(re, '' + InkUtilString._accentedRemovedChars[i] + '');\n }\n return newString;\n },\n\n /**\n * Count the number of occurrences of a specific needle in a haystack\n *\n * @method substrCount\n * @param {String} haystack String to search in\n * @param {String} needle String to search for\n * @return {Number} Number of occurrences\n * @public\n * @static\n * @sample Ink_Util_String_substrCount.html \n */\n substrCount: function(haystack,needle)\n {\n return haystack ? haystack.split(needle).length - 1 : 0;\n },\n\n /**\n * Eval a JSON - We recommend you Ink.Util.Json\n *\n * @method evalJSON\n * @param {String} strJSON JSON string to eval\n * @param {Boolean} sanitize Flag to sanitize input\n * @return {Object} JS Object\n * @public\n * @static\n */\n evalJSON: function(strJSON, sanitize) {\n /* jshint evil:true */\n if( (typeof sanitize === 'undefined' || sanitize === null) || InkUtilString.isJSON(strJSON)) {\n try {\n if(typeof(JSON) !== \"undefined\" && typeof(JSON.parse) !== 'undefined'){\n return JSON.parse(strJSON);\n }\n return eval('('+strJSON+')');\n } catch(e) {\n throw new Error('ERROR: Bad JSON string...');\n }\n }\n },\n\n /**\n * Checks if a string is a valid JSON object (string encoded)\n *\n * @method isJSON\n * @param {String} str String to check\n * @return {Boolean} Return whether it's JSON.\n * @public\n * @static\n */\n isJSON: function(str)\n {\n str = str.replace(/\\\\./g, '@').replace(/\"[^\"\\\\\\n\\r]*\"/g, '');\n return (/^[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]*$/).test(str);\n },\n\n /**\n * Escapes unsafe html chars as HTML entities\n *\n * @method htmlEscapeUnsafe\n * @param {String} str String to escape\n * @return {String} Escaped string\n * @public\n * @static\n * @sample Ink_Util_String_htmlEscapeUnsafe.html \n */\n htmlEscapeUnsafe: function(str){\n var chars = InkUtilString._htmlUnsafeChars;\n return str !== null ? String(str).replace(/[<>&'\"]/g,function(c){return chars[c];}) : str;\n },\n\n /**\n * Normalizes whitespace in string.\n * String is trimmed and sequences of whitespaces are collapsed.\n *\n * @method normalizeWhitespace\n * @param {String} str String to normalize\n * @return {String} Normalized string\n * @public\n * @static\n * @sample Ink_Util_String_normalizeWhitespace.html \n */\n normalizeWhitespace: function(str){\n return str !== null ? InkUtilString.trim(String(str).replace(/\\s+/g,' ')) : str;\n },\n\n /**\n * Converts string to unicode.\n *\n * @method toUnicode\n * @param {String} str String to convert\n * @return {String} Unicoded String\n * @public\n * @static\n * @sample Ink_Util_String_toUnicode.html \n */\n toUnicode: function(str) {\n if (typeof str === 'string') {\n var unicodeString = '';\n var inInt = false;\n var theUnicode = false;\n var total = str.length;\n var i=0;\n\n while(i < total)\n {\n inInt = str.charCodeAt(i);\n if( (inInt >= 32 && inInt <= 126) ||\n inInt === 8 ||\n inInt === 9 ||\n inInt === 10 ||\n inInt === 12 ||\n inInt === 13 ||\n inInt === 32 ||\n inInt === 34 ||\n inInt === 47 ||\n inInt === 58 ||\n inInt === 92) {\n\n /*\n if(inInt == 34 || inInt == 92 || inInt == 47) {\n theUnicode = '\\\\'+str.charAt(i);\n } else {\n }\n */\n if(inInt === 8) {\n theUnicode = '\\\\b';\n } else if(inInt === 9) {\n theUnicode = '\\\\t';\n } else if(inInt === 10) {\n theUnicode = '\\\\n';\n } else if(inInt === 12) {\n theUnicode = '\\\\f';\n } else if(inInt === 13) {\n theUnicode = '\\\\r';\n } else {\n theUnicode = str.charAt(i);\n }\n } else {\n theUnicode = str.charCodeAt(i).toString(16)+''.toUpperCase();\n while (theUnicode.length < 4) {\n theUnicode = '0' + theUnicode;\n }\n theUnicode = '\\\\u' + theUnicode;\n }\n unicodeString += theUnicode;\n\n i++;\n }\n return unicodeString;\n }\n },\n\n /**\n * Escapes a unicode character.\n *\n * @method escape\n * @param {String} c Character to escape\n * @return {String} Escaped character. Returns \\xXX if hex smaller than 0x100, otherwise \\uXXXX\n * @public\n * @static\n * @sample Ink_Util_String_escape.html \n */\n escape: function(c) {\n var hex = (c).charCodeAt(0).toString(16).split('');\n if (hex.length < 3) {\n while (hex.length < 2) { hex.unshift('0'); }\n hex.unshift('x');\n }\n else {\n while (hex.length < 4) { hex.unshift('0'); }\n hex.unshift('u');\n }\n\n hex.unshift('\\\\');\n return hex.join('');\n },\n\n /**\n * Unescapes a unicode character escape sequence\n *\n * @method unescape\n * @param {String} es Escape sequence\n * @return {String} String un-unicoded\n * @public\n * @static\n * @sample Ink_Util_String_unescape.html \n */\n unescape: function(es) {\n var idx = es.lastIndexOf('0');\n idx = idx === -1 ? 2 : Math.min(idx, 2);\n //console.log(idx);\n var hexNum = es.substring(idx);\n //console.log(hexNum);\n var num = parseInt(hexNum, 16);\n return String.fromCharCode(num);\n },\n\n /**\n * Escapes unicode characters in a string as unicode character entities (`\\x##`, where the `##` are hex digits).\n *\n * @method escapeText\n * @param {String} txt String with characters outside the ASCII printable range (32 < charCode < 127)\n * @param {Array} [whiteList] Whitelist of characters which should NOT be escaped\n * @return {String} String escaped with unicode character entities.\n * @public\n * @static\n * @sample Ink_Util_String_escapeText.html \n */\n escapeText: function(txt, whiteList) {\n if (whiteList === undefined) {\n whiteList = ['[', ']', '\\'', ','];\n }\n var txt2 = [];\n var c, C;\n for (var i = 0, f = txt.length; i < f; ++i) {\n c = txt[i];\n C = c.charCodeAt(0);\n if (C < 32 || C > 126 && whiteList.indexOf(c) === -1) {\n c = InkUtilString.escape(c);\n }\n txt2.push(c);\n }\n return txt2.join('');\n },\n\n /**\n * Regex to check escaped strings\n *\n * @property escapedCharRegex\n * @type {Regex}\n * @public\n * @readOnly\n * @static\n */\n escapedCharRegex: /(\\\\x[0-9a-fA-F]{2})|(\\\\u[0-9a-fA-F]{4})/g,\n\n /**\n * Removes unicode entities (in the format \"\\x##\" or \"\\u####\", where \"#\" is a hexadecimal digit)\n *\n * @method unescapeText\n * @param {String} txt Text you intend to remove unicode character entities.\n * @return {String} Unescaped string\n * @public\n * @static\n * @sample Ink_Util_String_unescapeText.html \n */\n unescapeText: function(txt) {\n /*jshint boss:true */\n var m;\n while (m = InkUtilString.escapedCharRegex.exec(txt)) {\n m = m[0];\n txt = txt.replace(m, InkUtilString.unescape(m));\n InkUtilString.escapedCharRegex.lastIndex = 0;\n }\n return txt;\n },\n\n /**\n * Compares two strings.\n *\n * @method strcmp\n * @param {String} str1 First String\n * @param {String} str2 Second String\n * @return {Number} 0 if given strings are equal, 1 if str1 is greater than str2, and -1 if str2 is greater than str1.\n * @public\n * @static\n * @sample Ink_Util_String_strcmp.html \n */\n strcmp: function(str1, str2) {\n return ((str1 === str2) ? 0 : ((str1 > str2) ? 1 : -1));\n },\n\n /**\n * Splits a string into smaller chunks\n *\n * @method packetize\n * @param {String} str String to divide\n * @param {Number} maxLen Maximum chunk size (in characters)\n * @return {Array} Chunks of the original string\n * @public\n * @static\n * @sample Ink_Util_String_packetize.html \n */\n packetize: function(str, maxLen) {\n var len = str.length;\n var parts = new Array( Math.ceil(len / maxLen) );\n var chars = str.split('');\n var sz, i = 0;\n while (len) {\n sz = Math.min(maxLen, len);\n parts[i++] = chars.splice(0, sz).join('');\n len -= sz;\n }\n return parts;\n }\n };\n\n return InkUtilString;\n\n});\n","/**\n * URL Utilities\n * @module Ink.Util.Url_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Url', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Url_1\n */\n var Url = {\n\n /**\n * Auxiliary string for encoding\n *\n * @property _keyStr\n * @type {String}\n * @readOnly\n * @private\n */\n _keyStr : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n\n\n /**\n * Gets URL of current page\n *\n * @method getUrl\n * @return {String} Current URL\n * @public\n * @static\n * @sample Ink_Util_Url_getUrl.html \n */\n getUrl: function()\n {\n return window.location.href;\n },\n\n /**\n * Generates an URL string.\n *\n * @method genQueryString\n * @param {String} uri Base URL\n * @param {Object} params Object to transform to query string\n * @return {String} URI with query string set\n * @public\n * @static\n * @sample Ink_Util_Url_genQueryString.html \n */\n genQueryString: function(uri, params) {\n var hasQuestionMark = uri.indexOf('?') !== -1;\n var sep, pKey, pValue, parts = [uri];\n\n for (pKey in params) {\n if (params.hasOwnProperty(pKey)) {\n if (!hasQuestionMark) {\n sep = '?';\n hasQuestionMark = true;\n } else {\n sep = '&';\n }\n pValue = params[pKey];\n if (typeof pValue !== 'number' && !pValue) {\n pValue = '';\n }\n parts = parts.concat([sep, encodeURIComponent(pKey), '=', encodeURIComponent(pValue)]);\n }\n }\n\n return parts.join('');\n },\n\n /**\n * Gets an object from an URL encoded string.\n *\n * @method getQueryString\n * @param {String} [str] URL String. When not specified it uses the current URL.\n * @return {Object} Key-Value pair object\n * @public\n * @static\n * @sample Ink_Util_Url_getQueryString.html \n */\n getQueryString: function(str)\n {\n var url;\n if(str && typeof(str) !== 'undefined') {\n url = str;\n } else {\n url = this.getUrl();\n }\n var aParams = {};\n if(url.match(/\\?(.+)/i)) {\n var queryStr = url.replace(/^(.*)\\?([^\\#]+)(\\#(.*))?/g, \"$2\");\n if(queryStr.length > 0) {\n var aQueryStr = queryStr.split(/[;&]/);\n for(var i=0; i < aQueryStr.length; i++) {\n var pairVar = aQueryStr[i].split('=');\n aParams[decodeURIComponent(pairVar[0])] = (typeof(pairVar[1]) !== 'undefined' && pairVar[1]) ? decodeURIComponent(pairVar[1]) : false;\n }\n }\n }\n return aParams;\n },\n\n /**\n * Gets the URL hash value\n *\n * @method getAnchor\n * @param {String} [str] URL String. Defaults to current page URL.\n * @return {String|Boolean} Hash in the URL. If there's no hash, returns false.\n * @public\n * @static\n * @sample Ink_Util_Url_getAnchor.html \n */\n getAnchor: function(str)\n {\n var url;\n if(str && typeof(str) !== 'undefined') {\n url = str;\n } else {\n url = this.getUrl();\n }\n var anchor = false;\n if(url.match(/#(.+)/)) {\n anchor = url.replace(/([^#]+)#(.*)/, \"$2\");\n }\n return anchor;\n },\n\n /**\n * Gets the anchor string of an URL\n *\n * @method getAnchorString\n * @param {String} [string] URL to parse. Defaults to current URL.\n * @return {Object} Key-value pair object of the URL's hashtag 'variables'\n * @public\n * @static\n * @sample Ink_Util_Url_getAnchorString.html \n */\n getAnchorString: function(string)\n {\n var url;\n if(string && typeof(string) !== 'undefined') {\n url = string;\n } else {\n url = this.getUrl();\n }\n var aParams = {};\n if(url.match(/#(.+)/i)) {\n var anchorStr = url.replace(/^([^#]+)#(.*)?/g, \"$2\");\n if(anchorStr.length > 0) {\n var aAnchorStr = anchorStr.split(/[;&]/);\n for(var i=0; i < aAnchorStr.length; i++) {\n var pairVar = aAnchorStr[i].split('=');\n aParams[decodeURIComponent(pairVar[0])] = (typeof(pairVar[1]) !== 'undefined' && pairVar[1]) ? decodeURIComponent(pairVar[1]) : false;\n }\n }\n }\n return aParams;\n },\n\n\n /**\n * Parses URL string into URL parts\n *\n * @method parseUrl\n * @param {String} url URL to be parsed\n * @return {Object} Parsed URL as a key-value object.\n * @public\n * @static\n * @sample Ink_Util_Url_parseUrl.html \n */\n parseUrl: function(url) {\n var aURL = {};\n if(url && typeof url === 'string') {\n if(url.match(/^([^:]+):\\/\\//i)) {\n var re = /^([^:]+):\\/\\/([^\\/]*)\\/?([^\\?#]*)\\??([^#]*)#?(.*)/i;\n if(url.match(re)) {\n aURL.scheme = url.replace(re, \"$1\");\n aURL.host = url.replace(re, \"$2\");\n aURL.path = '/'+url.replace(re, \"$3\");\n aURL.query = url.replace(re, \"$4\") || false;\n aURL.fragment = url.replace(re, \"$5\") || false;\n }\n } else {\n var re1 = new RegExp(\"^([^\\\\?]+)\\\\?([^#]+)#(.*)\", \"i\");\n var re2 = new RegExp(\"^([^\\\\?]+)\\\\?([^#]+)#?\", \"i\");\n var re3 = new RegExp(\"^([^\\\\?]+)\\\\??\", \"i\");\n if(url.match(re1)) {\n aURL.scheme = false;\n aURL.host = false;\n aURL.path = url.replace(re1, \"$1\");\n aURL.query = url.replace(re1, \"$2\");\n aURL.fragment = url.replace(re1, \"$3\");\n } else if(url.match(re2)) {\n aURL.scheme = false;\n aURL.host = false;\n aURL.path = url.replace(re2, \"$1\");\n aURL.query = url.replace(re2, \"$2\");\n aURL.fragment = false;\n } else if(url.match(re3)) {\n aURL.scheme = false;\n aURL.host = false;\n aURL.path = url.replace(re3, \"$1\");\n aURL.query = false;\n aURL.fragment = false;\n }\n }\n if(aURL.host) {\n var regPort = /^(.*?)\\\\:(\\\\d+)$/i;\n // check for port\n if(aURL.host.match(regPort)) {\n var tmpHost1 = aURL.host;\n aURL.host = tmpHost1.replace(regPort, \"$1\");\n aURL.port = tmpHost1.replace(regPort, \"$2\");\n } else {\n aURL.port = false;\n }\n // check for user and pass\n if(aURL.host.match(/@/i)) {\n var tmpHost2 = aURL.host;\n aURL.host = tmpHost2.split('@')[1];\n var tmpUserPass = tmpHost2.split('@')[0];\n if(tmpUserPass.match(/\\:/)) {\n aURL.user = tmpUserPass.split(':')[0];\n aURL.pass = tmpUserPass.split(':')[1];\n } else {\n aURL.user = tmpUserPass;\n aURL.pass = false;\n }\n }\n }\n }\n return aURL;\n },\n\n /**\n * Formats an URL object into an URL string.\n *\n * @method format\n * @param {String|Location|Object} urlObj Window.location, a.href, or parseUrl object to format\n * @return {String} Full URL.\n */\n format: function (urlObj) {\n var protocol = '';\n var host = '';\n var path = '';\n var frag = '';\n var query = '';\n\n if (typeof urlObj.protocol === 'string') {\n protocol = urlObj.protocol + '//'; // here it comes with the colon\n } else if (typeof urlObj.scheme === 'string') {\n protocol = urlObj.scheme + '://';\n }\n\n host = urlObj.host || urlObj.hostname || '';\n path = urlObj.path || '';\n\n if (typeof urlObj.query === 'string') {\n query = urlObj.query;\n } else if (typeof urlObj.search === 'string') {\n query = urlObj.search.replace(/^\\?/, '');\n }\n if (typeof urlObj.fragment === 'string') {\n frag = urlObj.fragment;\n } else if (typeof urlObj.hash === 'string') {\n frag = urlObj.hash.replace(/#$/, '');\n }\n\n return [\n protocol,\n host,\n path,\n query && '?' + query,\n frag && '#' + frag\n ].join('');\n },\n\n /**\n * Gets the last loaded script element\n *\n * @method currentScriptElement\n * @param {String} [match] String to match against the script src attribute\n * @return {DOMElement|Boolean} Returns the `script` DOM Element or false if unable to find it.\n * @public\n * @static\n * @sample Ink_Util_Url_currentScriptElement.html \n */\n currentScriptElement: function(match)\n {\n var aScripts = document.getElementsByTagName('script');\n if(typeof(match) === 'undefined') {\n if(aScripts.length > 0) {\n return aScripts[(aScripts.length - 1)];\n } else {\n return false;\n }\n } else {\n var curScript = false;\n var re = new RegExp(\"\"+match+\"\", \"i\");\n for(var i=0, total = aScripts.length; i < total; i++) {\n curScript = aScripts[i];\n if(re.test(curScript.src)) {\n return curScript;\n }\n }\n return false;\n }\n }\n };\n\n return Url;\n\n});\n","/**\n * Validation Utilities\n * @module Ink.Util.Validator_1\n * @version 1\n */\n \nInk.createModule('Ink.Util.Validator', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Validator_1 \n */\n var Validator = {\n\n /**\n * List of country codes avaible for the isPhone method\n *\n * @property _countryCodes\n * @type {Array}\n * @private\n * @static\n * @readOnly\n */\n _countryCodes : [\n 'AO',\n 'CV',\n 'MZ',\n 'PT'\n ],\n\n /**\n * International number for portugal\n *\n * @property _internacionalPT\n * @type {Number}\n * @private\n * @static\n * @readOnly\n *\n */\n _internacionalPT: 351,\n\n /**\n * List of all portuguese number prefixes\n *\n * @property _indicativosPT\n * @type {Object}\n * @private\n * @static\n * @readOnly\n *\n */\n _indicativosPT: {\n 21: 'lisboa',\n 22: 'porto',\n 231: 'mealhada',\n 232: 'viseu',\n 233: 'figueira da foz',\n 234: 'aveiro',\n 235: 'arganil',\n 236: 'pombal',\n 238: 'seia',\n 239: 'coimbra',\n 241: 'abrantes',\n 242: 'ponte de sôr',\n 243: 'santarém',\n 244: 'leiria',\n 245: 'portalegre',\n 249: 'torres novas',\n 251: 'valença',\n 252: 'vila nova de famalicão',\n 253: 'braga',\n 254: 'peso da régua',\n 255: 'penafiel',\n 256: 'são joão da madeira',\n 258: 'viana do castelo',\n 259: 'vila real',\n 261: 'torres vedras',\n 262: 'caldas da raínha',\n 263: 'vila franca de xira',\n 265: 'setúbal',\n 266: 'évora',\n 268: 'estremoz',\n 269: 'santiago do cacém',\n 271: 'guarda',\n 272: 'castelo branco',\n 273: 'bragança',\n 274: 'proença-a-nova',\n 275: 'covilhã',\n 276: 'chaves',\n 277: 'idanha-a-nova',\n 278: 'mirandela',\n 279: 'moncorvo',\n 281: 'tavira',\n 282: 'portimão',\n 283: 'odemira',\n 284: 'beja',\n 285: 'moura',\n 286: 'castro verde',\n 289: 'faro',\n 291: 'funchal, porto santo',\n 292: 'corvo, faial, flores, horta, pico',\n 295: 'angra do heroísmo, graciosa, são jorge, terceira',\n 296: 'ponta delgada, são miguel, santa maria',\n\n 91 : 'rede móvel 91 (Vodafone / Yorn)',\n 93 : 'rede móvel 93 (Optimus)',\n 96 : 'rede móvel 96 (TMN)',\n 92 : 'rede móvel 92 (TODOS)',\n //925 : 'rede móvel 925 (TMN 925)',\n //926 : 'rede móvel 926 (TMN 926)',\n //927 : 'rede móvel 927 (TMN 927)',\n //922 : 'rede móvel 922 (Phone-ix)',\n\n 707: 'número único',\n 760: 'número único',\n 800: 'número grátis',\n 808: 'chamada local',\n 30: 'voip'\n },\n /**\n * International number for Cabo Verde\n *\n * @property _internacionalCV\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalCV: 238,\n\n /**\n * List of all Cabo Verde number prefixes\n *\n * @property _indicativosCV\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosCV: {\n 2: 'fixo',\n 91: 'móvel 91',\n 95: 'móvel 95',\n 97: 'móvel 97',\n 98: 'móvel 98',\n 99: 'móvel 99'\n },\n /**\n * International number for Angola\n *\n * @property _internacionalAO\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalAO: 244,\n\n /**\n * List of all Angola number prefixes\n *\n * @property _indicativosAO\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosAO: {\n 2: 'fixo',\n 91: 'móvel 91',\n 92: 'móvel 92'\n },\n /**\n * International number for Mozambique\n *\n * @property _internacionalMZ\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalMZ: 258,\n\n /**\n * List of all Mozambique number prefixes\n *\n * @property _indicativosMZ\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosMZ: {\n 2: 'fixo',\n 82: 'móvel 82',\n 84: 'móvel 84'\n },\n\n /**\n * International number for Timor\n *\n * @property _internacionalTL\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalTL: 670,\n\n /**\n * List of all Timor number prefixes\n *\n * @property _indicativosTL\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosTL: {\n 3: 'fixo',\n 7: 'móvel 7'\n },\n\n /**\n * Regular expression groups for several groups of characters\n *\n * http://en.wikipedia.org/wiki/C0_Controls_and_Basic_Latin\n * http://en.wikipedia.org/wiki/Plane_%28Unicode%29#Basic_Multilingual_Plane\n * http://en.wikipedia.org/wiki/ISO_8859-1\n *\n * @property _characterGroups\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _characterGroups: {\n numbers: ['0-9'],\n asciiAlpha: ['a-zA-Z'],\n latin1Alpha: ['a-zA-Z', '\\u00C0-\\u00FF'],\n unicodeAlpha: ['a-zA-Z', '\\u00C0-\\u00FF', '\\u0100-\\u1FFF', '\\u2C00-\\uD7FF'],\n /* whitespace characters */\n space: [' '],\n dash: ['-'],\n underscore: ['_'],\n nicknamePunctuation: ['_.-'],\n\n singleLineWhitespace: ['\\t '],\n newline: ['\\n'],\n whitespace: ['\\t\\n\\u000B\\f\\r\\u00A0 '],\n\n asciiPunctuation: ['\\u0021-\\u002F', '\\u003A-\\u0040', '\\u005B-\\u0060', '\\u007B-\\u007E'],\n latin1Punctuation: ['\\u0021-\\u002F', '\\u003A-\\u0040', '\\u005B-\\u0060', '\\u007B-\\u007E', '\\u00A1-\\u00BF', '\\u00D7', '\\u00F7'],\n unicodePunctuation: ['\\u0021-\\u002F', '\\u003A-\\u0040', '\\u005B-\\u0060', '\\u007B-\\u007E', '\\u00A1-\\u00BF', '\\u00D7', '\\u00F7', '\\u2000-\\u206F', '\\u2E00-\\u2E7F', '\\u3000-\\u303F']\n },\n\n /**\n * Creates a regular expression for several character groups.\n *\n * @method createRegExp\n *\n * @param {Object} groups\n * Groups to build regular expressions for. Possible keys are:\n *\n * - **numbers**: 0-9\n * - **asciiAlpha**: a-z, A-Z\n * - **latin1Alpha**: asciiAlpha, plus printable characters in latin-1\n * - **unicodeAlpha**: unicode alphanumeric characters.\n * - **space**: ' ', the space character.\n * - **dash**: dash character.\n * - **underscore**: underscore character.\n * - **nicknamePunctuation**: dash, dot, underscore\n * - **singleLineWhitespace**: space and tab (whitespace which only spans one line).\n * - **newline**: newline character ('\\n')\n * - **whitespace**: whitespace characters in the ASCII character set.\n * - **asciiPunctuation**: punctuation characters in the ASCII character set.\n * - **latin1Punctuation**: punctuation characters in latin-1.\n * - **unicodePunctuation**: punctuation characters in unicode.\n *\n * @returns {RegExp} A regular expression with the given groups.\n */\n createRegExp: function (groups) {\n var re = '^[';\n for (var key in groups) if (groups.hasOwnProperty(key)) {\n if (!(key in Validator._characterGroups)) {\n throw new Error('group ' + key + ' is not a valid character group');\n } else if (groups[key]) {\n re += Validator._characterGroups[key].join('');\n }\n }\n if (re === '^[') {\n // No changes\n return new RegExp('$^'); // match nothing\n }\n return new RegExp(re + ']*?$');\n },\n\n /**\n * Checks if a field has the required groups.\n *\n * @method checkCharacterGroups\n * @param {String} s The validation string\n * @param {Object} [groups={}] What groups are included. See `createRegExp`\n * @return {Boolean} Whether this is a valid string (all groups pass).\n * @sample Ink_Util_Validator_checkCharacterGroups.html \n */\n checkCharacterGroups: function (s, groups) {\n return Validator.createRegExp(groups).test(s);\n },\n\n /**\n * Checks if a field contains unicode printable characters.\n *\n * @method unicode\n * @param {String} s The validation string\n * @param {Object} [options={}] Optional configuration object. See createRegexp\n * @return {Boolean} Whether this is a valid unicode string.\n */\n unicode: function (s, options) {\n return Validator.checkCharacterGroups(s, Ink.extendObj({\n unicodeAlpha: true}, options));\n },\n\n /**\n * Checks if a field only contains latin-1 alphanumeric characters. \n * Takes options for allowing singleline whitespace, cross-line whitespace and punctuation.\n *\n * @method latin1\n *\n * @param {String} s The validation string\n * @param {Object} [options={}] Optional configuration object. See createRegexp\n * @return {Boolean} Whether this is a valid latin1 string.\n * @sample Ink_Util_Validator_latin1.html \n */\n latin1: function (s, options) {\n return Validator.checkCharacterGroups(s, Ink.extendObj({\n latin1Alpha: true}, options));\n },\n\n /**\n * Checks if a field only contains only ASCII alphanumeric characters. \n * Takes options for allowing singleline whitespace, cross-line whitespace and punctuation.\n *\n * @method ascii\n *\n * @param {String} s The validation string\n * @param {Object} [options={}] Optional configuration object. See createRegexp\n * @return {Boolean} Whether this is a valid ascii string.\n * @sample Ink_Util_Validator_ascii.html \n */\n ascii: function (s, options) {\n return Validator.checkCharacterGroups(s, Ink.extendObj({\n asciiAlpha: true}, options));\n },\n\n /**\n * Checks if a number is a valid\n *\n * @method number\n * @param {String} numb The number\n * @param {Object} [options] Further options\n * @param {String} [options.decimalSep='.'] Allow decimal separator.\n * @param {String} [options.thousandSep=\",\"] Strip this character from the number.\n * @param {String} [options.negative=false] Allow negative numbers.\n * @param {String} [options.decimalPlaces=null] Maximum number of decimal places. Use `0` for an integer number.\n * @param {Number} [options.max=null] Maximum number\n * @param {Number} [options.min=null] Minimum number\n * @param {Boolean}[options.returnNumber=false] When this option is `true`, return the number itself when the value is valid.\n * @return {Boolean|Number} `false` when invalid, `true` when valid. If `options.returnNumber` is `true`, return the parsed, valid number or `false`.\n * @sample Ink_Util_Validator_number.html \n */\n number: function (numb, options) {\n numb = numb + '';\n options = Ink.extendObj({\n decimalSep: '.',\n thousandSep: '',\n negative: true,\n decimalPlaces: null,\n maxDigits: null,\n max: null,\n min: null,\n returnNumber: false\n }, options || {});\n // smart recursion thing sets up aliases for options.\n if (options.thousandSep) {\n numb = numb.replace(new RegExp('\\\\' + options.thousandSep, 'g'), '');\n options.thousandSep = '';\n return Validator.number(numb, options);\n }\n if (options.negative === false) {\n options.min = 0;\n options.negative = true;\n return Validator.number(numb, options);\n }\n if (options.decimalSep !== '.') {\n numb = numb.replace(new RegExp('\\\\' + options.decimalSep, 'g'), '.');\n }\n\n if (!/^(-)?(\\d+)?(\\.\\d+)?$/.test(numb) || numb === '') {\n return false; // forbidden character found\n }\n \n var split;\n if (options.decimalSep && numb.indexOf(options.decimalSep) !== -1) {\n split = numb.split(options.decimalSep);\n if (options.decimalPlaces !== null &&\n split[1].length > options.decimalPlaces) {\n return false;\n }\n } else {\n split = ['' + numb, ''];\n }\n \n if (options.maxDigits!== null) {\n if (split[0].replace(/-/g, '').length > options.maxDigits) {\n return split;\n }\n }\n \n // Now look at the actual float\n var ret = parseFloat(numb);\n \n if (options.maxExcl !== null && ret >= options.maxExcl ||\n options.minExcl !== null && ret <= options.minExcl) {\n return false;\n }\n if (options.max !== null && ret > options.max ||\n options.min !== null && ret < options.min) {\n return false;\n }\n \n if (options.returnNumber) {\n return ret;\n } else {\n return true;\n }\n },\n\n /**\n * Checks if a year is Leap \"Bissexto\"\n *\n * @method _isLeapYear\n * @param {Number} year Year to be checked\n * @return {Boolean} True if it is a leap year.\n * @private\n * @static\n * @example\n * Ink.requireModules(['Ink.Util.Validator_1'], function( InkValidator ){\n * console.log( InkValidator._isLeapYear( 2004 ) ); // Result: true\n * console.log( InkValidator._isLeapYear( 2006 ) ); // Result: false\n * });\n */\n _isLeapYear: function(year){\n var yearRegExp = /^\\d{4}$/;\n\n if(yearRegExp.test(year)){\n return ((year%4) ? false: ((year%100) ? true : ((year%400)? false : true)) );\n }\n\n return false;\n },\n\n /**\n * Object with the date formats available for validation\n *\n * @property _dateParsers\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _dateParsers: {\n 'yyyy-mm-dd': {day:5, month:3, year:1, sep: '-', parser: /^(\\d{4})(\\-)(\\d{1,2})(\\-)(\\d{1,2})$/},\n 'yyyy/mm/dd': {day:5, month:3, year:1, sep: '/', parser: /^(\\d{4})(\\/)(\\d{1,2})(\\/)(\\d{1,2})$/},\n 'yy-mm-dd': {day:5, month:3, year:1, sep: '-', parser: /^(\\d{2})(\\-)(\\d{1,2})(\\-)(\\d{1,2})$/},\n 'yy/mm/dd': {day:5, month:3, year:1, sep: '/', parser: /^(\\d{2})(\\/)(\\d{1,2})(\\/)(\\d{1,2})$/},\n 'dd-mm-yyyy': {day:1, month:3, year:5, sep: '-', parser: /^(\\d{1,2})(\\-)(\\d{1,2})(\\-)(\\d{4})$/},\n 'dd/mm/yyyy': {day:1, month:3, year:5, sep: '/', parser: /^(\\d{1,2})(\\/)(\\d{1,2})(\\/)(\\d{4})$/},\n 'dd-mm-yy': {day:1, month:3, year:5, sep: '-', parser: /^(\\d{1,2})(\\-)(\\d{1,2})(\\-)(\\d{2})$/},\n 'dd/mm/yy': {day:1, month:3, year:5, sep: '/', parser: /^(\\d{1,2})(\\/)(\\d{1,2})(\\/)(\\d{2})$/}\n },\n\n /**\n * Gets the number of days in a given month of a given year\n *\n * @method _daysInMonth\n * @param {Number} _m Month (1 to 12)\n * @param {Number} _y Year\n * @return {Number} Returns the number of days in a given month of a given year\n * @private\n * @static\n * @example\n * Ink.requireModules(['Ink.Util.Validator_1'], function( InkValidator ){\n * console.log( InkValidator._daysInMonth( 2, 2004 ) ); // Result: 29\n * console.log( InkValidator._daysInMonth( 2, 2006 ) ); // Result: 28\n * });\n */\n _daysInMonth: function(_m,_y){\n var nDays=0;\n\n _m = parseInt(_m, 10);\n _y = parseInt(_y, 10);\n\n if(_m===1 || _m===3 || _m===5 || _m===7 || _m===8 || _m===10 || _m===12) {\n nDays= 31;\n } else if ( _m===4 || _m===6 || _m===9 || _m===11) {\n nDays = 30;\n } else if (_m===2) {\n if((_y%400===0) || (_y%4===0 && _y%100!==0)) {\n nDays = 29;\n } else {\n nDays = 28;\n }\n }\n\n return nDays;\n },\n\n\n\n /**\n * Checks if a date is valid\n *\n * @method _isValidDate\n * @param {Number} year Year fragment of your date.\n * @param {Number} month Month fragment of your date.\n * @param {Number} day Day fragment of your date.\n * @return {Boolean} True if valid\n * @private\n * @static\n * @example\n * Ink.requireModules(['Ink.Util.Validator_1'], function( InkValidator ){\n * console.log( InkValidator._isValidDate( 2004, 2, 29 ) ); // Result: true\n * console.log( InkValidator._isValidDate( 2006, 2, 29 ) ); // Result: false\n * });\n */\n _isValidDate: function(year, month, day){\n var yearRegExp = /^\\d{4}$/;\n var validOneOrTwo = /^\\d{1,2}$/;\n if(yearRegExp.test(year) && validOneOrTwo.test(month) && validOneOrTwo.test(day)){\n if(month>=1 && month<=12 && day>=1 && this._daysInMonth(month,year)>=day){\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if an email address is valid\n *\n * @method email\n * @param {String} email String containing the e-mail.\n * @return {Boolean} `true` if it's a valid e-mail address.\n * @public\n * @static\n * @sample Ink_Util_Validator_mail.html \n */\n email: function(email)\n {\n var emailValido = new RegExp(\"^[_a-z0-9-]+((\\\\.|\\\\+)[_a-z0-9-]+)*@([\\\\w]*-?[\\\\w]*\\\\.)+[a-z]{2,4}$\", \"i\");\n return !!emailValido.test(email);\n },\n\n /**\n * Deprecated. Alias for email(). Use it instead.\n *\n * @method mail\n * @public\n * @param {String} mail See `email`\n * @returns {Boolean} See `email`\n * @static\n * @private\n */\n mail: function (mail) { return Validator.email(mail); },\n\n /**\n * Checks if an url is valid\n *\n * @method url\n * @param {String} url URL to be checked\n * @param {Boolean} [full] If true, validates a full URL (one that should start with 'http')\n * @return {Boolean} True if valid\n * @public\n * @static\n * @sample Ink_Util_Validator_url.html \n */\n url: function(url, full)\n {\n if(typeof full === \"undefined\" || full === false) {\n var reHTTP = new RegExp(\"(^(http\\\\:\\\\/\\\\/|https\\\\:\\\\/\\\\/)(.+))\", \"i\");\n if(reHTTP.test(url) === false) {\n url = 'http://'+url;\n }\n }\n\n var reUrl = new RegExp(\"^(http:\\\\/\\\\/|https:\\\\/\\\\/)([\\\\w]*(-?[\\\\w]*)*\\\\.)+[a-z]{2,4}\", \"i\");\n if(reUrl.test(url) === false) {\n return false;\n } else {\n return true;\n }\n },\n\n /**\n * Checks if a phone is valid in Portugal\n *\n * @method isPTPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Portuguese Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isPTPhone.html\n */\n isPTPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosPT) {\n if(typeof(this._indicativosPT[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n\n var re351 = /^(00351|\\+351)/;\n if(re351.test(phone)) {\n phone = phone.replace(re351, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{9}/i;\n if(phone.length === 9 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Alias function for isPTPhone\n *\n * @method isPortuguesePhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Portuguese Phone\n * @public\n * @static\n */\n isPortuguesePhone: function(phone)\n {\n return this.isPTPhone(phone);\n },\n\n /**\n * Checks if a phone is valid in Cabo Verde\n *\n * @method isCVPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Cape Verdean Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isCVPhone.html \n */\n isCVPhone: function(phone)\n {\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosCV) {\n if(typeof(this._indicativosCV[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n\n var re238 = /^(00238|\\+238)/;\n if(re238.test(phone)) {\n phone = phone.replace(re238, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{7}/i;\n if(phone.length === 7 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a phone is valid in Angola\n *\n * @method isAOPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Angolan Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isAOPhone.html \n */\n isAOPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosAO) {\n if(typeof(this._indicativosAO[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n\n var re244 = /^(00244|\\+244)/;\n if(re244.test(phone)) {\n phone = phone.replace(re244, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{9}/i;\n if(phone.length === 9 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a phone is valid in Mozambique\n *\n * @method isMZPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Mozambican Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isMZPhone.html \n */\n isMZPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosMZ) {\n if(typeof(this._indicativosMZ[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n var re258 = /^(00258|\\+258)/;\n if(re258.test(phone)) {\n phone = phone.replace(re258, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{8,9}/i;\n if((phone.length === 9 || phone.length === 8) && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n if(phone.indexOf('2') === 0 && phone.length === 8) {\n return true;\n } else if(phone.indexOf('8') === 0 && phone.length === 9) {\n return true;\n }\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a phone is valid in Timor\n *\n * @method isTLPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid phone from Timor-Leste\n * @public\n * @static\n * @sample Ink_Util_Validator_isTLPhone.html \n */\n isTLPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosTL) {\n if(typeof(this._indicativosTL[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n var re670 = /^(00670|\\+670)/;\n if(re670.test(phone)) {\n phone = phone.replace(re670, \"\");\n }\n\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{7}/i;\n if(phone.length === 7 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a number is a phone number.\n * This method validates the number in all country codes available the ones set in the second param\n *\n * @method isPhone\n * @param {String} phone Phone number to validate\n * @param {String|Array} [countryCode] Country code or array of countries to validate\n * @return {Boolean} True if it's a valid phone in any country available\n * @public\n * @static\n * @sample Ink_Util_Validator_isPhone.html\n */\n isPhone: function(){\n var index;\n\n if(arguments.length===0){\n return false;\n }\n\n var phone = arguments[0];\n\n if(arguments.length>1){\n if(arguments[1].constructor === Array){\n var func;\n for(index=0; index= 0 && match[i-1] <= 100){\n valid = true;\n } else {\n return false;\n }\n }\n // check 0 to 255 values\n if(i===1 || i===3 || i===5 && (typeof match[i+1] === \"undefined\" || match[i+1] === \"\")){\n if(typeof match[i] !== \"undefined\" && match[i] >= 0 && match[i] <= 255){\n valid = true;\n } else {\n return false;\n }\n }\n }\n }\n\n // hsl range check\n if((match = hsl.exec(str)) !== null || (match = hsla.exec(str)) !== null){\n i = match.length;\n while(i--){\n // check percentage values\n if(i===3 || i===5){\n if(typeof match[i-1] !== \"undefined\" && typeof match[i] !== \"undefined\" && match[i] !== \"\" &&\n match[i-1] >= 0 && match[i-1] <= 100){\n valid = true;\n } else {\n return false;\n }\n }\n // check 0 to 360 value\n if(i===1){\n if(typeof match[i] !== \"undefined\" && match[i] >= 0 && match[i] <= 360){\n valid = true;\n } else {\n return false;\n }\n }\n }\n }\n\n return valid;\n },\n\n /**\n * Checks if the value is a valid IP. \n *\n * @method isIP\n * @param {String} value Value to be checked\n * @param {String} ipType Type of IP to be validated. The values are: ipv4, ipv6. By default is ipv4.\n * @return {Boolean} True if the value is a valid IP address. False if not.\n * @sample Ink_Util_Validator_isIP.html \n */\n isIP: function( value, ipType ){\n if( typeof value !== 'string' ){\n return false;\n }\n\n ipType = (ipType || 'ipv4').toLowerCase();\n\n switch( ipType ){\n case 'ipv4':\n return (/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/).test(value);\n case 'ipv6':\n return (/^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/).test(value);\n default:\n return false;\n }\n },\n\n /**\n * Credit Card specifications, to be used in the credit card verification.\n *\n * @property _creditCardSpecs\n * @type {Object}\n * @private\n */\n _creditCardSpecs: {\n 'default': {\n 'length': '13,14,15,16,17,18,19',\n 'prefix': /^.+/,\n 'luhn': true\n },\n\n 'american express': {\n 'length': '15',\n 'prefix': /^3[47]/,\n 'luhn' : true\n },\n\n 'diners club': {\n 'length': '14,16',\n 'prefix': /^36|55|30[0-5]/,\n 'luhn' : true\n },\n\n 'discover': {\n 'length': '16',\n 'prefix': /^6(?:5|011)/,\n 'luhn' : true\n },\n\n 'jcb': {\n 'length': '15,16',\n 'prefix': /^3|1800|2131/,\n 'luhn' : true\n },\n\n 'maestro': {\n 'length': '16,18',\n 'prefix': /^50(?:20|38)|6(?:304|759)/,\n 'luhn' : true\n },\n\n 'mastercard': {\n 'length': '16',\n 'prefix': /^5[1-5]/,\n 'luhn' : true\n },\n\n 'visa': {\n 'length': '13,16',\n 'prefix': /^4/,\n 'luhn' : true\n }\n },\n\n /**\n * Luhn function, to be used when validating credit card numbers\n * @method _luhn\n * @private\n * @param {Number} num Given credit card number\n * @returns {Boolean} Whether the credit card number is valid.\n */\n _luhn: function (num){\n\n num = parseInt(num,10);\n\n if ( (typeof num !== 'number') && (num % 1 !== 0) ){\n // Luhn can only be used on nums!\n return false;\n }\n\n num = num+'';\n // Check num length\n var length = num.length;\n\n // Checksum of the card num\n var i;\n var checksum = 0;\n\n for (i = length - 1; i >= 0; i -= 2)\n {\n // Add up every 2nd digit, starting from the right\n checksum += parseInt(num.substr(i, 1),10);\n }\n\n for (i = length - 2; i >= 0; i -= 2)\n {\n // Add up every 2nd digit doubled, starting from the right\n var dbl = parseInt(num.substr(i, 1) * 2,10);\n\n // Subtract 9 from the dbl where value is greater than 10\n checksum += (dbl >= 10) ? (dbl - 9) : dbl;\n }\n\n // If the checksum is a multiple of 10, the number is valid\n return (checksum % 10 === 0);\n },\n\n /**\n * Checks if a number is of a specific credit card type\n * @method isCreditCard\n * @param {String} num Number to be validates\n * @param {String|Array} creditCardType Credit card type or list of types. See _creditCardSpecs for the list of supported values.\n * @return {Boolean} Whether the number is of that credit card type (or at least one of `creditCardType` if you pass in an array).\n * @sample Ink_Util_Validator_isCreditCard.html \n */\n isCreditCard: function(num, creditCardType){\n\n if ( /\\d+/.test(num) === false ){\n return false;\n }\n\n if ( typeof creditCardType === 'undefined' ){\n creditCardType = 'default';\n }\n else if ( creditCardType instanceof Array ){\n var i, ccLength = creditCardType.length;\n for ( i=0; i < ccLength; i++ ){\n // Test each type for validity\n if (this.isCreditCard(num, creditCardType[i]) ){\n return true;\n }\n }\n\n return false;\n }\n\n // Check card type\n creditCardType = creditCardType.toLowerCase();\n\n if ( typeof this._creditCardSpecs[creditCardType] === 'undefined' ){\n return false;\n }\n\n // Check card number length\n var length = num.length+'';\n\n // Validate the card length by the card type\n if ( this._creditCardSpecs[creditCardType]['length'].split(\",\").indexOf(length) === -1 ){\n return false;\n }\n\n // Check card number prefix\n if ( !this._creditCardSpecs[creditCardType]['prefix'].test(num) ){\n return false;\n }\n\n // No Luhn check required\n if (this._creditCardSpecs[creditCardType]['luhn'] === false){\n return true;\n }\n\n return this._luhn(num);\n }\n };\n\n return Validator;\n\n});\n"]} \ No newline at end of file +{"version":3,"file":"ink-all.min.js","sources":["../../src/js/Ink/1/lib.js","../../src/js/Ink/Net/Ajax/1/lib.js","../../src/js/Ink/Net/JsonP/1/lib.js","../../src/js/Ink/Dom/Browser/1/lib.js","../../src/js/Ink/Dom/Css/1/lib.js","../../src/js/Ink/Dom/Element/1/lib.js","../../src/js/Ink/Dom/Event/1/lib.js","../../src/js/Ink/Dom/FormSerialize/1/lib.js","../../src/js/Ink/Dom/Loaded/1/lib.js","../../src/js/Ink/Dom/Selector/1/lib.js","../../src/js/Ink/UI/Animate/1/lib.js","../../src/js/Ink/UI/Carousel/1/lib.js","../../src/js/Ink/UI/Close/1/lib.js","../../src/js/Ink/UI/Common/1/lib.js","../../src/js/Ink/UI/DatePicker/1/lib.js","../../src/js/Ink/UI/Draggable/1/lib.js","../../src/js/Ink/UI/Drawer/1/lib.js","../../src/js/Ink/UI/Dropdown/1/lib.js","../../src/js/Ink/UI/Droppable/1/lib.js","../../src/js/Ink/UI/FormValidator/1/lib.js","../../src/js/Ink/UI/FormValidator/2/lib.js","../../src/js/Ink/UI/ImageQuery/1/lib.js","../../src/js/Ink/UI/LazyLoad/1/lib.js","../../src/js/Ink/UI/Modal/1/lib.js","../../src/js/Ink/UI/Pagination/1/lib.js","../../src/js/Ink/UI/ProgressBar/1/lib.js","../../src/js/Ink/UI/SmoothScroller/1/lib.js","../../src/js/Ink/UI/SortableList/1/lib.js","../../src/js/Ink/UI/Spy/1/lib.js","../../src/js/Ink/UI/Stacker/1/lib.js","../../src/js/Ink/UI/Sticky/1/lib.js","../../src/js/Ink/UI/Swipe/1/lib.js","../../src/js/Ink/UI/Table/1/lib.js","../../src/js/Ink/UI/Tabs/1/lib.js","../../src/js/Ink/UI/TagField/1/lib.js","../../src/js/Ink/UI/Toggle/1/lib.js","../../src/js/Ink/UI/Tooltip/1/lib.js","../../src/js/Ink/UI/TreeView/1/lib.js","../../src/js/Ink/UI/Upload/1/lib.js","../../src/js/Ink/Util/Array/1/lib.js","../../src/js/Ink/Util/BinPack/1/lib.js","../../src/js/Ink/Util/Cookie/1/lib.js","../../src/js/Ink/Util/Date/1/lib.js","../../src/js/Ink/Util/Dumper/1/lib.js","../../src/js/Ink/Util/I18n/1/lib.js","../../src/js/Ink/Util/Json/1/lib.js","../../src/js/Ink/Util/String/1/lib.js","../../src/js/Ink/Util/Url/1/lib.js","../../src/js/Ink/Util/Validator/1/lib.js"],"names":["window","document","paths","modules","modulesLoadOrder","modulesRequested","pendingRMs","modulesWaitingForDeps","apply","Function","prototype","isEmptyObject","o","k","hasOwnProperty","Ink","VERSION","_checkPendingRequireModules","I","F","dep","mod","cb","pRMs","toApply","length","left","args","remaining","push","i","setTimeout","getPath","key","noLib","split","curKey","root","path","slice","join","test","setPath","rootURI","replace","loadScript","uri","contentType","indexOf","givenUri","this","Error","scriptEl","createElement","setAttribute","onerror","error","head","getElementsByTagName","appendChild","_loadLater","namespace","ns","returnParentAndKey","levels","nsobj","parent","f","getModule","version","createModule","deps","modFn","modAll","Array","call","arguments","moduleContent","_version","isInkModule","t","requireModules","cbFn","undefined","_moduleRenames","warn","Ink.UI.Aux_1","getModulesLoadOrder","getModuleScripts","mlo","unshift","map","m","getModuleURL","createExt","moduleName","dependencies","bind","fn","context","innerArgs","finalArgs","concat","bindMethod","object","methodName","bindEvent","event","id","getElementById","ss","selector","from","Dom","Selector","select","s","extendObj","destination","sources","len","property","Object","log","console","Ajax","url","options","init","globalOptions","parameters","requestHeaders","xMLHttpRequestWithCredentials","XMLHttpRequest","userOptions","asynchronous","cors","validateCors","debug","delay","evalJS","method","postBody","sanitizeJSON","signRequest","timeout","useCredentials","xhrProxy","onComplete","onCreate","onException","onFailure","onHeaders","onInit","onSuccess","onTimeout","globalParameters","paramsObjToStr","safeCall","urlLocation","_locationFromURL","isHTTP","_locationIsHTTP","isCrossDomain","_locationIsCrossDomain","location","requestHasBody","search","transport","getTransport","request","createElementNS","href","match","protocol","widget","split1","split2","protocol1","protocol2","colonOrSlash","host1","host2","usingXDomainReq","XDomainRequest","ActiveXObject","e","setHeaders","headers","Accept","Accept-Language","navigator","language","X-Requested-With","X-Ink-Version","headerReqName","overrideMimeType","userAgent","Connection","headerName","setRequestHeader","optParams","p","a","params","toString","isNaN","encodeURIComponent","pop","setParams","getHeader","name","getResponseHeader","getAllHeaders","getAllResponseHeaders","getResponse","r","headerJSON","responseJSON","timeTaken","Date","startTime","requestedUrl","readyState","responseText","responseXML","status","statusText","abort","clearTimeout","delayTimeout","stoTimeout","ex","finish","runStateChange","rs","getTime","responseContent","response","curStatus","isSuccess","headerContentType","evalJSON","mimeType","xmlDoc","DOMParser","parseFromString","xml","onreadystatechange","destroy","handlerName","value","nodeType","crossDomain","open","withCredentials","onload","send","isJSON","str","strJSON","sanitize","JSON","parse","eval","load","callback","ping","JsonP","failureObj","callbackParam","internalCallback","randVar","parseInt","Math","random","Net","_cleanUp","_addScriptTag","_addParamsToGet","hasQuestionMark","sep","pKey","pValue","parts","_getScriptContainer","body","documentElement","rnd_seed","_scriptEl","type","src","scriptCtn","_removeScriptTag","parentNode","removeChild","Browser","IE","GECKO","OPERA","SAFARI","KONQUEROR","CHROME","model","cssPrefix","domPrefix","detectBrowser","setDimensions","setReferrer","myWidth","myHeight","innerWidth","innerHeight","clientWidth","clientHeight","windowWidth","windowHeight","referrer","escape","_sniffUserAgent","sAgent","toLowerCase","rVersion","re","RegExp","reVersion","alert","getCs","defaultView","getComputedStyle","Css","addRemoveClassName","elm","className","addRemState","addClassName","removeClassName","classList","add","hasClassName","remove","elmClassName","setClassName","all","has","contains","blinkClass","element","negate","Number","toggleClassName","forceAdd","toggle","setOpacity","val","style","opacity","filter","_camelCase","_","$1","toUpperCase","getStyle","currentStyle","charAt","css","parseFloat","setStyle","cssText","prop","styleFloat","cssFloat","show","forceDisplayProperty","display","hide","showHide","forceShow","_getRefTag","firstElementChild","child","firstChild","nextSibling","appendStyleTag","force","styles","oldStyle","l","innerHTML","defStyle","refTag","styleStr","styleSheet","createTextNode","insertBefore","appendStylesheet","media","rel","_loadingCSSFiles","_loadedCSSFiles","appendStylesheetCb","cbs","linkEl","headEl","imgEl","_url","callbacks","decToHex","dec","normalizeTo2","rDec","gDec","g","bDec","b","rgb","hexToDec","hex","substr","getPropertyFromStylesheet","rule","getRuleFromStylesheet","getPropertyFromStylesheet2","rules","getRulesFromStylesheet","x","sheet","ri","rf","styleSheets","si","sf","cssRules","selectorText","res","getPropertiesFromRule","props","steps","pre","pos","substring","borderTopLeftRadius","borderBottomRightRadius","borderTopRightRadius","borderBottomLeftRadius","changeFontSize","delta","op","minVal","maxVal","that","TypeError","el","els","fontSize","rect","elem","dimensions","getBoundingClientRect","top","offsetTop","offsetLeft","createContextualFragmentSupport","createRange","Range","createContextualFragment","deleteThisTbodyToken","browserCreatesTbodies","div","InkElement","isDOMElement","get","create","tag","properties","parEl","scrollTo","scrollIntoView","elmOffset","elmTop","elmLeft","offsetParent","y","offset","positionedOffset","valueTop","valueLeft","tagName","position","doc","ownerDocument","docElem","box","clientTop","clientLeft","scrollTop","pageYOffset","scrollLeft","pageXOffset","scroll","_getPropPx","cs","n","c","getPropertyValue","offset2","hasAttribute","attr","getAttribute","insertAfter","newElm","targetElm","insertTop","insertBottom","textContent","node","text","innerText","lastChild","childNodes","nodeValue","setTextContent","isLink","hasAttributeNS","isAncestorOf","ancestor","compareDocumentPosition","descendantOf","descendant","lastElementChild","previousSibling","nextElementSibling","sibling","previousElementSibling","elementWidth","offsetWidth","elementHeight","offsetHeight","elementLeft","elementTop","elementDimensions","outerDimensions","bbox","right","bottom","inViewport","dims","partial","margin","viewportWidth","viewportHeight","isHidden","w","h","isVisible","clonePosition","cloneTo","cloneFrom","ellipsizeText","overflow","whiteSpace","textOverflow","findUpwardsHaving","boolTest","findUpwardsByClass","tst","cls","findUpwardsByTag","nodeName","findUpwardsById","findUpwardsBySelector","sel","matchesSelector","getChildrenText","removeIt","j","part","nodes","jLen","_trimString","String","data","trim","getSelectValues","selectEl","values","_normalizeData","d","data2","fillSelect","container","skipEmpty","defaultValue","containerEl","optionEl","fillRadios","insertAfterEl","splitEl","inputEl","checked","fillChecks","parentIndexOf","parentEl","childEl","children","nextSiblings","elements","siblings","index","previousSiblings","childElementCount","_wrapElements","TABLE","html","TBODY","THEAD","TFOOT","TR","_getWrapper","wrapper","wrapFunc","tds","tbody","appendHTML","prependHTML","setHTML","wrap","target","nextNode","unwrap","wrapperSelector","replacement","replaceChild","removeTextNodeChildren","prevEl","toRemove","htmlToFragment","range","createDocumentFragment","selectNode","fragment","tempElement","current","InkDomSelector","dataset","attrs","attributes","curAttr","curAttrName","curAttrValue","total","moveCursorTo","setSelectionRange","createTextRange","collapse","moveEnd","moveStart","pageWidth","xScroll","scrollMaxX","scrollWidth","self","pageHeight","yScroll","scrollMaxY","scrollHeight","bean","definition","win","old","namespaceRegex","nameRegex","addEvent","removeEvent","W3C_MODEL","eventSupport","ONE","str2arr","isString","isFunction","standardNativeEvents","w3cNativeEvents","nativeEvents","hash","events","customEvents","isAncestor","check","related","relatedTarget","prefix","mouseenter","base","condition","mouseleave","mousewheel","Event","commonProps","mouseProps","mouseWheelProps","keyProps","textProps","touchProps","messageProps","stateProps","overOutRegex","typeFixers","reg","fix","newEvent","keyCode","which","rightClick","button","pageX","pageY","clientX","clientY","typeFixerMap","isNative","parentWindow","originalEvent","isBean","srcElement","fixer","preventDefault","returnValue","stopPropagation","cancelBubble","stop","stopped","stopImmediatePropagation","isImmediatePropagationStopped","clone","currentTarget","ne","targetElement","RegEntry","wrappedHandler","eargs","findTarget","eventElement","__beanDel","ft","handler","original","namespaces","customType","once","removeListener","eventType","inNamespaces","checkNamespaces","matches","checkElement","checkOriginal","checkHandler","registry","forAll","pfx","list","entries","entry","put","del","splice","removed","selectorEngine","setSelectorEngine","querySelectorAll","rootListener","propertyName","listeners","listener","custom","attachEvent","detachEvent","rm","originalFn","orgType","handlers","delegate","array","fireListener","evt","createEvent","dispatchEvent","fireEvent","createEventObject","off","typeSpec","isTypeStr","on","types","first","delfn","one","fire","names","beanDel","noConflict","cleanup","CollectGarbage","InkEvent","KEY_BACKSPACE","KEY_TAB","KEY_RETURN","KEY_ESC","KEY_SPACE","KEY_LEFT","KEY_UP","KEY_RIGHT","KEY_DOWN","KEY_DELETE","KEY_HOME","KEY_END","KEY_PAGEUP","KEY_PAGEDOWN","KEY_INSERT","throttle","func","wait","throttled","now","timeDiff","lastCall","ev","delegationTarget","fromElement","toElement","findElement","elmTagName","observe","eventName","callBack","useCapture","addEventListener","observeOnce","onceBack","stopObserving","observeMulti","observeDelegated","cursor","Selector_1","removeEventListener","cancel","stopDefault","pointer","pointerX","pointerY","touches","isLeftClick","isRightClick","isMiddleClick","getCharFromKeyboardEvent","changeCasing","fromCharCode","shiftOn","shiftKey","InkArray","isArrayIsh","obj","isArray","toArray","FormSerialize","serialize","form","out","emptyArrayToken","pairs","asPairs","emptyArray","outputUnchecked","forEach","pair","_resultsInArray","emit","serializeEl","elNodeName","elType","multiple","didEmit","thisOption","inputs","_isSerialized","fillIn","map2","_objToPairs","_fillInPairs","groupBy","reduce","_fillInOne","firstOne","firstNodeName","firstType","isSelectMulti","_fillInBoolean","min","checkAttr","input","isChecked","inArray","Loaded","_contexts","run","cbQueue","done","checkState","_checkState","poll","_poll","ael","rem","det","wet","csf","alreadyLoaded","frameElement","doScroll","where","_ready","rnative","createCache","cache","keys","Expr","cacheLength","shift","markFunction","expando","assert","Sizzle","results","seed","groups","nid","newContext","newSelector","preferredDoc","setDocument","documentIsHTML","rquickExpr","exec","support","getElementsByClassName","qsa","rbuggyQSA","tokenize","rescape","toSelector","rsibling","qsaError","removeAttribute","rtrim","siblingCheck","cur","diff","sourceIndex","MAX_NEGATIVE","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","parseOnly","matched","tokens","soFar","preFilters","cached","tokenCache","preFilter","rcomma","rcombinators","matchExpr","addCombinator","matcher","combinator","dir","checkNonElements","doneName","outerCache","dirkey","dirruns","cachedruns","elementMatcher","matchers","condense","unmatched","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","elems","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","relative","implicitRelative","matchContext","matchAnyContext","outermostContext","matcherFromGroupMatchers","elementMatchers","setMatchers","matcherCachedRuns","bySet","byElement","superMatcher","expandContext","setMatched","matchedCount","outermost","contextBackup","find","dirrunsUnique","uniqueSort","contexts","token","runescape","funescape","compile","setFilters","getText","isXML","recompare","sortInput","rbuggyMatches","classCache","compilerCache","hasDuplicate","sortOrder","strundefined","arr","push_native","whitespace","characterEncoding","identifier","operators","pseudos","rpseudo","ridentifier","ID","CLASS","NAME","TAG","ATTR","PSEUDO","CHILD","needsContext","rinputs","rheader","rattributeQuotes","escaped","high","createComment","getByName","pass","getElementsByName","sortDetached","div1","attrHandle","attrId","getAttributeNode","tmp","mozMatchesSelector","webkitMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","adown","bup","compare","aup","ap","bp","expr","ret","specified","msg","duplicates","detectDuplicates","sortStable","sort","selectors","createPseudo",">"," ","+","~","excess","unquoted","pattern","operator","result","what","last","simple","forward","ofType","nodeIndex","start","useCache","pseudo","idx","not","lang","elemLang","focus","activeElement","hasFocus","tabIndex","enabled","disabled","selected","selectedIndex","empty","header","eq","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","group","filters","Common","Animate","BaseUIComponent","animationPrefix","animationEndEventName","animation","webkitAnimation","_name","_optionDefinition","trigger","duration","removeClass","onEnd","_init","_options","animate","_element","_animationPrefix","animationSupported","onAnimationEnd","animationName","elOrSelector","createUIComponent","Pagination","limitRange","max","Carousel","setTransitionProperty","newTransition","transitionProperty","oTransitionProperty","msTransitionProperty","mozTransitionProperty","webkitTransitionProperty","requestAnimationFrame","autoAdvance","axis","initialPage","spaceAfterLastSlide","keyboardSupport","pagination","onChange","swipe","_handlers","paginationChange","windowResize","_isY","ulEl","width","_ulEl","_currentPage","refit","_setUpPagination","_setUpAutoAdvance","size","perpendicular","_liEls","numSlides","contRect","_ctnLength","_elLength","_slidesPerPage","floor","isFinite","numPages","ceil","numPagesChanged","_numPages","_deltaLength","_IE7","_pagination","setSize","setPage","getPage","setOnChange","setCurrent","nextPage","slides","stl","_onTouchStart","_swipeData","ulRect","firstUlPos","inUlX","inUlY","_touchMoveIsFirstTouchMove","_onTouchMove","deltaY","deltaX","aDeltaY","abs","aDeltaX","_scrolling","_onAnimationFrame","pointerDelta","pointerPos","swipeData","elRect","newPos","_onTouchEnd","snapToNext","curPage","progressInPages","_onPaginationChange","pgn","_setPage","getCurrent","getPagination","page","_lengthToGo","isLastPage","_itemsInLastPage","previousPage","getSlidesPerPage","getTotalPages","getStageElm","getSlidesList","getTotalSlides","Close","Url","warnStub","constructor","stub","_componentOptions","elementIsOptional","elsOrSelector","isValidInstance","_validateInstance","registerInstance","_stubInstance","nothing","es6WeakMapSupport","instances","WeakMap","_reg","domRegistry","set","thing","Layouts","TINY","SMALL","MEDIUM","LARGE","XLARGE","isInteger","fieldName","required","fieldId","defaults","overrides","optionValue","lType","defaultVal","invalidThrow","_coerce_funcs","fromDataAttrs","dataAttrs","_coerce_from_string","_options_validate","invalid","quote","invalidStr","paramName","_options_validate_types","number","boolean","string","function","integer","round","stringify","childIndex","ajaxJSON","endpoint","message","currentLayout","v","detectorEl","hashSet","hashParams","getAnchorString","genQueryString","cleanChildren","storeIdAndClasses","fromEl","inObj","_id","classes","_classes","restoreIdAndClasses","toEl","_instanceId","_warnDoubleInstantiation","newInstance","getName","getInstance","nameWithoutVersion","inst","unregisterInstance","UIComponent","givenEl","getInstanceFromSelector","getInstanceIds","getInstances","destroyComponent","instance","err","_validate","_validationError","getOption","setOption","getElement","theConstructor","assertProp","propType","propVal","_oldProto","hideF","InkDate","clamp","dateishFromYMDString","YMD","dateishFromYMD","year","month","day","_year","_month","_day","dateishFromDate","date","getFullYear","getMonth","getDate","DatePicker","autoOpen","cleanText","closeText","pickerField","containerElement","cssClass","dateRange","displayInSelect","dayField","monthField","yearField","format","nextLinkText","ofText","onFocus","onMonthSelected","onSetDate","onYearSelected","prevLinkText","showClean","showClose","shy","startDate","startWeekDay","validDayFn","validMonthFn","validYearFn","nextValidDateFn","prevValidDateFn","yearRange",1,2,3,4,5,6,7,8,9,10,11,12,"wDay","_dateParsers","_hoverPicker","_picker","_setMinMax","setDate","_lang","_render","_listenToContainerObjectEvents","_containerObject","_renderSuperTopBar","calendarTop","_monthDescContainer","_monthPrev","_monthNext","_monthContainer","_monthSelector","_renderMonthSelector","_yearSelector","_appendDatePickerToDom","_renderMonth","_monthChanger","_ofText","_yearChanger","inline","_addOpenCloseEvents","_addDateChangeHandlersToInputs","fields","_updateDate","_showDefaultView","_inline","_hide","opener","cannotBe","ulSelector","mon","_renderMonthButton","liMonth","data-cal-month","appendTarget","parentIsControl","_wrapper","_wrapperIsControl","_superTopBar","_onClick","_onRelativeChangerClick","_onAbsoluteChangerClick","_showMonthSelector","_showYearSelector","_clean","_updateDescription","changeYear","change_year_next","change_year_prev","changeMonth","change_month_next","change_month_prev","_updateCal","elemData","calDay","calMonth","calYear","_changeYear","blur","noLimits","_min","noMinLimit","_max","noMaxLimit","MAX_VALUE","dates","rDate","each","noLim","lim","_daysInMonth","valid","_dateCmp","_fitDateToRange","_isValidDate","_dateWithinRange","_dateAboveMax","_dateBelowMin","oth","_dateCmpUntil","depth","_getPrevMonth","_getNextMonth","dataParsed","_parseDate","_setDate","inc","_incrementViewingYear","firstYear","thisYear","yearUl","prevYearLi","_getYearButton","nextYearLi","_acceptableYear","li","data-cal-year","_addMonthClassNames","dateStr","yearRegExp","validOneOrTwo","_isDate","_acceptableDay","_acceptableDateComponent","_acceptableMonth","userCb","_callUserCallbackBool","_writeDateInFormat","dateString","auxDate","objClicked","dt","_updateMonth","_y","_m","exceptions","incValue","_tryLeap","_getPrevYear","_getNextYear","atomName","directionName","advancer","maxOrMin","boundary","leapUserCb","_callUserCallbackDate","daysInThisMonth","_getNextDecade","decade","_getCurrentDecade","_getPrevDecade","_callUserCallbackBase","yyyy-mm-dd","yyyy/mm/dd","yy-mm-dd","yy/mm/dd","dd-mm-yyyy","dd/mm/yyyy","dd-mm-yy","dd/mm/yy","mm/dd/yyyy","mm-dd-yyyy","_getMonthCalendarHeader","_getDayButtons","_getFirstDayIndex","wDayFirst","getDay","daysInMonth","ul","firstDayIndex","_getDayButton","dayButton","_addMonthButtonClassNames","btn","toDisable","showMonth","isMonthRendered","between","Draggable","constraint","constraintElm","handle","revert","zIndex","fps","droppableProxy","mouseAnchor","dragClass","skipChildren","onStart","onDrag","elmStartPosition","active","dragged","prevCoords","placeholder","zindex","firstDrag","deltaMs","lastRunAt","_onStart","dragFacade","_onDragFacade","drag","_onDrag","end","_onEnd","selectStart","_getCoords","ps","_cloneStyle","dst","borderWidth","padding","height","tgtEl","originalPosition","marginTop","marginBottom","marginLeft","marginRight","visibility","delta2","ad","applyDelta","dragHandlerName","proxy","fs","backgroundColor","firstEl","mouseCoords","mPosX","mPosY","newX","newY","draggableSize","constTop","constBottom","constLeft","constRight","Droppable","updateAll","mouseCoords2","action","pt","Element","pageWideFocusListener","onlyWrapper","_removePageWideFocusListener","mouseIsDown","focusFirstFocusableElementInside","withTabIndex","lowestTabIndex","lowestTabIndexElm","ind","firstFocusable","sFocusableElms","elNotFound","Drawer","transitionSupport","transitions","WebkitTransitionProperty","styleProp","parentSelector","leftDrawer","leftTrigger","rightDrawer","rightTrigger","contentDrawer","mode","sides","validateSide","side","drawer","triggers","atLeastOneSide","errorMsg","drawerOption","triggerOption","_contentDrawers","_leftDrawer","_leftTriggers","_rightDrawer","_rightTriggers","_triggers","_isOpen","_direction","click","afterTransition","_afterTransition","_addEvents","clickedTrigger","_onTriggerClicked","clickedInContent","clickedInLink","close","_getRecentDrawer","direction","drawerEl","_transitionWillOccur","uselessValue","lastFocused","didFocus","insideDrawer","transitioning","Toggle","Dropdown","hoverOpen","dismissOnInsideClick","dismissOnOutsideClick","dismissAfter","onInsideClick","onOutsideClick","onOpen","onDismiss","_toggle","closeOnInsideClick","closeOnClick","onChangeState","newState","_openOrDismiss","_onMouseOver","getState","_openTimeout","_dismissTimeout","_onMouseOut","_onInsideClick","_handlerCall","dismiss","_onOutsideClick","foundElem","needle","foundTarget","callHandler","_doNotInformToggle","setState","hAddClassName","hRemoveClassName","_droppables","_draggables","cleanStyle","draggable","opt","hoverClass","hoverclass","accept","onHover","onDrop","onDropOut","namedEventHandlers","move","droppable","copy","cloneNode","_findDraggable","originalParent","elementData","_update","_findData","elms","update","coords","InkValidator","elementsWithSameName","everything","FormValidator","_flagMap","ink-fv-required","ink-fv-email","ink-fv-url","ink-fv-number","ink-fv-phone_pt","ink-fv-phone_cv","ink-fv-phone_mz","ink-fv-phone_ao","ink-fv-date","ink-fv-confirm","ink-fv-custom","confirmElms","hasConfirm","_errorClassName","_errorValidationClassName","_errorTypeWarningClassName","_errorTypeErrorClassName","validate","_free","onError","customFlag","confirmGroup","fail","_validateElements","_showError","_clearError","_clearCache","_getElements","formElms","curElm","totalElm","flag","flag2","oGroups","_makeConfirmGroups","errors","customErrors","_isValid","_isCustomValid","_validateConfirmGroups","curGroup","totalG","curFlag","tCustom","fieldType","inputType","_trim","aFormRadios","totalRadio","mail","isPTPhone","isCVPhone","isAOPhone","isMZPhone","validFormat","validValues","isDate","formElm","aFail","tFail","_showAnErrorOnElement","controlGroupElm","controlElm","errorClasses","_errorTypeClassName","aErrorLabel","control","aErrorLabel2","I18n","FormElement","validationFunctions","min_length","minSize","max_length","maxSize","exact_length","exactSize","email","fullCheck","ip","ipType","isIP","phone","phoneType","countryCode","credit_card","cardType","isCreditCard","alpha","supportSpaces","ascii","singleLineWhitespace","punctuation","unicode","unicodePunctuation","latin","latin1","latin1Punctuation","alpha_numeric","numbers","alpha_dash","dash","underscore","digit","positive","negative","decimalPlaces","decimal","decimalSeparator","leftDigits","decimalSep","maxDigits","numeric","minValue","maxValue","multipleOf","color","isColor","fieldToCompare","otherField","getFormElements","otherFieldValue","getValue","_rules","validationMessages","en_US","formvalidator.required","formvalidator.min_length","formvalidator.max_length","formvalidator.exact_length","formvalidator.email","formvalidator.url","formvalidator.ip","formvalidator.phone","formvalidator.credit_card","formvalidator.date","formvalidator.alpha","formvalidator.text","formvalidator.latin","formvalidator.alpha_numeric","formvalidator.alpha_dash","formvalidator.digit","formvalidator.integer","formvalidator.decimal","formvalidator.numeric","formvalidator.range","formvalidator.color","formvalidator.matches","formvalidator.validation_function_not_found","pt_PT","label","_errors","_value","_getLabel","_parseRules","rulesLength","paramStartPos","_addError","paramObj","field","i18nKey","getErrors","_formElements","doValidate","eventTrigger","neverSubmit","searchFor","beforeValidation","setRule","errorMessage","getKey","langObj","dictObj","append","getI18n","setI18n","i18n","appendI18n","setLanguage","getRules","_rootElement","_errorMessages","_markedErrorElements","getElements","formElements","formElement","_getOrCreateFormElementInstance","errorElement","errorElements","counter","controlGroupElement","controlElement","paragraph","errorArr","ImageQuery","retina","queries","onLoad","lastIndexOf","_filename","sortMulti","reverse","_onLoad","_onResize","_findCurrentQuery","getQuerySrc","query","devicePixelRatio","LazyLoad","item","source","scrollElement","touchEvents","onInsideViewport","onAfterAttributeChange","autoInit","_aData","_hasEvents","_activate","_getData","_onScrollThrottled","aElms","_onScroll","_removeEvents","_elInViewport","_userCallback","reload","upName","dimension","firstCharacter","maxName","Modal","opacitySupported","openModals","shadeClass","modalClass","triggerEvent","autoDisplay","markup","onShow","closeOnEscape","responsive","_onShadeClick","keyDown","_onKeyDown","resize","_markupMode","_modalDiv","_modalShadow","_contentContainer","setContentMarkup","triggerElements","_reposition","isPercentage","currentViewport","originalStatus","_resizeContainer","_shadeElement","alertsInTheModal","alertsLength","containerHeight","_modalHeader","_modalFooter","isOpen","compatMode","_contentElement","_waitForFade","keyValue","htmlEl","fadeChecks","fadeChecker","getContentElement","contentMarkup","tempHeader","tempFooter","toAdd","genAEl","aEl","wrapText","spanEl","totalItemCount","itemsPerPage","sideButtons","firstLabel","lastLabel","previousLabel","nextLabel","previousPageLabel","nextPageLabel","hashParameter","parentTag","childTag","wrapperClass","paginationClass","activeClass","disabledClass","hideClass","previousClass","previousPageClass","nextClass","nextPageClass","firstClass","lastClass","numberFormatter","autoWrap","_size","_calculateSize","_current","_itemLiEls","_generateMarkup","_updateItems","_observe","count","liEls","isSimpleToggle","liEl","_nextEl","pi","pf","_pageStart","_pageEnd","_page","_prevPageEl","hasPreviousPage","_nextPageEl","hasNextPage","_firstEl","isFirst","_lastEl","isLast","_prevEl","hasPrevious","hasNext","hasUlAlready","isChevron","isDotted","createLiEl","isPrev","isNext","isPrevPage","isNextPage","aElem","nr","sz","setSizeInItems","totalItems","pageNumber","isRelative","next","previous","getSize","ProgressBar","startValue","_elementBar","setValue","newValue","cancelAnimationFrame","SmoothScroller","speed","changeHash","endPos","interval","onDone","onClick","render","link","thisDocument","linkedDocument","activeLiSelector","activeLi","Events","SortableList","hasTouch","maxTouchPoints","msMaxTouchPoints","placeholderClass","draggedClass","draggingClass","dragSelector","handleSelector","moveSelector","swap","cancelMouseOut","down","_onDown","_onMove","up","_onUp","_isMoving","_down","_move","_up","stopMoving","_placeholder","_movePlaceholder","_addMovingClasses","touch","elementFromPoint","validateMove","droppedElement","_removeMovingClasses","target_position","placeholder_position","from_top","from_left","targetIndex","spyTargets","addSpied","spied","observeOnScroll","observingOnScroll","onScroll","onScrollForTarget","activeEl","findActiveElement","toDeactivate","menuLinkSelector","toActivate","closest","Infinity","closestIndex","bBox","Spy","Stacker","column","customBreakPoints","largeMax","largeMin","mediumMax","mediumMin","smallMax","smallMin","largeCols","mediumCols","smallCols","isOrdered","onRunCallback","onResizeCallback","onAPIReloadCallback","_aList","_curLayout","_runFirstTime","_getPageItemsToList","_canApplyLayoutChange","_applyLayoutChange","addItem","reloadItems","_removeDomItems","_setCurLayout","customBreakpoints","_getColumnsToShow","cols","curLayout","_aColumn","totalCols","aItems","aNewList","ii","countCol","Sticky","offsetBottom","topElement","stickyClass","inlineDimensions","inlinePosition","bottomElement","activateInLayouts","_dims","scrollTarget","_isDisabledInLayout","_getDims","unstick","_unstick","bottomOfSticky","maxBottomOfSticky","_stickTo","_inlineDimensions","_getBottomOffset","bottomOfViewport","toBottomOfDocument","oldPosition","oldWidth","dimensionsInStatic","Swipe","onMove","minDist","maxDist","minDuration","maxDuration","storeGesture","stopEvents","_supported","db","_isOn","_isMeOrParent","_pushGesture","_gesture","_time","changedTouches","_target","_t0","_p0","t1","gesture","p1","dr","dist","sqrt","time","overallMovement","overallTime","InkUrl","InkString","Json","maybeTurnIntoNumber","rNumber","cmp","numberishEnabledCmp","aValue","bValue","Table","sameSame","pageSize","caretUpClass","caretDownClass","createEndpointUrl","createEndpointURL","getDataFromEndPoint","getDataFromEndpoint","processJSONRows","rows","processJSONRow","processJSONField","processJSONHeaders","processJSONTotalRows","totalRows","getSortKey","allowResetSorting","visibleFields","tdClassNames","paginationOptions","_thead","tHead","createTHead","_headers","thClick","_originalFields","_sortableFields","_originalData","_data","_totalRows","_resetSortOrder","_addHeadersClasses","_setPagination","headerLabel","classNames","_onThClick","paginated","sortable","_invertSortOrder","_setSortOrderOfColumn","row","_paginate","sortAndReverse","isAscending","_sort","caretHtml","order","firstIndex","lastIndex","_registerFieldNames","_fieldIsVisible","userKey","keyFunction","columnIndex","columnName","trA","trB","elementA","elementB","_createHeadersFromJson","tr","insertRow","th","_createSingleHeaderFromJson","_createRowsFromJSON","trIndex","_createSingleRowFromJson","rowIndex","_createFieldFromJson","fieldData","processor","_elOrFieldData","processed","isNumber","setEndpoint","currentPage","paginationEl","pageNo","_getSortOrder","_getDataViaAjax","_getUrl","urlCreator","parseUrl","sortField","endpointUri","success","JSONData","_onAjaxSuccess","jsonResponse","_rowLength","Tabs","preventUrlChange","onBeforeChange","menuSelector","contentSelector","triggerEventsOnLoad","_menu","_initializeDom","_setFirstActive","contentTabs","activeMenuLink","_findLinkByHref","_changeTab","runCallbacks","activeTabs","_activeMenuTab","_activeSection","_activeMenuLink","_onTabClickedGeneric","doChangeTab","_onTabClicked","tabElm","_dehashify","changeTab","_hashify","links","disable","enable","activeTab","activeSection","TagField","enterKey","backspaceKey","isTruthy","buggySplit","splitFunction","nativeSplit","compliantExecNpcg","separator","limit","output","flags","ignoreCase","multiline","extended","sticky","lastLastIndex","separator2","lastLength","tags","tagQuery","tagQueryAsync","allowRepeated","maxTags","outSeparator","autoSplit","_readInput","_viewElm","_input","_tagsFromMarkup","_tags","_onKeyUp","_onBlur","_refocus","tagname","option","_tagsToMarkup","_addTag","_removeTag","spc","_onEnterKeyDown","_onBackspaceKeyDown","_removeConfirm","_unsetRemovingVisual","_setRemovingVisual","tagIndex","_removeRemovingVisualTimeout","canToggleAnAncestor","isAccordion","initialState","classNameOn","classNameOff","_targets","_accordionContainer","_constructing","_bindEvents","state","_onTriggerEvent","isAncestorOfClickedElement","some","thisOne","_firstTime","_updateAccordion","otherToggle","shades","ancestorOfTargets","shadesLength","_group","Tooltip","EachTooltip","transitionDurationName","transitionPropertyName","transitionTimingFunctionName","bodies","spacing","forever","template","templatefield","fade","tooltips","tooltip","_destroy","_oppositeDirections","_onMouseMove","_delayTimeout","_makeTooltip","mousePosition","_getOpt","_createTooltipElement","_removeTooltip","_fadeInTooltipElement","_placeTooltipElement","_onTooltipMouseOver","_getFloatOpt","outerHTML","_getIntOpt","fadeTime","mPos","_setPos","targetElementPos","tleft","ttop","centerh","centerv","tooltipDims","elementDims","maxX","maxY","_getWhereValueInsideViewport","arrow","tooltipLeft","tooltipTop","toBottom","toRight","toLeft","toTop","viewport","dataAttrVal","instanceOption","_getMousePosition","pageDims","_getPageXY","elmDims","scrollDim","_getScroll","cWidth","cHeight","dd","TreeView","parentClass","openNodeClass","openClass","closedClass","iconTag","isParent","_getIcon","_setNodeOpen","_getChild","beOpen","icon","DirectoryReader","maxDepth","_read","_readDirectories","running","_readEntries","currentEntry","createReader","readEntries","isDirectory","clearArray","fullPath","_stopActivityTimeout","readError","activity","checkActivity","clearInterval","readComplete","setInterval","Queue","lists","items","getItems","parentId","purge","keepList","pid","priority","view","_searchByPid","UI","Upload","_fileButton","fileButton","_dropzone","dropzone","_setDropEvent","_setFileButton","dropzones","ondrop","_dropEventHandler","ondragleave","_onDragLeave","ondragend","_onDragEndEventHandler","ondragdrop","ondragenter","_onDragEnterHandler","ondragover","_onDragOverHandler","publish","btns","_fileChangeHandler","files","FormData","_addFilesToQueue","_events","fileFormName","maxFilesize","INVALID_FILE_NAME","extraData","useChunks","chunkSize","minSizeToUseChunks","endpointChunk","endpointChunkCommit","foldersEnabled","directoryMaxDepth","_queueId","_queueRunning","_folders","_supportChunks","Blob","dataTransfer","_files","webkitGetAsEntry","folders","_addFolderToQueue","invalidFolders","getFiles","isFile","convertToFile","hasParent","getSubDirs","created","fileID","directory","_processQueue","internalUpload","queueLen","canceled","_doRequest","_upload","xhr","forceAbort","showError","lengthComputable","loaded","lastModifiedDate","upload","onprogress","chunk_offset","chunk_upload_id","fd","blob","upload_path","parentID","rootPath","invalidOffset","upload_id","chunk_expires","expires","onabort","abortAll","abortOne","subscribe","arrayProto","testedObject","outKey","latestGroup","initial","aKeys","shuffle","tmp1","rnd","mapFn","filtered","intersect","arr1","arr2","shared","J","convert","unique","newArr","step","insert","rLen","iLen","Packer","fit","blocks","block","findNode","splitNode","used","GrowingPacker","growNode","canGrowDown","canGrowRight","shouldGrowRight","shouldGrowDown","growRight","growDown","sorts","area","msort","maxside","criteria","BinPack","binPack","bl","packer","sorter","dims2","fitted","unfitted","filled","Cookie","cookie","_Cookie","aCookie","aItem","decodeURIComponent","domain","secure","sName","sExpires","sPath","sDomain","sSecure","oDate","sDate","valueOf","nDate","expiresString","toGMTString","hostname","cookieName","expiresDate","_months","_iMonth","janeiro","jan","fevereiro","fev","março","mar","abril","abr","maio","mai","junho","jun","julho","jul","agosto","ago","setembro","outubro","novembro","nov","dezembro","dez","_wDays","_d","_iWeek","week","segunda","seg","terça","ter","quarta","qua","quinta","qui","sexta","sex","sábado","sáb","domingo","dom","nDays","_date","iFormat","escapeChar","jsDate","jsFirstDay","jsThisDay","jsHour","jsDay","suffixes","suffix","UTC","jsYearStart","days","jsMonth","getYear","jsYear","getHours","jsMinute","getMinutes","jsSecond","getSeconds","getTimezoneOffset","jsMinZone","jsMinutes","jsDayName","jsMonthName","str_date","mList","objIndex","dayY","dayW","hour","hourD","sec","msec","ampm","diffM","diffH","pattr","_haveDatetime","_haveYear","_haveYDay","_haveDay","_haveMonth","_haveMonthDay","_haveOnlyDay","_haveWDay","_haveWeek","_haveWeekWDay","_haveOnlyWDay","_validDate","_noDate","_haveHour12","_haveHour24","_haveHour","_haveMin","_haveSec","_haveMSec","_haveMoreM","_haveMoreS","_haveDiffM","_haveDiffH","dList","gmt","aux","Dumper","_tab","_formatParam","param","formated","_outputFormat","_getTabs","numberOfTabs","tabs","_i","indent","_typeof","printDump","write","returnDump","alertDump","windowDump","dumperwindow","pattrText","funcOrVal","dict","testMode","_dicts","_dict","_testMode","_gLang","newTestMode","gLang","langGlobal","_gDict","pars","isObj","$2","$3","ntext","strSin","strPlur","ordinal","num","lastDig","ordDict","byLastDigit","alias","_gDicts","appendGlobal","twoDigits","function_call","cx","dateToISOString","toISOString","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","toFixed","InkJson","_nativeJSON","_convertToUnicode","_escape","theString","\b","\t","\n","\f","\r","\"","\\","charCodeAt","_toUnicode","unicodeString","inInt","theUnicode","_stringifyValue","toJSON","arrayString","objectString","convertToUnicode","reviver","walk","holder","SyntaxError","InkUtilString","_chars","_entities","_accentedChars","_accentedRemovedChars","_htmlUnsafeChars","<","&","'","ucFirst","firstWordOnly","replacer","stripTags","allowed","aAllowed","aNewAllowed","cleanedTag","strAllowed","reAllowed","aFoundTags","htmlEntitiesEncode","htmlEntitiesDecode","$0","utf8Encode","utfstring","shortString","words","resultstr","truncateString","utf8Decode","c2","c3","removeAccentedChars","newString","substrCount","haystack","htmlEscapeUnsafe","chars","normalizeWhitespace","toUnicode","unescape","es","hexNum","escapeText","txt","whiteList","txt2","C","escapedCharRegex","unescapeText","strcmp","str1","str2","packetize","maxLen","_keyStr","getUrl","getQueryString","aParams","queryStr","aQueryStr","pairVar","getAnchor","anchor","anchorStr","aAnchorStr","aURL","scheme","host","re1","re2","re3","regPort","tmpHost1","port","tmpHost2","tmpUserPass","user","urlObj","frag","currentScriptElement","aScripts","curScript","Validator","_countryCodes","_internacionalPT","_indicativosPT",21,22,231,232,233,234,235,236,238,239,241,242,243,244,245,249,251,252,253,254,255,256,258,259,261,262,263,265,266,268,269,271,272,273,274,275,276,277,278,279,281,282,283,284,285,286,289,291,292,295,296,91,93,96,92,707,760,800,808,30,"_internacionalCV","_indicativosCV",95,97,98,99,"_internacionalAO","_indicativosAO","_internacionalMZ","_indicativosMZ",82,84,"_internacionalTL","_indicativosTL","_characterGroups","asciiAlpha","latin1Alpha","unicodeAlpha","space","nicknamePunctuation","newline","asciiPunctuation","createRegExp","checkCharacterGroups","numb","thousandSep","returnNumber","maxExcl","minExcl","_isLeapYear","parser","emailValido","full","reHTTP","reUrl","aInd","strInd","re351","reSpecialChars","reInt","reValid","isPortuguesePhone","re238","re244","re258","isTLPhone","re670","isPhone","codPostal","cp1","cp2","returnBothResults","cPostalSep","cPostal4","cPostal3","parserCPostal","cPostal","yearIndex","monthIndex","dayIndex","dateParser","keyword","hexa","rgba","hsl","hsla","_creditCardSpecs","default","luhn","american express","diners club","discover","jcb","maestro","mastercard","visa","_luhn","checksum","dbl","creditCardType","ccLength"],"mappings":"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","sourcesContent":["/**\n * Ink Core.\n * @module Ink_1\n * This module provides the necessary methods to create and load the modules using Ink.\n */\n\n;(function(window, document) {\n\n 'use strict';\n\n // skip redefinition of Ink core\n if ('Ink' in window) { return; }\n\n\n // internal data\n\n /*\n * NOTE:\n * invoke Ink.setPath('Ink', '/Ink/'); before requiring local modules\n */\n var paths = {};\n var modules = {};\n var modulesLoadOrder = [];\n var modulesRequested = {};\n var pendingRMs = [];\n var modulesWaitingForDeps = {};\n\n var apply = Function.prototype.apply;\n\n // auxiliary fns\n var isEmptyObject = function(o) {\n /*jshint unused:false */\n if (typeof o !== 'object') { return false; }\n for (var k in o) {\n if (o.hasOwnProperty(k)) {\n return false;\n }\n }\n return true;\n };\n\n /**\n * @namespace Ink_1\n */\n\n window.Ink = {\n /**\n * @property {String} VERSION\n **/\n VERSION: '3.1.2',\n _checkPendingRequireModules: function() {\n var I, F, o, dep, mod, cb, pRMs = [];\n var toApply = [];\n for (I = 0, F = pendingRMs.length; I < F; ++I) {\n o = pendingRMs[I];\n\n if (!o) { continue; }\n\n for (dep in o.left) {\n if (o.left.hasOwnProperty(dep)) {\n mod = modules[dep];\n if (mod) {\n o.args[o.left[dep] ] = mod;\n delete o.left[dep];\n --o.remaining;\n }\n }\n }\n\n if (o.remaining > 0) {\n pRMs.push(o);\n } else {\n cb = o.cb;\n if (!cb) { continue; }\n delete o.cb; // to make sure I won't call this more than once!\n toApply.push([cb, o.args]);\n }\n }\n\n pendingRMs = pRMs;\n\n for (var i = 0; i < toApply.length; i++) {\n toApply[i][0].apply(false, toApply[i][1]);\n }\n\n if (pendingRMs.length > 0) {\n setTimeout( function() { Ink._checkPendingRequireModules(); }, 0 );\n }\n },\n\n /**\n * Get the full path of a module.\n * This method looks up the paths given in setPath (and ultimately the default Ink's path).\n *\n * @method getPath\n * @param {String} key Name of the module you want to get the path\n * @param {Boolean} [noLib] Flag to skip appending 'lib.js' to the returned path.\n *\n * @return {String} The URI to the module, according to what you added in setPath for the given `key`.\n */\n getPath: function(key, noLib) {\n var split = key.split(/[._]/g);\n var curKey;\n var i;\n var root;\n var path;\n\n // Look for Ink.Dom.Element.1, Ink.Dom.Element, Ink.Dom, Ink in this order.\n for (i = split.length; i >= 0; i -= 1) {\n curKey = split.slice(0, i + 1).join('.'); // See comment in setPath\n if (paths[curKey]) {\n root = curKey;\n break;\n }\n }\n\n if (root in paths) {\n path = paths[root];\n } else {\n return null;\n }\n\n if (!/\\/$/.test(path)) {\n path += '/';\n }\n if (i < split.length) {\n // Add the rest of the path. For example, if we found\n // paths['Ink.Dom'] to be 'http://example.com/Ink/Dom/',\n // we now add '/Element/' to get the full path.\n path += split.slice(i + 1).join('/') + '/';\n }\n if (!noLib) {\n path += 'lib.js';\n }\n return path;\n },\n\n /**\n * Sets the URL path for a namespace.\n * Use this to customize where requireModules and createModule will load dependencies from.\n * This can be useful to set your own CDN for dynamic module loading or simply to change your module folder structure\n *\n * @method setPath\n *\n * @param {String} key Module or namespace\n * @param {String} rootURI Base URL path and schema to be appended to the module or namespace\n * @return {void}\n *\n * @example\n * Ink.setPath('Ink', 'http://my-cdn/Ink/');\n * Ink.setPath('Lol', 'http://my-cdn/Lol/');\n *\n * // Loads from http://my-cdn/Ink/Dom/Whatever/lib.js\n * Ink.requireModules(['Ink.Dom.Whatever'], function () { ... });\n * // Loads from http://my-cdn/Lol/Whatever/lib.js\n * Ink.requireModules(['Lol.Whatever'], function () { ... });\n */\n setPath: function(key, rootURI) {\n // Replacing version separator with dot because the difference\n // between a submodule and a version doesn't matter here.\n // It would also overcomplicate the implementation of getPath\n paths[key.replace(/_/, '.')] = rootURI;\n },\n\n /**\n * Loads a script URL.\n * This creates a `script` tag in the `head` of the document.\n * Reports errors by listening to 'error' and 'readystatechange' events.\n *\n * @method loadScript\n * @param {String} uri Can be an external URL or a module name\n * @param {String} [contentType]='text/javascript' The `type` attribute of the new script tag.\n * @return {Element} The newly created script element.\n */\n loadScript: function(uri, contentType) {\n /*jshint evil:true */\n\n if (uri.indexOf('/') === -1) {\n var givenUri = uri; // For the error message\n uri = this.getPath(uri);\n if (uri === null) {\n throw new Error('Could not load script \"' + givenUri + '\". ' +\n 'Path not found in the registry. Did you misspell ' +\n 'the name, or forgot to call setPath()?');\n }\n }\n\n var scriptEl = document.createElement('script');\n scriptEl.setAttribute('type', contentType || 'text/javascript');\n scriptEl.setAttribute('src', uri);\n\n if ('onerror' in scriptEl) {\n scriptEl.onerror = function () {\n Ink.error(['Failed to load script from ', uri, '.'].join(''));\n };\n }\n\n var head = document.head ||\n document.getElementsByTagName('head')[0];\n\n if (head) {\n return head.appendChild(scriptEl);\n }\n },\n\n _loadLater: function (dep) {\n setTimeout(function () {\n if (modules[dep] || modulesRequested[dep] ||\n modulesWaitingForDeps[dep]) {\n return;\n }\n modulesRequested[dep] = true;\n Ink.loadScript(dep);\n }, 0);\n },\n\n /**\n * Defines a module namespace.\n *\n * @method namespace\n * @param {String} ns Namespace to define.\n * @param {Boolean} [returnParentAndKey] Flag to change the return value to an array containing the namespace parent and the namespace key\n * @return {Object|Array} Returns the created namespace object\n */\n namespace: function(ns, returnParentAndKey) {\n if (!ns || !ns.length) { return null; }\n\n var levels = ns.split('.');\n var nsobj = window;\n var parent;\n\n for (var i = 0, f = levels.length; i < f; ++i) {\n nsobj[ levels[i] ] = nsobj[ levels[i] ] || {};\n parent = nsobj;\n nsobj = nsobj[ levels[i] ];\n }\n\n if (returnParentAndKey) {\n return [\n parent,\n levels[i-1]\n ];\n }\n\n return nsobj;\n },\n\n /**\n * Loads a module.\n * A synchronous method to get the module from the internal registry.\n * It assumes the module is defined and loaded already!\n *\n * @method getModule\n * @param {String} mod Module name\n * @param {Number} [version] Version number of the module\n * @return {Object|Function} Module object or function, depending how the module is defined\n */\n getModule: function(mod, version) {\n var key = version ? [mod, '_', version].join('') : mod;\n return modules[key];\n },\n\n /**\n * Creates a new module.\n * Use this to wrap your code and benefit from the module loading used throughout the Ink library\n *\n * @method createModule\n * @param {String} mod Module name, separated by dots. Like Ink.Dom.Selector, Ink.UI.Modal\n * @param {Number} version Version number\n * @param {Array} deps Array of module names which are dependencies of the module being created. The order in which they are passed here will define the order they will be passed to the callback function.\n * @param {Function} modFn The callback function to be executed when all the dependencies are resolved. The dependencies are passed as arguments, in the same order they were declared. The function itself should return the module.\n * @return {void}\n * @sample Ink_1_createModule.html\n *\n */\n createModule: function(mod, version, deps, modFn) { // define\n if (typeof mod !== 'string') {\n throw new Error('module name must be a string!');\n }\n\n // validate version correctness\n if (!(typeof version === 'number' || (typeof version === 'string' && version.length > 0))) {\n throw new Error('version number missing!');\n }\n\n var modAll = [mod, '_', version].join('');\n\n modulesWaitingForDeps[modAll] = true;\n\n var cb = function() {\n //console.log(['createModule(', mod, ', ', version, ', [', deps.join(', '), '], ', !!modFn, ')'].join(''));\n\n // make sure module in not loaded twice\n if (modules[modAll]) {\n //console.warn(['Ink.createModule ', modAll, ': module has been defined already.'].join(''));\n return;\n }\n\n\n // delete related pending tasks\n delete modulesRequested[modAll];\n delete modulesRequested[mod];\n\n\n // run module's supplied factory\n var args = Array.prototype.slice.call(arguments);\n var moduleContent = modFn.apply(window, args);\n modulesLoadOrder.push(modAll);\n // console.log('** loaded module ' + modAll + '**');\n\n\n // set version\n if (typeof moduleContent === 'object') { // Dom.Css Dom.Event\n moduleContent._version = version;\n }\n else if (typeof moduleContent === 'function') {\n moduleContent.prototype._version = version; // if constructor\n moduleContent._version = version; // if regular function\n }\n\n\n // add to global namespace...\n var isInkModule = mod.indexOf('Ink.') === 0;\n var t;\n if (isInkModule) {\n t = Ink.namespace(mod, true); // for mod 'Ink.Dom.Css', t[0] gets 'Ink.Dom' object and t[1] 'Css'\n }\n\n\n // versioned\n modules[ modAll ] = moduleContent; // in modules\n delete modulesWaitingForDeps[ modAll ];\n\n if (isInkModule) {\n t[0][ t[1] + '_' + version ] = moduleContent; // in namespace\n }\n\n\n // unversioned\n modules[ mod ] = moduleContent; // in modules\n\n if (isInkModule) {\n if (isEmptyObject( t[0][ t[1] ] )) {\n t[0][ t[1] ] = moduleContent; // in namespace\n }\n // else {\n // console.warn(['Ink.createModule ', modAll, ': module has been defined already with a different version!'].join(''));\n // }\n }\n\n\n if (this) { // there may be pending requires expecting this module, check...\n Ink._checkPendingRequireModules();\n }\n };\n\n this.requireModules(deps, cb);\n },\n\n /**\n * Requires modules asynchronously\n * Use this to get modules, even if they're not loaded yet\n *\n * @method requireModules\n * @param {Array} deps Array of module names. The order in which they are passed here will define the order they will be passed to the callback function.\n * @param {Function} cbFn The callback function to be executed when all the dependencies are resolved. The dependencies are passed as arguments, in the same order they were declared.\n * @return {void}\n * @sample Ink_1_requireModules.html\n */\n requireModules: function(deps, cbFn) { // require\n //console.log(['requireModules([', deps.join(', '), '], ', !!cbFn, ')'].join(''));\n var i, f, o, dep, mod;\n f = deps && deps.length;\n o = {\n args: new Array(f),\n left: {},\n remaining: f,\n cb: cbFn\n };\n\n if (!(typeof deps === 'object' && deps.length !== undefined)) {\n throw new Error('Dependency list should be an array!');\n }\n if (typeof cbFn !== 'function') {\n throw new Error('Callback should be a function!');\n }\n\n for (i = 0; i < f; ++i) {\n if (Ink._moduleRenames[deps[i]]) {\n Ink.warn(deps[i] + ' was renamed to ' + Ink._moduleRenames[deps[i]]);\n dep = Ink._moduleRenames[deps[i]];\n } else {\n dep = deps[i];\n }\n\n // Because trailing commas in oldIE bring us undefined values here\n if (!dep) {\n --o.remaining;\n continue;\n }\n\n mod = modules[dep];\n if (mod) {\n o.args[i] = mod;\n --o.remaining;\n continue;\n }\n else if (!modulesRequested[dep]) {\n Ink._loadLater(dep);\n }\n o.left[dep] = i;\n }\n\n if (o.remaining > 0) {\n pendingRMs.push(o);\n }\n else {\n cbFn.apply(true, o.args);\n }\n },\n\n _moduleRenames: {\n 'Ink.UI.Aux_1': 'Ink.UI.Common_1'\n },\n\n /**\n * Lists loaded module names.\n * The list is ordered by loaded time (oldest module comes first)\n *\n * @method getModulesLoadOrder\n * @return {Array} returns the order in which modules were resolved and correctly loaded\n */\n getModulesLoadOrder: function() {\n return modulesLoadOrder.slice();\n },\n\n /**\n * Builds the markup needed to load the modules.\n * This method builds the script tags needed to load the currently used modules\n *\n * @method getModuleScripts\n * @uses getModulesLoadOrder\n * @return {String} The script markup\n */\n getModuleScripts: function() {\n var mlo = this.getModulesLoadOrder();\n mlo.unshift('Ink_1');\n mlo = mlo.map(function(m) {\n return [''].join('');\n });\n\n return mlo.join('\\n');\n },\n\n /**\n * Creates an Ink.Ext module\n *\n * Does exactly the same as createModule but creates the module in the Ink.Ext namespace\n *\n * @method createExt\n * @uses createModule\n * @param {String} moduleName Extension name\n * @param {String} version Extension version\n * @param {Array} dependencies Extension dependencies\n * @param {Function} modFn Function returning the extension\n * @return {void}\n * @sample Ink_1_createExt.html\n */\n createExt: function (moduleName, version, dependencies, modFn) {\n return Ink.createModule('Ink.Ext.' + moduleName, version, dependencies, modFn);\n },\n\n /**\n * Function.prototype.bind alternative/fallback.\n * Creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called.\n *\n * @method bind\n * @param {Function} fn The function\n * @param {Object} context The value to be passed as the this parameter to the target function when the bound function is called. If used as false, it preserves the original context and just binds the arguments.\n * @param {Mixed} [more...] Additional arguments will be sent to the original function as prefix arguments.\n * @return {Function} A copy of `fn` bound to the given `context`. Calling this function causes a call to `fn` with the new `context` and any `more` arguments.\n * @sample Ink_1_bind.html\n */\n bind: function(fn, context) {\n var args = Array.prototype.slice.call(arguments, 2);\n return function() {\n var innerArgs = Array.prototype.slice.call(arguments);\n var finalArgs = args.concat(innerArgs);\n return fn.apply(context === false ? this : context, finalArgs);\n };\n },\n\n /**\n * Function.prototype.bind alternative for class methods\n * See Ink.bind. The difference between `bindMethod` and `bind` is that `bindMethod` fetches a method from an object. It can be useful, for instance, to bind a function which is a property of an object returned by another function.\n *\n * @method bindMethod\n * @uses bind\n * @param {Object} object The object that contains the method to bind\n * @param {String} methodName The name of the method that will be bound\n * @param {Mixed} [more...] Additional arguments will be sent to the new method as prefix arguments.\n * @return {Function} See Ink.bind.\n * @sample Ink_1_bindMethod.html\n */\n bindMethod: function (object, methodName) {\n return Ink.bind.apply(Ink,\n [object[methodName], object].concat([].slice.call(arguments, 2)));\n },\n\n /**\n * Function.prototype.bind alternative for event handlers.\n * Same as bind but keeps first argument of the call the original event.\n * Set `context` to `false` to preserve the original context of the function and just bind the arguments.\n *\n * @method bindEvent\n * @param {Function} fn The function\n * @param {Object} context The value to be passed as the this parameter to the target\n * @param {Mixed} [more...] Additional arguments will be sent to the original function as prefix arguments\n * @return {Function} A function which will always call `fn` with the given event (or window.event, in IE) as the first argument.\n * @sample Ink_1_bindEvent.html\n */\n bindEvent: function(fn, context) {\n var args = Array.prototype.slice.call(arguments, 2);\n return function(event) {\n var finalArgs = args.slice();\n finalArgs.unshift(event || window.event);\n return fn.apply(context === false ? this : context, finalArgs);\n };\n },\n\n /**\n * Shorter alias to document.getElementById.\n * Just calls `document.getElementById(id)`, unless `id` happens to be an element.\n * If `id` is an element, `Ink.i` just returns it.\n *\n * You can use this in situations where you want to accept an element id, but a raw element is also okay.\n *\n * @method i\n * @param {String} id Element ID\n * @return {DOMElement|null} The element returned by `document.getElementById(id)` if `id` was a string, and `id` otherwise.\n * @sample Ink_1_i.html\n */\n i: function(id) {\n if(typeof(id) === 'string') {\n return document.getElementById(id) || null;\n }\n return id;\n },\n\n /**\n * Alias for Ink.Dom.Selector\n *\n * Using sizzle-specific selectors is NOT encouraged!\n *\n * @method ss\n * @uses Ink.Dom.Selector.select\n * @param {String} selector CSS3 selector string\n * @param {DOMElement} [from=document] Context element. If set to a DOM element, the `selector` will only look for descendants of this DOM Element.\n * @return {Array} array of DOMElements\n * @sample Ink_1_ss.html\n */\n ss: function(selector, from)\n {\n if(typeof(Ink.Dom) === 'undefined' || typeof(Ink.Dom.Selector) === 'undefined') {\n throw new Error('This method requires Ink.Dom.Selector');\n }\n return Ink.Dom.Selector.select(selector, (from || document));\n },\n\n /**\n * Selects elements like `Ink.ss`, but only returns the first element found.\n *\n * Using sizzle-specific selectors is NOT encouraged!\n *\n * @method s\n * @uses Ink.Dom.Selector.select\n * @param {String} selector CSS3 selector string\n * @param {DOMElement} [from=document] Context element. If set to a DOM element, the `selector` will only look for descendants of this DOM Element.\n * @return {DOMElement} The first element found which matches the `selector`, or `null` if nothing is found.\n * @sample Ink_1_s.html\n */\n s: function(selector, from)\n {\n if(typeof(Ink.Dom) === 'undefined' || typeof(Ink.Dom.Selector) === 'undefined') {\n throw new Error('This method requires Ink.Dom.Selector');\n }\n return Ink.Dom.Selector.select(selector, (from || document))[0] || null;\n },\n\n /**\n * Extends an object with another\n * Copy all of the properties in one or more source objects over to the destination object, and return the destination object. It's in-order, so the last source will override properties of the same name in previous arguments.\n *\n * @method extendObj\n * @param {Object} destination The object that will receive the new/updated properties\n * @param {Object} source The object whose properties will be copied over to the destination object\n * @param {Object} [more...] Additional source objects. The last source will override properties of the same name in the previous defined sources\n * @return {Object} destination object, enriched with defaults from the sources\n * @sample Ink_1_extendObj.html\n */\n extendObj: function(destination/*, source... */) {\n var sources = [].slice.call(arguments, 1);\n\n for (var i = 0, len = sources.length; i < len; i++) {\n if (!sources[i]) { continue; }\n for (var property in sources[i]) {\n if(Object.prototype.hasOwnProperty.call(sources[i], property)) {\n destination[property] = sources[i][property];\n }\n }\n }\n\n return destination;\n },\n\n /**\n * Calls native console.log if available.\n *\n * @method log\n * @param {Mixed} [more...] Arguments to be evaluated\n * @return {void}\n * @sample Ink_1_log.html\n **/\n log: function () {\n // IE does not have console.log.apply in IE10 emulated mode\n var console = window.console;\n if (console && console.log) {\n apply.call(console.log, console, arguments);\n }\n },\n\n /**\n * Calls native console.warn if available.\n *\n * @method warn\n * @param {Mixed} [more...] Arguments to be evaluated\n * @return {void}\n * @sample Ink_1_warn.html\n **/\n warn: function () {\n // IE does not have console.log.apply in IE10 emulated mode\n var console = window.console;\n if (console && console.warn) {\n apply.call(console.warn, console, arguments);\n }\n },\n\n /**\n * Calls native console.error if available.\n *\n * @method error\n * @param {Mixed} [more...] Arguments to be evaluated\n * @return {void}\n * @sample Ink_1_error.html\n **/\n error: function () {\n // IE does not have console.log.apply in IE10 emulated mode\n var console = window.console;\n if (console && console.error) {\n apply.call(console.error, console, arguments);\n }\n }\n };\n\n\n // TODO for debug - to detect pending stuff\n /*\n var failCount = {}; // fail count per module name\n var maxFails = 3; // times\n var checkDelta = 0.5; //seconds\n\n var tmpTmr = setInterval(function() {\n var mk = Object.keys(modulesRequested);\n var l = mk.length;\n\n if (l > 0) {\n // console.log('** waiting for modules: ' + mk.join(', ') + ' **');\n\n for (var i = 0, f = mk.length, k, v; i < f; ++i) {\n k = mk[i];\n v = failCount[k];\n failCount[k] = (v === undefined) ? 1 : ++v;\n\n if (v >= maxFails) {\n console.error('** Loading of module ' + k + ' failed! **');\n delete modulesRequested[k];\n }\n }\n }\n else {\n // console.log('** Module loads complete. **');\n clearInterval(tmpTmr);\n }\n }, checkDelta*1000);\n */\n}(window, document));\n","/**\n * Cross Browser Ajax requests\n * @module Ink.Net.Ajax_1\n * @version 1\n */\n\nInk.createModule('Ink.Net.Ajax', '1', [], function() {\n 'use strict';\n\n /**\n * Creates a new XMLHttpRequest object\n *\n * @class Ink.Net.Ajax\n * @constructor\n *\n * @param {String} url Request URL\n * @param {Object} [options] Request options, containing:\n * @param {Boolean} [options.asynchronous=true] If false, the request synchronous.\n * @param {String} [options.contentType] Content-type header to be sent. Defaults to 'application/x-www-form-urlencoded'\n * @param {Boolean} [options.cors] Flag to activate CORS. Set this to true if you're doing a cross-origin request\n * @param {Boolean} [options.validateCors] If this is set to `true`, perform a CORS request automatically based on the URL being cross-domain or not.\n * @param {Number} [options.delay] Artificial delay. If the request is completed faster than this delay, wait the remaining time before executing the callbacks\n * @param {Boolean|String} [options.evalJS=true] If the request Content-type header is application/json, evaluates the response and populates responseJSON. Use 'force' if you want to force the response evaluation, no matter what Content-type it's using.\n * @param {String} [options.method='POST'] HTTP request method. POST by default.\n * @param {Object|String} [options.parameters] Request parameters to be sent with the request\n * @param {String} [options.postBody] POST request body. If not specified, it's filled with the contents from parameters\n * @param {Object} [options.requestHeaders] Key-value pairs for additional request headers\n * @param {Boolean} [options.sanitizeJSON] Flag to sanitize the content of responseText before evaluation\n * @xparam {Boolean} [options.signRequest=false] Send a \"X-Requested-With: XMLHttpRequest\" header in the request.\n * @param {Number} [options.timeout] Request timeout in seconds\n * @param {String} [options.xhrProxy] URI for proxy service hosted on the same server as the web app, that can fetch documents from other domains. The service must pipe all input and output untouched (some input sanitization is allowed, like clearing cookies). e.g., requesting http://example.org/doc can become /proxy/http%3A%2F%2Fexample.org%2Fdoc The proxy service will be used for cross-domain requests, if set, else a network error is returned as exception.\n * @param {Function} [options.onComplete] Callback executed after the request is completed, regardless of what happened during the request.\n * @param {Function} [options.onCreate] Callback executed after object initialization but before the request is made\n * @param {Function} [options.onException] Callback executed if an exception occurs. Receives the exception as a parameter.\n * @param {Function} [options.onFailure] Callback executed if the request fails (requests with status codes different from 2xx)\n * @param {Function} [options.onHeaders] Callback executed when headers of the response arrive.\n * @param {Function} [options.onInit] Callback executed before any initialization\n * @param {Function} [options.onSuccess] Callback executed if the request is successful (requests with 2xx status codes)\n * @param {Function} [options.onTimeout] Callback executed if the request times out\n *\n * @sample Ink_Net_Ajax_1.html \n */\n var Ajax = function(url, options){\n this.init(url, options);\n };\n\n /**\n * Options for all requests. These can then be overriden for individual ones.\n */\n Ajax.globalOptions = {\n parameters: {},\n requestHeaders: {}\n };\n\n\n // IE10 does not need XDomainRequest\n var xMLHttpRequestWithCredentials = 'XMLHttpRequest' in window && 'withCredentials' in (new XMLHttpRequest());\n\n\n\n Ajax.prototype = {\n\n init: function(url, userOptions) {\n if (!url) {\n throw new Error(\"new Ink.Net.Ajax: Pass a url as the first argument!\");\n }\n var options = Ink.extendObj({\n asynchronous: true,\n contentType: 'application/x-www-form-urlencoded',\n cors: false,\n validateCors: false,\n debug: false,\n delay: 0,\n evalJS: true,\n method: 'POST',\n parameters: null,\n postBody: '',\n requestHeaders: null,\n sanitizeJSON: false,\n signRequest: false,\n timeout: 0,\n useCredentials: false,\n xhrProxy: '',\n onComplete: null,\n onCreate: null,\n onException: null,\n onFailure: null,\n onHeaders: null,\n onInit: null,\n onSuccess: null,\n onTimeout: null\n }, Ajax.globalOptions);\n\n if (userOptions && typeof userOptions === 'object') {\n options = Ink.extendObj(options, userOptions);\n\n\n if (typeof userOptions.parameters === 'object') {\n options.parameters = Ink.extendObj(Ink.extendObj({}, Ajax.globalOptions.parameters), userOptions.parameters);\n } else if (userOptions.parameters !== null) {\n var globalParameters = this.paramsObjToStr(Ajax.globalOptions.parameters);\n if (globalParameters) {\n options.parameters = userOptions.parameters + '&' + globalParameters;\n }\n }\n\n options.requestHeaders = Ink.extendObj({}, Ajax.globalOptions.requestHeaders);\n options.requestHeaders = Ink.extendObj(options.requestHeaders, userOptions.requestHeaders);\n }\n\n this.options = options;\n\n this.safeCall('onInit');\n\n this.url = url;\n\n var urlLocation = this._locationFromURL(url);\n this.isHTTP = this._locationIsHTTP(urlLocation);\n this.isCrossDomain = this._locationIsCrossDomain(urlLocation, location);\n\n this.requestHasBody = options.method.search(/^get|head$/i) < 0;\n\n if (this.options.validateCors === true) {\n this.options.cors = this.isCrossDomain;\n }\n\n if(this.options.cors) {\n this.isCrossDomain = false;\n }\n\n this.transport = this.getTransport();\n\n this.request();\n },\n\n /**\n * Returns a location object from an URL\n *\n * @method _locationFromUrl\n * @param {String} url Input url\n * @return {Location} An `` element with `href` set to the given URL.\n * @private\n **/\n _locationFromURL: function (url) {\n var urlLocation = document.createElementNS ?\n document.createElementNS('http://www.w3.org/1999/xhtml', 'a') :\n document.createElement('a');\n urlLocation.setAttribute('href', url);\n return urlLocation;\n },\n\n /**\n * Checks whether a location is HTTP or HTTPS\n *\n * @method locationIsHttp\n * @param {Location} urlLocation Location object or `` element representing the current location.\n * @return {Boolean} `true` if the location is HTTP or HTTPS, `false` otherwise.\n * @private\n */\n _locationIsHTTP: function (urlLocation) {\n return urlLocation.href.match(/^https?:/i) ? true : false;\n },\n\n /**\n * Checks whether a location is cross-domain from ours.\n *\n * @method _locationIsCrossDomain\n * @param {Location} urlLocation A Location object or an `` elemnt.\n * @param {Location} [location=window.location] A location representing this one. This argument only exists for testing. Don't use it.\n * @return {Boolean} `true` if the locations are in different domains (in which case we need to perform a cross-domain request)\n * @private\n */\n _locationIsCrossDomain: function (urlLocation, location) {\n // TODO because of oldIE compatibility, we can only use .href (the full URL), and none of the other useful properties one can find in Location elements. So we should just pass pure strings around. Not only here.\n location = location || window.location;\n if (!Ajax.prototype._locationIsHTTP(urlLocation) || location.protocol === 'widget:' || typeof window.widget === 'object') {\n return false;\n } else {\n var split1 = urlLocation.href.split('//');\n var split2 = location.href.split('//');\n\n if (split1.length === 1 || split2.length === 1) {\n // This occurs when there's no protocol string in either URL\n // Only happens in IE7 because setting the \"href\" of a link doesn't make that link show you the full URL when the URI is relative to this host.\n // So we have our answer.\n // If there's no protocol string\n // We know for sure that our `urlLocation` is relative\n // In which case, they are in the same domain.\n return false;\n }\n\n var protocol1 = split1[0];\n var protocol2 = split2[0];\n\n var colonOrSlash = /:|\\//; // Finds colons or slashes, which are the end of hostnames (without ports)\n\n var host1 = split1[1].split(colonOrSlash)[0];\n var host2 = split2[1].split(colonOrSlash)[0];\n\n return protocol1 !== protocol2 ||\n host1 !== host2;\n }\n },\n\n /**\n * Creates the appropriate XMLHttpRequest object, depending on our browser and whether we're trying to perform a cross-domain request.\n *\n * @method getTransport\n * @return {Object} XMLHttpRequest object\n * @private\n */\n getTransport: function()\n {\n /*global XDomainRequest:false, ActiveXObject:false */\n if (!xMLHttpRequestWithCredentials && this.options.cors && 'XDomainRequest' in window) {\n this.usingXDomainReq = true;\n return new XDomainRequest();\n }\n else if (typeof XMLHttpRequest !== 'undefined') {\n return new XMLHttpRequest();\n }\n else if (typeof ActiveXObject !== 'undefined') {\n try {\n return new ActiveXObject('Msxml2.XMLHTTP');\n } catch (e) {\n return new ActiveXObject('Microsoft.XMLHTTP');\n }\n } else {\n return null;\n }\n },\n\n /**\n * Set the necessary headers for an ajax request.\n *\n * @method setHeaders\n * @return {void}\n */\n setHeaders: function()\n {\n if (this.transport) {\n try {\n var headers = {\n \"Accept\": \"text/javascript,text/xml,application/xml,application/xhtml+xml,text/html,application/json;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1\",\n \"Accept-Language\": navigator.language,\n \"X-Requested-With\": \"XMLHttpRequest\",\n \"X-Ink-Version\": \"3\"\n };\n if (this.options.cors) {\n if (!this.options.signRequest) {\n delete headers['X-Requested-With'];\n }\n delete headers['X-Ink-Version'];\n }\n\n if (this.options.requestHeaders && typeof this.options.requestHeaders === 'object') {\n for(var headerReqName in this.options.requestHeaders) {\n if (this.options.requestHeaders.hasOwnProperty(headerReqName)) {\n headers[headerReqName] = this.options.requestHeaders[headerReqName];\n }\n }\n }\n\n if (this.transport.overrideMimeType && (navigator.userAgent.match(/Gecko\\/(\\d{4})/) || [0,2005])[1] < 2005) {\n headers.Connection = 'close';\n }\n\n for (var headerName in headers) {\n if(headers.hasOwnProperty(headerName)) {\n this.transport.setRequestHeader(headerName, headers[headerName]);\n }\n }\n } catch(e) {}\n }\n },\n\n /**\n * Converts an object with parameters to a querystring\n *\n * @method paramsObjToStr\n * @param {Object} optParams Parameters object, example: `{ a: 2, b: 3 }`\n * @return {String} A query string. Example: `'a=2&b=3'`\n * @private\n */\n paramsObjToStr: function(optParams) {\n var k, m, p, a, params = [];\n if (typeof optParams === 'object') {\n for (p in optParams){\n if (optParams.hasOwnProperty(p)) {\n a = optParams[p];\n if (Object.prototype.toString.call(a) === '[object Array]' && !isNaN(a.length)) {\n for (k = 0, m = a.length; k < m; k++) {\n params = params.concat([\n encodeURIComponent(p), '[]', '=',\n encodeURIComponent(a[k]), '&'\n ]);\n }\n }\n else {\n params = params.concat([\n encodeURIComponent(p), '=',\n encodeURIComponent(a), '&'\n ]);\n }\n }\n }\n if (params.length > 0) {\n params.pop();\n }\n }\n else\n {\n return optParams;\n }\n return params.join('');\n },\n\n /**\n * Set the url parameters for a GET request\n *\n * @method setParams\n * @return {void}\n * @private\n */\n setParams: function()\n {\n var params = null, optParams = this.options.parameters;\n\n if(typeof optParams === \"object\"){\n params = this.paramsObjToStr(optParams);\n } else {\n params = '' + optParams;\n }\n\n if(params){\n if(this.url.indexOf('?') > -1) {\n this.url = this.url.split('#')[0] + '&' + params;\n } else {\n this.url = this.url.split('#')[0] + '?' + params;\n }\n }\n },\n\n /**\n * Gets an HTTP header from the response\n *\n * @method getHeader\n * @param {String} name Header name\n * @return {String} Header content\n * @public\n */\n getHeader: function(name)\n {\n if (this.usingXDomainReq && name === 'Content-Type') {\n return this.transport.contentType;\n }\n try{\n return this.transport.getResponseHeader(name);\n } catch(e) {\n return null;\n }\n },\n\n /**\n * Gets all the HTTP headers from the response\n *\n * @method getAllHeaders\n * @return {String} The headers, each separated by a newline\n * @public\n */\n getAllHeaders: function()\n {\n try {\n return this.transport.getAllResponseHeaders();\n } catch(e) {\n return null;\n }\n },\n\n /**\n * Gets the ajax response object\n *\n * @method getResponse\n * @return {Object} The response object\n * @public\n */\n getResponse: function(){\n // setup our own stuff\n var t = this.transport,\n r = {\n headerJSON: null,\n responseJSON: null,\n getHeader: this.getHeader,\n getAllHeaders: this.getAllHeaders,\n request: this,\n transport: t,\n timeTaken: new Date() - this.startTime,\n requestedUrl: this.url\n };\n\n // setup things expected from the native object\n r.readyState = t.readyState;\n try { r.responseText = t.responseText; } catch(e) {}\n try { r.responseXML = t.responseXML; } catch(e) {}\n try { r.status = t.status; } catch(e) { r.status = 0; }\n try { r.statusText = t.statusText; } catch(e) { r.statusText = ''; }\n\n return r;\n },\n\n /**\n * Aborts the request if still running. No callbacks are called\n *\n * @method abort\n * @return {void}\n * @public\n */\n abort: function(){\n if (this.transport) {\n clearTimeout(this.delayTimeout);\n clearTimeout(this.stoTimeout);\n try { this.transport.abort(); } catch(ex) {}\n this.finish();\n }\n },\n\n /**\n * Executes the state changing phase of an ajax request\n *\n * @method runStateChange\n * @return {void}\n * @public\n */\n runStateChange: function()\n {\n var rs = this.transport.readyState;\n if (rs === 3) {\n if (this.isHTTP) {\n this.safeCall('onHeaders');\n }\n } else if (rs === 4 || this.usingXDomainReq) {\n\n if (this.options.asynchronous && this.options.delay && (this.startTime + this.options.delay > new Date().getTime())) {\n this.delayTimeout = setTimeout(Ink.bind(this.runStateChange, this), this.options.delay + this.startTime - new Date().getTime());\n return;\n }\n\n var responseJSON,\n responseContent = this.transport.responseText,\n response = this.getResponse(),\n curStatus = this.transport.status;\n\n if (this.isHTTP && !this.options.asynchronous) {\n this.safeCall('onHeaders');\n }\n\n clearTimeout(this.stoTimeout);\n\n if (curStatus === 0) {\n // Status 0 indicates network error for http requests.\n // For http less requests, 0 is always returned.\n if (this.isHTTP) {\n this.safeCall('onException', new Error('Ink.Net.Ajax: network error! (HTTP status 0)'));\n } else {\n curStatus = responseContent ? 200 : 404;\n }\n }\n else if (curStatus === 304) {\n curStatus = 200;\n }\n var isSuccess = this.usingXDomainReq || 200 <= curStatus && curStatus < 300;\n\n var headerContentType = this.getHeader('Content-Type') || '';\n if (this.options.evalJS &&\n (headerContentType.indexOf(\"application/json\") >= 0 || this.options.evalJS === 'force')){\n try {\n responseJSON = this.evalJSON(responseContent, this.sanitizeJSON);\n\n if(responseJSON){\n responseContent = response.responseJSON = responseJSON;\n }\n } catch(e){\n if (isSuccess) {\n // If the request failed, then this is perhaps an error page\n // so don't notify error.\n this.safeCall('onException', e);\n }\n }\n }\n\n if (this.usingXDomainReq && headerContentType.indexOf('xml') !== -1 && 'DOMParser' in window) {\n // http://msdn.microsoft.com/en-us/library/ie/ff975278(v=vs.85).aspx\n var mimeType;\n switch (headerContentType) {\n case 'application/xml':\n case 'application/xhtml+xml':\n case 'image/svg+xml':\n mimeType = headerContentType;\n break;\n default:\n mimeType = 'text/xml';\n }\n var xmlDoc = (new DOMParser()).parseFromString( this.transport.responseText, mimeType);\n this.transport.responseXML = xmlDoc;\n response.responseXML = xmlDoc;\n }\n\n if (this.transport.responseXML != null && response.responseJSON == null && this.transport.responseXML.xml !== \"\"){\n responseContent = this.transport.responseXML;\n }\n\n if (curStatus || this.usingXDomainReq) {\n if (isSuccess) {\n this.safeCall('onSuccess', response, responseContent);\n } else {\n this.safeCall('onFailure', response, responseContent);\n }\n this.safeCall('on'+curStatus, response, responseContent);\n }\n this.finish(response, responseContent);\n }\n },\n\n /**\n * Last step after XHR is complete. Call onComplete and cleanup object\n *\n * @method finish\n * @param {Mixed} response Response object as returned from getResponse().\n * @param {Mixed} responseContent Content of the response.\n * @return {void}\n * @private\n */\n finish: function(response, responseContent){\n if (response) {\n this.safeCall('onComplete', response, responseContent);\n }\n clearTimeout(this.stoTimeout);\n\n if (this.transport) {\n // IE6 sometimes barfs on this one\n try{ this.transport.onreadystatechange = null; } catch(e){}\n\n if (typeof this.transport.destroy === 'function') {\n // Stuff for Samsung.\n this.transport.destroy();\n }\n\n // Let XHR be collected.\n this.transport = null;\n }\n },\n\n /**\n * Safely calls a callback function.\n * Verifies that the callback is well defined and traps errors\n *\n * If you pass in an error as the second argument, it gets thrown if there is no default listener.\n *\n * @method safeCall\n * @param {Function} handlerName Name of the handler we wish to call\n * @param {Error} error This error gets reported to the console using Ink.error if there's no listener to `handlerName`.\n * @param {Mixed} [args...] Arguments to get passed to the `handlerName` handler.\n * @return {void}\n * @private\n */\n safeCall: function(handlerName /*[error or rest...]*/) {\n var error = arguments[1] instanceof Error ? arguments[1] : null;\n if (typeof this.options[handlerName] === 'function') {\n try {\n this.options[handlerName].apply(this, [].slice.call(arguments, 1));\n } catch(ex) {\n Ink.error('Ink.Net.Ajax: an error was raised while executing ' + handlerName + '.', ex);\n }\n } else if (error) {\n Ink.error('Ink.Net.Ajax: ' + error);\n }\n },\n\n /**\n * Sets a new request header for the next http request\n *\n * @method setRequestHeader\n * @param {String} name Header name.\n * @param {String} value New header value.\n * @return {void}\n * @public\n */\n setRequestHeader: function(name, value){\n if (!this.options.requestHeaders) {\n this.options.requestHeaders = {};\n }\n this.options.requestHeaders[name] = value;\n },\n\n /**\n * Executes the request\n *\n * @method request\n * @return {void}\n * @private\n */\n request: function()\n {\n if(this.transport) {\n var params = null;\n if(this.requestHasBody) {\n if(this.options.postBody !== null && this.options.postBody !== '') {\n params = this.options.postBody;\n this.setParams();\n } else if (this.options.parameters !== null && this.options.parameters !== ''){\n params = this.options.parameters;\n }\n\n if (typeof params === \"object\" && !params.nodeType) {\n params = this.paramsObjToStr(params);\n } else if (typeof params !== \"object\" && params !== null){\n params = '' + params;\n }\n\n if(this.options.contentType) {\n this.setRequestHeader('Content-Type', this.options.contentType);\n }\n } else {\n this.setParams();\n }\n\n var url = this.url;\n var method = this.options.method;\n var crossDomain = this.isCrossDomain;\n\n if (crossDomain && this.options.xhrProxy) {\n this.setRequestHeader('X-Url', url);\n url = this.options.xhrProxy + encodeURIComponent(url);\n crossDomain = false;\n }\n\n try {\n this.transport.open(method, url, this.options.asynchronous);\n } catch(e) {\n this.safeCall('onException', e);\n return this.finish(this.getResponse(), null);\n }\n\n this.setHeaders();\n\n this.safeCall('onCreate');\n\n if(this.options.timeout && !isNaN(this.options.timeout)) {\n this.stoTimeout = setTimeout(Ink.bind(function() {\n if(this.options.onTimeout) {\n this.safeCall('onTimeout');\n this.abort();\n }\n }, this), (this.options.timeout * 1000));\n }\n\n if(this.options.useCredentials && !this.usingXDomainReq) {\n this.transport.withCredentials = true;\n }\n\n if(this.options.asynchronous && !this.usingXDomainReq) {\n this.transport.onreadystatechange = Ink.bind(this.runStateChange, this);\n }\n else if (this.usingXDomainReq) {\n this.transport.onload = Ink.bind(this.runStateChange, this);\n }\n\n try {\n if (crossDomain) {\n // Need explicit handling because Mozila aborts\n // the script and Chrome fails silently.per the spec\n Ink.error('Ink.Net.Ajax: You are attempting to request a URL which is cross-domain from this one. To do this, you *must* enable the `cors` option!');\n return;\n } else {\n this.startTime = new Date().getTime();\n this.transport.send(params);\n }\n } catch(e) {\n this.safeCall('onException', e);\n return this.finish(this.getResponse(), null);\n }\n\n if(!this.options.asynchronous) {\n this.runStateChange();\n }\n }\n },\n\n /**\n * Checks if a given string is valid JSON\n *\n * @method isJSON\n * @param {String} str String to be evaluated\n * @return {Boolean} True if the string is valid JSON\n * @public\n */\n isJSON: function(str)\n {\n if (typeof str !== \"string\" || !str){ return false; }\n str = str.replace(/\\\\./g, '@').replace(/\"[^\"\\\\\\n\\r]*\"/g, '');\n return (/^[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]*$/).test(str);\n },\n\n /**\n * Evaluates a given string as JSON\n *\n * @method evalJSON\n * @param {String} strJSON String to be evaluated\n * @param {Boolean} sanitize Flag to sanitize the content\n * @return {Object} JSON content as an object\n * @public\n */\n evalJSON: function(strJSON, sanitize)\n {\n if (strJSON && (!sanitize || this.isJSON(strJSON))) {\n try {\n if (typeof JSON !== \"undefined\" && typeof JSON.parse !== 'undefined'){\n return JSON.parse(strJSON);\n }\n /*jshint evil:true */\n return eval('(' + strJSON + ')');\n } catch(e) {\n throw new Error('Ink.Net.Ajax: Bad JSON string. ' + e);\n }\n }\n return null;\n }\n };\n\n /**\n * Loads content from a given url through an XMLHttpRequest.\n *\n * Shortcut function for simple AJAX use cases. Works with JSON, XML and plain text.\n *\n * @method load\n * @param {String} url Request URL\n * @param {Function} callback Callback to be executed if the request is successful\n * @return {Object} XMLHttpRequest object\n * @public\n *\n * @sample Ink_Net_Ajax_load.html \n */\n Ajax.load = function(url, callback){\n var isCrossDomain = Ajax.prototype._locationIsCrossDomain(window.location, Ajax.prototype._locationFromURL(url));\n return new Ajax(url, {\n method: 'GET',\n cors: isCrossDomain,\n onSuccess: function(response){\n callback(response.responseJSON || response.responseText, response);\n }\n });\n };\n\n /**\n * Loads content from a given url through an XMLHttpRequest.\n * Shortcut function for simple AJAX use cases.\n *\n * @method ping\n * @param {String} url Request url\n * @param {Function} callback Callback to be executed if the request is successful\n * @public\n * @return {Object} XMLHttpRequest object\n */\n Ajax.ping = function(url, callback){\n var isCrossDomain = Ajax.prototype._locationIsCrossDomain(window.location, Ajax.prototype._locationFromURL(url));\n return new Ajax(url, {\n method: 'HEAD',\n cors: isCrossDomain,\n onSuccess: function(response){\n if (typeof callback === 'function'){\n callback(response);\n }\n }\n });\n };\n\n\n return Ajax;\n});\n","/**\n * Cross Browser JsonP requests\n * @module Ink.Net.JsonP_1\n * @version 1\n */\n\nInk.createModule('Ink.Net.JsonP', '1', [], function() {\n\n 'use strict';\n\n /**\n * Executes a JSONP request\n *\n * @class Ink.Net.JsonP\n * @constructor\n *\n * @param {String} uri Request URL\n * @param {Object} options Request options\n * @param {Function} options.onSuccess Success callback. Called with the JSONP response.\n * @param {Function} [options.onFailure] Failure callback. Called when there is a timeout.\n * @param {Object} [options.failureObj] Object to be passed as argument to failure callback\n * @param {Number} [options.timeout] Timeout for the request, in seconds. defaults to 10.\n * @param {Object} [options.params] Object with URL parameters.\n * @param {String} [options.callbackParam] URL parameter which gets the name of the JSONP function to call. defaults to 'jsoncallback'.\n * @param {String} [options.randVar] (Advanced, not recommended unless you know what you're doing) A string to append to the callback name. By default, generate a random number. Use an empty string if you already passed the correct name in the internalCallback option.\n * @param {String} [options.internalCallback] (Advanced) Name of the callback function stored in the Ink.Net.JsonP object (before it's prefixed).\n *\n * @sample Ink_Net_JsonP_1.html \n */\n var JsonP = function(uri, options) {\n this.init(uri, options);\n };\n\n JsonP.prototype = {\n\n init: function(uri, options) {\n this.options = Ink.extendObj( {\n onSuccess: undefined,\n onFailure: undefined,\n failureObj: {},\n timeout: 10,\n params: {},\n callbackParam: 'jsoncallback',\n internalCallback: '_cb',\n randVar: false\n }, options || {});\n\n if(this.options.randVar !== false) {\n this.randVar = this.options.randVar;\n } else {\n this.randVar = parseInt(Math.random() * 100000, 10);\n }\n\n this.options.internalCallback += this.randVar;\n\n this.uri = uri;\n\n // prevent SAPO legacy onComplete - make it onSuccess\n if(typeof(this.options.onComplete) === 'function') {\n this.options.onSuccess = this.options.onComplete;\n }\n\n if (typeof this.uri !== 'string') {\n throw new Error('Ink.Net.JsonP: Please define an URI');\n }\n\n if (typeof this.options.onSuccess !== 'function') {\n throw new Error('Ink.Net.JsonP: please define a callback function on option onSuccess!');\n }\n\n Ink.Net.JsonP[this.options.internalCallback] = Ink.bind(function() {\n this.options.onSuccess(arguments[0]);\n this._cleanUp();\n }, this);\n\n this.timeout = setTimeout(Ink.bind(function () {\n this.abort();\n if(typeof this.options.onFailure === 'function'){\n this.options.onFailure(this.options.failureObj);\n }\n }, this),\n this.options.timeout * 1000);\n\n this._addScriptTag();\n },\n\n /**\n * Abort the request, avoiding onSuccess or onFailure being called.\n * @method abort\n * @return {void}\n **/\n abort: function () {\n Ink.Net.JsonP[this.options.internalCallback] = Ink.bindMethod(this, '_cleanUp');\n },\n\n _addParamsToGet: function(uri, params) {\n var hasQuestionMark = uri.indexOf('?') !== -1;\n var sep, pKey, pValue, parts = [uri];\n\n for (pKey in params) {\n if (params.hasOwnProperty(pKey)) {\n if (!hasQuestionMark) { sep = '?'; hasQuestionMark = true; }\n else { sep = '&'; }\n pValue = params[pKey];\n if (typeof pValue !== 'number' && !pValue) { pValue = ''; }\n parts = parts.concat([sep, pKey, '=', encodeURIComponent(pValue)]);\n }\n }\n\n return parts.join('');\n },\n\n _getScriptContainer: function() {\n return document.body ||\n document.getElementsByTagName('body')[0] ||\n document.getElementsByTagName('head')[0] ||\n document.documentElement;\n },\n\n _addScriptTag: function() {\n // enrich options will callback and random seed\n this.options.params[this.options.callbackParam] = 'Ink.Net.JsonP.' + this.options.internalCallback;\n this.options.params.rnd_seed = this.randVar;\n this.uri = this._addParamsToGet(this.uri, this.options.params);\n // create script tag\n this._scriptEl = document.createElement('script');\n this._scriptEl.type = 'text/javascript';\n this._scriptEl.src = this.uri;\n var scriptCtn = this._getScriptContainer();\n scriptCtn.appendChild(this._scriptEl);\n },\n\n _cleanUp: function () {\n if (this.timeout) {\n window.clearTimeout(this.timeout);\n }\n delete this.options.onSuccess;\n delete this.options.onFailure;\n delete Ink.Net.JsonP[this.options.internalCallback];\n this._removeScriptTag();\n },\n\n _removeScriptTag: function() {\n if (!this._scriptEl) { return; /* already removed */ }\n this._scriptEl.parentNode.removeChild(this._scriptEl);\n delete this._scriptEl;\n }\n };\n\n return JsonP;\n\n});\n","/**\n * Browser Detection and User Agent sniffing\n * @module Ink.Dom.Browser_1\n * @version 1\n */\nInk.createModule('Ink.Dom.Browser', '1', [], function() {\n 'use strict'; \n\n /**\n * @namespace Ink.Dom.Browser\n * @version 1\n * @static\n * @example\n * \n */\n var Browser = {\n /**\n * True if the browser is Internet Explorer\n *\n * @property IE\n * @type {Boolean}\n * @public\n * @static\n */\n IE: false,\n\n /**\n * True if the browser is Gecko based\n *\n * @property GECKO\n * @type {Boolean}\n * @public\n * @static\n */\n GECKO: false,\n\n /**\n * True if the browser is Opera\n *\n * @property OPERA\n * @type {Boolean}\n * @public\n * @static\n */\n OPERA: false,\n\n /**\n * True if the browser is Safari\n *\n * @property SAFARI\n * @type {Boolean}\n * @public\n * @static\n */\n SAFARI: false,\n\n /**\n * True if the browser is Konqueror\n *\n * @property KONQUEROR\n * @type {Boolean}\n * @public\n * @static\n */\n KONQUEROR: false,\n\n /**\n * True if browser is Chrome\n *\n * @property CHROME\n * @type {Boolean}\n * @public\n * @static\n */\n CHROME: false,\n\n /**\n * The specific browser model.\n * False if it is unavailable.\n *\n * @property model\n * @type {Boolean|String}\n * @public\n * @static\n */\n model: false,\n\n /**\n * The browser version.\n * False if it is unavailable.\n *\n * @property version\n * @type {Boolean|String}\n * @public\n * @static\n */\n version: false,\n\n /**\n * The user agent string.\n * False if it is unavailable.\n *\n * @property userAgent\n * @type {Boolean|String}\n * @public\n * @static\n */\n userAgent: false,\n\n /**\n * The CSS prefix (-moz-, -webkit-, -ms-, ...)\n * False if it is unavailable \n *\n * @property cssPrefix \n * @type {Boolean|String}\n * @public \n * @static \n */\n cssPrefix: false, \n\n /**\n * The DOM prefix (Moz, Webkit, ms, ...)\n * False if it is unavailable \n * @property domPrefix \n * @type {Boolean|String}\n * @public \n * @static \n */\n domPrefix: false,\n\n /**\n * Initialization function for the Browser object.\n *\n * Is called automatically when this module is loaded, and calls setDimensions, setBrowser and setReferrer.\n *\n * @method init\n * @return {void}\n * @public\n */\n init: function() {\n this.detectBrowser();\n this.setDimensions();\n this.setReferrer();\n },\n\n /**\n * Retrieves and stores window dimensions in this object. Called automatically when this module is loaded.\n *\n * @method setDimensions\n * @return {void}\n * @public\n */\n setDimensions: function() {\n //this.windowWidth=window.innerWidth !== null? window.innerWidth : document.documentElement && document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body !== null ? document.body.clientWidth : null;\n //this.windowHeight=window.innerHeight != null? window.innerHeight : document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body != null? document.body.clientHeight : null;\n var myWidth = 0, myHeight = 0;\n if ( typeof window.innerWidth=== 'number' ) {\n myWidth = window.innerWidth;\n myHeight = window.innerHeight;\n } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {\n myWidth = document.documentElement.clientWidth;\n myHeight = document.documentElement.clientHeight;\n } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {\n myWidth = document.body.clientWidth;\n myHeight = document.body.clientHeight;\n }\n this.windowWidth = myWidth;\n this.windowHeight = myHeight;\n },\n\n /**\n * Stores the referrer. Called automatically when this module is loaded.\n *\n * @method setReferrer\n * @return {void}\n * @public\n */\n setReferrer: function() {\n if (document.referrer && document.referrer.length) {\n this.referrer = window.escape(document.referrer);\n } else {\n this.referrer = false;\n }\n },\n\n /**\n * Detects the browser and stores the found properties. Called automatically when this module is loaded.\n *\n * @method detectBrowser\n * @return {void}\n * @public\n */\n detectBrowser: function() {\n this._sniffUserAgent(navigator.userAgent);\n },\n\n _sniffUserAgent: function (sAgent) {\n this.userAgent = sAgent;\n\n sAgent = sAgent.toLowerCase();\n\n if (/applewebkit\\//.test(sAgent)) {\n this.cssPrefix = '-webkit-';\n this.domPrefix = 'Webkit';\n if(/(chrome|crios)\\//.test(sAgent)) {\n // Chrome\n this.CHROME = true;\n this.model = 'chrome';\n this.version = sAgent.replace(/(.*)chrome\\/([^\\s]+)(.*)/, \"$2\");\n } else {\n // Safari\n this.SAFARI = true;\n this.model = 'safari';\n var rVersion = /version\\/([^) ]+)/;\n if (rVersion.test(sAgent)) {\n this.version = sAgent.match(rVersion)[1];\n } else {\n this.version = sAgent.replace(/(.*)applewebkit\\/([^\\s]+)(.*)/, \"$2\");\n }\n }\n } else if (/opera/.test(sAgent)) {\n // Opera\n this.OPERA = true;\n this.model = 'opera';\n this.version = sAgent.replace(/(.*)opera.([^\\s$]+)(.*)/, \"$2\");\n this.cssPrefix = '-o-';\n this.domPrefix = 'O';\n } else if (/konqueror/.test(sAgent)) {\n // Konqueroh\n this.KONQUEROR = true;\n this.model = 'konqueror';\n this.version = sAgent.replace(/(.*)konqueror\\/([^;]+);(.*)/, \"$2\");\n this.cssPrefix = '-khtml-';\n this.domPrefix = 'Khtml';\n } else if (/(msie|trident)/i.test(sAgent)) {\n // MSIE\n this.IE = true;\n this.model = 'ie';\n if (/rv:((?:\\d|\\.)+)/.test(sAgent)) { // IE 11\n this.version = sAgent.match(/rv:((?:\\d|\\.)+)/)[1];\n } else {\n this.version = sAgent.replace(/(.*)\\smsie\\s([^;]+);(.*)/, \"$2\");\n }\n this.cssPrefix = '-ms-';\n this.domPrefix = 'ms';\n } else if (/gecko/.test(sAgent)) {\n // GECKO\n // Supports only:\n // Camino, Chimera, Epiphany, Minefield (firefox 3), Firefox, Firebird, Phoenix, Galeon,\n // Iceweasel, K-Meleon, SeaMonkey, Netscape, Songbird, Sylera,\n this.cssPrefix = '-moz-';\n this.domPrefix = 'Moz';\n\n this.GECKO = true;\n\n var re = /(camino|chimera|epiphany|minefield|firefox|firebird|phoenix|galeon|iceweasel|k\\-meleon|seamonkey|netscape|songbird|sylera)/;\n if(re.test(sAgent)) {\n this.model = sAgent.match(re)[1];\n this.version = sAgent.replace(new RegExp(\"(.*)\"+this.model+\"\\/([^;\\\\s$]+)(.*)\"), \"$2\");\n } else {\n // probably is mozilla\n this.model = 'mozilla';\n var reVersion = /(.*)rv:([^)]+)(.*)/;\n if(reVersion.test(sAgent)) {\n this.version = sAgent.replace(reVersion, \"$2\");\n }\n }\n }\n },\n\n /**\n * Debug function which displays browser (and Ink.Dom.Browser) information as an alert message.\n *\n * @method debug\n * @return {void}\n * @public\n * @sample Ink_Dom_Browser_1_debug.html\n */\n debug: function() {\n /*global alert:false */\n var str = \"known browsers: (ie, gecko, opera, safari, konqueror) \\n\";\n str += [this.IE, this.GECKO, this.OPERA, this.SAFARI, this.KONQUEROR] +\"\\n\";\n str += \"cssPrefix -> \"+this.cssPrefix+\"\\n\";\n str += \"domPrefix -> \"+this.domPrefix+\"\\n\";\n str += \"model -> \"+this.model+\"\\n\";\n str += \"version -> \"+this.version+\"\\n\";\n str += \"\\n\";\n str += \"original UA -> \"+this.userAgent;\n\n alert(str);\n }\n };\n\n Browser.init();\n\n return Browser;\n});\n","/**\n * CSS Utilities and toolbox\n * @module Ink.Dom.Css_1\n * @version 1\n */\n\nInk.createModule( 'Ink.Dom.Css', 1, [], function() {\n\n 'use strict';\n\n // getComputedStyle feature detection.\n var getCs = (\"defaultView\" in document) && (\"getComputedStyle\" in document.defaultView) ? document.defaultView.getComputedStyle : window.getComputedStyle;\n\n /**\n * @namespace Ink.Dom.Css\n * @static\n */\n\n var Css = {\n /**\n * Adds of removes a class.\n * Depending on addRemState, this method either adds a class if it's true or removes if if false.\n *\n * @method addRemoveClassName\n * @param {DOMElement|string} elm DOM element or element id\n * @param {string} className class name to add or remove.\n * @param {boolean} addRemState Whether to add or remove. `true` to add, `false` to remove.\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_addRemoveClassName.html \n */\n addRemoveClassName: function(elm, className, addRemState) {\n if (addRemState) {\n return this.addClassName(elm, className);\n }\n this.removeClassName(elm, className);\n },\n\n /**\n * Adds a class to a given element\n *\n * @method addClassName\n * @param {Element|String} elm Element or element id\n * @param {String|Array} className Class or classes to add. Examples: 'my-class', ['my-class', 'other-class'], 'my-class other-class'\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_addClassName.html\n */\n addClassName: function(elm, className) {\n elm = Ink.i(elm);\n if (!elm || !className) { return null; }\n className = ('' + className).split(/[, ]+/);\n var i = 0;\n var len = className.length;\n\n for (; i < len; i++) {\n // remove whitespace and ignore on empty string\n if (className[i].replace(/^\\s+|\\s+$/g, '')) {\n if (typeof elm.classList !== \"undefined\") {\n elm.classList.add(className[i]);\n } else if (!Css.hasClassName(elm, className[i])) {\n elm.className += (elm.className ? ' ' : '') + className[i];\n }\n }\n }\n },\n\n /**\n * Removes a class from a given element\n *\n * @method removeClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String|Array} className Class names to remove. You can either use a space separated string of classnames, comma-separated list or an array\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_removeClassName.html \n */\n removeClassName: function(elm, className) {\n elm = Ink.i(elm);\n if (!elm || !className) { return null; }\n \n className = ('' + className).split(/[, ]+/);\n var i = 0;\n var len = className.length;\n\n if (typeof elm.classList !== \"undefined\"){\n for (; i < len; i++) {\n elm.classList.remove(className[i]);\n }\n } else {\n var elmClassName = elm.className || '';\n var re;\n for (; i < len; i++) {\n re = new RegExp(\"(^|\\\\s+)\" + className[i] + \"(\\\\s+|$)\");\n elmClassName = elmClassName.replace(re, ' ');\n }\n elm.className = (elmClassName\n .replace(/^\\s+/, '')\n .replace(/\\s+$/, ''));\n }\n },\n\n /**\n * Alias to addRemoveClassName. \n * Utility function, saves many if/elses.\n *\n * @method setClassName\n * @uses addRemoveClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String|Array} className Class names to add\\remove. Comma separated, space separated or simply an Array\n * @param {Boolean} [add]=false Flag to switch behavior from removal to addition. true to add, false to remove\n * @return {void}\n * @public\n */\n setClassName: function(elm, className, add) {\n this.addRemoveClassName(elm, className, add || false);\n },\n\n /**\n * Checks if an element has a class.\n * This method verifies if an element has ONE of a list of classes. If the last argument is flagged as true, instead checks if the element has ALL the classes\n * \n * @method hasClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String|Array} className Class name(s) to test\n * @param {Boolean} [all=false] Irrelevant if only one `className` is passed. If `true`, check if the element contains ALL the CSS classes. If `false`, check whether the element contains ANY of the given classes.\n * @return {Boolean} `true` if a given class is applied to a given element, `false` if it isn't.\n * @public\n * @sample Ink_Dom_Css_hasClassName.html \n */\n hasClassName: function(elm, className, all) {\n elm = Ink.i(elm);\n if (!elm || !className) { return false; }\n\n className = ('' + className).split(/[, ]+/);\n var i = 0;\n var len = className.length;\n var has;\n var re;\n\n for ( ; i < len; i++) {\n if (typeof elm.classList !== \"undefined\"){\n has = elm.classList.contains(className[i]);\n } else {\n var elmClassName = elm.className;\n if (elmClassName === className[i]) {\n has = true;\n } else {\n re = new RegExp(\"(^|\\\\s)\" + className[i] + \"(\\\\s|$)\");\n has = re.test(elmClassName);\n }\n }\n if (has && !all) { return true; } // return if looking for any class\n if (!has && all) { return false; } // return if looking for all classes\n }\n\n if (all) {\n // if we got here, all classes were found so far\n return true;\n } else {\n // if we got here with all == false, no class was found\n return false;\n }\n },\n\n /**\n * Blinks a class from an element\n * Add and removes the class from the element with a timeout, so it blinks\n *\n * @method blinkClass\n * @uses addRemoveClassName\n * @param {Element|String} element DOM element or element id\n * @param {String|Array} className Class name(s) to blink\n * @param {Number} timeout timeout in ms between adding and removing, default 100 ms\n * @param {Boolean} negate is true, class is removed then added\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_blinkClass.html \n */\n blinkClass: function(element, className, timeout, negate){\n element = Ink.i(element);\n Css.addRemoveClassName(element, className, !negate);\n setTimeout(function() {\n Css.addRemoveClassName(element, className, negate);\n }, Number(timeout) || 100);\n },\n\n /**\n * Toggles a class name from a given element\n *\n * @method toggleClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} className Class name\n * @param {Boolean} [forceAdd] Flag to force adding the the classe names if they don't exist yet.\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_toggleClassName.html \n */\n toggleClassName: function(elm, className, forceAdd) {\n if (!elm || !className) { return false; }\n\n if (typeof forceAdd !== 'undefined') {\n return Css.addRemoveClassName(elm, className, forceAdd);\n } else if (typeof elm.classList !== \"undefined\" && !/[, ]/.test(className)) {\n elm = Ink.i(elm);\n if (elm !== null){\n elm.classList.toggle(className);\n }\n } else {\n if (Css.hasClassName(elm, className)) {\n Css.removeClassName(elm, className);\n } else {\n Css.addClassName(elm, className);\n }\n }\n },\n\n /**\n * Sets the opacity of given element \n *\n * @method setOpacity\n * @param {DOMElement|String} elm DOM element or element id\n * @param {Number} value allows 0 to 1(default mode decimal) or percentage (warning using 0 or 1 will reset to default mode)\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_setOpacity.html \n */\n setOpacity: function(elm, value) {\n elm = Ink.i(elm);\n if (elm !== null){\n var val = 1;\n\n if (!isNaN(Number(value))){\n if (value <= 0) { val = 0; }\n else if (value <= 1) { val = value; }\n else if (value <= 100) { val = value / 100; }\n else { val = 1; }\n }\n\n if (typeof elm.style.opacity !== 'undefined') {\n elm.style.opacity = val;\n }\n else {\n elm.style.filter = \"alpha(opacity:\"+(val*100|0)+\")\";\n }\n }\n },\n\n /**\n * Converts a css property name to a string in camelcase to be used with CSSStyleDeclaration.\n * @method _camelCase\n * @private\n * @param {String} str String to convert\n * @return {String} Converted string\n */\n _camelCase: function(str) {\n return str ? str.replace(/-(\\w)/g, function (_, $1) {\n return $1.toUpperCase();\n }) : str;\n },\n\n\n /**\n * Gets the value for an element's style attribute\n *\n * @method getStyle\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} style Which css attribute to fetch\n * @return {Mixed} Style value\n * @public\n * @sample Ink_Dom_Css_getStyle.html \n */\n getStyle: function(elm, style) {\n elm = Ink.i(elm);\n if (elm !== null && elm.style) {\n style = style === 'float' ? 'cssFloat': this._camelCase(style);\n\n var value = elm.style[style];\n\n if (getCs && (!value || value === 'auto')) {\n var css = getCs(elm, null);\n value = css ? css[style] : null;\n }\n else if (!value && elm.currentStyle) {\n value = elm.currentStyle[style];\n if (value === 'auto' && (style === 'width' || style === 'height')) {\n value = elm[\"offset\" + style.charAt(0).toUpperCase() + style.slice(1)] + \"px\";\n }\n }\n\n if (style === 'opacity') {\n return value ? parseFloat(value, 10) : 1.0;\n }\n else if (style === 'borderTopWidth' || style === 'borderBottomWidth' ||\n style === 'borderRightWidth' || style === 'borderLeftWidth' ) {\n if (value === 'thin') { return '1px'; }\n else if (value === 'medium') { return '3px'; }\n else if (value === 'thick') { return '5px'; }\n }\n\n return value === 'auto' ? null : value;\n }\n },\n\n\n /**\n * Adds CSS rules to an element's style attribute.\n *\n * @method setStyle\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} style Which css attribute to set\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_setStyle.html \n */\n setStyle: function(elm, style) {\n elm = Ink.i(elm);\n if (elm === null) { return; }\n if (typeof style === 'string') {\n elm.style.cssText += '; '+style;\n\n if (style.indexOf('opacity') !== -1) {\n this.setOpacity(elm, style.match(/opacity:\\s*(\\d?\\.?\\d*)/)[1]);\n }\n }\n else {\n for (var prop in style) {\n if (style.hasOwnProperty(prop)){\n if (prop === 'opacity') {\n this.setOpacity(elm, style[prop]);\n }\n else if (prop === 'float' || prop === 'cssFloat') {\n if (typeof elm.style.styleFloat === 'undefined') {\n elm.style.cssFloat = style[prop];\n }\n else {\n elm.style.styleFloat = style[prop];\n }\n } else {\n elm.style[prop] = style[prop];\n }\n }\n }\n }\n },\n\n\n /**\n * Shows an element.\n * Internally it unsets the display property of an element. You can force a specific display property using forceDisplayProperty\n *\n * @method show\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} [forceDisplayProperty] Css display property to apply on show\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_show.html \n */\n show: function(elm, forceDisplayProperty) {\n elm = Ink.i(elm);\n if (elm !== null) {\n elm.style.display = forceDisplayProperty || '';\n }\n },\n\n /**\n * Hides an element.\n *\n * @method hide\n * @param {DOMElement|String} elm DOM element or element id\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_hide.html \n */\n hide: function(elm) {\n elm = Ink.i(elm);\n if (elm !== null) {\n elm.style.display = 'none';\n }\n },\n\n /**\n * Shows or hides an element.\n * If the show parameter is true, it shows the element. Otherwise, hides it.\n *\n * @method showHide\n * @param {DOMElement|String} elm DOM element or element id\n * @param {boolean} [show]=false Whether to show or hide `elm`.\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_showHide.html \n */\n showHide: function(elm, show) {\n elm = Ink.i(elm);\n if (elm) {\n elm.style.display = show ? '' : 'none';\n }\n },\n\n /**\n * Toggles an element visibility.\n * \n * @method toggle\n * @param {DOMElement|String} elm DOM element or element id\n * @param {Boolean} forceShow Forces showing if element is hidden\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_toggle.html \n */\n toggle: function(elm, forceShow) {\n elm = Ink.i(elm);\n if (elm !== null) {\n if (typeof forceShow !== 'undefined') {\n if (forceShow === true) {\n this.show(elm);\n } else {\n this.hide(elm);\n }\n } else {\n if (this.getStyle(elm,'display').toLowerCase() === 'none') {\n this.show(elm);\n }\n else {\n this.hide(elm);\n }\n }\n }\n },\n\n _getRefTag: function(head){\n if (head.firstElementChild) {\n return head.firstElementChild;\n }\n\n for (var child = head.firstChild; child; child = child.nextSibling){\n if (child.nodeType === 1){\n return child;\n }\n }\n return null;\n },\n\n /**\n * Injects style tags with rules to the page.\n *\n * @method appendStyleTag\n * @param {String} selector The css selector for the rule\n * @param {String} style The content of the style rule\n * @param {Object} options Options for the tag\n * @param {String} [options.type]='text/css' File type\n * @param {Boolean} [options.force]=false If true, the style tag will be appended to end of head\n * @return {void}\n * @public\n * \n * @sample Ink_Dom_Css_appendStyleTag.html \n */\n appendStyleTag: function(selector, style, options){\n options = Ink.extendObj({\n type: 'text/css',\n force: false\n }, options || {});\n\n var styles = document.getElementsByTagName(\"style\"),\n oldStyle = false, setStyle = true, i, l;\n\n for (i=0, l=styles.length; i= 0) {\n setStyle = false;\n }\n }\n\n if (setStyle) {\n var defStyle = document.createElement(\"style\"),\n head = document.getElementsByTagName(\"head\")[0],\n refTag = false, styleStr = '';\n\n defStyle.type = options.type;\n\n styleStr += selector +\" {\";\n styleStr += style;\n styleStr += \"} \";\n\n if (typeof defStyle.styleSheet !== \"undefined\") {\n defStyle.styleSheet.cssText = styleStr;\n } else {\n defStyle.appendChild(document.createTextNode(styleStr));\n }\n\n if (options.force){\n head.appendChild(defStyle);\n } else {\n refTag = this._getRefTag(head);\n if (refTag){\n head.insertBefore(defStyle, refTag);\n }\n }\n }\n },\n\n /**\n * Injects an external link tag.\n * This method add a stylesheet to the head of a page\n *\n * @method appendStylesheet\n * @param {String} path File path\n * @param {Object} options Options for the tag\n * @param {String} [options.media='screen'] Media type\n * @param {String} [options.type='text/css'] File type\n * @param {Boolean} [options.force=false] If true, tag will be appended to end of head\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_appendStylesheet.html \n */\n appendStylesheet: function(path, options){\n options = Ink.extendObj({\n media: 'screen',\n type: 'text/css',\n force: false\n }, options || {});\n\n var refTag,\n style = document.createElement(\"link\"),\n head = document.getElementsByTagName(\"head\")[0];\n\n style.media = options.media;\n style.type = options.type;\n style.href = path;\n style.rel = \"Stylesheet\";\n\n if (options.force){\n head.appendChild(style);\n }\n else {\n refTag = this._getRefTag(head);\n if (refTag){\n head.insertBefore(style, refTag);\n }\n }\n },\n\n /**\n * Injects an external link tag.\n * Loads CSS via LINK element inclusion in HEAD (skips append if already there)\n *\n * Works similarly to appendStylesheet but:\n * supports optional callback which gets invoked once the CSS has been applied\n *\n * @method appendStylesheetCb\n * @param {String} cssURI URI of the CSS to load, if empty ignores and just calls back directly\n * @param {Function(cssURI)} [callback] optional callback which will be called once the CSS is loaded\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_appendStylesheetCb.html \n */\n _loadingCSSFiles: {},\n _loadedCSSFiles: {},\n appendStylesheetCb: function(url, callback) {\n if (!url) {\n return callback(url);\n }\n\n if (this._loadedCSSFiles[url]) {\n return callback(url);\n }\n\n var cbs = this._loadingCSSFiles[url];\n if (cbs) {\n return cbs.push(callback);\n }\n\n this._loadingCSSFiles[url] = [callback];\n\n var linkEl = document.createElement('link');\n linkEl.type = 'text/css';\n linkEl.rel = 'stylesheet';\n linkEl.href = url;\n\n var headEl = document.getElementsByTagName('head')[0];\n headEl.appendChild(linkEl);\n\n var imgEl = document.createElement('img');\n /*\n var _self = this;\n (function(_url) {\n imgEl.onerror = function() {\n //var url = this;\n var url = _url;\n _self._loadedCSSFiles[url] = true;\n var callbacks = _self._loadingCSSFiles[url];\n for (var i = 0, f = callbacks.length; i < f; ++i) {\n callbacks[i](url);\n }\n delete _self._loadingCSSFiles[url];\n };\n })(url);\n */\n imgEl.onerror = Ink.bindEvent(function(event, _url) {\n //var url = this;\n var url = _url;\n this._loadedCSSFiles[url] = true;\n var callbacks = this._loadingCSSFiles[url];\n for (var i = 0, f = callbacks.length; i < f; ++i) {\n callbacks[i](url);\n }\n delete this._loadingCSSFiles[url];\n }, this, url);\n imgEl.src = url;\n },\n\n /**\n * Converts decimal to hexadecimal values\n * Useful to convert colors to their hexadecimal representation.\n *\n * @method decToHex\n * @param {String} dec Either a single decimal value, an rgb(r, g, b) string or an Object with r, g and b properties\n * @return {String} Hexadecimal value\n * @sample Ink_Dom_Css_decToHex.html \n */\n decToHex: function(dec) {\n var normalizeTo2 = function(val) {\n if (val.length === 1) {\n val = '0' + val;\n }\n val = val.toUpperCase();\n return val;\n };\n\n if (typeof dec === 'object') {\n var rDec = normalizeTo2(parseInt(dec.r, 10).toString(16));\n var gDec = normalizeTo2(parseInt(dec.g, 10).toString(16));\n var bDec = normalizeTo2(parseInt(dec.b, 10).toString(16));\n return rDec+gDec+bDec;\n }\n else {\n dec += '';\n var rgb = dec.match(/\\((\\d+),\\s?(\\d+),\\s?(\\d+)\\)/);\n if (rgb !== null) {\n return normalizeTo2(parseInt(rgb[1], 10).toString(16)) +\n normalizeTo2(parseInt(rgb[2], 10).toString(16)) +\n normalizeTo2(parseInt(rgb[3], 10).toString(16));\n }\n else {\n return normalizeTo2(parseInt(dec, 10).toString(16));\n }\n }\n },\n\n /**\n * Converts hexadecimal values to decimal\n * Useful to use with CSS colors\n *\n * @method hexToDec\n * @param {String} hex hexadecimal Value with 6, 3, 2 or 1 characters\n * @return {Number} Object with properties r, g, b if length of number is >= 3 or decimal value instead.\n * @sample Ink_Dom_Css_hexToDec.html \n */\n hexToDec: function(hex){\n if (hex.indexOf('#') === 0) {\n hex = hex.substr(1);\n }\n if (hex.length === 6) { // will return object RGB\n return {\n r: parseInt(hex.substr(0,2), 16),\n g: parseInt(hex.substr(2,2), 16),\n b: parseInt(hex.substr(4,2), 16)\n };\n }\n else if (hex.length === 3) { // will return object RGB\n return {\n r: parseInt(hex.charAt(0) + hex.charAt(0), 16),\n g: parseInt(hex.charAt(1) + hex.charAt(1), 16),\n b: parseInt(hex.charAt(2) + hex.charAt(2), 16)\n };\n }\n else if (hex.length <= 2) { // will return int\n return parseInt(hex, 16);\n }\n },\n\n /**\n * Get a single property from a stylesheet.\n * Use this to obtain the value of a CSS property (searched from loaded CSS documents)\n *\n * @method getPropertyFromStylesheet\n * @param {String} selector a CSS rule. must be an exact match\n * @param {String} property a CSS property\n * @return {String} value of the found property, or null if it wasn't matched\n */\n getPropertyFromStylesheet: function(selector, property) {\n var rule = this.getRuleFromStylesheet(selector);\n if (rule) {\n return rule.style[property];\n }\n return null;\n },\n\n getPropertyFromStylesheet2: function(selector, property) {\n var rules = this.getRulesFromStylesheet(selector);\n /*\n rules.forEach(function(rule) {\n var x = rule.style[property];\n if (x !== null && x !== undefined) {\n return x;\n }\n });\n */\n var x;\n for(var i=0, t=rules.length; i < t; i++) {\n x = rules[i].style[property];\n if (x !== null && x !== undefined) {\n return x;\n }\n }\n return null;\n },\n\n getRuleFromStylesheet: function(selector) {\n var sheet, rules, ri, rf, rule;\n var s = document.styleSheets;\n if (!s) {\n return null;\n }\n\n for (var si = 0, sf = document.styleSheets.length; si < sf; ++si) {\n sheet = document.styleSheets[si];\n rules = sheet.rules ? sheet.rules : sheet.cssRules;\n if (!rules) { return null; }\n\n for (ri = 0, rf = rules.length; ri < rf; ++ri) {\n rule = rules[ri];\n if (!rule.selectorText) { continue; }\n if (rule.selectorText === selector) {\n return rule;\n }\n }\n }\n\n return null;\n },\n\n getRulesFromStylesheet: function(selector) {\n var res = [];\n var sheet, rules, ri, rf, rule;\n var s = document.styleSheets;\n if (!s) { return res; }\n\n for (var si = 0, sf = document.styleSheets.length; si < sf; ++si) {\n sheet = document.styleSheets[si];\n rules = sheet.rules ? sheet.rules : sheet.cssRules;\n if (!rules) {\n return null;\n }\n\n for (ri = 0, rf = rules.length; ri < rf; ++ri) {\n rule = rules[ri];\n if (!rule.selectorText) { continue; }\n if (rule.selectorText === selector) {\n res.push(rule);\n }\n }\n }\n\n return res;\n },\n\n getPropertiesFromRule: function(selector) {\n var rule = this.getRuleFromStylesheet(selector);\n var props = {};\n var prop, i, f;\n\n /*if (typeof rule.style.length === 'snumber') {\n for (i = 0, f = rule.style.length; i < f; ++i) {\n prop = this._camelCase( rule.style[i] );\n props[prop] = rule.style[prop];\n }\n }\n else { // HANDLES IE 8, FIREFOX RULE JOINING... */\n rule = rule.style.cssText;\n var parts = rule.split(';');\n var steps, val, pre, pos;\n for (i = 0, f = parts.length; i < f; ++i) {\n if (parts[i].charAt(0) === ' ') {\n parts[i] = parts[i].substring(1);\n }\n steps = parts[i].split(':');\n prop = this._camelCase( steps[0].toLowerCase() );\n val = steps[1];\n if (val) {\n val = val.substring(1);\n\n if (prop === 'padding' || prop === 'margin' || prop === 'borderWidth') {\n\n if (prop === 'borderWidth') { pre = 'border'; pos = 'Width'; }\n else { pre = prop; pos = ''; }\n\n if (val.indexOf(' ') !== -1) {\n val = val.split(' ');\n props[pre + 'Top' + pos] = val[0];\n props[pre + 'Bottom'+ pos] = val[0];\n props[pre + 'Left' + pos] = val[1];\n props[pre + 'Right' + pos] = val[1];\n }\n else {\n props[pre + 'Top' + pos] = val;\n props[pre + 'Bottom'+ pos] = val;\n props[pre + 'Left' + pos] = val;\n props[pre + 'Right' + pos] = val;\n }\n }\n else if (prop === 'borderRadius') {\n if (val.indexOf(' ') !== -1) {\n val = val.split(' ');\n props.borderTopLeftRadius = val[0];\n props.borderBottomRightRadius = val[0];\n props.borderTopRightRadius = val[1];\n props.borderBottomLeftRadius = val[1];\n }\n else {\n props.borderTopLeftRadius = val;\n props.borderTopRightRadius = val;\n props.borderBottomLeftRadius = val;\n props.borderBottomRightRadius = val;\n }\n }\n else {\n props[prop] = val;\n }\n }\n }\n //}\n //console.log(props);\n\n return props;\n },\n\n /**\n * Change the font size of elements.\n * Changes the font size of the elements which match the given CSS rule\n * For this function to work, the CSS file must be in the same domain than the host page, otherwise JS can't access it.\n *\n * @method changeFontSize\n * @param {String} selector CSS selector rule\n * @param {Number} delta Number of pixels to change on font-size\n * @param {String} [op] Supported operations are '+' and '*'. defaults to '+'\n * @param {Number} [minVal] If result gets smaller than minVal, change does not occurr\n * @param {Number} [maxVal] If result gets bigger than maxVal, change does not occurr\n * @return {void}\n * @public\n */\n changeFontSize: function(selector, delta, op, minVal, maxVal) {\n var that = this;\n Ink.requireModules(['Ink.Dom.Selector_1'], function(Selector) {\n var e;\n if (typeof selector !== 'string') { e = '1st argument must be a CSS selector rule.'; }\n else if (typeof delta !== 'number') { e = '2nd argument must be a number.'; }\n else if (op !== undefined && op !== '+' && op !== '*') { e = '3rd argument must be one of \"+\", \"*\".'; }\n else if (minVal !== undefined && (typeof minVal !== 'number' || minVal <= 0)) { e = '4th argument must be a positive number.'; }\n else if (maxVal !== undefined && (typeof maxVal !== 'number' || maxVal < maxVal)) { e = '5th argument must be a positive number greater than minValue.'; }\n if (e) { throw new TypeError(e); }\n\n var val, el, els = Selector.select(selector);\n if (minVal === undefined) { minVal = 1; }\n op = (op === '*') ? function(a,b){return a*b;} : function(a,b){return a+b;};\n for (var i = 0, f = els.length; i < f; ++i) {\n el = els[i];\n val = parseFloat( that.getStyle(el, 'fontSize'));\n val = op(val, delta);\n if (val < minVal) { continue; }\n if (typeof maxVal === 'number' && val > maxVal) { continue; }\n el.style.fontSize = val + 'px';\n }\n });\n }\n\n };\n\n return Css;\n\n});\n","/**\n * DOM Traversal and manipulation\n * @module Ink.Dom.Element_1\n * @version 1\n */\n\nInk.createModule('Ink.Dom.Element', 1, [], function() {\n\n 'use strict';\n\n var createContextualFragmentSupport = (\n typeof document.createRange === 'function' &&\n typeof window.Range.prototype.createContextualFragment === 'function');\n\n var deleteThisTbodyToken = 'Ink.Dom.Element tbody: ' + Math.random();\n var browserCreatesTbodies = (function () {\n var div = document.createElement('div');\n div.innerHTML = '';\n return div.getElementsByTagName('tbody').length !== 0;\n }());\n\n function rect(elem){\n var dimensions = {};\n try {\n dimensions = elem.getBoundingClientRect();\n } catch(e){\n dimensions = { top: elem.offsetTop, left: elem.offsetLeft };\n }\n return dimensions;\n }\n\n /**\n * @namespace Ink.Dom.Element_1\n */\n\n var InkElement = {\n\n /**\n * Checks if something is a DOM Element.\n *\n * @method isDOMElement\n * @static\n * @param {Mixed} o The object to be checked.\n * @return {Boolean} True if it's a valid DOM Element.\n * @public\n * @example\n * var el = Ink.s('#element');\n * if( InkElement.isDOMElement( el ) === true ){\n * // It is a DOM Element.\n * } else {\n * // It is NOT a DOM Element.\n * }\n */\n isDOMElement: function(o) {\n return o !== null && typeof o === 'object' && 'nodeType' in o && o.nodeType === 1;\n },\n\n /**\n * Shortcut for `document.getElementById`\n *\n * @method get\n * @param {String|DOMElement} elm Either an ID of an element, or an element.\n * @return {DOMElement|null} The DOM element with the given id or null when it was not found\n * @public\n * @sample Ink_Dom_Element_1_get.html\n */\n get: function(elm) {\n if(typeof elm !== 'undefined') {\n if(typeof elm === 'string') {\n return document.getElementById(elm);\n }\n return elm;\n }\n return null;\n },\n\n /**\n * Creates a DOM element.\n *\n * Just a shortcut for `document.createElement(tag)`, but with the second argument you can call additional functions present in Ink.Dom.Element.\n *\n * @method create\n * @param {String} tag Tag name\n * @param {Object} properties Object with properties to be set on the element. You can also call other functions in Ink.Dom.Element like this\n * @return {Element} The newly created element.\n * @public\n * @sample Ink_Dom_Element_1_create.html\n */\n create: function(tag, properties) {\n var el = document.createElement(tag);\n //Ink.extendObj(el, properties);\n if (properties) {\n for(var property in properties) {\n if(properties.hasOwnProperty(property)) {\n if (property in InkElement) {\n InkElement[property](el, properties[property]);\n } else {\n if(property === 'className' || property === 'class') {\n el.className = properties.className || properties['class'];\n } else {\n el.setAttribute(property, properties[property]);\n }\n }\n }\n }\n }\n return el;\n },\n\n /**\n * Removes a DOM Element\n *\n * @method remove\n * @param {Element} elm The element to remove\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_remove.html\n */\n remove: function(elm) {\n elm = Ink.i(elm);\n var parEl;\n if (elm && (parEl = elm.parentNode)) {\n parEl.removeChild(elm);\n }\n },\n\n /**\n * Scrolls the window to an element\n *\n * @method scrollTo\n * @param {DOMElement|String} elm Element where to scroll\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_scrollTo.html\n */\n scrollTo: function(elm) {\n elm = InkElement.get(elm);\n if(elm) {\n if (elm.scrollIntoView) {\n return elm.scrollIntoView();\n }\n\n var elmOffset = {},\n elmTop = 0, elmLeft = 0;\n\n do {\n elmTop += elm.offsetTop || 0;\n elmLeft += elm.offsetLeft || 0;\n\n elm = elm.offsetParent;\n } while(elm);\n\n elmOffset = {x: elmLeft, y: elmTop};\n\n window.scrollTo(elmOffset.x, elmOffset.y);\n }\n },\n\n /**\n * Gets the top offset of an element\n *\n * @method offsetTop\n * @uses Ink.Dom.Browser\n *\n * @param {DOMElement|String} elm Target element\n * @return {Number} Offset from the target element to the top of the document.\n * @public\n * @sample Ink_Dom_Element_1_offsetTop.html\n */\n offsetTop: function(elm) {\n return InkElement.offset(elm)[1];\n },\n\n /**\n * Gets the left offset of an element\n *\n * @method offsetLeft\n * @uses Ink.Dom.Browser\n *\n * @param {DOMElement|String} elm Target element\n * @return {Number} Offset from the target element to the left of the document\n * @public\n * @sample Ink_Dom_Element_1_offsetLeft.html\n */\n offsetLeft: function(elm) {\n return InkElement.offset(elm)[0];\n },\n\n /**\n * Gets the relative offset of an element\n *\n * @method positionedOffset\n * @param {Element|String} element Target element\n * @return {Array} Array with the element offsetleft and offsettop relative to the closest positioned ancestor\n * @public\n * @sample Ink_Dom_Element_1_positionedOffset.html\n */\n positionedOffset: function(element) {\n var valueTop = 0, valueLeft = 0;\n element = InkElement.get(element);\n do {\n valueTop += element.offsetTop || 0;\n valueLeft += element.offsetLeft || 0;\n element = element.offsetParent;\n if (element) {\n if (element.tagName.toLowerCase() === 'body') { break; }\n\n var value = element.style.position;\n if (!value && element.currentStyle) {\n value = element.currentStyle.position;\n }\n if ((!value || value === 'auto') && typeof getComputedStyle !== 'undefined') {\n var css = getComputedStyle(element, null);\n value = css ? css.position : null;\n }\n if (value === 'relative' || value === 'absolute') { break; }\n }\n } while (element);\n return [valueLeft, valueTop];\n },\n\n /**\n * Gets the cumulative offset for an element\n *\n * Returns the top left position of the element on the page\n *\n * @method offset\n * @uses Ink.Dom.Browser\n *\n * @method offset\n * @param {DOMElement|String} elm Target element\n * @return {[Number, Number]} Array with pixel distance from the target element to the top left corner of the document\n * @public\n * @sample Ink_Dom_Element_1_offset.html\n */\n offset: function(elm) {\n /*jshint boss:true */\n elm = Ink.i(elm);\n var res = [0, 0];\n var doc = elm.ownerDocument,\n docElem = doc.documentElement,\n box = rect(elm),\n body = doc.body,\n clientTop = docElem.clientTop || body.clientTop || 0,\n clientLeft = docElem.clientLeft || body.clientLeft || 0,\n scrollTop = doc.pageYOffset || docElem.scrollTop || body.scrollTop,\n scrollLeft = doc.pageXOffset || docElem.scrollLeft || body.scrollLeft,\n top = box.top + scrollTop - clientTop,\n left = box.left + scrollLeft - clientLeft;\n res = [left, top];\n return res;\n },\n\n /**\n * Gets the scroll of the element\n *\n * @method scroll\n * @param {DOMElement|String} [elm] Target element or document.body\n * @returns {Array} offset values for x and y scroll\n * @public\n * @sample Ink_Dom_Element_1_scroll.html\n */\n scroll: function(elm) {\n elm = elm ? Ink.i(elm) : document.body;\n return [\n ( ( !window.pageXOffset ) ? elm.scrollLeft : window.pageXOffset ),\n ( ( !window.pageYOffset ) ? elm.scrollTop : window.pageYOffset )\n ];\n },\n\n _getPropPx: function(cs, prop) {\n var n, c;\n var val = cs.getPropertyValue ? cs.getPropertyValue(prop) : cs[prop];\n if (!val) { n = 0; }\n else {\n c = val.indexOf('px');\n if (c === -1) { n = 0; }\n else {\n n = parseFloat(val, 10);\n }\n }\n\n //console.log([prop, ' \"', val, '\" ', n].join(''));\n\n return n;\n },\n\n /**\n * Alias for offset()\n *\n * @method offset2\n * @param {Element} el Element to be passed to `offset()`\n * @return {void}\n * @public\n * @deprecated Kept for historic reasons. Use offset() instead.\n */\n offset2: function(el) {\n return InkElement.offset(el);\n },\n\n /**\n * Checks if an element has an attribute\n *\n * @method hasAttribute\n * @param {Object} elm Target element\n * @param {String} attr Attribute name\n * @return {Boolean} Boolean based on existance of attribute\n * @sample Ink_Dom_Element_1_hasAttribute.html\n */\n hasAttribute: function(elm, attr){\n elm = Ink.i(elm);\n return elm.hasAttribute ? elm.hasAttribute(attr) : !!elm.getAttribute(attr);\n },\n /**\n * Inserts an element right after another\n *\n * @method insertAfter\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertAfter.html\n */\n insertAfter: function(newElm, targetElm) {\n /*jshint boss:true */\n if (targetElm = InkElement.get(targetElm)) {\n if (targetElm.nextSibling !== null) {\n targetElm.parentNode.insertBefore(newElm, targetElm.nextSibling);\n } else {\n targetElm.parentNode.appendChild(newElm);\n }\n }\n },\n\n /**\n * Inserts an element before another\n *\n * @method insertBefore\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertBefore.html\n */\n insertBefore: function (newElm, targetElm) {\n /*jshint boss:true */\n if ( (targetElm = InkElement.get(targetElm)) ) {\n targetElm.parentNode.insertBefore(newElm, targetElm);\n }\n },\n\n /**\n * Inserts an element as the first child of another\n *\n * @method insertTop\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertTop.html\n */\n insertTop: function(newElm,targetElm) {\n /*jshint boss:true */\n if (targetElm = InkElement.get(targetElm)) {\n if (targetElm.firstChild) {\n targetElm.insertBefore(newElm, targetElm.firstChild);\n } else {\n targetElm.appendChild(newElm);\n }\n }\n },\n\n /**\n * Inserts an element as the last child of another\n *\n * @method insertBottom\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertBottom.html\n */\n insertBottom: function(newElm, targetElm) {\n /*jshint boss:true */\n targetElm = Ink.i(targetElm);\n targetElm.appendChild(newElm);\n },\n\n /**\n * Retrieves textContent from node\n *\n * @method textContent\n * @param {DOMNode} node Where to retreive text from. Can be any node type.\n * @return {String} The text\n * @public\n * @sample Ink_Dom_Element_1_textContent.html\n */\n textContent: function(node){\n node = Ink.i(node);\n var text, k, cs, m;\n\n switch(node && node.nodeType) {\n case 9: /*DOCUMENT_NODE*/\n // IE quirks mode does not have documentElement\n return InkElement.textContent(node.documentElement || node.body && node.body.parentNode || node.body);\n\n case 1: /*ELEMENT_NODE*/\n text = ('textContent' in node) ? node.textContent : node.innerText;\n if (typeof text !== 'undefined') {\n return text;\n }\n /* falls through */\n case 11: /*DOCUMENT_FRAGMENT_NODE*/\n text = node.textContent;\n if (typeof text !== 'undefined') {\n return text;\n }\n\n if (node.firstChild === node.lastChild) {\n // Common case: 0 or 1 children\n return InkElement.textContent(node.firstChild);\n }\n\n text = [];\n cs = node.childNodes;\n for (k = 0, m = cs.length; k < m; ++k) {\n text.push( InkElement.textContent( cs[k] ) );\n }\n return text.join('');\n\n case 3: /*TEXT_NODE*/\n case 4: /*CDATA_SECTION_NODE*/\n return node.nodeValue;\n }\n return '';\n },\n\n /**\n * Replaces text content of a DOM Node\n * This method removes any child node previously present\n *\n * @method setTextContent\n * @param {Element} node Target node where the text will be added.\n * @param {String} text Text to be added on the node.\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_setTextContent.html\n */\n setTextContent: function(node, text){\n node = Ink.i(node);\n switch(node && node.nodeType)\n {\n case 1: /*ELEMENT_NODE*/\n if ('innerText' in node) {\n node.innerText = text;\n break;\n }\n /* falls through */\n case 11: /*DOCUMENT_FRAGMENT_NODE*/\n if ('textContent' in node) {\n node.textContent = text;\n break;\n }\n /* falls through */\n case 9: /*DOCUMENT_NODE*/\n while(node.firstChild) {\n node.removeChild(node.firstChild);\n }\n if (text !== '') {\n var doc = node.ownerDocument || node;\n node.appendChild(doc.createTextNode(text));\n }\n break;\n\n case 3: /*TEXT_NODE*/\n case 4: /*CDATA_SECTION_NODE*/\n node.nodeValue = text;\n break;\n }\n },\n\n /**\n * Checks if an element is a link\n *\n * @method isLink\n * @param {Element} element Element to check if it's a link.\n * @return {Boolean} Whether the element is a link.\n * @public\n * @sample Ink_Dom_Element_1_isLink.html\n */\n isLink: function(element){\n var b = element && element.nodeType === 1 && ((/^a|area$/i).test(element.tagName) ||\n element.hasAttributeNS && element.hasAttributeNS('http://www.w3.org/1999/xlink','href'));\n return !!b;\n },\n\n /**\n * Checks if a node is an ancestor of another\n *\n * @method isAncestorOf\n * @param {DOMNode} ancestor Ancestor node\n * @param {DOMNode} node Descendant node\n * @return {Boolean} Whether `ancestor` is an ancestor of `node`\n * @public\n * @sample Ink_Dom_Element_1_isAncestorOf.html\n */\n isAncestorOf: function(ancestor, node){\n /*jshint boss:true */\n if (!node || !ancestor) {\n return false;\n }\n if (node.compareDocumentPosition) {\n return (ancestor.compareDocumentPosition(node) & 0x10) !== 0;/*Node.DOCUMENT_POSITION_CONTAINED_BY*/\n }\n while (node = node.parentNode){\n if (node === ancestor){\n return true;\n }\n }\n return false;\n },\n\n /**\n * Checks if a node is descendant of another\n *\n * @method descendantOf\n * @param {DOMNode} node The ancestor\n * @param {DOMNode} descendant The descendant\n * @return {Boolean} `true` if 'descendant' is descendant of 'node'\n * @public\n * @sample Ink_Dom_Element_1_descendantOf.html\n */\n descendantOf: function(node, descendant){\n return node !== descendant && InkElement.isAncestorOf(node, descendant);\n },\n\n /**\n * Get first child element of another\n * @method firstElementChild\n * @param {DOMElement} elm Parent node\n * @return {DOMElement} the Element child\n * @public\n * @sample Ink_Dom_Element_1_firstElementChild.html\n */\n firstElementChild: function(elm){\n if(!elm) {\n return null;\n }\n if ('firstElementChild' in elm) {\n return elm.firstElementChild;\n }\n var child = elm.firstChild;\n while(child && child.nodeType !== 1) {\n child = child.nextSibling;\n }\n return child;\n },\n\n /**\n * Get the last child element of another\n * @method lastElementChild\n * @param {DOMElement} elm Parent node\n * @return {DOMElement} the Element child\n * @public\n * @sample Ink_Dom_Element_1_lastElementChild.html\n */\n lastElementChild: function(elm){\n if(!elm) {\n return null;\n }\n if ('lastElementChild' in elm) {\n return elm.lastElementChild;\n }\n var child = elm.lastChild;\n while(child && child.nodeType !== 1) {\n child = child.previousSibling;\n }\n return child;\n },\n\n /**\n * Get the first sibling element after the node\n *\n * @method nextElementSibling\n * @param {DOMNode} node The current node\n * @return {DOMElement|Null} The first sibling element after node or null if none is found\n * @public\n * @sample Ink_Dom_Element_1_nextElementSibling.html \n */\n nextElementSibling: function(node){\n var sibling = null;\n\n if(!node){ return sibling; }\n\n if(\"nextElementSibling\" in node){\n return node.nextElementSibling;\n } else {\n sibling = node.nextSibling;\n\n // 1 === Node.ELEMENT_NODE\n while(sibling && sibling.nodeType !== 1){\n sibling = sibling.nextSibling;\n }\n\n return sibling;\n }\n },\n\n /**\n * Get the first sibling element before the node\n *\n * @method previousElementSibling\n * @param {DOMNode} node The current node\n * @return {DOMElement|Null} The first element sibling before node or null if none is found\n * @public\n * @sample Ink_Dom_Element_1_previousElementSibling.html \n */\n previousElementSibling: function(node){\n var sibling = null;\n\n if(!node){ return sibling; }\n\n if(\"previousElementSibling\" in node){\n return node.previousElementSibling;\n } else {\n sibling = node.previousSibling;\n\n // 1 === Node.ELEMENT_NODE\n while(sibling && sibling.nodeType !== 1){\n sibling = sibling.previousSibling;\n }\n\n return sibling;\n }\n },\n\n /**\n * Get an element's width in pixels.\n *\n * @method elementWidth\n * @param {DOMElement|String} element Target DOM element or target ID\n * @return {Number} The element's width\n * @public\n * @sample Ink_Dom_Element_1_elementWidth.html \n */\n elementWidth: function(element) {\n if(typeof element === \"string\") {\n element = document.getElementById(element);\n }\n return element.offsetWidth;\n },\n\n /**\n * Get an element's height in pixels.\n *\n * @method elementHeight\n * @param {DOMElement|String} element DOM element or target ID\n * @return {Number} The element's height\n * @public\n * @sample Ink_Dom_Element_1_elementHeight.html \n */\n elementHeight: function(element) {\n if(typeof element === \"string\") {\n element = document.getElementById(element);\n }\n return element.offsetHeight;\n },\n\n /**\n * Deprecated. Alias for offsetLeft()\n *\n * @method elementLeft\n * @param {DOMElement|String} element DOM element or target ID\n * @return {Number} Element's left position\n */\n elementLeft: function(element) {\n return InkElement.offsetLeft(element);\n },\n\n /**\n * Deprecated. Alias for offsetTop()\n *\n * @method elementTop\n * @param {DOMElement|string} element Target DOM element or target ID\n * @return {Number} element's top position\n */\n elementTop: function(element) {\n return InkElement.offsetTop(element);\n },\n\n /**\n * Get an element's dimensions in pixels.\n *\n * @method elementDimensions\n * @param {DOMElement|string} element DOM element or target ID\n * @return {Array} Array with element's width and height\n * @sample Ink_Dom_Element_1_elementDimensions.html \n */\n elementDimensions: function(element) {\n element = Ink.i(element);\n return [element.offsetWidth, element.offsetHeight];\n },\n\n /**\n * Get the outer dimensions of an element in pixels.\n *\n * @method outerDimensions\n * @uses Ink.Dom.Css\n *\n * @param {DOMElement} element Target element\n * @return {Array} Array with element width and height.\n * @sample Ink_Dom_Element_1_outerDimensions.html \n */\n outerDimensions: function (element) {\n var bbox = rect(element);\n\n var Css = Ink.getModule('Ink.Dom.Css_1');\n var getStyle = Ink.bindMethod(Css, 'getStyle', element);\n\n return [\n bbox.right - bbox.left + parseFloat(getStyle('marginLeft') || 0) + parseFloat(getStyle('marginRight') || 0), // w\n bbox.bottom - bbox.top + parseFloat(getStyle('marginTop') || 0) + parseFloat(getStyle('marginBottom') || 0) // h\n ];\n },\n\n /**\n * Check if an element is inside the viewport\n *\n * @method inViewport\n * @param {DOMElement} element DOM Element\n * @param {Object} [options] Options object. If you pass a Boolean value here, it is interpreted as `options.partial`\n * @param {Boolean} [options.partial]=false Return `true` even if it is only partially visible.\n * @param {Number} [options.margin]=0 Consider a margin all around the viewport with `opts.margin` width a dead zone.\n * @return {Boolean} Whether the element is inside the viewport.\n * @public\n * @sample Ink_Dom_Element_1_inViewport.html \n */\n inViewport: function (element, options) {\n var dims = rect(Ink.i(element));\n if (typeof options === 'boolean') {\n options = {partial: options, margin: 0};\n }\n options = Ink.extendObj({ partial: false, margin: 0}, options || {});\n if (options.partial) {\n return dims.bottom + options.margin > 0 && // from the top\n dims.left - options.margin < InkElement.viewportWidth() && // from the right\n dims.top - options.margin < InkElement.viewportHeight() && // from the bottom\n dims.right + options.margin > 0; // from the left\n } else {\n return dims.top + options.margin > 0 && // from the top\n dims.right - options.margin < InkElement.viewportWidth() && // from the right\n dims.bottom - options.margin < InkElement.viewportHeight() && // from the bottom\n dims.left + options.margin > 0; // from the left\n }\n },\n\n /**\n * Check if an element is hidden.\n * Taken from Mootools Element extras ( https://gist.github.com/cheeaun/73342 )\n * Does not take into account visibility:hidden\n * @method isHidden\n * @param {DOMElement} element Element to check\n * @return {Boolean} Whether the element is hidden\n * @sample Ink_Dom_Element_1_isHidden.html \n */\n isHidden: function (element) {\n var w = element.offsetWidth, \n h = element.offsetHeight,\n force = (element.tagName.toLowerCase() === 'tr');\n\n var Css = Ink.getModule('Ink.Dom.Css_1');\n\n return (w===0 && h===0 && !force) ? true :\n (w!==0 && h!==0 && !force) ? false :\n Css.getStyle(element, 'display').toLowerCase() === 'none';\n },\n\n /**\n * Check if an element is visible \n *\n * @method isVisible\n * @uses isHidden\n * @param {DOMElement} element Element to check\n * @return {Boolean} Whether the element is visible\n * @sample Ink_Dom_Element_1_isVisible.html \n */\n isVisible: function (element) {\n return !this.isHidden(element);\n },\n\n /**\n * Clones an element's position to another\n *\n * @method clonePosition\n * @param {Element} cloneTo element to be position cloned\n * @param {Element} cloneFrom element to get the cloned position\n * @return {Element} The element with positionClone\n * @public\n * @sample Ink_Dom_Element_1_clonePosition.html \n */\n clonePosition: function(cloneTo, cloneFrom){\n var pos = InkElement.offset(cloneFrom);\n cloneTo.style.left = pos[0]+'px';\n cloneTo.style.top = pos[1]+'px';\n\n return cloneTo;\n },\n\n /**\n * Text-overflow: ellipsis emulation\n * Slices off a piece of text at the end of the element and adds the ellipsis so all text fits inside.\n *\n * @method ellipsizeText\n * @param {Element} element Element to modify text content\n * @param {String} [ellipsis='\\u2026'] String to append to the chopped text\n * @return {void}\n * @public\n */\n ellipsizeText: function(element/*, ellipsis*/){\n if ((element = Ink.i(element))) {\n element.style.overflow = 'hidden';\n element.style.whiteSpace = 'nowrap';\n element.style.textOverflow = 'ellipsis';\n }\n },\n\n /**\n * Finds the closest ancestor element matching your test function\n *\n * @method findUpwardsHaving\n * @param {Element} element Element to base the search from\n * @param {Function} boolTest Testing function\n * @return {Element|false} The matched element or false if did not match\n * @public\n * @sample Ink_Dom_Element_1_findUpwardsHaving.html \n */\n findUpwardsHaving: function(element, boolTest) {\n while (element && element.nodeType === 1) {\n if (boolTest(element)) {\n return element;\n }\n element = element.parentNode;\n }\n return false;\n },\n\n /**\n * Finds the closest ancestor by class name\n *\n * @method findUpwardsByClass\n * @uses findUpwardsHaving\n * @param {DOMElement} element Element to base the search from\n * @param {String} className Class name to search\n * @returns {DOMElement|false} The matched element or false if did not match\n * @public\n * @sample Ink_Dom_Element_1_findUpwardsByClass.html \n */\n findUpwardsByClass: function(element, className) {\n var re = new RegExp(\"(^|\\\\s)\" + className + \"(\\\\s|$)\");\n var tst = function(el) {\n var cls = el.className;\n return cls && re.test(cls);\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Finds the closest ancestor by tag name\n *\n * @method findUpwardsByTag\n * @param {DOMElement} element Element to base the search from\n * @param {String} tag Tag to search\n * @returns {DOMElement|false} the matched element or false if did not match\n * @sample Ink_Dom_Element_1_findUpwardsByTag.html \n */\n findUpwardsByTag: function(element, tag) {\n tag = tag.toUpperCase();\n var tst = function(el) {\n return el.nodeName && el.nodeName.toUpperCase() === tag;\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Finds the closest ancestor by id\n *\n * @method findUpwardsById\n * @param {HtmlElement} element Element to base the search from\n * @param {String} id ID to search\n * @returns {HtmlElement|false} The matched element or false if did not match\n * @sample Ink_Dom_Element_1_findUpwardsById.html \n */\n findUpwardsById: function(element, id) {\n var tst = function(el) {\n return el.id === id;\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Finds the closest ancestor by CSS selector\n *\n * @method findUpwardsBySelector\n * @param {HtmlElement} element Element to base the search from\n * @param {String} sel CSS selector\n * @returns {HtmlElement|false} The matched element or false if did not match\n * @sample Ink_Dom_Element_1_findUpwardsBySelector.html \n */\n findUpwardsBySelector: function(element, sel) {\n var Selector = Ink.getModule('Ink.Dom.Selector', '1');\n if (!Selector) {\n throw new Error('This method requires Ink.Dom.Selector');\n }\n var tst = function(el) {\n return Selector.matchesSelector(el, sel);\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Gets the trimmed text of an element\n *\n * @method getChildrenText\n * @param {DOMElement} el Element to base the search from\n * @param {Boolean} [removeIt] Flag to remove the text from the element\n * @return {String} Text found\n * @sample Ink_Dom_Element_1_getChildrenText.html \n */\n getChildrenText: function(el, removeIt) {\n var node,\n j,\n part,\n nodes = el.childNodes,\n jLen = nodes.length,\n text = '';\n\n if (!el) {\n return text;\n }\n\n for (j = 0; j < jLen; ++j) {\n node = nodes[j];\n if (!node) { continue; }\n if (node.nodeType === 3) { // TEXT NODE\n part = InkElement._trimString( String(node.data) );\n if (part.length > 0) {\n text += part;\n if (removeIt) { el.removeChild(node); }\n }\n else { el.removeChild(node); }\n }\n }\n\n return text;\n },\n\n /**\n * String trim implementation\n * Used by getChildrenText\n *\n * function _trimString\n * param {String} text\n * return {String} trimmed text\n */\n _trimString: function(text) {\n return (String.prototype.trim) ? text.trim() : text.replace(/^\\s*/, '').replace(/\\s*$/, '');\n },\n\n /**\n * Gets value of a select element\n *\n * @method getSelectValues\n * @param {DOMElement|String} select element\n * @return {Array} The selected values\n * @sample Ink_Dom_Element_1_getSelectValues.html \n */\n getSelectValues: function (select) {\n var selectEl = Ink.i(select);\n var values = [];\n for (var i = 0; i < selectEl.options.length; ++i) {\n values.push( selectEl.options[i].value );\n }\n return values;\n },\n\n\n /* used by fills */\n _normalizeData: function(data) {\n var d, data2 = [];\n for (var i = 0, f = data.length; i < f; ++i) {\n d = data[i];\n\n if (!(d instanceof Array)) { // if not array, wraps primitive twice: val -> [val, val]\n d = [d, d];\n }\n else if (d.length === 1) { // if 1 element array: [val] -> [val, val]\n d.push(d[0]);\n }\n data2.push(d);\n }\n return data2;\n },\n\n\n /**\n * Fills a select element with options\n *\n * @method fillSelect\n * @param {DOMElement|String} container Select element which will get filled\n * @param {Array} data Data to populate the component\n * @param {Boolean} [skipEmpty] Flag to skip empty option\n * @param {String|Number} [defaultValue] Initial selected value\n * @return {void}\n * @public\n *\n * @sample Ink_Dom_Element_1_fillSelect.html \n */\n fillSelect: function(container, data, skipEmpty, defaultValue) {\n var containerEl = Ink.i(container);\n if (!containerEl) { return; }\n\n containerEl.innerHTML = '';\n var d, optionEl;\n\n if (!skipEmpty) {\n // add initial empty option\n optionEl = document.createElement('option');\n optionEl.setAttribute('value', '');\n containerEl.appendChild(optionEl);\n }\n\n data = InkElement._normalizeData(data);\n\n for (var i = 0, f = data.length; i < f; ++i) {\n d = data[i];\n\n optionEl = document.createElement('option');\n optionEl.setAttribute('value', d[0]);\n if (d.length > 2) {\n optionEl.setAttribute('extra', d[2]);\n }\n optionEl.appendChild( document.createTextNode(d[1]) );\n\n if (d[0] === defaultValue) {\n optionEl.setAttribute('selected', 'selected');\n }\n\n containerEl.appendChild(optionEl);\n }\n },\n\n\n /**\n * Creates a set of radio buttons from an array of data\n *\n * @method fillRadios\n * @param {Element|String} insertAfterEl Element after which the input elements will be created\n * @param {String} name Name for the form field ([] is added if not present as a suffix)\n * @param {Array} data Data to populate the component\n * @param {Boolean} [skipEmpty] Flag to skip creation of empty options\n * @param {String|Number} [defaultValue] Initial selected value\n * @param {String} [splitEl] Name of element to add after each input element (example: 'br')\n * @return {DOMElement} Wrapper element around the radio buttons\n */\n fillRadios: function(insertAfterEl, name, data, skipEmpty, defaultValue, splitEl) {\n insertAfterEl = Ink.i(insertAfterEl);\n var containerEl = document.createElement('span');\n InkElement.insertAfter(containerEl, insertAfterEl);\n\n data = InkElement._normalizeData(data);\n\n /*\n if (name.substring(name.length - 1) !== ']') {\n name += '[]';\n }\n */\n\n var d, inputEl;\n\n if (!skipEmpty) {\n // add initial empty option\n inputEl = document.createElement('input');\n inputEl.setAttribute('type', 'radio');\n inputEl.setAttribute('name', name);\n inputEl.setAttribute('value', '');\n containerEl.appendChild(inputEl);\n if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); }\n }\n\n for (var i = 0; i < data.length; ++i) {\n d = data[i];\n\n inputEl = document.createElement('input');\n inputEl.setAttribute('type', 'radio');\n inputEl.setAttribute('name', name);\n inputEl.setAttribute('value', d[0]);\n containerEl.appendChild(inputEl);\n containerEl.appendChild( document.createTextNode(d[1]) );\n if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); }\n\n if (d[0] === defaultValue) {\n inputEl.checked = true;\n }\n }\n\n return containerEl;\n },\n\n\n /**\n * Creates set of checkbox buttons\n *\n * @method fillChecks\n * @param {Element|String} insertAfterEl Element after which the input elements will be created\n * @param {String} name Name for the form field ([] is added if not present as a suffix)\n * @param {Array} data Data to populate the component\n * @param {String|Number} [defaultValue] Initial selected value\n * @param {String} [splitEl] Name of element to add after each input element (example: 'br')\n * @return {Element} Wrapper element around the checkboxes\n * @public\n */\n fillChecks: function(insertAfterEl, name, data, defaultValue, splitEl) {\n insertAfterEl = Ink.i(insertAfterEl);\n var containerEl = document.createElement('span');\n InkElement.insertAfter(containerEl, insertAfterEl);\n\n data = InkElement._normalizeData(data);\n\n if (name.substring(name.length - 1) !== ']') {\n name += '[]';\n }\n\n var d, inputEl;\n\n for (var i = 0; i < data.length; ++i) {\n d = data[i];\n\n inputEl = document.createElement('input');\n inputEl.setAttribute('type', 'checkbox');\n inputEl.setAttribute('name', name);\n inputEl.setAttribute('value', d[0]);\n containerEl.appendChild(inputEl);\n containerEl.appendChild( document.createTextNode(d[1]) );\n if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); }\n\n if (d[0] === defaultValue) {\n inputEl.checked = true;\n }\n }\n\n return containerEl;\n },\n\n\n /**\n * Gets the index of an element relative to a parent\n *\n * @method parentIndexOf\n * @param {Element} [parentEl] childEl's parent. Deprecated.\n * @param {Element} childEl Child Element to look for\n * @return {Number} The index of the childEl inside parentEl. Returns -1 if it's not a direct child\n * @public\n * @sample Ink_Dom_Element_1_parentIndexOf.html \n */\n parentIndexOf: function(parentEl, childEl) {\n if (!childEl) {\n // one argument form\n childEl = parentEl;\n parentEl = parentEl.parentNode;\n }\n if (!parentEl) { return false; }\n for (var i = 0, f = parentEl.children.length; i < f; ++i) {\n if (parentEl.children[i] === childEl) {\n return i;\n }\n }\n return false;\n },\n\n\n /**\n * Gets the next siblings of an element\n *\n * @method nextSiblings\n * @param {String|DOMElement} elm Element\n * @return {Array} Array of next sibling elements\n * @sample Ink_Dom_Element_1_nextSiblings.html \n */\n nextSiblings: function(elm) {\n elm = Ink.i(elm);\n if(typeof(elm) === 'object' && elm !== null && elm.nodeType && elm.nodeType === 1) {\n var elements = [],\n siblings = elm.parentNode.children,\n index = InkElement.parentIndexOf(elm.parentNode, elm);\n\n for(var i = ++index, len = siblings.length; i\" + html + \"
    \" + deleteThisTbodyToken + \"
    \";\n } else {\n div.innerHTML = \"\" + html + \"
    \";\n }\n return div.firstChild;\n },\n TBODY: function (div, html) {\n div.innerHTML = '' + html + '
    ';\n return div.firstChild.getElementsByTagName('tbody')[0];\n },\n THEAD: function (div, html) {\n div.innerHTML = '' + html + '
    ';\n return div.firstChild.getElementsByTagName('thead')[0];\n },\n TFOOT: function (div, html) {\n div.innerHTML = '' + html + '
    ';\n return div.firstChild.getElementsByTagName('tfoot')[0];\n },\n TR: function (div, html) {\n div.innerHTML = '' + html + '
    ';\n return div.firstChild.firstChild.firstChild;\n }\n },\n\n /**\n * Gets a wrapper DIV with a certain HTML content to be inserted inside another element.\n * This is necessary for appendHTML,prependHTML functions, because they need a container element to copy the children from.\n *\n * Works around IE table quirks\n * @method _getWrapper\n * @private\n * @param elm\n * @param html\n */\n _getWrapper: function (elm, html) {\n var nodeName = elm.nodeName && elm.nodeName.toUpperCase();\n var wrapper = document.createElement('div');\n var wrapFunc = InkElement._wrapElements[nodeName];\n\n if ( !wrapFunc ) {\n wrapper.innerHTML = html;\n return wrapper;\n }\n // special cases\n wrapper = wrapFunc(wrapper, html);\n // worst case: tbody auto-creation even when our HTML has a tbody.\n if (browserCreatesTbodies && nodeName === 'TABLE') {\n // terrible case. Deal with tbody creation too.\n var tds = wrapper.getElementsByTagName('td');\n for (var i = 0, len = tds.length; i < len; i++) {\n if (tds[i].innerHTML === deleteThisTbodyToken) {\n var tbody = tds[i].parentNode.parentNode;\n tbody.parentNode.removeChild(tbody);\n }\n }\n }\n return wrapper;\n },\n\n /**\n * Appends HTML to an element.\n * This method parses the html string and doesn't modify its contents\n *\n * @method appendHTML\n * @param {String|DOMElement} elm Element\n * @param {String} html Markup string\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_appendHTML.html \n */\n appendHTML: function(elm, html){\n elm = Ink.i(elm);\n if(elm !== null) {\n var wrapper = InkElement._getWrapper(elm, html);\n while (wrapper.firstChild) {\n elm.appendChild(wrapper.firstChild);\n }\n }\n },\n\n /**\n * Prepends HTML to an element.\n * This method parses the html string and doesn't modify its contents\n *\n * @method prependHTML\n * @param {String|Element} elm Element\n * @param {String} html Markup string to prepend\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_prependHTML.html \n */\n prependHTML: function(elm, html){\n elm = Ink.i(elm);\n if(elm !== null) {\n var wrapper = InkElement._getWrapper(elm, html);\n while (wrapper.lastChild) {\n elm.insertBefore(wrapper.lastChild, elm.firstChild);\n }\n }\n },\n\n /**\n * Sets the inner HTML of an element.\n *\n * @method setHTML\n * @param {String|DOMElement} elm Element\n * @param {String} html Markup string\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_setHTML.html \n */\n setHTML: function (elm, html) {\n elm = Ink.i(elm);\n if(elm !== null) {\n try {\n elm.innerHTML = html;\n } catch (e) {\n // Tables in IE7\n while (elm.firstChild) {\n elm.removeChild(elm.firstChild);\n }\n InkElement.appendHTML(elm, html);\n }\n }\n },\n\n /**\n * Wraps an element inside a container.\n *\n * The container may or may not be in the document yet.\n *\n * @method wrap\n * @param {String|Element} target Element to be wrapped\n * @param {String|Element} container Element to wrap the target\n * @return {Element} Container element\n * @public\n * @sample Ink_Dom_Element_1_wrap.html \n *\n * @example\n * before:\n *\n *
    \n *\n * call this function to wrap #target with a wrapper div.\n *\n * InkElement.wrap('target', InkElement.create('div', {id: 'container'});\n * \n * after: \n *\n *
    \n */\n wrap: function (target, container) {\n target = Ink.i(target);\n container = Ink.i(container);\n \n var nextNode = target.nextSibling;\n var parent = target.parentNode;\n\n container.appendChild(target);\n\n if (nextNode !== null) {\n parent.insertBefore(container, nextNode);\n } else {\n parent.appendChild(container);\n }\n\n return container;\n },\n\n /**\n * Places an element outside a wrapper.\n *\n * @method unwrap\n * @param {DOMElement} elem The element you're trying to unwrap. This should be an ancestor of the wrapper.\n * @param {String} [wrapperSelector] CSS Selector for the ancestor. Use this if your wrapper is not the direct parent of elem.\n * @return {void}\n * @sample Ink_Dom_Element_1_unwrap.html \n *\n * @example\n *\n * When you have this:\n *\n *
    \n *
    \n *
    \n *\n * If you do this:\n *\n * InkElement.unwrap('unwrapMe');\n *\n * You get this:\n *\n *
    \n *
    \n * \n **/\n unwrap: function (elem, wrapperSelector) {\n elem = Ink.i(elem);\n var wrapper;\n if (typeof wrapperSelector === 'string') {\n wrapper = InkElement.findUpwardsBySelector(elem, wrapperSelector);\n } else if (typeof wrapperSelector === 'object' && wrapperSelector.tagName) {\n wrapper = InkElement.findUpwardsHaving(elem, function (ancestor) {\n return ancestor === wrapperSelector;\n });\n } else {\n wrapper = elem.parentNode;\n }\n if (!wrapper || !wrapper.parentNode) { return; }\n\n InkElement.insertBefore(elem, wrapper);\n },\n\n /**\n * Replaces an element with another.\n *\n * @method replace\n * @param {Element} element The element to be replaced.\n * @param {Element} replacement The new element.\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_replace.html \n *\n * @example\n * var newelement1 = InkElement.create('div');\n * // ...\n * replace(Ink.i('element1'), newelement1);\n */\n replace: function (element, replacement) {\n element = Ink.i(element);\n if(element !== null) {\n element.parentNode.replaceChild(replacement, element);\n }\n },\n\n /**\n * Removes direct text children.\n * Useful to remove nasty layout gaps generated by whitespace on the markup.\n *\n * @method removeTextNodeChildren\n * @param {Element} el Element to remove text from\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_removeTextNodeChildren.html \n */\n removeTextNodeChildren: function(el) {\n el = Ink.i(el);\n if(el !== null) {\n var prevEl, toRemove, parent = el;\n el = el.firstChild;\n while (el) {\n toRemove = (el.nodeType === 3);\n prevEl = el;\n el = el.nextSibling;\n if (toRemove) {\n parent.removeChild(prevEl);\n }\n }\n }\n },\n\n /**\n * Creates a documentFragment from an HTML string.\n *\n * @method htmlToFragment\n * @param {String} html HTML string\n * @return {DocumentFragment} DocumentFragment containing all of the elements from the html string\n * @sample Ink_Dom_Element_1_htmlToFragment.html \n */\n htmlToFragment: (createContextualFragmentSupport ?\n function(html){\n var range;\n\n if(typeof html !== 'string'){ return document.createDocumentFragment(); }\n\n range = document.createRange();\n\n // set the context to document.body (firefox does this already, webkit doesn't)\n range.selectNode(document.body);\n\n return range.createContextualFragment(html);\n } : function (html) {\n var fragment = document.createDocumentFragment(),\n tempElement,\n current;\n\n if(typeof html !== 'string'){ return fragment; }\n\n tempElement = document.createElement('div');\n tempElement.innerHTML = html;\n\n // append child removes elements from the original parent\n while( (current = tempElement.firstChild) ){ // intentional assignment\n fragment.appendChild(current);\n }\n\n return fragment;\n }),\n\n _camelCase: function(str)\n {\n return str ? str.replace(/-(\\w)/g, function (_, $1){\n return $1.toUpperCase();\n }) : str;\n },\n\n /**\n * Gets data attributes from an element\n *\n * @method data\n * @param {String|DOMElement} selector Element or CSS selector\n * @return {Object} Object with the data-* properties. If no data-attributes are present, an empty object is returned.\n * @sample Ink_Dom_Element_1_data.html \n */\n data: function(selector) {\n var el;\n if (typeof selector !== 'object' && typeof selector !== 'string') {\n throw '[Ink.Dom.Element.data] :: Invalid selector defined';\n }\n\n if (typeof selector === 'object') {\n el = selector;\n }\n else {\n var InkDomSelector = Ink.getModule('Ink.Dom.Selector', 1);\n if (!InkDomSelector) {\n throw \"[Ink.Dom.Element.data] :: this method requires Ink.Dom.Selector - v1\";\n }\n el = InkDomSelector.select(selector);\n if (el.length <= 0) {\n throw \"[Ink.Dom.Element.data] :: Can't find any element with the specified selector\";\n }\n el = el[0];\n }\n\n var dataset = {};\n var attrs = el.attributes || [];\n\n var curAttr, curAttrName, curAttrValue;\n if (attrs) {\n for (var i = 0, total = attrs.length; i < total; ++i) {\n curAttr = attrs[i];\n curAttrName = curAttr.name;\n curAttrValue = curAttr.value;\n if (curAttrName && curAttrName.indexOf('data-') === 0) {\n dataset[InkElement._camelCase(curAttrName.replace('data-', ''))] = curAttrValue;\n }\n }\n }\n\n return dataset;\n },\n\n /**\n * Move the cursor on an input or textarea element.\n * @method moveCursorTo\n * @param {Element} el Input or Textarea element\n * @param {Number} t Index of the character to move the cursor to\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_moveCursorTo.html \n */\n moveCursorTo: function(el, t) {\n el = Ink.i(el);\n if(el !== null) {\n if (el.setSelectionRange) {\n el.setSelectionRange(t, t);\n //el.focus();\n }\n else {\n var range = el.createTextRange();\n range.collapse(true);\n range.moveEnd( 'character', t);\n range.moveStart('character', t);\n range.select();\n }\n }\n },\n\n /**\n * Get the page's width.\n * @method pageWidth\n * @return {Number} Page width in pixels\n * @sample Ink_Dom_Element_1_pageWidth.html \n */\n pageWidth: function() {\n var xScroll;\n\n if (window.innerWidth && window.scrollMaxX) {\n xScroll = window.innerWidth + window.scrollMaxX;\n } else if (document.body.scrollWidth > document.body.offsetWidth){\n xScroll = document.body.scrollWidth;\n } else {\n xScroll = document.body.offsetWidth;\n }\n\n var windowWidth;\n\n if (window.self.innerWidth) {\n if(document.documentElement.clientWidth){\n windowWidth = document.documentElement.clientWidth;\n } else {\n windowWidth = window.self.innerWidth;\n }\n } else if (document.documentElement && document.documentElement.clientWidth) {\n windowWidth = document.documentElement.clientWidth;\n } else if (document.body) {\n windowWidth = document.body.clientWidth;\n }\n\n if(xScroll < windowWidth){\n return xScroll;\n } else {\n return windowWidth;\n }\n },\n\n /**\n * Get the page's height.\n * @method pageHeight\n * @return {Number} Page height in pixels\n * @sample Ink_Dom_Element_1_pageHeight.html \n */\n pageHeight: function() {\n var yScroll;\n\n if (window.innerHeight && window.scrollMaxY) {\n yScroll = window.innerHeight + window.scrollMaxY;\n } else if (document.body.scrollHeight > document.body.offsetHeight){\n yScroll = document.body.scrollHeight;\n } else {\n yScroll = document.body.offsetHeight;\n }\n\n var windowHeight;\n\n if (window.self.innerHeight) {\n windowHeight = window.self.innerHeight;\n } else if (document.documentElement && document.documentElement.clientHeight) {\n windowHeight = document.documentElement.clientHeight;\n } else if (document.body) {\n windowHeight = document.body.clientHeight;\n }\n\n if(yScroll < windowHeight){\n return windowHeight;\n } else {\n return yScroll;\n }\n },\n\n /**\n * Get the viewport's width.\n * @method viewportWidth\n * @return {Number} Viewport width in pixels\n * @sample Ink_Dom_Element_1_viewportWidth.html \n */\n viewportWidth: function() {\n if(typeof window.innerWidth !== \"undefined\") {\n return window.innerWidth;\n }\n if (document.documentElement && typeof document.documentElement.offsetWidth !== \"undefined\") {\n return document.documentElement.offsetWidth;\n }\n },\n\n /**\n * Get the viewport's height.\n * @method viewportHeight\n * @return {Number} Viewport height in pixels\n * @sample Ink_Dom_Element_1_viewportHeight.html \n */\n viewportHeight: function() {\n if (typeof window.innerHeight !== \"undefined\") {\n return window.innerHeight;\n }\n if (document.documentElement && typeof document.documentElement.offsetHeight !== \"undefined\") {\n return document.documentElement.offsetHeight;\n }\n },\n\n /**\n * Get the scroll's width.\n * @method scrollWidth\n * @return {Number} Scroll width\n */\n scrollWidth: function() {\n if (typeof window.self.pageXOffset !== 'undefined') {\n return window.self.pageXOffset;\n }\n if (typeof document.documentElement !== 'undefined' && typeof document.documentElement.scrollLeft !== 'undefined') {\n return document.documentElement.scrollLeft;\n }\n return document.body.scrollLeft;\n },\n\n /**\n * Get the scroll's height.\n * @method scrollHeight\n * @return {Number} Scroll height\n */\n scrollHeight: function() {\n if (typeof window.self.pageYOffset !== 'undefined') {\n return window.self.pageYOffset;\n }\n if (typeof document.documentElement !== 'undefined' && typeof document.documentElement.scrollTop !== 'undefined') {\n return document.documentElement.scrollTop;\n }\n return document.body.scrollTop;\n }\n };\n\n return InkElement;\n\n});\n","/**\n * Event management\n * @module Ink.Dom.Event_1\n * @version 1\n */\n\nInk.createModule('Ink.Dom.Event', 1, [], function() {\n /* jshint\n asi:true,\n strict:false,\n laxcomma:true,\n eqeqeq:false,\n laxbreak:true,\n boss:true,\n curly:false,\n expr:true\n */\n\n /**\n * @namespace Ink.Dom.Event_1\n * @static\n */\n\n /*!\n * Bean - copyright (c) Jacob Thornton 2011-2012\n * https://github.com/fat/bean\n * MIT license\n */\n var bean = (function (name, context, definition) {\n return definition()\n })('bean', this, function (name, context) {\n name = name || 'bean'\n context = context || this\n\n var win = window\n , old = context[name]\n , namespaceRegex = /[^\\.]*(?=\\..*)\\.|.*/\n , nameRegex = /\\..*/\n , addEvent = 'addEventListener'\n , removeEvent = 'removeEventListener'\n , doc = document || {}\n , root = doc.documentElement || {}\n , W3C_MODEL = root[addEvent]\n , eventSupport = W3C_MODEL ? addEvent : 'attachEvent'\n , ONE = {} // singleton for quick matching making add() do one()\n\n , slice = Array.prototype.slice\n , str2arr = function (s, d) { return s.split(d || ' ') }\n , isString = function (o) { return typeof o == 'string' }\n , isFunction = function (o) { return typeof o == 'function' }\n\n // events that we consider to be 'native', anything not in this list will\n // be treated as a custom event\n , standardNativeEvents =\n 'click dblclick mouseup mousedown contextmenu ' + // mouse buttons\n 'mousewheel mousemultiwheel DOMMouseScroll ' + // mouse wheel\n 'mouseover mouseout mousemove selectstart selectend ' + // mouse movement\n 'keydown keypress keyup ' + // keyboard\n 'orientationchange ' + // mobile\n 'focus blur change reset select submit ' + // form elements\n 'load unload beforeunload resize move DOMContentLoaded ' + // window\n 'readystatechange message ' + // window\n 'error abort scroll ' // misc\n // element.fireEvent('onXYZ'... is not forgiving if we try to fire an event\n // that doesn't actually exist, so make sure we only do these on newer browsers\n , w3cNativeEvents =\n 'show ' + // mouse buttons\n 'input invalid ' + // form elements\n 'touchstart touchmove touchend touchcancel ' + // touch\n 'gesturestart gesturechange gestureend ' + // gesture\n 'textinput' + // TextEvent\n 'readystatechange pageshow pagehide popstate ' + // window\n 'hashchange offline online ' + // window\n 'afterprint beforeprint ' + // printing\n 'dragstart dragenter dragover dragleave drag drop dragend ' + // dnd\n 'loadstart progress suspend emptied stalled loadmetadata ' + // media\n 'loadeddata canplay canplaythrough playing waiting seeking ' + // media\n 'seeked ended durationchange timeupdate play pause ratechange ' + // media\n 'volumechange cuechange ' + // media\n 'checking noupdate downloading cached updateready obsolete ' // appcache\n\n // convert to a hash for quick lookups\n , nativeEvents = (function (hash, events, i) {\n for (i = 0; i < events.length; i++) events[i] && (hash[events[i]] = 1)\n return hash\n }({}, str2arr(standardNativeEvents + (W3C_MODEL ? w3cNativeEvents : ''))))\n\n // custom events are events that we *fake*, they are not provided natively but\n // we can use native events to generate them\n , customEvents = (function () {\n var isAncestor = 'compareDocumentPosition' in root\n ? function (element, container) {\n return container.compareDocumentPosition && (container.compareDocumentPosition(element) & 16) === 16\n }\n : 'contains' in root\n ? function (element, container) {\n container = container.nodeType === 9 || container === window ? root : container\n return container !== element && container.contains(element)\n }\n : function (element, container) {\n while (element = element.parentNode) if (element === container) return 1\n return 0\n }\n , check = function (event) {\n var related = event.relatedTarget\n return !related\n ? related == null\n : (related !== this && related.prefix !== 'xul' && !/document/.test(this.toString())\n && !isAncestor(related, this))\n }\n\n return {\n mouseenter: { base: 'mouseover', condition: check }\n , mouseleave: { base: 'mouseout', condition: check }\n , mousewheel: { base: /Firefox/.test(navigator.userAgent) ? 'DOMMouseScroll' : 'mousewheel' }\n }\n }())\n\n // we provide a consistent Event object across browsers by taking the actual DOM\n // event object and generating a new one from its properties.\n , Event = (function () {\n // a whitelist of properties (for different event types) tells us what to check for and copy\n var commonProps = str2arr('altKey attrChange attrName bubbles cancelable ctrlKey currentTarget ' +\n 'detail eventPhase getModifierState isTrusted metaKey relatedNode relatedTarget shiftKey ' +\n 'srcElement target timeStamp type view which propertyName path')\n , mouseProps = commonProps.concat(str2arr('button buttons clientX clientY dataTransfer ' +\n 'fromElement offsetX offsetY pageX pageY screenX screenY toElement movementX movementY region'))\n , mouseWheelProps = mouseProps.concat(str2arr('wheelDelta wheelDeltaX wheelDeltaY wheelDeltaZ ' +\n 'axis')) // 'axis' is FF specific\n , keyProps = commonProps.concat(str2arr('char charCode key keyCode keyIdentifier ' +\n 'keyLocation location isComposing code'))\n , textProps = commonProps.concat(str2arr('data'))\n , touchProps = commonProps.concat(str2arr('touches targetTouches changedTouches scale rotation'))\n , messageProps = commonProps.concat(str2arr('data origin source'))\n , stateProps = commonProps.concat(str2arr('state'))\n , overOutRegex = /over|out/\n // some event types need special handling and some need special properties, do that all here\n , typeFixers = [\n { // key events\n reg: /key/i\n , fix: function (event, newEvent) {\n newEvent.keyCode = event.keyCode || event.which\n return keyProps\n }\n }\n , { // mouse events\n reg: /click|mouse(?!(.*wheel|scroll))|menu|drag|drop/i\n , fix: function (event, newEvent, type) {\n newEvent.rightClick = event.which === 3 || event.button === 2\n newEvent.pos = { x: 0, y: 0 }\n if (event.pageX || event.pageY) {\n newEvent.clientX = event.pageX\n newEvent.clientY = event.pageY\n } else if (event.clientX || event.clientY) {\n newEvent.clientX = event.clientX + doc.body.scrollLeft + root.scrollLeft\n newEvent.clientY = event.clientY + doc.body.scrollTop + root.scrollTop\n }\n if (overOutRegex.test(type)) {\n newEvent.relatedTarget = event.relatedTarget\n || event[(type == 'mouseover' ? 'from' : 'to') + 'Element']\n }\n return mouseProps\n }\n }\n , { // mouse wheel events\n reg: /mouse.*(wheel|scroll)/i\n , fix: function () { return mouseWheelProps }\n }\n , { // TextEvent\n reg: /^text/i\n , fix: function () { return textProps }\n }\n , { // touch and gesture events\n reg: /^touch|^gesture/i\n , fix: function () { return touchProps }\n }\n , { // message events\n reg: /^message$/i\n , fix: function () { return messageProps }\n }\n , { // popstate events\n reg: /^popstate$/i\n , fix: function () { return stateProps }\n }\n , { // everything else\n reg: /.*/\n , fix: function () { return commonProps }\n }\n ]\n , typeFixerMap = {} // used to map event types to fixer functions (above), a basic cache mechanism\n\n , Event = function (event, element, isNative) {\n if (!arguments.length) return\n event = event || ((element.ownerDocument || element.document || element).parentWindow || win).event\n this.originalEvent = event\n this.isNative = isNative\n this.isBean = true\n\n if (!event) return\n\n var type = event.type\n , target = event.target || event.srcElement\n , i, l, p, props, fixer\n\n this.target = target && target.nodeType === 3 ? target.parentNode : target\n\n if (isNative) { // we only need basic augmentation on custom events, the rest expensive & pointless\n fixer = typeFixerMap[type]\n if (!fixer) { // haven't encountered this event type before, map a fixer function for it\n for (i = 0, l = typeFixers.length; i < l; i++) {\n if (typeFixers[i].reg.test(type)) { // guaranteed to match at least one, last is .*\n typeFixerMap[type] = fixer = typeFixers[i].fix\n break\n }\n }\n }\n\n props = fixer(event, this, type)\n for (i = props.length; i--;) {\n if (!((p = props[i]) in this) && p in event) this[p] = event[p]\n }\n }\n }\n\n // preventDefault() and stopPropagation() are a consistent interface to those functions\n // on the DOM, stop() is an alias for both of them together\n Event.prototype.preventDefault = function () {\n if (this.originalEvent.preventDefault) this.originalEvent.preventDefault()\n else this.originalEvent.returnValue = false\n }\n Event.prototype.stopPropagation = function () {\n if (this.originalEvent.stopPropagation) this.originalEvent.stopPropagation()\n else this.originalEvent.cancelBubble = true\n }\n Event.prototype.stop = function () {\n this.preventDefault()\n this.stopPropagation()\n this.stopped = true\n }\n // stopImmediatePropagation() has to be handled internally because we manage the event list for\n // each element\n // note that originalElement may be a Bean#Event object in some situations\n Event.prototype.stopImmediatePropagation = function () {\n if (this.originalEvent.stopImmediatePropagation) this.originalEvent.stopImmediatePropagation()\n this.isImmediatePropagationStopped = function () { return true }\n }\n Event.prototype.isImmediatePropagationStopped = function () {\n return this.originalEvent.isImmediatePropagationStopped && this.originalEvent.isImmediatePropagationStopped()\n }\n Event.prototype.clone = function (currentTarget) {\n //TODO: this is ripe for optimisation, new events are *expensive*\n // improving this will speed up delegated events\n var ne = new Event(this, this.element, this.isNative)\n ne.currentTarget = currentTarget\n return ne\n }\n\n return Event\n }())\n\n // if we're in old IE we can't do onpropertychange on doc or win so we use doc.documentElement for both\n , targetElement = function (element, isNative) {\n return !W3C_MODEL && !isNative && (element === doc || element === win) ? root : element\n }\n\n /**\n * Bean maintains an internal registry for event listeners. We don't touch elements, objects\n * or functions to identify them, instead we store everything in the registry.\n * Each event listener has a RegEntry object, we have one 'registry' for the whole instance.\n */\n , RegEntry = (function () {\n // each handler is wrapped so we can handle delegation and custom events\n var wrappedHandler = function (element, fn, condition, args) {\n var call = function (event, eargs) {\n return fn.apply(element, args ? slice.call(eargs, event ? 0 : 1).concat(args) : eargs)\n }\n , findTarget = function (event, eventElement) {\n return fn.__beanDel ? fn.__beanDel.ft(event.target, element) : eventElement\n }\n , handler = condition\n ? function (event) {\n var target = findTarget(event, this) // deleated event\n if (condition.apply(target, arguments)) {\n if (event) event.currentTarget = target\n return call(event, arguments)\n }\n }\n : function (event) {\n if (fn.__beanDel) event = event.clone(findTarget(event)) // delegated event, fix the fix\n return call(event, arguments)\n }\n handler.__beanDel = fn.__beanDel\n return handler\n }\n\n , RegEntry = function (element, type, handler, original, namespaces, args, root) {\n var customType = customEvents[type]\n , isNative\n\n if (type == 'unload') {\n // self clean-up\n handler = once(removeListener, element, type, handler, original)\n }\n\n if (customType) {\n if (customType.condition) {\n handler = wrappedHandler(element, handler, customType.condition, args)\n }\n type = customType.base || type\n }\n\n this.isNative = isNative = nativeEvents[type] && !!element[eventSupport]\n this.customType = !W3C_MODEL && !isNative && type\n this.element = element\n this.type = type\n this.original = original\n this.namespaces = namespaces\n this.eventType = W3C_MODEL || isNative ? type : 'propertychange'\n this.target = targetElement(element, isNative)\n this[eventSupport] = !!this.target[eventSupport]\n this.root = root\n this.handler = wrappedHandler(element, handler, null, args)\n }\n\n // given a list of namespaces, is our entry in any of them?\n RegEntry.prototype.inNamespaces = function (checkNamespaces) {\n var i, j, c = 0\n if (!checkNamespaces) return true\n if (!this.namespaces) return false\n for (i = checkNamespaces.length; i--;) {\n for (j = this.namespaces.length; j--;) {\n if (checkNamespaces[i] == this.namespaces[j]) c++\n }\n }\n return checkNamespaces.length === c\n }\n\n // match by element, original fn (opt), handler fn (opt)\n RegEntry.prototype.matches = function (checkElement, checkOriginal, checkHandler) {\n return this.element === checkElement &&\n (!checkOriginal || this.original === checkOriginal) &&\n (!checkHandler || this.handler === checkHandler)\n }\n\n return RegEntry\n }())\n\n , registry = (function () {\n // our map stores arrays by event type, just because it's better than storing\n // everything in a single array.\n // uses '$' as a prefix for the keys for safety and 'r' as a special prefix for\n // rootListeners so we can look them up fast\n var map = {}\n\n // generic functional search of our registry for matching listeners,\n // `fn` returns false to break out of the loop\n , forAll = function (element, type, original, handler, root, fn) {\n var pfx = root ? 'r' : '$'\n if (!type || type == '*') {\n // search the whole registry\n for (var t in map) {\n if (t.charAt(0) == pfx) {\n forAll(element, t.substr(1), original, handler, root, fn)\n }\n }\n } else {\n var i = 0, l, list = map[pfx + type], all = element == '*'\n if (!list) return\n for (l = list.length; i < l; i++) {\n if ((all || list[i].matches(element, original, handler)) && !fn(list[i], list, i, type)) return\n }\n }\n }\n\n , has = function (element, type, original, root) {\n // we're not using forAll here simply because it's a bit slower and this\n // needs to be fast\n var i, list = map[(root ? 'r' : '$') + type]\n if (list) {\n for (i = list.length; i--;) {\n if (!list[i].root && list[i].matches(element, original, null)) return true\n }\n }\n return false\n }\n\n , get = function (element, type, original, root) {\n var entries = []\n forAll(element, type, original, null, root, function (entry) {\n return entries.push(entry)\n })\n return entries\n }\n\n , put = function (entry) {\n var has = !entry.root && !this.has(entry.element, entry.type, null, false)\n , key = (entry.root ? 'r' : '$') + entry.type\n ;(map[key] || (map[key] = [])).push(entry)\n return has\n }\n\n , del = function (entry) {\n forAll(entry.element, entry.type, null, entry.handler, entry.root, function (entry, list, i) {\n list.splice(i, 1)\n entry.removed = true\n if (list.length === 0) delete map[(entry.root ? 'r' : '$') + entry.type]\n return false\n })\n }\n\n // dump all entries, used for onunload\n , entries = function () {\n var t, entries = []\n for (t in map) {\n if (t.charAt(0) == '$') entries = entries.concat(map[t])\n }\n return entries\n }\n\n return { has: has, get: get, put: put, del: del, entries: entries }\n }())\n\n // we need a selector engine for delegated events, use querySelectorAll if it exists\n // but for older browsers we need Qwery, Sizzle or similar\n , selectorEngine\n , setSelectorEngine = function (e) {\n if (!arguments.length) {\n selectorEngine = doc.querySelectorAll\n ? function (s, r) {\n return r.querySelectorAll(s)\n }\n : function () {\n throw new Error('Bean: No selector engine installed') // eeek\n }\n } else {\n selectorEngine = e\n }\n }\n\n // we attach this listener to each DOM event that we need to listen to, only once\n // per event type per DOM element\n , rootListener = function (event, type) {\n if (!W3C_MODEL && type && event && event.propertyName != '_on' + type) return\n\n var listeners = registry.get(this, type || event.type, null, false)\n , l = listeners.length\n , i = 0\n\n event = new Event(event, this, true)\n if (type) event.type = type\n\n // iterate through all handlers registered for this type, calling them unless they have\n // been removed by a previous handler or stopImmediatePropagation() has been called\n for (; i < l && !event.isImmediatePropagationStopped(); i++) {\n if (!listeners[i].removed) listeners[i].handler.call(this, event)\n }\n }\n\n // add and remove listeners to DOM elements\n , listener = W3C_MODEL\n ? function (element, type, add) {\n // new browsers\n element[add ? addEvent : removeEvent](type, rootListener, false)\n }\n : function (element, type, add, custom) {\n // IE8 and below, use attachEvent/detachEvent and we have to piggy-back propertychange events\n // to simulate event bubbling etc.\n var entry\n if (add) {\n registry.put(entry = new RegEntry(\n element\n , custom || type\n , function (event) { // handler\n rootListener.call(element, event, custom)\n }\n , rootListener\n , null\n , null\n , true // is root\n ))\n if (custom && element['_on' + custom] == null) element['_on' + custom] = 0\n entry.target.attachEvent('on' + entry.eventType, entry.handler)\n } else {\n entry = registry.get(element, custom || type, rootListener, true)[0]\n if (entry) {\n entry.target.detachEvent('on' + entry.eventType, entry.handler)\n registry.del(entry)\n }\n }\n }\n\n , once = function (rm, element, type, fn, originalFn) {\n // wrap the handler in a handler that does a remove as well\n return function () {\n fn.apply(this, arguments)\n rm(element, type, originalFn)\n }\n }\n\n , removeListener = function (element, orgType, handler, namespaces) {\n var type = orgType && orgType.replace(nameRegex, '')\n , handlers = registry.get(element, type, null, false)\n , removed = {}\n , i, l\n\n for (i = 0, l = handlers.length; i < l; i++) {\n if ((!handler || handlers[i].original === handler) && handlers[i].inNamespaces(namespaces)) {\n // TODO: this is problematic, we have a registry.get() and registry.del() that\n // both do registry searches so we waste cycles doing this. Needs to be rolled into\n // a single registry.forAll(fn) that removes while finding, but the catch is that\n // we'll be splicing the arrays that we're iterating over. Needs extra tests to\n // make sure we don't screw it up. @rvagg\n registry.del(handlers[i])\n if (!removed[handlers[i].eventType] && handlers[i][eventSupport])\n removed[handlers[i].eventType] = { t: handlers[i].eventType, c: handlers[i].type }\n }\n }\n // check each type/element for removed listeners and remove the rootListener where it's no longer needed\n for (i in removed) {\n if (removed.hasOwnProperty(i)) {\n if (!registry.has(element, removed[i].t, null, false)) {\n // last listener of this type, remove the rootListener\n listener(element, removed[i].t, false, removed[i].c)\n }\n }\n }\n }\n\n // set up a delegate helper using the given selector, wrap the handler function\n , delegate = function (selector, fn) {\n //TODO: findTarget (therefore $) is called twice, once for match and once for\n // setting e.currentTarget, fix this so it's only needed once\n var findTarget = function (target, root) {\n var i, array = isString(selector) ? selectorEngine(selector, root) : selector\n for (; target && target !== root; target = target.parentNode) {\n for (i = array.length; i--;) {\n if (array[i] === target) return target\n }\n }\n }\n , handler = function (e) {\n var match = findTarget(e.target, this)\n if (match) fn.apply(match, arguments)\n }\n\n // __beanDel isn't pleasant but it's a private function, not exposed outside of Bean\n handler.__beanDel = {\n ft : findTarget // attach it here for customEvents to use too\n , selector : selector\n }\n return handler\n }\n\n , fireListener = W3C_MODEL ? function (isNative, type, element) {\n // modern browsers, do a proper dispatchEvent()\n var evt = doc.createEvent(isNative ? 'HTMLEvents' : 'UIEvents')\n evt[isNative ? 'initEvent' : 'initUIEvent'](type, true, true, win, 1)\n element.dispatchEvent(evt)\n } : function (isNative, type, element) {\n // old browser use onpropertychange, just increment a custom property to trigger the event\n element = targetElement(element, isNative)\n isNative ? element.fireEvent('on' + type, doc.createEventObject()) : element['_on' + type]++\n }\n\n /**\n * Public API: off(), on(), add(), (remove()), one(), fire(), clone()\n */\n\n /**\n * off(element[, eventType(s)[, handler ]])\n */\n , off = function (element, typeSpec, fn) {\n var isTypeStr = isString(typeSpec)\n , k, type, namespaces, i\n\n if (isTypeStr && typeSpec.indexOf(' ') > 0) {\n // off(el, 't1 t2 t3', fn) or off(el, 't1 t2 t3')\n typeSpec = str2arr(typeSpec)\n for (i = typeSpec.length; i--;)\n off(element, typeSpec[i], fn)\n return element\n }\n\n type = isTypeStr && typeSpec.replace(nameRegex, '')\n if (type && customEvents[type]) type = customEvents[type].base\n\n if (!typeSpec || isTypeStr) {\n // off(el) or off(el, t1.ns) or off(el, .ns) or off(el, .ns1.ns2.ns3)\n if (namespaces = isTypeStr && typeSpec.replace(namespaceRegex, '')) namespaces = str2arr(namespaces, '.')\n removeListener(element, type, fn, namespaces)\n } else if (isFunction(typeSpec)) {\n // off(el, fn)\n removeListener(element, null, typeSpec)\n } else {\n // off(el, { t1: fn1, t2, fn2 })\n for (k in typeSpec) {\n if (typeSpec.hasOwnProperty(k)) off(element, k, typeSpec[k])\n }\n }\n\n return element\n }\n\n /**\n * on(element, eventType(s)[, selector], handler[, args ])\n */\n , on = function(element, events, selector, fn) {\n var originalFn, type, types, i, args, entry, first\n\n //TODO: the undefined check means you can't pass an 'args' argument, fix this perhaps?\n if (selector === undefined && typeof events == 'object') {\n //TODO: this can't handle delegated events\n for (type in events) {\n if (events.hasOwnProperty(type)) {\n on.call(this, element, type, events[type])\n }\n }\n return\n }\n\n if (!isFunction(selector)) {\n // delegated event\n originalFn = fn\n args = slice.call(arguments, 4)\n fn = delegate(selector, originalFn, selectorEngine)\n } else {\n args = slice.call(arguments, 3)\n fn = originalFn = selector\n }\n\n types = str2arr(events)\n\n // special case for one(), wrap in a self-removing handler\n if (this === ONE) {\n fn = once(off, element, events, fn, originalFn)\n }\n\n for (i = types.length; i--;) {\n // add new handler to the registry and check if it's the first for this element/type\n first = registry.put(entry = new RegEntry(\n element\n , types[i].replace(nameRegex, '') // event type\n , fn\n , originalFn\n , str2arr(types[i].replace(namespaceRegex, ''), '.') // namespaces\n , args\n , false // not root\n ))\n if (entry[eventSupport] && first) {\n // first event of this type on this element, add root listener\n listener(element, entry.eventType, true, entry.customType)\n }\n }\n\n return element\n }\n\n /**\n * add(element[, selector], eventType(s), handler[, args ])\n *\n * Deprecated: kept (for now) for backward-compatibility\n */\n , add = function (element, events, fn, delfn) {\n return on.apply(\n null\n , !isString(fn)\n ? slice.call(arguments)\n : [ element, fn, events, delfn ].concat(arguments.length > 3 ? slice.call(arguments, 5) : [])\n )\n }\n\n /**\n * one(element, eventType(s)[, selector], handler[, args ])\n */\n , one = function () {\n return on.apply(ONE, arguments)\n }\n\n /**\n * fire(element, eventType(s)[, args ])\n *\n * The optional 'args' argument must be an array, if no 'args' argument is provided\n * then we can use the browser's DOM event system, otherwise we trigger handlers manually\n */\n , fire = function (element, type, args) {\n var types = str2arr(type)\n , i, j, l, names, handlers\n\n for (i = types.length; i--;) {\n type = types[i].replace(nameRegex, '')\n if (names = types[i].replace(namespaceRegex, '')) names = str2arr(names, '.')\n if (!names && !args && element[eventSupport]) {\n fireListener(nativeEvents[type], type, element)\n } else {\n // non-native event, either because of a namespace, arguments or a non DOM element\n // iterate over all listeners and manually 'fire'\n handlers = registry.get(element, type, null, false)\n args = [false].concat(args)\n for (j = 0, l = handlers.length; j < l; j++) {\n if (handlers[j].inNamespaces(names)) {\n handlers[j].handler.apply(element, args)\n }\n }\n }\n }\n return element\n }\n\n /**\n * clone(dstElement, srcElement[, eventType ])\n *\n * TODO: perhaps for consistency we should allow the same flexibility in type specifiers?\n */\n , clone = function (element, from, type) {\n var handlers = registry.get(from, type, null, false)\n , l = handlers.length\n , i = 0\n , args, beanDel\n\n for (; i < l; i++) {\n if (handlers[i].original) {\n args = [ element, handlers[i].type ]\n if (beanDel = handlers[i].handler.__beanDel) args.push(beanDel.selector)\n args.push(handlers[i].original)\n on.apply(null, args)\n }\n }\n return element\n }\n\n , bean = {\n 'on' : on\n , 'add' : add\n , 'one' : one\n , 'off' : off\n , 'remove' : off\n , 'clone' : clone\n , 'fire' : fire\n , 'Event' : Event\n , 'setSelectorEngine' : setSelectorEngine\n , 'noConflict' : function () {\n context[name] = old\n return this\n }\n }\n\n // for IE, clean up on unload to avoid leaks\n if (win.attachEvent) {\n var cleanup = function () {\n var i, entries = registry.entries()\n for (i in entries) {\n if (entries[i].type && entries[i].type !== 'unload') off(entries[i].element, entries[i].type)\n }\n win.detachEvent('onunload', cleanup)\n win.CollectGarbage && win.CollectGarbage()\n }\n win.attachEvent('onunload', cleanup)\n }\n\n // initialize selector engine to internal default (qSA or throw Error)\n setSelectorEngine(Ink.ss)\n\n return bean\n });\n\n /**\n * Keep this declaration here and off Bean as it extends the Event\n * object and some properties are readonly in strict mode\n */\n 'use strict';\n\n var InkEvent = {\n\n KEY_BACKSPACE: 8,\n KEY_TAB: 9,\n KEY_RETURN: 13,\n KEY_ESC: 27,\n KEY_SPACE: 32,\n KEY_LEFT: 37,\n KEY_UP: 38,\n KEY_RIGHT: 39,\n KEY_DOWN: 40,\n KEY_DELETE: 46,\n KEY_HOME: 36,\n KEY_END: 35,\n KEY_PAGEUP: 33,\n KEY_PAGEDOWN: 34,\n KEY_INSERT: 45,\n \n /**\n * Creates a throttled version of a function.\n * Returns a function which calls `func`, waiting at least `wait` milliseconds between calls. This is useful for events such as `scroll` or `resize`, which can be triggered too many times per second, slowing down the browser with needless function calls.\n *\n * *note:* This does not delay the first function call to the function.\n *\n * @method throttle\n * @param {Function} func Function to call. Arguments and context are both passed.\n * @param {Number} [wait]=0 Milliseconds to wait between calls.\n * @return {Function} A function throttled which will only be called at most every `wait` milliseconds.\n * @sample Ink_Dom_Event_1_throttle.html \n **/\n throttle: function (func, wait) {\n wait = wait || 0;\n var lastCall = 0; // Warning: This breaks on Jan 1st 1970 0:00\n var timeout;\n function throttled() {\n var now = +new Date();\n var timeDiff = now - lastCall;\n if (timeDiff >= wait) {\n lastCall = now;\n return func.apply(this, [].slice.call(arguments));\n } else {\n var that = this;\n var args = [].slice.call(arguments);\n\n if (timeout) {\n // Clear the old timeout because that one has old arguments\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(function () {\n timeout = null;\n return throttled.apply(that, args);\n }, wait - timeDiff);\n }\n }\n return throttled;\n },\n\n /**\n * Gets the event's target element.\n *\n * @method element\n * @param {Object} ev Event object\n * @return {Element} The target\n * @public\n * @sample Ink_Dom_Event_1_element.html \n */\n element: function(ev) {\n var node = ev.delegationTarget ||\n ev.target ||\n // IE stuff\n (ev.type === 'mouseout' && ev.fromElement) ||\n (ev.type === 'mouseleave' && ev.fromElement) ||\n (ev.type === 'mouseover' && ev.toElement) ||\n (ev.type === 'mouseenter' && ev.toElement) ||\n ev.srcElement ||\n null;\n return node && (node.nodeType === 3 || node.nodeType === 4) ? node.parentNode : node;\n },\n\n /**\n * Gets the event's related target element.\n *\n * @method relatedTarget\n * @param {Object} ev event object\n * @return {DOMNode} The related target\n * @sample Ink_Dom_Event_1_relatedTarget.html \n */\n relatedTarget: function(ev){\n var node = ev.relatedTarget ||\n // IE stuff\n (ev.type === 'mouseout' && ev.toElement) ||\n (ev.type === 'mouseleave' && ev.toElement) ||\n (ev.type === 'mouseover' && ev.fromElement) ||\n (ev.type === 'mouseenter' && ev.fromElement) ||\n null;\n return node && (node.nodeType === 3 || node.nodeType === 4) ? node.parentNode : node;\n },\n\n /**\n * Find closest ancestor element by tag name related to the event target.\n * Navigate up the DOM tree, looking for a tag with the name `elmTagName`.\n *\n * If such tag is not found, `document` is returned.\n *\n * @method findElement\n * @param {Object} ev Event object\n * @param {String} elmTagName Tag name to find\n * @param {Boolean} [force]=false Flag to skip returning `document` and to return `false` instead.\n * @return {DOMElement} the first element which matches given tag name or the document element if the wanted tag is not found\n * @sample Ink_Dom_Event_1_findElement.html \n */\n findElement: function(ev, elmTagName, force)\n {\n var node = this.element(ev);\n while(true) {\n if(node.nodeName.toLowerCase() === elmTagName.toLowerCase()) {\n return node;\n } else {\n node = node.parentNode;\n if(!node) {\n if(force) {\n return false;\n }\n return document;\n }\n if(!node.parentNode){\n if(force){ return false; }\n return document;\n }\n }\n }\n },\n\n /**\n * Attaches an event to element\n *\n * @method observe\n * @param {DOMElement|String} element Element id or element\n * @param {String} eventName Event name\n * @param {Function} callBack Receives the event object as a parameter. If you're manually firing custom events, check it's eventName property to make sure you're handling the right event.\n * @param {Boolean} [useCapture] Flag to change event listening from bubbling to capture.\n * @return {Function} The event handler used. Hang on to this if you want to `stopObserving` later.\n * @sample Ink_Dom_Event_1_observe.html \n */\n observe: function(element, eventName, callBack, useCapture) {\n element = Ink.i(element);\n if(element) {\n if(element.addEventListener) {\n element.addEventListener(eventName, callBack, !!useCapture);\n } else {\n element.attachEvent('on' + eventName, (callBack = Ink.bind(callBack, element)));\n }\n return callBack;\n }\n },\n\n /**\n * Like observe, but listen to the event only once.\n *\n * @method observeOnce\n * @param {DOMElement|String} element Element id or element\n * @param {String} eventName Event name\n * @param {Function} callBack Receives the event object as a parameter. If you're manually firing custom events, check it's eventName property to make sure you're handling the right event.\n * @param {Boolean} [useCapture] Flag to change event listening from bubbling to capture.\n * @return {Function} The event handler used. Hang on to this if you want to `stopObserving` later.\n * @sample Ink_Dom_Event_1_observeOnce.html \n */\n observeOnce: function (element, eventName, callBack, useCapture) {\n var onceBack = function () {\n InkEvent.stopObserving(element, eventName, handler);\n return callBack.apply(this, arguments);\n };\n var handler = InkEvent.observe(element, eventName, onceBack, useCapture);\n return handler;\n },\n\n /**\n * Attaches an event to a selector or array of elements.\n *\n * @method observeMulti\n * @param {Array|String} elements Array of elements which are going to be observed. A selector is acceptable too.\n * @param {String} eventName Event name\n * @param {Function} callBack Receives the event object as a parameter. If you're manually firing custom events, check it's eventName property to make sure you're handling the right event.\n * @param {Boolean} [useCapture] Flag change event listening from bubbling to capture.\n * @return {Function} The used callback.\n * @sample Ink_Dom_Event_1_observeMulti.html \n */\n observeMulti: function (elements, eventName, callBack, useCapture) {\n if (typeof elements === 'string') {\n elements = Ink.ss(elements);\n } else if ( /* is an element */ elements && elements.nodeType === 1) {\n elements = [elements];\n }\n if (!elements[0]) { return false; }\n\n for (var i = 0, len = elements.length; i < len; i++) {\n this.observe(elements[i], eventName, callBack, useCapture);\n }\n return callBack;\n },\n\n /**\n * Observes an event on an element and its descendants matching the selector.\n *\n * Requires Ink.Dom.Selector if you need to use a selector.\n *\n * @method observeDelegated\n * @param {Element|String} element Element to observe.\n * @param {String} eventName Event name to observe.\n * @param {String} selector Child element selector. When null, finds any element.\n * @param {Function} callback Callback to be called when the event is fired\n * @return {Function} The used callback, for ceasing to listen to the event later.\n * @public\n * @sample Ink_Dom_Event_1_observeDelegated.html \n **/\n observeDelegated: function (element, eventName, selector, callback) {\n return InkEvent.observe(element, eventName, function (event) {\n var fromElement = InkEvent.element(event);\n if (!fromElement || fromElement === element) { return; }\n\n var cursor = fromElement;\n\n // Go up the document tree until we hit the element itself.\n while (cursor !== element && cursor !== document && cursor) {\n if (Ink.Dom.Selector_1.matchesSelector(cursor, selector)) {\n event.delegationTarget = cursor;\n return callback(event);\n }\n cursor = cursor.parentNode;\n }\n });\n },\n\n /**\n * Removes an event attached to an element.\n *\n * @method stopObserving\n * @param {DOMElement|String} element Element id or element\n * @param {String} eventName Event name\n * @param {Function} callBack Callback function\n * @param {Boolean} [useCapture] Set to true if the event was being observed with useCapture set to true as well.\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stopObserving.html \n */\n stopObserving: function(element, eventName, callBack, useCapture) {\n element = Ink.i(element);\n\n if(element) {\n if(element.removeEventListener) {\n element.removeEventListener(eventName, callBack, !!useCapture);\n } else {\n element.detachEvent('on' + eventName, callBack);\n }\n }\n },\n\n /**\n * Stops event propagation and bubbling.\n *\n * @method stop\n * @param {Object} event Event handle\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stop.html \n */\n stop: function(event)\n {\n if(event.cancelBubble !== null) {\n event.cancelBubble = true;\n }\n if(event.stopPropagation) {\n event.stopPropagation();\n }\n if(event.preventDefault) {\n event.preventDefault();\n }\n if(window.attachEvent) {\n event.returnValue = false;\n }\n if(event.cancel !== null) {\n event.cancel = true;\n }\n },\n\n /**\n * Stops event propagation.\n *\n * @method stopPropagation\n * @param {Object} event Event handle\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stopPropagation.html \n */\n stopPropagation: function(event) {\n if(event.cancelBubble !== null) {\n event.cancelBubble = true;\n }\n if(event.stopPropagation) {\n event.stopPropagation();\n }\n },\n\n /**\n * Stops event default behaviour.\n *\n * @method stopDefault\n * @param {Object} event Event handle\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stopDefault.html \n */\n stopDefault: function(event)\n {\n if(event.preventDefault) {\n event.preventDefault();\n }\n if(window.attachEvent) {\n event.returnValue = false;\n }\n if(event.cancel !== null) {\n event.cancel = true;\n }\n },\n\n /**\n * Gets the pointer's coordinates from the event object.\n *\n * @method pointer\n * @param {Object} ev Event object\n * @return {Object} An object with the mouse X and Y position\n * @public\n * @sample Ink_Dom_Event_1_pointer.html \n */\n pointer: function(ev)\n {\n return {\n x: this.pointerX(ev),\n y: this.pointerY(ev)\n };\n },\n\n /**\n * Gets the pointer's X coordinate.\n *\n * @method pointerX\n * @param {Object} ev Event object\n * @return {Number} Mouse X position\n * @public\n */\n pointerX: function(ev)\n {\n return (ev.touches && ev.touches[0] && ev.touches[0].clientX) ||\n (ev.pageX) ||\n (ev.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));\n },\n\n /**\n * Gets the pointer's Y coordinate.\n *\n * @method pointerY\n * @param {Object} ev Event object\n * @return {Number} Mouse Y position\n * @public\n */\n pointerY: function(ev)\n {\n return (ev.touches && ev.touches[0] && ev.touches[0].clientY) ||\n (ev.pageY) ||\n (ev.clientY + (document.documentElement.scrollTop || document.body.scrollTop));\n },\n\n /**\n * Checks if an event is a left click.\n *\n * @method isLeftClick\n * @param {Object} ev Event object\n * @return {Boolean} True if the event is a left click\n * @public\n * @sample Ink_Dom_Event_1_isLeftClick.html \n */\n isLeftClick: function(ev) {\n if (window.addEventListener) {\n if(ev.button === 0){\n return true;\n } else if(ev.type === 'touchend' && ev.button === null){\n // [todo] do the above check for pointerEvents too\n return true;\n }\n }\n else {\n if(ev.button === 1){ return true; }\n }\n return false;\n },\n\n /**\n * Checks if an event is a right click.\n *\n * @method isRightClick\n * @param {Object} ev Event object\n * @return {Boolean} True if the event is a right click\n * @public\n * @sample Ink_Dom_Event_1_isRightClick.html \n */\n isRightClick: function(ev) {\n return (ev.button === 2);\n },\n\n /**\n * Checks if an event is a middle click.\n *\n * @method isMiddleClick\n * @param {Object} ev Event object\n * @return {Boolean} True if the event is a middle click\n * @public\n * @sample Ink_Dom_Event_1_isMiddleClick.html \n */\n isMiddleClick: function(ev) {\n if (window.addEventListener) {\n return (ev.button === 1);\n }\n else {\n return (ev.button === 4);\n }\n return false;\n },\n\n /**\n * Gets character from an event.\n *\n * @method getCharFromKeyboardEvent\n * @param {Object} event Keyboard event\n * @param {Boolean} [changeCasing] If true uppercases, if false lowercases, otherwise keeps casing\n * @return {String} Character representation of pressed key combination\n * @public\n * @sample Ink_Dom_Event_1_getCharFromKeyboardEvent.html \n */\n getCharFromKeyboardEvent: function(event, changeCasing) {\n var k = event.keyCode;\n var c = String.fromCharCode(k);\n\n var shiftOn = event.shiftKey;\n if (k >= 65 && k <= 90) { // A-Z\n if (typeof changeCasing === 'boolean') {\n shiftOn = changeCasing;\n }\n return (shiftOn) ? c : c.toLowerCase();\n }\n else if (k >= 96 && k <= 105) { // numpad digits\n return String.fromCharCode( 48 + (k-96) );\n }\n switch (k) {\n case 109: case 189: return '-';\n case 107: case 187: return '+';\n }\n return c;\n },\n\n debug: function(){}\n};\n\n/**\n * Lets you attach event listeners to both elements and objects.\n * http://github.com/fat/bean#on\n *\n * @method on\n * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object\n * @param {String} eventType An Event (or multiple events, space separated) to listen to\n * @param {String} [selector] A CSS DOM Element selector string to bind the listener to child elements matching the selector\n * @param {Function} [handler] The callback function\n * @param {Object} [args...] Additional arguments to pass to the callback function when triggered\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_on.html \n */\n\n/**\n * Alias for `on` but will only be executed once.\n * bean.one() is an alias for bean.on() except that the handler will only be executed once and then removed for the event type(s).\n * http://github.com/fat/bean#one\n *\n * @method one\n * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object\n * @param {String} eventType An Event (or multiple events, space separated) to listen to\n * @param {String} [selector] A CSS DOM Element selector string to bind the listener to child elements matching the selector\n * @param {Function} [handler] The callback function\n * @param [args...] Additional arguments to pass to the callback function when triggered\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_one.html \n */\n\n/**\n * Removes event handlers.\n * bean.off() is how you get rid of handlers once you no longer want them active. It's also a good idea to call off on elements before you remove them from your DOM; this gives Bean a chance to clean up some things and prevents memory leaks.\n * http://github.com/fat/bean#off\n *\n * @method off\n * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object\n * @param {String} eventType An Event (or multiple events, space separated) to remove\n * @param {Function} [handler] The specific callback function to remove\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_off.html \n */\n\n/**\n * Clones events from one object to another\n * bean.clone() is a method for cloning events from one DOM element or object to another.\n * http://github.com/fat/bean#clone\n *\n * @method clone\n * @param {DOMElement|Object} destElement An HTML DOM element or any JavaScript Object to copy events to\n * @param {String} srcElement An HTML DOM element or any JavaScript Object to copy events from\n * @param {String} [eventType] An Event (or multiple events, space separated) to clone\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_clone.html \n */\n\n/**\n * Triggers events.\n * http://github.com/fat/bean#fire\n *\n * @method fire\n * @param {DOMElement|Object} destElement An HTML DOM element or any JavaScript Object fire the event on\n * @param {String} eventType An Event (or multiple events, space separated) to fire\n * @param [args...] Additional arguments to pass to the callback function when triggered\n *\n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_fire.html \n */\n\nreturn Ink.extendObj(InkEvent, bean);\n\n});\n","/**\n * @module Ink.Dom.FormSerialize_1\n * Two way serialization of form data and javascript objects.\n * Valid applications are ad hoc AJAX/syndicated submission of forms, restoring form values from server side state, etc.\n */\n\nInk.createModule('Ink.Dom.FormSerialize', 1, ['Ink.Util.Array_1', 'Ink.Dom.Element_1', 'Ink.Dom.Selector_1'], function (InkArray, InkElement, Selector) {\n 'use strict';\n\n // Check whether something is not a string or a DOM element, but still has length.\n function isArrayIsh(obj) {\n return obj != null &&\n (!InkElement.isDOMElement(obj)) &&\n (InkArray.isArray(obj) || (typeof obj !== 'string' && typeof obj.length === 'number'));\n }\n\n function toArray(obj) {\n if (isArrayIsh(obj)) { return obj; }\n else { return [obj]; }\n }\n\n /**\n * @namespace Ink.Dom.FormSerialize\n * @static\n **/\n var FormSerialize = {\n\n /**\n * Serializes a form element into a JS object\n * It turns field *names* (not IDs!) into keys and field values into values.\n *\n * note: Multi-select and checkboxes with multiple values will result in arrays\n *\n * @method serialize\n * @param {DOMElement|String} form Form element to extract data\n * @param {Object} [options] Options object, containing:\n * @param {Boolean} [options.outputUnchecked=false] Whether to emit unchecked checkboxes and unselected radio buttons.\n * @return {Object} Map of fieldName -> String|String[]|Boolean\n * @sample Ink_Dom_FormSerialize_serialize.html \n */\n serialize: function(form, options) {\n options = options || {};\n var out = {};\n var emptyArrayToken = {}; // A hack so that empty select[multiple] elements appear although empty.\n\n var pairs = this.asPairs(form, { elements: true, emptyArray: emptyArrayToken, outputUnchecked: options.outputUnchecked });\n if (pairs == null) { return pairs; }\n InkArray.forEach(pairs, function (pair) {\n var name = pair[0].replace(/\\[\\]$/, '');\n var value = pair[1];\n var el = pair[2];\n\n if (value === emptyArrayToken) {\n out[name] = []; // It's an empty select[multiple]\n } else if (!(FormSerialize._resultsInArray(el) || /\\[\\]$/.test(pair[0]))) {\n out[name] = value;\n } else {\n out[name] = out[name] || [];\n out[name].push(value);\n }\n });\n\n return out;\n },\n\n /**\n * Like `serialize`, but returns an array of [fieldName, value] pairs.\n *\n * @method asPairs\n * @param {DOMElement|String} form Form element\n * @param {Object} [options] Options object, containing:\n * @param {Boolean} [options.elements] Instead of returning an array of [fieldName, value] pairs, return an array of [fieldName, value, fieldElement] triples.\n * @param {Boolean} [options.emptyArray] What to emit as the value of an empty select[multiple]. If you don't pass this option, nothing comes out.\n * @param {Boolean} [options.outputUnchecked=false] Whether to emit unchecked checkboxes and unselected radio buttons.\n * @return {Array} Array of [fieldName, value] pairs.\n **/\n asPairs: function (form, options) {\n var out = [];\n options = options || {};\n\n function emit(name, val, el) {\n if (options.elements) {\n out.push([name, val, el]);\n } else {\n out.push([name, val]);\n }\n }\n\n function serializeEl(el) {\n var elNodeName = el.nodeName.toLowerCase();\n var elType = (el.type + '').toLowerCase();\n\n if (elNodeName === 'select' && el.multiple) {\n var didEmit = false;\n InkArray.forEach(Selector.select('option:checked', el), function (thisOption) {\n emit(el.name, thisOption.value, el);\n didEmit = true;\n });\n if (!didEmit && 'emptyArray' in options) {\n emit(el.name, options.emptyArray, el);\n }\n } else if (elNodeName === 'input' && (elType === 'checkbox' || elType === 'radio') && options.outputUnchecked) {\n // It's an empty checkbox and we wouldn't emit it otherwise but the user asked for it using outputUnchecked\n emit(el.name, null, el);\n } else {\n emit(el.name, el.value, el);\n }\n }\n\n if ((form = Ink.i(form))) {\n var inputs = InkArray.filter(form.elements, function (elm) {\n return FormSerialize._isSerialized(elm, options);\n });\n for (var i = 0, len = inputs.length; i < len; i++) {\n serializeEl(inputs[i]);\n }\n return out;\n }\n\n return null;\n },\n\n /**\n * Sets form elements' values with values from an object\n *\n * Note: You can't set the values of an input with `type=\"file\"` (browser prohibits it)\n *\n * @method fillIn \n * @param {Element|String} form Form element to be populated\n * @param {Object|Array} map2 Mapping of fields to values contained in fields. Can be a hash (keys as names, strings or arrays for values), or an array of [name, value] pairs.\n * @return {void}\n * @sample Ink_Dom_FormSerialize_fillIn.html \n */\n fillIn: function(form, map2) {\n if (!(form = Ink.i(form))) { return null; }\n\n var pairs;\n\n if (typeof map2 === 'object' && !isArrayIsh(map2)) {\n pairs = FormSerialize._objToPairs(map2);\n } else if (isArrayIsh(map2)) {\n pairs = map2;\n } else {\n return null;\n }\n\n return FormSerialize._fillInPairs(form, pairs);\n },\n\n _objToPairs: function (obj) {\n var pairs = [];\n var val;\n for (var name in obj) if (obj.hasOwnProperty(name)) {\n val = toArray(obj[name]);\n for (var i = 0, len = val.length; i < len; i++) {\n pairs.push([name, val[i]]);\n }\n if (len === 0) {\n pairs.push([name, []]);\n }\n }\n return pairs;\n },\n\n _fillInPairs: function (form, pairs) {\n pairs = InkArray.groupBy(pairs, {\n key: function (pair) { return pair[0].replace(/\\[\\]$/, ''); }\n });\n\n // For each chunk...\n pairs = InkArray.map(pairs, function (pair) {\n // Join the items in the chunk by concatenating the values together and leaving the names alone\n var values = InkArray.reduce(pair, function (left, right) {\n return [null, left[1].concat([right[1]])];\n }, [null, []])[1];\n return [pair[0][0], values];\n });\n\n var name;\n var inputs;\n var values;\n for (var i = 0, len = pairs.length; i < len; i++) {\n name = pairs[i][0];\n\n if (name in form) {\n inputs = form[name];\n } else if ((name + '[]') in form) {\n inputs = form[name + '[]'];\n name = name + '[]';\n } else {\n continue;\n }\n\n inputs = toArray(inputs);\n values = pairs[i][1];\n\n FormSerialize._fillInOne(name, inputs, values);\n }\n },\n\n _fillInOne: function (name, inputs, values) {\n var firstOne = inputs[0];\n var firstNodeName = firstOne.nodeName.toLowerCase();\n var firstType = firstOne.getAttribute('type');\n firstType = firstType && firstType.toLowerCase();\n var isSelectMulti = firstNodeName === 'select' && InkElement.hasAttribute(firstOne, 'multiple');\n\n if (firstType === 'checkbox' || firstType === 'radio') {\n FormSerialize._fillInBoolean(inputs, values, 'checked');\n } else if (isSelectMulti) {\n FormSerialize._fillInBoolean(inputs[0].options, values, 'selected');\n } else {\n if (inputs.length !== values.length) {\n Ink.warn('Form had ' + inputs.length + ' inputs named \"' + name + '\", but received ' + values.length + ' values.');\n }\n\n for (var i = 0, len = Math.min(inputs.length, values.length); i < len; i += 1) {\n inputs[i].value = values[i];\n }\n }\n },\n\n _fillInBoolean: function (inputs, values, checkAttr /* 'selected' or 'checked' */) {\n InkArray.forEach(inputs, function (input) {\n var isChecked = InkArray.inArray(input.value, values);\n input[checkAttr] = isChecked;\n });\n },\n\n /**\n * Whether FormSerialize.serialize() should produce an array when looking at this element.\n * @method _resultsInArray\n * @private\n * @param element\n **/\n _resultsInArray: function (element) {\n var type = element.getAttribute('type');\n var nodeName = element.nodeName.toLowerCase();\n\n return type === 'checkbox' ||\n (nodeName === 'select' && InkElement.hasAttribute(element, 'multiple'));\n },\n\n _isSerialized: function (element, options) {\n options = options || {};\n if (!InkElement.isDOMElement(element)) { return false; }\n if (!InkElement.hasAttribute(element, 'name')) { return false; }\n\n var nodeName = element.nodeName.toLowerCase();\n\n if (!nodeName || nodeName === 'fieldset') { return false; }\n\n if (element.type === 'checkbox' || element.type === 'radio') {\n if (options.outputUnchecked) { return true; }\n return !!element.checked;\n }\n\n return true;\n }\n };\n\n return FormSerialize;\n});\n","/**\n * Execute code only when the DOM is loaded.\n * @module Ink.Dom.Loaded_1\n * @version 1\n */\n \nInk.createModule('Ink.Dom.Loaded', 1, [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Dom.Loaded_1\n **/\n var Loaded = {\n\n /**\n * Callbacks and their contexts. Array of 2-arrays.\n *\n * []\n *\n * @attribute _contexts Array\n * @private\n * \n */\n _contexts: [], // Callbacks' queue\n\n /**\n * Specify a function to execute when the DOM is fully loaded.\n *\n * @method run\n * @param {Object} [win]=window Window object to attach/add the event\n * @param {Function} fn Callback function to be executed after the DOM is ready\n * @return {void}\n * @public\n * @sample Ink_Dom_Loaded_run.html \n */\n run: function(win, fn) {\n if (!fn) {\n fn = win;\n win = window;\n }\n\n var context;\n\n for (var i = 0, len = this._contexts.length; i < len; i++) {\n if (this._contexts[i][0] === win) {\n context = this._contexts[i][1];\n break;\n }\n }\n if (!context) {\n context = {\n cbQueue: [],\n win: win,\n doc: win.document,\n root: win.document.documentElement,\n done: false,\n top: true\n };\n context.handlers = {\n checkState: Ink.bindEvent(this._checkState, this, context),\n poll: Ink.bind(this._poll, this, context)\n };\n this._contexts.push(\n [win, context] // Javascript Objects cannot map different windows to\n // different values.\n );\n }\n\n var ael = context.doc.addEventListener;\n context.add = ael ? 'addEventListener' : 'attachEvent';\n context.rem = ael ? 'removeEventListener' : 'detachEvent';\n context.pre = ael ? '' : 'on';\n context.det = ael ? 'DOMContentLoaded' : 'onreadystatechange';\n context.wet = context.pre + 'load';\n\n var csf = context.handlers.checkState;\n var alreadyLoaded = (\n /complete|loaded/.test(context.doc.readyState) &&\n context.win.location.toString() !== 'about:blank'); // https://code.google.com/p/chromium/issues/detail?id=32357\n\n if (alreadyLoaded){\n setTimeout(Ink.bind(function () {\n fn.call(context.win, 'lazy');\n }, this), 0);\n } else {\n context.cbQueue.push(fn);\n\n context.doc[context.add]( context.det , csf );\n context.win[context.add]( context.wet , csf );\n\n var frameElement = 1;\n try{\n frameElement = context.win.frameElement;\n } catch(e) {}\n if ( !ael && context.root && context.root.doScroll ) { // IE HACK\n try {\n context.top = !frameElement;\n } catch(e) { }\n if (context.top) {\n this._poll(context);\n }\n }\n }\n },\n\n /**\n * Function that will be running the callbacks after the page is loaded\n *\n * @method _checkState\n * @param {Event} event Triggered event\n * @private\n */\n _checkState: function(event, context) {\n if ( !event || (event.type === 'readystatechange' && !/complete|loaded/.test(context.doc.readyState))) {\n return;\n }\n var where = (event.type === 'load') ? context.win : context.doc;\n where[context.rem](context.pre+event.type, context.handlers.checkState, false);\n this._ready(context);\n },\n\n /**\n * Polls the load progress of the page to see if it has already loaded or not\n *\n * @method _poll\n * @private\n */\n\n /**\n * (old IE only) wait until a doScroll() call does not throw an error\n *\n * @method _poll\n * @private\n */\n _poll: function(context) {\n try {\n context.root.doScroll('left');\n } catch(e) {\n return setTimeout(context.handlers.poll, 50);\n }\n this._ready(context);\n },\n\n /**\n * Function that runs the callbacks from the queue when the document is ready.\n *\n * @method _ready\n * @private\n */\n _ready: function(context) {\n if (!context.done) {\n context.done = true;\n for (var i = 0; i < context.cbQueue.length; ++i) {\n context.cbQueue[i].call(context.win);\n }\n context.cbQueue = [];\n }\n }\n };\n\n return Loaded;\n\n});\n","/**\n * CSS selector engine\n * @module Ink.Dom.Selector_1\n * @version 1\n */\n \nInk.createModule('Ink.Dom.Selector', 1, [], function() {\n /*jshint forin:false, eqnull:true, noempty:false, expr:true, boss:true, maxdepth:false*/\n\t'use strict';\n\n/*!\n * Sizzle CSS Selector Engine\n * Copyright 2013 jQuery Foundation and other contributors\n * Released under the MIT license\n * http://sizzlejs.com/\n */\n\nvar i,\n\tcachedruns,\n\tExpr,\n\tgetText,\n\tisXML,\n\tcompile,\n\toutermostContext,\n\trecompare,\n\tsortInput,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + -(new Date()),\n\tpreferredDoc = window.document,\n\tsupport = {},\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\thasDuplicate = false,\n\tsortOrder = function() { return 0; },\n\n\t// General-purpose constants\n\tstrundefined = typeof undefined,\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Array methods\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf if we can't use a native one\n\tindexOf = arr.indexOf || function( elem ) {\n\t\tvar i = 0,\n\t\t\tlen = this.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( this[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\toperators = \"([*^$|!~]?=)\",\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:\" + operators + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\n\t// Prefer arguments quoted,\n\t// then not containing pseudos/brackets,\n\t// then attribute selectors/non-parenthetical expressions,\n\t// then anything else\n\t// These preferences are here to reduce the number of selectors\n\t// needing tokenize in the PSEUDO preFilter\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes.replace( 3, 8 ) + \")*)|.*)\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([\\\\x20\\\\t\\\\r\\\\n\\\\f>+~])\" + whitespace + \"*\" ),\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"NAME\": new RegExp( \"^\\\\[name=['\\\"]?(\" + characterEncoding + \")['\\\"]?\\\\]\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trsibling = /[\\x20\\t\\r\\n\\f]*[+~]/,\n\n\trnative = /^[^{]+\\{\\s*\\[native code/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trescape = /'|\\\\/g,\n\trattributeQuotes = /\\=[\\x20\\t\\r\\n\\f]*([^'\"\\]]*)[\\x20\\t\\r\\n\\f]*\\]/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = /\\\\([\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|.)/g,\n\tfunescape = function( _, escaped ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\treturn high !== high ?\n\t\t\tescaped :\n\t\t\t// BMP codepoint\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\n/*\n * For feature detection\n * @param {Function} fn The function to test for native support\n */\nfunction isNative( fn ) {\n\treturn rnative.test( fn + \"\" );\n}\n\n/*\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar cache,\n\t\tkeys = [];\n\n\treturn (cache = function( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key += \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key ] = value);\n\t});\n}\n\n/*\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/*\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( documentIsHTML && !seed ) {\n\n\t\t// Shortcuts\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && !rbuggyQSA.test(selector) ) {\n\t\t\told = true;\n\t\t\tnid = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType === 9 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/*\n * Detect xml\n * @param {Element|Object} elem An element or a document\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/*\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar doc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\n\t// Support tests\n\tdocumentIsHTML = !isXML( doc );\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Check if attributes should be retrieved by attribute nodes\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.innerHTML = \"\";\n\t\tvar type = typeof div.lastChild.getAttribute(\"multiple\");\n\t\t// IE8 returns a string for some attributes even when not present\n\t\treturn type !== \"boolean\" && type !== \"string\";\n\t});\n\n\t// Check if getElementsByClassName can be trusted\n\tsupport.getElementsByClassName = assert(function( div ) {\n\t\t// Opera can't find a second classname (in 9.6)\n\t\tdiv.innerHTML = \"\";\n\t\tif ( !div.getElementsByClassName || !div.getElementsByClassName(\"e\").length ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Safari 3.2 caches class attributes and doesn't catch changes\n\t\tdiv.lastChild.className = \"e\";\n\t\treturn div.getElementsByClassName(\"e\").length === 2;\n\t});\n\n\t// Check if getElementsByName privileges form controls or returns elements by ID\n\t// If so, assume (for broader support) that getElementById returns elements by name\n\tsupport.getByName = assert(function( div ) {\n\t\t// Inject content\n\t\tdiv.id = expando + 0;\n\t\t// Support: Windows 8 Native Apps\n\t\t// Assigning innerHTML with \"name\" attributes throws uncatchable exceptions\n\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx\n\t\tdiv.appendChild( document.createElement(\"a\") ).setAttribute( \"name\", expando );\n\t\tdiv.appendChild( document.createElement(\"i\") ).setAttribute( \"name\", expando );\n\t\tdocElem.appendChild( div );\n\n\t\t// Test\n\t\tvar pass = doc.getElementsByName &&\n\t\t\t// buggy browsers will return fewer than the correct 2\n\t\t\tdoc.getElementsByName( expando ).length === 2 +\n\t\t\t// buggy browsers will return more than the correct 0\n\t\t\tdoc.getElementsByName( expando + 0 ).length;\n\n\t\t// Cleanup\n\t\tdocElem.removeChild( div );\n\n\t\treturn pass;\n\t});\n\n\t// Support: Webkit<537.32\n\t// Detached nodes confoundingly follow *each other*\n\tsupport.sortDetached = assert(function( div1 ) {\n\t\treturn div1.compareDocumentPosition &&\n\t\t\t// Should return 1, but Webkit returns 4 (following)\n\t\t\t(div1.compareDocumentPosition( document.createElement(\"div\") ) & 1);\n\t});\n\n\t// IE6/7 return modified attributes\n\tExpr.attrHandle = assert(function( div ) {\n\t\tdiv.innerHTML = \"
    \";\n\t\treturn div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&\n\t\t\tdiv.firstChild.getAttribute(\"href\") === \"#\";\n\t}) ?\n\t\t{} :\n\t\t{\n\t\t\t\"href\": function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"href\", 2 );\n\t\t\t},\n\t\t\t\"type\": function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"type\");\n\t\t\t}\n\t\t};\n\n\t// ID find and filter\n\tif ( support.getByName ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\n\t\t\t\treturn m ?\n\t\t\t\t\tm.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode(\"id\").value === id ?\n\t\t\t\t\t\t[m] :\n\t\t\t\t\t\tundefined :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t}\n\t\t} :\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Name\n\tExpr.find[\"NAME\"] = support.getByName && function( tag, context ) {\n\t\tif ( typeof context.getElementsByName !== strundefined ) {\n\t\t\treturn context.getElementsByName( name );\n\t\t}\n\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21),\n\t// no need to also add to buggyMatches since matches checks buggyQSA\n\t// A support test would require too much code (would include document ready)\n\trbuggyQSA = [ \":focus\" ];\n\n\tif ( (support.qsa = isNative(doc.querySelectorAll)) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdiv.innerHTML = \"\";\n\n\t\t\t// IE8 - Some boolean attributes are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:checked|disabled|ismap|multiple|readonly|selected|value)\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Opera 10-12/IE8 - ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tif ( div.querySelectorAll(\"[i^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:\\\"\\\"|'')\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = isNative(docElem.contains) || docElem.compareDocumentPosition ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t// Document order sorting\n\tsortOrder = docElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );\n\n\t\tif ( compare ) {\n\t\t\t// Disconnected nodes\n\t\t\tif ( compare & 1 ||\n\t\t\t\t(recompare && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t\tif ( a === doc || contains(preferredDoc, a) ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( b === doc || contains(preferredDoc, b) ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\t// Maintain original order\n\t\t\t\treturn sortInput ?\n\t\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t\t0;\n\t\t\t}\n\n\t\t\treturn compare & 4 ? -1 : 1;\n\t\t}\n\n\t\t// Not directly comparable, sort on existence of method\n\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\t} else if ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\t// rbuggyQSA always contains :focus, so no need for an existence check\n\tif ( support.matchesSelector && documentIsHTML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) {\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch(e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [elem] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\tvar val;\n\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tif ( documentIsHTML ) {\n\t\tname = name.toLowerCase();\n\t}\n\tif ( (val = Expr.attrHandle[ name ]) ) {\n\t\treturn val( elem );\n\t}\n\tif ( !documentIsHTML || support.attributes ) {\n\t\treturn elem.getAttribute( name );\n\t}\n\treturn ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?\n\t\tname :\n\t\tval && val.specified ? val.value : null;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n// Document sorting and removing duplicates\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\t// Compensate for sort limitations\n\trecompare = !support.sortDetached;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\treturn results;\n};\n\n/*\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns Returns -1 if a precedes b, 1 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n// Returns a function to use in pseudos for input types\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n// Returns a function to use in pseudos for buttons\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n// Returns a function to use in pseudos for positionals\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/*\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( ; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (see #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[5] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[4] ) {\n\t\t\t\tmatch[2] = match[4];\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeName ) {\n\t\t\tif ( nodeName === \"*\" ) {\n\t\t\t\treturn function() { return true; };\n\t\t\t}\n\n\t\t\tnodeName = nodeName.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\")) || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\n\t\t\t// not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t// Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === elem.type );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( tokens = [] );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar data, cache, outerCache,\n\t\t\t\tdirkey = dirruns + \" \" + doneName;\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {\n\t\t\t\t\t\t\tif ( (data = cache[1]) === true || data === cachedruns ) {\n\t\t\t\t\t\t\t\treturn data === true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcache = outerCache[ dir ] = [ dirkey ];\n\t\t\t\t\t\t\tcache[1] = matcher( elem, context, xml ) || cachedruns;\n\t\t\t\t\t\t\tif ( cache[1] === true ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\t// A counter to specify which element is currently being matched\n\tvar matcherCachedRuns = 0,\n\t\tbySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, expandContext ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tsetMatched = [],\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\toutermost = expandContext != null,\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", expandContext && context.parentNode || context ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t\tcachedruns = matcherCachedRuns;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t\tcachedruns = ++matcherCachedRuns;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !group ) {\n\t\t\tgroup = tokenize( selector );\n\t\t}\n\t\ti = group.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( group[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\t}\n\treturn cached;\n};\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tmatch = tokenize( selector );\n\n\tif ( !seed ) {\n\t\t// Try to minimize operations if there is only one group\n\t\tif ( match.length === 1 ) {\n\n\t\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t\ttokens = match[0] = match[0].slice( 0 );\n\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\t\tcontext.nodeType === 9 && documentIsHTML &&\n\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\t\tif ( !context ) {\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\n\t\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t\t}\n\n\t\t\t// Fetch a seed set for right-to-left matching\n\t\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\ttoken = tokens[i];\n\n\t\t\t\t// Abort if we hit a combinator\n\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\t\tif ( (seed = find(\n\t\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\t\trsibling.test( tokens[0].type ) && context.parentNode || context\n\t\t\t\t\t)) ) {\n\n\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\tcompile( selector, match )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector )\n\t);\n\treturn results;\n}\n\n// Deprecated\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\n// Check sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Initialize with the default document\nsetDocument();\n\n// Always assume the presence of duplicates if sort doesn't\n// pass them to our comparison function (as in Google Chrome).\n[0, 0].sort( sortOrder );\nsupport.detectDuplicates = hasDuplicate;\n\n// EXPOSE\n/*if ( typeof define === \"function\" && define.amd ) {\n\tdefine(function() { return Sizzle; });\n} else {\n\twindow.Sizzle = Sizzle;\n}*/\n// EXPOSE\n\n/**\n * @namespace Ink.Dom.Selector\n * @static\n */\n\n/**\n * Alias for the Sizzle selector engine\n *\n * @method select\n * @param {String} selector CSS selector to search for elements\n * @param {DOMElement} [context] By default the search is done in the document element. However, you can specify an element as search context\n * @param {Array} [results] By default this is considered an empty array. But if you want to merge it with other searches you did, pass their result array through here.\n * @return {Array} Array of resulting DOM Elements\n * @sample Ink_Dom_Selector_select.html\n */\n\n/**\n * Filters elements that match a CSS selector.\n *\n * @method matches\n * @param {String} selector CSS selector to search for elements\n * @param {Array} matches Elements to be 'matched' with\n * @return {Array} Elements that matched\n * @sample Ink_Dom_Selector_matches.html\n */\n\n/**\n * Checks if an element matches a given selector\n *\n * @method matchesSelector\n * @param {DOMElement} element Element to test\n * @param {String} selector CSS selector to test the element with\n * @return {Boolean} True if element matches the CSS selector\n * @sample Ink_Dom_Selector_matchesSelector.html \n */\n\nreturn {\n select: Sizzle,\n matches: Sizzle.matches,\n matchesSelector: Sizzle.matchesSelector\n};\n\n\n}); //( window );\n","/**\n * Animate.css Utility\n *\n * This module is a wrapper around animate.css's CSS classes to produce animation.\n * It contains options to ease common tasks, like listen to the \"animationend\" event with all necessary prefixes, remove the necessary class names when the animation finishes, or configure the duration of your animation with the necessary browser prefix.\n *\n * @module Ink.UI.Animate_1\n * @version 1\n */\n\nInk.createModule('Ink.UI.Animate', 1, ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Css_1'], function (Common, InkEvent, Css) {\n 'use strict';\n\n var animationPrefix = (function (el) {\n return ('animationName' in el.style) ? 'animation' :\n ('webkitAnimationName' in el.style) ? 'webkitAnimation' : null;\n }(document.createElement('div')));\n\n var animationEndEventName = {\n animation: 'animationend',\n webkitAnimation: 'webkitAnimationEnd'\n }[animationPrefix];\n\n /**\n * @class Ink.UI.Animate_1\n * @constructor\n *\n * @param {Element} element Animated element\n * @param {Object} options Options object\n * @param {String} options.animation Animation name\n * @param {String|Number} [options.duration] Duration name (fast|medium|slow) or duration in milliseconds. Defaults to 'medium'.\n * @param {Boolean} [options.removeClass] Flag to remove the CSS class when finished animating. Defaults to false.\n * @param {Function} [options.onEnd] Callback for the animation end\n *\n * @sample Ink_UI_Animate_1.html\n *\n **/\n function Animate() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n Animate._name = 'Animate_1';\n\n Animate._optionDefinition = {\n trigger: ['Element', null],\n duration: ['String', 'slow'], // Actually a string with a duration name, or a number of ms\n animation: ['String'],\n removeClass: ['Boolean', true],\n onEnd: ['Function', function () {}]\n };\n\n Animate.prototype._init = function () {\n if (!isNaN(parseInt(this._options.duration, 10))) {\n this._options.duration = parseInt(this._options.duration, 10);\n }\n\n if (this._options.trigger) {\n InkEvent.observe(this._options.trigger, 'click', Ink.bind(function () {\n this.animate();\n }, this)); // later\n } else {\n this.animate();\n }\n };\n\n Animate.prototype.animate = function () {\n Animate.animate(this._element, this._options.animation, this._options);\n };\n\n Ink.extendObj(Animate, {\n /**\n * Browser prefix for the CSS animations.\n *\n * @property _animationPrefix\n * @private\n **/\n _animationPrefix: animationPrefix,\n\n /**\n * Boolean which says whether this browser has CSS3 animation support.\n *\n * @property animationSupported\n **/\n animationSupported: !!animationPrefix,\n\n /**\n * Prefixed 'animationend' event name.\n *\n * @property animationEndEventName\n **/\n animationEndEventName: animationEndEventName,\n\n /**\n * Animate an element using one of the animate.css classes\n *\n * **Note: This is a utility method inside the `Animate` class, which you can access through `Animate.animate()`. Do not mix these up.**\n *\n * @static\n * @method animate\n * @param {Element} element Animated element\n * @param {String} animation Animation name\n * @param {Object} [options] Options object, containing:\n * @param {Function} [options.onEnd=null] Callback for animation end.\n * @param {Boolean} [options.removeClass=false] Whether to remove the Css class when finished.\n * @param {String|Number} [options.duration=medium] Duration name (the fast|medium|slow strings) or, duration in milliseconds.\n *\n * @return {void}\n * @public\n *\n * @sample Ink_UI_Animate_1_animate.html\n **/\n animate: function (element, animation, options) {\n element = Common.elOrSelector(element);\n\n if (typeof options === 'number' || typeof options === 'string') {\n options = { duration: options };\n } else if (!options) {\n options = {};\n }\n\n if (typeof arguments[3] === 'function') {\n options.onEnd = arguments[3];\n }\n\n if (typeof options.duration !== 'number' && typeof options.duration !== 'string') {\n options.duration = 400;\n }\n\n if (!Animate.animationSupported) {\n if (options.onEnd) {\n setTimeout(function () {\n options.onEnd(null);\n }, 0);\n }\n return;\n }\n\n if (typeof options.duration === 'number') {\n element.style[animationPrefix + 'Duration'] = options.duration + 'ms';\n } else if (typeof options.duration === 'string') {\n Css.addClassName(element, options.duration);\n }\n\n Css.addClassName(element, ['animated', animation]);\n\n function onAnimationEnd(event) {\n if (event.target !== element) { return; }\n if (event.animationName !== animation) { return; }\n if (options.onEnd) { options.onEnd(event); }\n if (options.removeClass) {\n Css.removeClassName(element, animation);\n }\n if (typeof options.duration === 'string') {\n Css.removeClassName(element, options.duration);\n }\n element.removeEventListener(animationEndEventName, onAnimationEnd, false);\n }\n\n element.addEventListener(animationEndEventName, onAnimationEnd, false);\n }\n });\n\n Common.createUIComponent(Animate);\n\n return Animate;\n});\n","/**\n * Flexible Carousel\n * @module Ink.UI.Carousel_1\n * @version 1\n */\n\nInk.createModule('Ink.UI.Carousel', '1',\n ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Css_1', 'Ink.Dom.Element_1', 'Ink.UI.Pagination_1', 'Ink.Dom.Browser_1', 'Ink.Dom.Selector_1'],\n function(Common, InkEvent, Css, InkElement, Pagination, Browser/*, Selector*/) {\n 'use strict';\n\n /*\n * TODO:\n * keyboardSupport\n */\n\n function limitRange(n, min, max) {\n return Math.min(max, Math.max(min, n));\n }\n\n var requestAnimationFrame = window.requestAnimationFrame ||\n function (cb) { return setTimeout(cb, 1000 / 30); };\n\n /**\n * @class Ink.UI.Carousel_1\n * @constructor\n *\n * @param {String|Element} selector DOM element or element id\n * @param {Object} [options] Carousel Options\n * @param {Integer} [options.autoAdvance] Milliseconds to wait before auto-advancing pages. Set to 0 to disable auto-advance. Defaults to 0.\n * @param {String} [options.axis] Axis of the carousel. Set to 'y' for a vertical carousel. Defaults to 'x'.\n * @param {Number} [options.initialPage] Initial index page of the carousel. Defaults to 0.\n * @param {Boolean} [options.spaceAfterLastSlide=true] If there are not enough slides to fill the full width of the last page, leave white space. Defaults to `true`.\n * @param {Boolean} [options.swipe] Enable swipe support if available. Defaults to true.\n * @param {Mixed} [options.pagination] Either an ul element to add pagination markup to or an `Ink.UI.Pagination` instance to use.\n * @param {Function} [options.onChange] Callback to be called when the page changes.\n *\n * @sample Ink_UI_Carousel_1.html\n */\n function Carousel() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n Carousel._name = 'Carousel_1';\n\n Carousel._optionDefinition = {\n autoAdvance: ['Integer', 0],\n axis: ['String', 'x'],\n initialPage: ['Integer', 0],\n spaceAfterLastSlide: ['Boolean', true],\n keyboardSupport:['Boolean', false],\n pagination: ['String', null],\n onChange: ['Function', null],\n onInit: ['Function', function () {}],\n swipe: ['Boolean', true]\n // TODO exponential swipe\n // TODO specify break point for next page when moving finger\n };\n\n Carousel.prototype = {\n _init: function () {\n this._handlers = {\n paginationChange: Ink.bindMethod(this, '_onPaginationChange'),\n windowResize: InkEvent.throttle(Ink.bindMethod(this, 'refit'), 200)\n };\n\n InkEvent.observe(window, 'resize', this._handlers.windowResize);\n\n this._isY = (this._options.axis === 'y');\n\n var ulEl = Ink.s('ul.stage', this._element);\n ulEl.style.width = '100%';\n this._ulEl = ulEl;\n\n InkElement.removeTextNodeChildren(ulEl);\n\n if (this._options.pagination == null) {\n this._currentPage = this._options.initialPage;\n }\n\n this.refit(); // recalculate this._numPages\n\n if (this._isY) {\n // Override white-space: no-wrap which is only necessary to make sure horizontal stuff stays horizontal, but breaks stuff intended to be vertical.\n this._ulEl.style.whiteSpace = 'normal';\n }\n\n if (this._options.swipe) {\n InkEvent.observe(this._element, 'touchstart', Ink.bindMethod(this, '_onTouchStart'));\n InkEvent.observe(this._element, 'touchmove', Ink.bindMethod(this, '_onTouchMove'));\n InkEvent.observe(this._element, 'touchend', Ink.bindMethod(this, '_onTouchEnd'));\n }\n\n this._setUpPagination();\n this._setUpAutoAdvance();\n\n this._options.onInit.call(this, this);\n },\n\n /**\n * Repositions elements around.\n * Measure the carousel once again, adjusting the involved elements' sizes. This is called automatically when the window resizes, in order to cater for changes from responsive media queries, for instance.\n *\n * @method refit\n * @return {void}\n * @public\n */\n refit: function() {\n var _isY = this._isY;\n\n var size = function (elm, perpendicular) {\n if (!elm) { return 0; }\n\n if (!perpendicular) {\n return InkElement.outerDimensions(elm)[_isY ? 1 : 0];\n } else {\n return InkElement.outerDimensions(elm)[_isY ? 0 : 1];\n }\n };\n\n this._liEls = Ink.ss('li.slide', this._ulEl);\n var numSlides = this._liEls.length;\n\n var contRect = this._ulEl.getBoundingClientRect();\n this._ctnLength = _isY ? contRect.bottom - contRect.top : contRect.right - contRect.left;\n this._elLength = size(this._liEls[0]);\n this._slidesPerPage = Math.floor( this._ctnLength / this._elLength ) || 1;\n if (!isFinite(this._slidesPerPage)) { this._slidesPerPage = 1; }\n\n var numPages = Math.ceil( numSlides / this._slidesPerPage );\n var numPagesChanged = this._numPages !== numPages;\n this._numPages = numPages;\n this._deltaLength = this._slidesPerPage * this._elLength;\n \n this._IE7();\n\n if (this._pagination && numPagesChanged) {\n this._pagination.setSize(this._numPages);\n }\n this.setPage(limitRange(this.getPage(), 0, this._numPages - 1));\n },\n\n _setUpPagination: function () {\n if (this._options.pagination) {\n if (Common.isDOMElement(this._options.pagination) ||\n typeof this._options.pagination === 'string') {\n // if dom element or css selector string...\n this._pagination = new Pagination(this._options.pagination, {\n size: this._numPages,\n onChange: this._handlers.paginationChange\n });\n } else {\n // assumes instantiated pagination\n this._pagination = this._options.pagination;\n this._pagination.setOnChange(this._handlers.paginationChange);\n this._pagination.setSize(this._numPages);\n }\n this._pagination.setCurrent(this._options.initialPage || 0);\n } else {\n this._currentPage = this._options.initialPage || 0;\n }\n },\n\n _setUpAutoAdvance: function () {\n if (!this._options.autoAdvance) { return; }\n var self = this;\n\n setTimeout(function autoAdvance() {\n self.nextPage(true /* wrap */);\n setTimeout(autoAdvance, self._options.autoAdvance);\n }, this._options.autoAdvance);\n },\n\n /**\n * Refits elements for IE7 because it doesn't support inline-block.\n *\n * @method _IE7\n * @private\n */\n _IE7: function () {\n if (Browser.IE && '' + Browser.version.split('.')[0] === '7') {\n // var numPages = this._numPages;\n var slides = Ink.ss('li.slide', this._ulEl);\n var stl = function (prop, val) {slides[i].style[prop] = val; };\n for (var i = 0, len = slides.length; i < len; i++) {\n stl('position', 'absolute');\n stl(this._isY ? 'top' : 'left', (i * this._elLength) + 'px');\n }\n }\n },\n\n _onTouchStart: function (event) {\n if (event.touches.length > 1) { return; }\n\n this._swipeData = {\n x: InkEvent.pointerX(event),\n y: InkEvent.pointerY(event)\n };\n\n var ulRect = this._ulEl.getBoundingClientRect();\n\n this._swipeData.firstUlPos = ulRect[this._isY ? 'top' : 'left'];\n\n this._swipeData.inUlX = this._swipeData.x - ulRect.left;\n this._swipeData.inUlY = this._swipeData.y - ulRect.top;\n\n setTransitionProperty(this._ulEl, 'none');\n\n this._touchMoveIsFirstTouchMove = true;\n },\n\n _onTouchMove: function (event) {\n if (event.touches.length > 1) { return; /* multitouch event, not my problem. */ }\n\n var pointerX = InkEvent.pointerX(event);\n var pointerY = InkEvent.pointerY(event);\n\n var deltaY = this._swipeData.y - pointerY;\n var deltaX = this._swipeData.x - pointerX;\n\n if (this._touchMoveIsFirstTouchMove) {\n var aDeltaY = Math.abs(deltaY);\n var aDeltaX = Math.abs(deltaX);\n\n this._touchMoveIsFirstTouchMove = undefined;\n this._scrolling = this._isY ?\n aDeltaX > aDeltaY :\n aDeltaY > aDeltaX ;\n\n if (!this._scrolling) {\n this._onAnimationFrame();\n }\n }\n\n if (!this._scrolling && this._swipeData) {\n InkEvent.stopDefault(event);\n\n this._swipeData.pointerDelta = this._isY ? deltaY : deltaX;\n this._swipeData.pointerPos = this._isY ? pointerY : pointerX;\n }\n },\n\n _onAnimationFrame: function () {\n var swipeData = this._swipeData;\n\n if (!swipeData || this._scrolling || this._touchMoveIsFirstTouchMove) { return; }\n\n var elRect = this._element.getBoundingClientRect();\n\n var newPos;\n\n if (!this._isY) {\n newPos = swipeData.pointerPos - swipeData.inUlX - elRect.left;\n } else {\n newPos = swipeData.pointerPos - swipeData.inUlY - elRect.top;\n }\n\n this._ulEl.style[this._isY ? 'top' : 'left'] = newPos + 'px';\n\n requestAnimationFrame(Ink.bindMethod(this, '_onAnimationFrame'));\n },\n\n _onTouchEnd: function (event) {\n if (this._swipeData && this._swipeData.pointerPos && !this._scrolling && !this._touchMoveIsFirstTouchMove) {\n var snapToNext = 0.1; // swipe 10% of the way to change page\n\n var pointerDelta = this._swipeData.pointerDelta;\n\n var curPage = this.getPage();\n\n // How many pages were advanced? May be fractional.\n var progressInPages = pointerDelta / this._elLength / this._slidesPerPage;\n\n // Have we advanced enough to change page?\n if (Math.abs(progressInPages) > snapToNext) {\n curPage += Math[ pointerDelta < 0 ? 'floor' : 'ceil' ](progressInPages);\n }\n\n curPage = limitRange(curPage, 0, this._numPages - 1);\n\n // If something used to calculate progressInPages was zero, we get NaN here.\n if (!isNaN(curPage)) {\n this.setPage(curPage);\n }\n\n InkEvent.stopDefault(event);\n }\n\n setTransitionProperty(this._ulEl, null /* transition: left, top */);\n this._swipeData = null;\n this._touchMoveIsFirstTouchMove = undefined;\n this._scrolling = undefined;\n },\n\n _onPaginationChange: function(pgn) {\n this._setPage(pgn.getCurrent());\n },\n\n /**\n * Gets the current page index\n * @method getPage\n * @return {Number} The current page number\n * @public\n **/\n getPage: function () {\n if (this._pagination) {\n return this._pagination.getCurrent();\n } else {\n return this._currentPage || 0;\n }\n },\n\n /**\n * Gets the Ink Pagination element this carousel is using.\n * @method getPagination\n * @return {Pagination} The pagination instance, if any. Otherwise, `null`.\n * @public\n **/\n getPagination: function () {\n return this._pagination || null;\n },\n\n /**\n * Sets the current page index\n * @method setPage\n * @param {Number} page Index of the destination page.\n * @param {Boolean} [wrap=false] Flag to activate circular counting (for example, if you set the page to `5` and there are only 4 pages, you're actually going to the first page).\n * @return {void}\n * @public\n **/\n setPage: function (page, wrap) {\n if (wrap) {\n // Pages outside the range [0..this._numPages] are wrapped.\n page = page % this._numPages;\n if (page < 0) { page = this._numPages - page; }\n }\n page = limitRange(page, 0, this._numPages - 1);\n\n if (page === this._currentPage) {\n if (this._swipeData) {\n this._setPage(page); // Just advance the view.\n }\n return;\n }\n\n if (this._pagination) {\n this._pagination.setCurrent(page); // _setPage is called by pagination because it listens to its Change event.\n } else {\n this._setPage(page);\n }\n },\n\n _setPage: function (page) {\n var _lengthToGo = page * this._deltaLength;\n var isLastPage = page === (this._numPages - 1);\n\n if (!this._options.spaceAfterLastSlide && isLastPage && page > 0) { \n var _itemsInLastPage = this._liEls.length - (page * this._slidesPerPage);\n if(_itemsInLastPage < this._slidesPerPage) {\n _lengthToGo = ((page - 1) * this._deltaLength) + (_itemsInLastPage * this._elLength);\n }\n }\n\n this._ulEl.style[ this._isY ? 'top' : 'left'] =\n ['-', (_lengthToGo / this._ctnLength) * 100, '%'].join('');\n\n if (this._options.onChange) {\n this._options.onChange.call(this, page);\n }\n\n this._currentPage = page;\n },\n\n /**\n * Goes to the next page\n * @method nextPage\n * @param {Boolean} [wrap=false] Flag to loop from last page to first page.\n * @return {void}\n * @public\n **/\n nextPage: function (wrap) {\n this.setPage(this.getPage() + 1, wrap);\n },\n\n /**\n * Goes to the previous page\n * @method previousPage\n * @param {Boolean} [wrap=false] Flag to loop from first page to last page.\n * @return {void}\n * @public\n **/\n previousPage: function (wrap) { this.setPage(this.getPage() - 1, wrap); },\n\n /**\n * Returns how many slides fit into a page\n * @method getSlidesPerPage\n * @return {Number} The number of slides per page\n * @public\n */\n getSlidesPerPage: function() {\n return this._slidesPerPage;\n },\n\n /**\n * Get the amount of pages in the carousel.\n * @method getTotalPages\n * @return {Number} The number of pages\n * @public\n */\n getTotalPages: function() {\n return this._numPages;\n },\n\n /**\n * Get the stage element (your UL with the class \".stage\").\n * @method getStageElm\n * @public\n * @return {Element} Stage element\n **/\n getStageElm: function() {\n return this._ulEl;\n },\n\n /**\n * Get a list of your slides (elements with the \".slide\" class inside your stage)\n * @method getSlidesList\n * @return {Element[]} Array containing the slides.\n * @public\n */\n getSlidesList: function() {\n return this._liEls;\n },\n\n /**\n * Get the total number of slides\n * @method getTotalSlides\n * @return {Number} The number of slides\n * @public\n */\n getTotalSlides: function() {\n return this.getSlidesList().length;\n }\n };\n\n function setTransitionProperty(el, newTransition) {\n el.style.transitionProperty =\n el.style.oTransitionProperty =\n el.style.msTransitionProperty =\n el.style.mozTransitionProperty =\n el.style.webkitTransitionProperty = newTransition;\n }\n\n Common.createUIComponent(Carousel);\n\n return Carousel;\n\n});\n","/**\n * Closing utilities\n * @module Ink.UI.Close_1\n * @version 1\n */\nInk.createModule('Ink.UI.Close', '1', ['Ink.Dom.Event_1','Ink.Dom.Element_1'], function(InkEvent, InkElement) {\n 'use strict';\n\n /**\n * Subscribes clicks on the document.body.\n * Whenever an element with the classes \".ink-close\" or \".ink-dismiss\" is clicked, this module finds an ancestor \".ink-alert\" or \".ink-alert-block\" element and removes it from the DOM.\n * This module should be created only once per page.\n * \n * @class Ink.UI.Close\n * @constructor\n * @example\n * \n *\n * @sample Ink_UI_Close_1.html\n */\n function Close() {\n InkEvent.observe(document.body, 'click', function(ev) {\n var el = InkEvent.element(ev);\n\n el = InkElement.findUpwardsByClass(el, 'ink-close') ||\n InkElement.findUpwardsByClass(el, 'ink-dismiss');\n\n if (!el) {\n return; // ink-close or ink-dismiss class not found\n }\n\n var toRemove = InkElement.findUpwardsByClass(el, 'ink-alert') ||\n InkElement.findUpwardsByClass(el, 'ink-alert-block') ||\n el;\n\n if (toRemove) {\n InkEvent.stop(ev);\n InkElement.remove(toRemove);\n }\n });\n }\n\n Close._name = 'Close_1';\n\n return Close;\n});\n","/**\n * Auxiliar utilities for UI Modules\n * @module Ink.UI.Common_1\n * @version 1\n */\n \nInk.createModule('Ink.UI.Common', '1', ['Ink.Dom.Element_1', 'Ink.Net.Ajax_1','Ink.Dom.Css_1','Ink.Dom.Selector_1','Ink.Util.Url_1'], function(InkElement, Ajax,Css,Selector,Url) {\n\n 'use strict';\n\n var nothing = {} /* a marker, for reference comparison. */;\n\n var keys = Object.keys || function (obj) {\n var ret = [];\n for (var k in obj) if (obj.hasOwnProperty(k)) {\n ret.push(k);\n }\n return ret;\n };\n\n var es6WeakMapSupport = 'WeakMap' in window;\n var instances = es6WeakMapSupport ? new WeakMap() : null;\n // Old Registry\n var _reg = [];\n var domRegistry = {\n get: function get(el) {\n return es6WeakMapSupport ?\n instances.get(el) :\n _reg[el.getAttribute('__InkInstance')];\n },\n set: function set(el, thing) {\n if (es6WeakMapSupport) {\n instances.set(el, thing);\n } else {\n el.setAttribute('__InkInstance', _reg.push(thing) - 1);\n }\n }\n };\n\n /**\n * @namespace Ink.UI.Common_1\n */\n\n var Common = {\n\n /**\n * Supported Ink Layouts\n *\n * @property Layouts\n * @type Object\n * @readOnly\n */\n Layouts: {\n TINY: 'tiny',\n SMALL: 'small',\n MEDIUM: 'medium',\n LARGE: 'large',\n XLARGE: 'xlarge'\n },\n\n /**\n * Checks if an item is a valid DOM Element.\n *\n * @method isDOMElement\n * @static\n * @param {Mixed} o The object to be checked.\n * @return {Boolean} True if it's a valid DOM Element.\n * @example\n * var el = Ink.s('#element');\n * if( Ink.UI.Common.isDOMElement( el ) === true ){\n * // It is a DOM Element.\n * } else {\n * // It is NOT a DOM Element.\n * }\n */\n isDOMElement: InkElement.isDOMElement,\n\n /**\n * Checks if an item is a valid integer.\n *\n * @method isInteger\n * @static\n * @param {Mixed} n The value to be checked.\n * @return {Boolean} True if it's a valid integer.\n * @example\n * var value = 1;\n * if( Ink.UI.Common.isInteger( value ) === true ){\n * // It is an integer.\n * } else {\n * // It is NOT an integer.\n * }\n */\n isInteger: function(n) {\n return (typeof n === 'number' && n % 1 === 0);\n },\n\n /**\n * Gets a DOM Element. \n *\n * @method elOrSelector\n * @static\n * @param {Element|String} elOrSelector DOM Element or CSS Selector\n * @param {String} fieldName The name of the field. Commonly used for debugging.\n * @return {Element} Returns the Element passed or the first result of the CSS Selector. Otherwise it throws an exception.\n * @example\n * // In case there are several .myInput, it will retrieve the first found\n * var el = Ink.UI.Common.elOrSelector('.myInput','My Input');\n */\n elOrSelector: function(elOrSelector, fieldName) {\n if (!Common.isDOMElement(elOrSelector)) {\n var t = Selector.select(elOrSelector);\n if (t.length === 0) {\n Ink.warn(fieldName + ' must either be a DOM Element or a selector expression!\\nThe script element must also be after the DOM Element itself.');\n return null;\n }\n return t[0];\n }\n return elOrSelector;\n },\n\n /**\n * Like `elOrSelector` but returns an array of elements.\n *\n * @method elsOrSelector\n *\n * @static\n * @param {Element|Array|String} elsOrSelector DOM Element, array of DOM Elements, or CSS Selector\n * @param {String} [fieldName] The name of the field. Used for the error shown when no elements are found.\n * @param {Boolean} required If this is true, throw an error instead of returning an empty array.\n * @return {Array} The selected Elements, or the given Elements\n * @example\n * var elements = Ink.UI.Common.elsOrSelector('input.my-inputs', 'My Input');\n */\n elsOrSelector: function(elsOrSelector, fieldName, required) {\n var ret;\n if (typeof elsOrSelector === 'string') {\n ret = Selector.select(elsOrSelector);\n } else if (Common.isDOMElement(elsOrSelector)) {\n ret = [elsOrSelector];\n } else if (elsOrSelector && typeof elsOrSelector === 'object' && typeof elsOrSelector.length === 'number') {\n ret = elsOrSelector;\n }\n\n if (ret && ret.length) {\n return ret;\n } else {\n if (required) {\n throw new TypeError(fieldName + ' must either be a DOM Element, an Array of elements, or a selector expression!\\nThe script element must also be after the DOM Element itself.');\n } else {\n return [];\n }\n }\n },\n\n /**\n * Gets options an object and element's metadata.\n *\n * The element's data attributes take precedence. Values from the element's data-atrributes are coerced into the required type.\n *\n * @method options\n *\n * @param {Object} [fieldId] Name to be used in error reports.\n * @param {Object} defaults Object with the options' types and defaults.\n * @param {Object} overrides Options to override the defaults. Usually passed when instantiating an UI module.\n * @param {Element} [element] Element with data-attributes\n * @return {Object} An object containing all the option values.\n *\n * @example\n *\n * this._options = Ink.UI.Common.options('MyComponent', {\n * 'anobject': ['Object', null], // Defaults to null\n * 'target': ['Element', null],\n * 'stuff': ['Number', 0.1],\n * 'stuff2': ['Integer', 0],\n * 'doKickFlip': ['Boolean', false],\n * 'targets': ['Elements'], // Required option since no default was given\n * 'onClick': ['Function', null]\n * }, options || {}, elm)\n *\n * @example\n *\n * ### Note about booleans\n *\n * Here is how options are read from the markup\n * data-attributes, for several values`data-a-boolean`.\n *\n * Options considered true:\n *\n * - `data-a-boolean=\"true\"`\n * - (Every other value which is not on the list below.)\n * \n * Options considered false:\n *\n * - `data-a-boolean=\"false\"`\n * - `data-a-boolean=\"\"`\n * - `data-a-boolean`\n *\n * Options which go to default:\n *\n * - (no attribute). When `data-a-boolean` is ommitted, the\n * option is not considered true nor false, and as such\n * defaults to what is in the `defaults` argument.\n *\n **/\n options: function (fieldId, defaults, overrides, element) {\n // TODO Change Common.options's signature? the below looks better, more manageable\n // var options = Common.options({\n // element: this._element,\n // modName: constructor._name,\n // options: constructor._optionDefinition,\n // defaults: constructor._globalDefaults\n // });\n\n if (typeof fieldId !== 'string') {\n element = overrides;\n overrides = defaults;\n defaults = fieldId;\n fieldId = '';\n }\n overrides = overrides || {};\n var out = {};\n var dataAttrs = element ? InkElement.data(element) : {};\n var fromDataAttrs;\n var type;\n var lType;\n var defaultVal;\n\n var invalidStr = function (str) {\n if (fieldId) { str = fieldId + ': \"' + ('' + str).replace(/\"/, '\\\\\"') + '\"'; }\n return str;\n };\n\n var quote = function (str) {\n return '\"' + ('' + str).replace(/\"/, '\\\\\"') + '\"';\n };\n\n var invalidThrow = function (str) {\n throw new Error(invalidStr(str));\n };\n\n var invalid = function (str) {\n Ink.error(invalidStr(str) + '. Ignoring option.');\n };\n\n function optionValue(key) {\n type = defaults[key][0];\n lType = type.toLowerCase();\n defaultVal = defaults[key].length === 2 ? defaults[key][1] : nothing;\n\n if (!type) {\n invalidThrow('Ink.UI.Common.options: Always specify a type!');\n }\n if (!(lType in Common._coerce_funcs)) {\n invalidThrow('Ink.UI.Common.options: ' + defaults[key][0] + ' is not a valid type. Use one of ' + keys(Common._coerce_funcs).join(', '));\n\n }\n if (!defaults[key].length || defaults[key].length > 2) {\n invalidThrow('the \"defaults\" argument must be an object mapping option names to [typestring, optional] arrays.');\n }\n\n if (key in dataAttrs) {\n fromDataAttrs = Common._coerce_from_string(lType, dataAttrs[key], key, fieldId);\n // (above can return `nothing`)\n } else {\n fromDataAttrs = nothing;\n }\n\n if (fromDataAttrs !== nothing) {\n if (!Common._options_validate(fromDataAttrs, lType)) {\n invalid('(' + key + ' option) Invalid ' + lType + ' ' + quote(fromDataAttrs));\n return defaultVal;\n } else {\n return fromDataAttrs;\n }\n } else if (key in overrides) {\n return overrides[key];\n } else if (defaultVal !== nothing) {\n return defaultVal;\n } else {\n invalidThrow('Option ' + key + ' is required!');\n }\n }\n\n for (var key in defaults) {\n if (defaults.hasOwnProperty(key)) {\n out[key] = optionValue(key);\n }\n }\n\n return out;\n },\n\n _coerce_from_string: function (type, val, paramName, fieldId) {\n if (type in Common._coerce_funcs) {\n return Common._coerce_funcs[type](val, paramName, fieldId);\n } else {\n return val;\n }\n },\n\n _options_validate: function (val, type) {\n if (type in Common._options_validate_types) {\n return Common._options_validate_types[type].call(Common, val);\n } else {\n // 'object' options cannot be passed through data-attributes.\n // Json you say? Not any good to embed in HTML.\n return false;\n }\n },\n\n _coerce_funcs: (function () {\n var ret = {\n element: function (val) {\n return Common.elOrSelector(val, '');\n },\n elements: function (val) {\n return Common.elsOrSelector(val, '', false /*not required, so don't throw an exception now*/);\n },\n object: function (val) { return val; },\n number: function (val) { return parseFloat(val); },\n 'boolean': function (val) {\n return !(val === 'false' || val === '' || val === null);\n },\n string: function (val) { return val; },\n 'function': function (val, paramName, fieldId) {\n Ink.error(fieldId + ': You cannot specify the option \"' + paramName + '\" through data-attributes because it\\'s a function');\n return nothing;\n }\n };\n ret['float'] = ret.integer = ret.number;\n return ret;\n }()),\n\n _options_validate_types: (function () {\n var types = {\n string: function (val) {\n return typeof val === 'string';\n },\n number: function (val) {\n return typeof val === 'number' && !isNaN(val) && isFinite(val);\n },\n integer: function (val) {\n return val === Math.round(val);\n },\n element: function (val) {\n return Common.isDOMElement(val);\n },\n elements: function (val) {\n return val && typeof val === 'object' && typeof val.length === 'number' && val.length;\n },\n 'boolean': function (val) {\n return typeof val === 'boolean';\n },\n object: function () { return true; }\n };\n types['float'] = types.number;\n return types;\n }()),\n\n /**\n * Deep copy (clone) an object.\n * Note: The object cannot have referece loops.\n *\n * @method clone\n * @static\n * @deprecated\n * @param {Object} o The object to be cloned/copied.\n * @return {Object} Returns the result of the clone/copy.\n * @example\n * var originalObj = {\n * key1: 'value1',\n * key2: 'value2',\n * key3: 'value3'\n * };\n * var cloneObj = Ink.UI.Common.clone( originalObj );\n */\n clone: function(o) {\n try {\n return JSON.parse( JSON.stringify(o) );\n } catch (ex) {\n throw new Error('Given object cannot have loops!');\n }\n },\n\n\n /**\n * Gets an element's one-base index relative to its parent.\n *\n * Deprecated. Use Ink.Dom.Element.parentIndexOf instead.\n *\n * @method childIndex\n * @deprecated\n * @static\n * @param {Element} childEl Valid DOM Element.\n * @return {Number} Numerical position of an element relatively to its parent.\n * @example\n * \n *
      \n *
    • One
    • \n *
    • Two
    • \n *
    • Three
    • \n *
    • Four
    • \n *
    \n *\n * \n */\n childIndex: InkElement.parentIndexOf,\n\n /**\n * AJAX JSON request shortcut method\n * It provides a more convenient way to do an AJAX request and expect a JSON response.It also offers a callback option, as third parameter, for better async handling.\n *\n * @method ajaxJSON\n * @static\n * @async\n * @param {String} endpoint Valid URL to be used as target by the request.\n * @param {Object} params This field is used in the thrown Exception to identify the parameter.\n * @param {Function} cb Callback for the request.\n * @return {void}\n * @public\n * @example\n * // In case there are several .myInput, it will retrieve the first found\n * var el = Ink.UI.Common.elOrSelector('.myInput','My Input');\n */\n ajaxJSON: function(endpoint, params, cb) {\n new Ajax(\n endpoint,\n {\n evalJS: 'force',\n method: 'POST',\n parameters: params,\n\n onSuccess: function( r) {\n try {\n r = r.responseJSON;\n if (r.status !== 'ok') {\n throw 'server error: ' + r.message;\n }\n cb(null, r);\n } catch (ex) {\n cb(ex);\n }\n },\n\n onFailure: function() {\n cb('communication failure');\n }\n }\n );\n },\n\n\n /**\n * Gets the current Ink layout.\n *\n * @method currentLayout\n * @static\n * @return {String} A string representation of the current layout name.\n * @public\n * @example\n * var inkLayout = Ink.UI.Common.currentLayout();\n * if (inkLayout === 'small') {\n * // ...\n * }\n */\n currentLayout: function() {\n var i, f, k, v, el, detectorEl = Selector.select('#ink-layout-detector')[0];\n if (!detectorEl) {\n detectorEl = document.createElement('div');\n detectorEl.id = 'ink-layout-detector';\n for (k in Common.Layouts) {\n if (Common.Layouts.hasOwnProperty(k)) {\n v = Common.Layouts[k];\n el = document.createElement('div');\n el.className = 'show-' + v + ' hide-all';\n el.setAttribute('data-ink-layout', v);\n detectorEl.appendChild(el);\n }\n }\n document.body.appendChild(detectorEl);\n }\n\n for (i = 0, f = detectorEl.children.length; i < f; ++i) {\n el = detectorEl.children[i];\n if (Css.getStyle(el, 'display') === 'block') {\n return el.getAttribute('data-ink-layout');\n }\n }\n\n return 'large';\n },\n\n\n /**\n * Sets the location's hash (window.location.hash).\n *\n * @method hashSet\n * @static\n * @param {Object} o Object with the info to be placed in the location's hash.\n * @return {void}\n * @example\n * // It will set the location's hash like: #key1=value1&key2=value2&key3=value3\n * Ink.UI.Common.hashSet({\n * key1: 'value1',\n * key2: 'value2',\n * key3: 'value3'\n * });\n */\n hashSet: function(o) {\n if (typeof o !== 'object') { throw new TypeError('o should be an object!'); }\n var hashParams = Url.getAnchorString();\n hashParams = Ink.extendObj(hashParams, o);\n window.location.hash = Url.genQueryString('', hashParams).substring(1);\n },\n\n /**\n * Removes children nodes from a given object.\n * This method was initially created to help solve a problem in Internet Explorer(s) that occurred when trying to set the innerHTML of some specific elements like 'table'.\n *\n * @method cleanChildren\n * @static\n * @param {Element} parentEl Valid DOM Element\n * @return {void}\n * @public\n * @example\n * \n *
      \n *
    • One
    • \n *
    • Two
    • \n *
    • Three
    • \n *
    • Four
    • \n *
    \n *\n * \n *\n * \n *
      \n */\n cleanChildren: function(parentEl) {\n if( !Common.isDOMElement(parentEl) ){\n throw new Error('Please provide a valid DOMElement');\n }\n InkElement.setHTML(parentEl, '');\n },\n\n /**\n * Stores the id and/or classes of an element in an object.\n *\n * @method storeIdAndClasses\n * @static\n * @param {Element} fromEl Valid DOM Element to get the id and classes from.\n * @param {Object} inObj Object where the id and classes will be saved.\n * @return {void}\n * @public\n * @example\n *
      \n *\n * \n */\n storeIdAndClasses: function(fromEl, inObj) {\n if( !Common.isDOMElement(fromEl) ){\n throw 'Please provide a valid Element as first parameter';\n }\n\n var id = fromEl.id;\n if (id) {\n inObj._id = id;\n }\n\n var classes = fromEl.className;\n if (classes) {\n inObj._classes = classes;\n }\n },\n\n /**\n * Sets the id and className properties of an element based \n *\n * @method restoreIdAndClasses\n * @static\n * @param {Element} toEl Valid DOM Element to set the id and classes on.\n * @param {Object} inObj Object where the id and classes to be set are. This method uses the same format as the one given in `storeIdAndClasses`\n * @return {void}\n * @public\n * @example\n *
      \n *\n * \n *\n * \n *
      \n */\n restoreIdAndClasses: function(toEl, inObj) {\n\n if( !Common.isDOMElement(toEl) ){\n throw 'Please provide a valid Element as first parameter';\n }\n\n if (inObj._id && toEl.id !== inObj._id) {\n toEl.id = inObj._id;\n }\n\n if (inObj._classes && toEl.className.indexOf(inObj._classes) === -1) {\n if (toEl.className) { toEl.className += ' ' + inObj._classes; }\n else { toEl.className = inObj._classes; }\n }\n\n if (inObj._instanceId && !toEl.getAttribute('data-instance')) {\n toEl.setAttribute('data-instance', inObj._instanceId);\n }\n },\n\n _warnDoubleInstantiation: function (elm, newInstance) {\n var instances = Common.getInstance(elm);\n\n if (getName(newInstance) === '') { return; }\n if (!instances) { return; }\n\n var nameWithoutVersion = getName(newInstance);\n\n if (!nameWithoutVersion) { return; }\n\n for (var i = 0, len = instances.length; i < len; i++) {\n if (nameWithoutVersion === getName(instances[i])) {\n // Yes, I am using + to concatenate and , to split\n // arguments.\n //\n // Elements can't be concatenated with strings, but if\n // they are passed in an argument, modern debuggers will\n // pretty-print them and make it easy to find them in the\n // element inspector.\n //\n // On the other hand, if strings are passed as different\n // arguments, they get pretty printed. And the pretty\n // print of a string has quotes around it.\n //\n // If some day people find out that strings are not\n // just text and they start preserving contextual\n // information, then by all means change this to a\n // regular concatenation.\n //\n // But they won't. So don't change this.\n Ink.warn('Creating more than one ' + nameWithoutVersion + 'for the same element.',\n '(Was creating a ' + nameWithoutVersion + ' on:', elm, ').');\n return false;\n }\n }\n\n function getName(thing) {\n return ((thing.constructor && (thing.constructor._name)) ||\n thing._name ||\n '').replace(/_.*?$/, '');\n }\n\n return true;\n },\n\n /**\n * Saves an object (which should inherit BaseUIComponent) in the registry, associated with an element. You can retrieve it later by calling getInstance.\n *\n * This won't allow two instances of the same class to be created on a single element. It will fail and print a warning to the console if you try to do it. That is a common error when using Ink.\n *\n * @method registerInstance\n * @static\n * @param {Object} inst Object to be registered\n * @param {Element} [el=inst._element] Element to associate with `inst`. Defaults to `_element` property of `inst`.\n * @return {Boolean} `true` if we could create the instance, `false` otherwise.\n */\n registerInstance: function(inst, el) {\n if (!inst) { return; }\n\n if (!el) { el = inst._element; }\n\n if (!Common.isDOMElement(el)) { throw new TypeError('Ink.UI.Common.registerInstance: The element passed in is not a DOM element!'); }\n\n // [todo] this belongs in the BaseUIComponent's initialization\n if (Common._warnDoubleInstantiation(el, inst) === false) {\n return false;\n }\n\n var instances = domRegistry.get(el);\n\n if (!instances) {\n instances = [];\n domRegistry.set(el, instances);\n }\n\n instances.push(inst);\n\n return true;\n },\n\n /**\n * Unregisters (removes from the registry) a UI component instance from whatever element it's on.\n *\n * @method unregisterInstance\n * @static\n * @param {String} inst Instance to be unregistered.\n * @return {void}\n * @public\n */\n unregisterInstance: function(inst) {\n if (!inst || !inst._element) { return; }\n var instances = domRegistry.get(inst._element);\n for (var i = 0, len = instances.length; i < len; i++) {\n if (instances[i] === inst) {\n instances.splice(i, 1);\n }\n }\n },\n\n /**\n * Gets an UI component instance from an element.\n *\n * This function is already available in the UI components' classes themselves. You can call Modal.getInstance() and retrieve a modal.\n *\n * @method getInstance\n * @static\n * @param {String|Element} el Element from which we want the instances. A selector is okay.\n * @param {BaseUIComponent} [UIComponent] If you pass an Ink UI component class (Like Ink.UI.Modal or Ink.UI.Carousel), this won't return an array of all instances associated with the element. Instead it will return only the object which is an instance of that class.\n * @return {Object|Array} Returns an array containing all the instances in that element.\n * @public\n */\n getInstance: function(el, UIComponent) {\n var givenEl = el; // So we can warn it later.\n\n el = Common.elOrSelector(el);\n\n if (!Common.isDOMElement(el)) {\n Ink.warn('Ink.UI.Common: getInstance called on non-element (' + givenEl + ')');\n return [];\n }\n\n var instances = domRegistry.get(el);\n\n if (!instances) {\n instances = [];\n }\n\n if (typeof UIComponent !== 'function') {\n return instances;\n }\n\n for (var i = 0, len = instances.length; i < len; i++) {\n if (instances[i] instanceof UIComponent) {\n return instances[i];\n }\n }\n\n return null;\n },\n\n /**\n * Gets an instance based on a selector.\n *\n * @method getInstanceFromSelector\n * @static\n * @param {String} selector CSS selector to get the instances from. This function will only use the *first* element.\n * @return {Object|Array} Returns an array of the instances in the selected element.\n * @public\n */\n getInstanceFromSelector: function(selector) {\n return Common.getInstance(selector);\n },\n\n /**\n * Gets all the instance ids\n *\n * @method getInstanceIds\n * @static\n * @return {Array} Collection of instance ids\n */\n getInstanceIds: function() {\n if( _reg.length > 0 ) return _reg;\n var res = [];\n for (var id in instances) {\n if (instances.hasOwnProperty(id)) {\n res.push( id );\n }\n }\n return res;\n },\n\n /**\n * Gets all the instances\n *\n * @method getInstances\n * @static\n * @return {Array} Collection of existing instances.\n * @public\n */\n getInstances: function() {\n if( _reg.length > 0 ) return _reg;\n var res = [];\n for (var id in instances) {\n if (instances.hasOwnProperty(id)) {\n res.push( instances[id] );\n }\n }\n return res;\n },\n\n /**\n * Boilerplate method to destroy a component.\n * Components should copy this method as its destroy method and modify it.\n *\n * @method destroyComponent\n * @return {void}\n * @public\n * @static\n */\n destroyComponent: function() {\n Common.unregisterInstance(this);\n this._element.parentNode.removeChild(this._element);\n }\n };\n\n\n\n\n /**\n * Ink UI Base Class\n **/\n\n function warnStub() {\n /* jshint validthis: true */\n if (!this || this === window || typeof this.constructor !== 'function') { return; }\n Ink.warn('You called a method on an incorrectly instantiated ' + this.constructor._name + ' component. Check the warnings above to see what went wrong.');\n }\n\n function stub(prototype, obj) {\n for (var k in prototype) if (prototype.hasOwnProperty(k)) {\n if (k === 'constructor') { continue; }\n if (typeof obj[k] === 'function') {\n obj[k] = warnStub;\n }\n }\n }\n\n /**\n * Ink UI Base Class\n *\n * You don't use this class directly, or inherit from it directly.\n *\n * See createUIComponent() (in this module) for how to create a UI component and inherit from this. It's not plain old JS inheritance, for several reasons.\n *\n * @class Ink.UI.Common.BaseUIComponent\n * @constructor\n *\n * @param {Element|String} element Element to associate this UI component with. It's the element you can get later using `comp.getElement()`\n * @param {Object} [options] Options to pass to the component. You should see your specific UI component for this information.\n * @public\n **/\n function BaseUIComponent(element, options) {\n var constructor = this.constructor;\n var _name = constructor._name;\n\n if (!this || this === window) {\n throw new Error('Use \"new InkComponent()\" instead of \"InkComponent()\"');\n }\n\n if (this && !(this instanceof BaseUIComponent)) {\n throw new Error('You forgot to call Ink.UI.Common.createUIComponent() on this module!');\n }\n\n if (!element && !constructor._componentOptions.elementIsOptional) {\n Ink.error(new Error(_name + ': You need to pass an element or a selector as the first argument to \"new ' + _name + '()\"'));\n return;\n } else {\n this._element = Common.elsOrSelector(element,\n _name + ': An element with the selector \"' + element + '\" was not found!')[0];\n }\n\n if (!this._element && !constructor._componentOptions.elementIsOptional) {\n isValidInstance = false;\n Ink.error(new Error(element + ' does not match an element on the page. You need to pass a valid selector to \"new ' + _name + '\".'));\n }\n\n this._options = Common.options(_name, constructor._optionDefinition, options, this._element);\n\n var isValidInstance = BaseUIComponent._validateInstance(this) === true;\n\n if (isValidInstance && typeof this._init === 'function') {\n try {\n this._init.apply(this, arguments);\n } catch(e) {\n isValidInstance = false;\n Ink.error(e);\n }\n }\n\n if (!isValidInstance) {\n BaseUIComponent._stubInstance(this, constructor, _name);\n } else if (this._element) {\n Common.registerInstance(this);\n }\n }\n\n /**\n * Calls the `instance`'s _validate() method so it can validate itself.\n *\n * Returns false if the method exists, was called, but no Error was returned or thrown.\n *\n * @method _validateInstance\n * @private\n */\n BaseUIComponent._validateInstance = function (instance) {\n var err;\n\n if (typeof instance._validate !== 'function') { return true; }\n\n try {\n err = instance._validate();\n } catch (e) {\n err = e;\n }\n\n if (err instanceof Error) {\n instance._validationError = err;\n return false;\n }\n\n return true;\n };\n\n\n /**\n * Replaces every method in the instance with stub functions which just call Ink.warn().\n *\n * This avoids breaking the page when there are errors.\n *\n * @method _stubInstance\n * @param instance\n * @param constructor\n * @param name\n * @private\n */\n BaseUIComponent._stubInstance = function (instance, constructor, name) {\n stub(constructor.prototype, instance);\n stub(BaseUIComponent.prototype, instance);\n Ink.warn(name + ' was not correctly created. ' + (instance._validationError || ''));\n };\n\n // TODO BaseUIComponent.setGlobalOptions = function () {}\n // TODO BaseUIComponent.createMany = function (selector) {}\n BaseUIComponent.getInstance = function (elOrSelector) {\n elOrSelector = Common.elOrSelector(elOrSelector);\n return Common.getInstance(elOrSelector, this /* get instance by constructor */);\n };\n\n Ink.extendObj(BaseUIComponent.prototype, {\n /**\n * Get an UI component's option's value.\n *\n * @method getOption\n * @param {String} name The option's name.\n * @return {Mixed} The option value, or undefined if nothing is found.\n *\n * @example\n *\n * var myUIComponent = new Modal('#element', { trigger: '#trigger' }); // or anything else inheriting BaseUIComponent\n * myUIComponent.getOption('trigger'); // -> The trigger element (not the selector string, mind you)\n *\n **/\n getOption: function (name) {\n if (this.constructor && !(name in this.constructor._optionDefinition)) {\n Ink.error('\"' + name + '\" is not an option for ' + this.constructor._name);\n return undefined;\n }\n\n return this._options[name];\n },\n\n /**\n * Sets an option's value.\n *\n * @method getOption\n * @param {String} name Name of the option.\n * @param {Mixed} value New option value.\n * @return {void}\n * @public\n *\n * @example\n *\n * var myUIComponent = new Modal(...);\n * myUIComponent.setOption('trigger', '#some-element');\n **/\n setOption: function (name, value) {\n if (this.constructor && !(name in this.constructor._optionDefinition)) {\n Ink.error('\"' + name + ' is not an option for ' + this.constructor._name);\n return;\n }\n\n this._options[name] = value;\n },\n\n /**\n * Get the element associated with an UI component (IE the one you used in the constructor)\n *\n * @method getElement\n * @return {Element} The component's element.\n *\n * @example\n * var myUIComponent = new Modal('#element'); // or anything else inheriting BaseUIComponent\n * myUIComponent.getElement(); // -> The '#element' (not the selector string, mind you).\n *\n **/\n getElement: function () {\n return this._element;\n }\n });\n\n Common.BaseUIComponent = BaseUIComponent;\n\n /**\n * Take a constructor, and make it an Ink UI component.\n *\n * Makes it inherit BaseUIComponent, makes sure it has the basic properties Ink.UI.Common needs it to have, adds the necessary static methods, sets its options, etc.\n *\n * @method createUIComponent\n * @param {Function} theConstructor UI component constructor. It should have an _init function in its prototype, an _optionDefinition object, and a _name property indicating its name.\n * @param {Object} [options] Options hash, containing:\n * @param {Boolean} [options.elementIsOptional=false] Whether the element argument is optional (For example, when the component might work on existing markup or create its own).\n * @return {void}\n * @public\n **/\n Common.createUIComponent = function createUIComponent(theConstructor, options) {\n theConstructor._componentOptions = options || {};\n\n function assert(test, msg) {\n if (!test) {\n throw new Error('Ink.UI_1.createUIComponent: ' + msg);\n }\n }\n\n function assertProp(prop, propType, message) {\n var propVal = theConstructor[prop];\n // Check that the property was passed\n assert(typeof propVal !== 'undefined',\n theConstructor + ' doesn\\'t have a \"' + prop + '\" property. ' + message);\n // Check that its type is correct\n assert(propType && typeof propVal === propType,\n 'typeof ' + theConstructor + '.' + prop + ' is not \"' + propType + '\". ' + message);\n }\n\n assert(typeof theConstructor === 'function',\n 'constructor argument is not a function!');\n\n assertProp('_name', 'string', 'This property is used for error ' +\n 'messages. Set it to the full module path and version (Ink.My.Module_1).');\n assertProp('_optionDefinition', 'object', 'This property contains the ' +\n 'option names, types and defaults. See Ink.UI.Common.options() for reference.');\n\n // Extend the instance methods and props\n var _oldProto = theConstructor.prototype;\n\n if (typeof Object.create === 'function') {\n theConstructor.prototype = Object.create(BaseUIComponent.prototype);\n } else {\n theConstructor.prototype = (function hideF() {\n function F() {}\n F.prototype = BaseUIComponent.prototype;\n return new F();\n }());\n }\n\n Ink.extendObj(theConstructor.prototype, _oldProto);\n theConstructor.prototype.constructor = theConstructor;\n // Extend static methods\n Ink.extendObj(theConstructor, BaseUIComponent);\n };\n\n return Common;\n\n});\n","/**\n * Date selector\n * @module Ink.UI.DatePicker_1\n * @version 1\n */\n\nInk.createModule('Ink.UI.DatePicker', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1','Ink.Util.Date_1', 'Ink.Dom.Browser_1'], function(Common, Event, Css, InkElement, Selector, InkArray, InkDate ) {\n 'use strict';\n\n // Clamp a number into a min/max limit\n function clamp(n, min, max) {\n if (n > max) { n = max; }\n if (n < min) { n = min; }\n\n return n;\n }\n\n function dateishFromYMDString(YMD) {\n var split = YMD.split('-');\n return dateishFromYMD(+split[0], +split[1] - 1, +split[2]);\n }\n\n function dateishFromYMD(year, month, day) {\n return {_year: year, _month: month, _day: day};\n }\n\n function dateishFromDate(date) {\n return {_year: date.getFullYear(), _month: date.getMonth(), _day: date.getDate()};\n }\n\n /**\n * @class Ink.UI.DatePicker\n * @constructor\n * @version 1\n *\n * @param {String|Element} selector Datepicker element\n * @param {Object} [options] Options\n * @param {Boolean} [options.autoOpen] Flag to automatically open the datepicker.\n * @param {String} [options.cleanText] Text for the clean button. Defaults to 'Clear'.\n * @param {String} [options.closeText] Text for the close button. Defaults to 'Close'.\n * @param {String} [options.cssClass] CSS class to be applied on the datepicker\n * @param {String|Element} [options.pickerField] (if not using in an input[type=\"text\"]) Element which displays the DatePicker when clicked. Defaults to an \"open\" link.\n * @param {String} [options.dateRange] Enforce limits to year, month and day for the Date, ex: '1990-08-25:2020-11'\n * @param {Boolean} [options.displayInSelect] Flag to display the component in a select element.\n * @param {String|Element} [options.dayField] (if using options.displayInSelect) `select` field with days.\n * @param {String|Element} [options.monthField] (if using options.displayInSelect) `select` field with months.\n * @param {String|Element} [options.yearField] (if using options.displayInSelect) `select` field with years.\n * @param {String} [options.format] Date format string\n * @param {Object} [options.month] Hash of month names. Defaults to english month names. January is 1.\n * @param {String} [options.nextLinkText] Text for the previous button. Defaults to '«'.\n * @param {String} [options.ofText] Text to show between month and year. Defaults to ' of '.\n * @param {Boolean} [options.onFocus] If the datepicker should open when the target element is focused. Defaults to true.\n * @param {Function} [options.onMonthSelected] Callback to execute when the month is selected.\n * @param {Function} [options.onSetDate] Callback to execute when the date is set.\n * @param {Function} [options.onYearSelected] Callback to execute when the year is selected.\n * @param {String} [options.position] Position for the datepicker. Either 'right' or 'bottom'. Defaults to 'right'.\n * @param {String} [options.prevLinkText] Text for the previous button. Defaults to '«'.\n * @param {Boolean} [options.showClean] If the clean button should be visible. Defaults to true.\n * @param {Boolean} [options.showClose] If the close button should be visible. Defaults to true.\n * @param {Boolean} [options.shy] If the datepicker should hide automatically when the user clicks outside. Defaults to true.\n * @param {String} [options.startDate] Date to define initial month. Must be in yyyy-mm-dd format.\n * @param {Number} [options.startWeekDay] First day of the week. Sunday is zero. Defaults to 1 (Monday).\n * @param {Function} [options.validYearFn] Callback to execute when 'rendering' the month (in the month view)\n * @param {Function} [options.validMonthFn] Callback to execute when 'rendering' the month (in the month view)\n * @param {Function} [options.validDayFn] Callback to execute when 'rendering' the day (in the month view)\n * @param {Function} [options.nextValidDateFn] Function to calculate the next valid date, given the current. Useful when there's invalid dates or time frames.\n * @param {Function} [options.prevValidDateFn] Function to calculate the previous valid date, given the current. Useful when there's invalid dates or time frames.\n * @param {Object} [options.wDay] Hash of week day names. Sunday is 0. Defaults to { 0:'Sunday', 1:'Monday', etc...\n * @param {String} [options.yearRange] Enforce limits to year for the Date, ex: '1990:2020' (deprecated)\n *\n * @sample Ink_UI_DatePicker_1.html\n */\n function DatePicker() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n DatePicker._name = 'DatePicker_1';\n\n DatePicker._optionDefinition = {\n autoOpen: ['Boolean', false],\n cleanText: ['String', 'Clear'],\n closeText: ['String', 'Close'],\n pickerField: ['Element', null],\n containerElement:['Element', null],\n cssClass: ['String', 'ink-calendar bottom'],\n dateRange: ['String', null],\n \n // use this in a \n *\n * By applying this UI class to the above input, you get a tag field with the tags \"initial\" and \"value\". The class preserves the original input element. It remains hidden and is updated with new tag information dynamically, so regular HTML form logic still applies.\n *\n * Below \"input\" refers to the current value of the input tag (updated as the user enters text, of course), and \"output\" refers to the value which this class writes back to said input tag.\n *\n * @class Ink.UI.TagField\n * @version 1\n * @constructor\n * @param {String|Element} element Selector or DOM Input Element.\n * @param {Object} [options] Options object\n * @param {String|Array} [options.tags] Initial tags in the input\n * @param {Boolean} [options.allowRepeated] Flag to allow user to input several tags. Defaults to true.\n * @param {RegExp} [options.separator] Split the input by this RegExp. Defaults to /[,;(space)]+/g (spaces, commas and semicolons)\n * @param {String} [options.outSeparator] Use this string to separate each tag from the next in the output. Defaults to ','.\n * @param {Boolean} [options.autoSplit] Flag to activate tag creation when the user types a separator. Defaults to true.\n * @param {Integer} [options.maxTags] Maximum number of tags allowed. Set to -1 for no limit. Defaults to -1.\n * @example\n */\n function TagField() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n TagField._name = 'TagField_1';\n\n TagField._optionDefinition = {\n tags: ['String', []],\n tagQuery: ['Object', null],\n tagQueryAsync: ['Object', null],\n allowRepeated: ['Boolean', false],\n maxTags: ['Integer', -1],\n outSeparator: ['String', ','],\n separator: ['String', /[,; ]+/g],\n autoSplit: ['Boolean', true]\n };\n\n TagField.prototype = {\n /**\n * Init function called by the constructor\n * \n * @method _init\n * @private\n */\n _init: function() {\n var o = this._options;\n if (typeof o.separator === 'string') {\n o.separator = new RegExp(o.separator, 'g');\n }\n\n if (typeof o.tags === 'string') {\n // coerce to array using the separator\n o.tags = this._readInput(o.tags);\n }\n\n Css.addClassName(this._element, 'hide-all');\n\n this._viewElm = InkElement.create('div', {\n className: 'ink-tagfield',\n insertAfter: this._element\n });\n\n this._input = InkElement.create('input', {\n type: 'text',\n className: 'new-tag-input',\n insertBottom: this._viewElm\n });\n\n var tags = [].concat(o.tags, this._tagsFromMarkup(this._element));\n\n this._tags = [];\n\n InkArray.each(tags, Ink.bindMethod(this, '_addTag'));\n\n InkEvent.observe(this._input, 'keyup', Ink.bindEvent(this._onKeyUp, this));\n InkEvent.observe(this._input, 'change', Ink.bindEvent(this._onKeyUp, this));\n InkEvent.observe(this._input, 'keydown', Ink.bindEvent(this._onKeyDown, this));\n InkEvent.observe(this._input, 'blur', Ink.bindEvent(this._onBlur, this));\n InkEvent.observe(this._viewElm, 'click', Ink.bindEvent(this._refocus, this));\n },\n\n destroy: function () {\n InkElement.remove(this._viewElm);\n Css.removeClassName(this._element, 'hide-all');\n },\n\n _tagsFromMarkup: function (element) {\n var tagname = element.tagName.toLowerCase();\n if (tagname === 'input') {\n return this._readInput(element.value);\n } else if (tagname === 'select') {\n return InkArray.map(element.getElementsByTagName('option'), function (option) {\n return InkElement.textContent(option);\n });\n } else {\n throw new Error('Cannot read tags from a ' + tagname + ' tag. Unknown tag');\n }\n },\n\n _tagsToMarkup: function (tags, element) {\n var tagname = element.tagName.toLowerCase();\n if (tagname === 'input') {\n if (this._options.separator) {\n element.value = tags.join(this._options.outSeparator);\n }\n } else if (tagname === 'select') {\n element.innerHTML = '';\n InkArray.each(tags, function (tag) {\n var opt = InkElement.create('option', {selected: 'selected'});\n InkElement.setTextContent(opt, tag);\n element.appendChild(opt);\n });\n } else {\n throw new Error('TagField: Cannot read tags from a ' + tagname + ' tag. Unknown tag');\n }\n },\n\n _addTag: function (tag) {\n if (this._options.maxTags !== -1 &&\n this._tags.length >= this._options.maxTags) {\n return;\n }\n if ((!this._options.allowRepeated &&\n InkArray.inArray(tag, this._tags, tag)) || !tag) {\n return false;\n }\n var elm = InkElement.create('span', {\n className: 'ink-tag',\n setTextContent: tag + ' '\n });\n\n var remove = InkElement.create('span', {\n className: 'remove fa fa-times',\n insertBottom: elm\n });\n InkEvent.observe(remove, 'click', Ink.bindEvent(this._removeTag, this, null));\n\n var spc = document.createTextNode(' ');\n\n this._tags.push(tag);\n this._viewElm.insertBefore(elm, this._input);\n this._viewElm.insertBefore(spc, this._input);\n this._tagsToMarkup(this._tags, this._element);\n },\n\n _readInput: function (text) {\n if (this._options.separator) {\n return InkArray.filter(text.split(this._options.separator), isTruthy);\n } else {\n return [text];\n }\n },\n\n _onKeyUp: function () { // TODO control input box size\n if (!this._options.autoSplit) {\n return;\n }\n\n var split;\n if (!buggySplit) {\n split = this._input.value.split(this._options.separator);\n } else {\n split = splitFunction(this._input.value, this._options.separator);\n }\n\n if (split.length <= 1) {\n return;\n }\n var last = split[split.length - 1];\n split = split.splice(0, split.length - 1);\n split = InkArray.filter(split, isTruthy);\n \n InkArray.each(split, Ink.bind(this._addTag, this));\n this._input.value = last;\n },\n\n _onKeyDown: function (event) {\n if (event.which === enterKey) {\n return this._onEnterKeyDown(event);\n } else if (event.which === backspaceKey) {\n return this._onBackspaceKeyDown();\n } else if (this._removeConfirm) {\n // user pressed another key, cancel removal from a backspace key\n this._unsetRemovingVisual(this._tags.length - 1);\n }\n },\n\n /**\n * When the user presses backspace twice on the empty input, we delete the last tag on the field.\n * @method onBackspaceKeyDown\n * @return {void}\n * @private\n */\n _onBackspaceKeyDown: function () {\n if (this._input.value) { return; }\n\n if (this._removeConfirm) {\n this._unsetRemovingVisual(this._tags.length - 1);\n this._removeTag(this._tags.length - 1);\n this._removeConfirm = null;\n } else {\n this._setRemovingVisual(this._tags.length - 1);\n }\n },\n\n _onEnterKeyDown: function (event) {\n var tag = this._input.value;\n if (tag) {\n this._addTag(tag);\n this._input.value = '';\n }\n InkEvent.stopDefault(event);\n },\n\n _onBlur: function () {\n this._addTag(this._input.value);\n this._input.value = '';\n },\n\n /* For when the user presses backspace.\n * Set the style of the tag so that it seems like it's going to be removed\n * if they press backspace again. */\n _setRemovingVisual: function (tagIndex) {\n var elm = this._viewElm.children[tagIndex];\n if (!elm) { return; }\n\n Css.addClassName(elm, 'tag-deleting');\n\n this._removeRemovingVisualTimeout = setTimeout(Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex), 4000);\n InkEvent.observe(this._input, 'blur', Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex));\n this._removeConfirm = true;\n },\n _unsetRemovingVisual: function (tagIndex) {\n var elm = this._viewElm.children[tagIndex];\n if (elm) {\n Css.removeClassName(elm, 'tag-deleting');\n clearTimeout(this._removeRemovingVisualTimeout);\n }\n this._removeConfirm = null;\n },\n\n _removeTag: function (event) {\n var index;\n if (typeof event === 'object') { // click event on close button\n var elm = InkEvent.element(event).parentNode;\n index = InkElement.parentIndexOf(this._viewElm, elm);\n } else if (typeof event === 'number') { // manual removal\n index = event;\n }\n this._tags = InkArray.remove(this._tags, index, 1);\n InkElement.remove(this._viewElm.children[index]);\n this._tagsToMarkup(this._tags, this._element);\n },\n\n _refocus: function (event) {\n this._input.focus();\n InkEvent.stop(event);\n return false;\n }\n };\n\n Common.createUIComponent(TagField);\n\n return TagField;\n});\n","/**\n * Toggle the visibility of elements.\n * @module Ink.UI.Toggle_1\n * @version 1\n */\n\n Ink.createModule('Ink.UI.Toggle', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, InkEvent, Css, InkElement, Selector, InkArray ) {\n 'use strict';\n\n /**\n * *Important note: Do NOT use this as a dropdown! Use Ink.UI.Dropdown for that.*\n *\n * You need two elements to use Toggle: the `trigger` element, and the `target` element (or elements). The default behaviour is to toggle the `target`(s) when you click the `trigger`.\n *\n * The toggle has a state. It is either \"on\" or \"off\". It works by switching between the CSS classes in `classNameOn` and `classNameOff` according to the current state.\n *\n * When you initialize the Toggle, it will check if the targets are visible to figure out what the initial state is. You can force the toggle to consider itself turned \"on\" or \"off\" by setting the `initialState` option to `true` or `false`, respectively.\n *\n * You can get the current state of the Toggle by calling `getState`, or by checking if your `trigger` element has the \"active\" class.\n * The state can be changed through JavaScript. Just call `setState(true)`\n * to turn the Toggle on (or `setState(false)` to turn it off).\n *\n * @class Ink.UI.Toggle\n * @constructor\n * @version 1\n * @param {String|Element} selector Trigger element. By clicking this, the target (or targets) are triggered.\n * @param {Object} [options] Options object, containing:\n *\n * @param {String} options.target CSS Selector that specifies the elements that this component will toggle\n * @param {Boolean} [options.isAccordion] Set this to true to signal that this toggle is part of an accordion with other toggles. The toggles of an accordion must be common descendants of an element with the class \"accordion\". If they're not, Ink will warn you about this on the console.\n * @param {String} [options.classNameOn] CSS class to toggle when on. Defaults to 'show-all'.\n * @param {String} [options.classNameOff] CSS class to toggle when off. Defaults to 'hide-all'.\n * @param {String} [options.triggerEvent] Event that will trigger the toggling. Defaults to 'click'.\n * @param {Boolean} [options.closeOnClick] Flag to toggle the targe off when clicking outside the toggled content. Defaults to true.\n * @param {Boolean} [options.canToggleAnAncestor] Set to true if you want the toggle to target ancestors of itself. Defaults to false.\n * @param {String} [options.closeOnInsideClick] Toggle off when a child element matching this selector is clicked. Set to null to deactivate the check. Defaults to 'a[href]'.\n * @param {Boolean} [options.initialState] Flag to define initial state. false: off, true: on, null: markup. Defaults to null.\n * @param {Function} [options.onChangeState] Callback when the toggle state changes. Return `false` to cancel the event.\n *\n * @sample Ink_UI_Toggle_1_constructor.html\n */\n function Toggle(){\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n Toggle._name = 'Toggle_1';\n\n Toggle._optionDefinition = {\n target: ['Elements'],\n triggerEvent: ['String', 'click'],\n closeOnClick: ['Boolean', true],\n canToggleAnAncestor: ['Boolean', false],\n isAccordion: ['Boolean', false],\n initialState: ['Boolean', null], // May be true, false, or null to be what it is right now\n classNameOn: ['String', 'show-all'],\n classNameOff: ['String', 'hide-all'],\n closeOnInsideClick: ['String', 'a[href]'], // closes the toggle when a target is clicked and it is a link\n onChangeState: ['Function', null]\n };\n\n Toggle.prototype = {\n\n /**\n * Init function called by the constructor\n *\n * @method _init\n * @private\n */\n _init: function(){\n var i, len;\n\n this._targets = Common.elsOrSelector(this._options.target);\n\n // Boolean option handling\n this._options.closeOnClick = this._options.closeOnClick;\n // Actually a throolean\n if (this._options.initialState === null) {\n this._options.initialState = Css.hasClassName(this._targets[0], this._options.classNameOn);\n }\n\n if (this._options.classNameOn !== 'show-all' || this._options.classNameOff !== 'hide-all') {\n for (i = 0, len = this._targets.length; i < len; i++) {\n Css.removeClassName(this._targets[i], 'show-all');\n Css.removeClassName(this._targets[i], 'hide-all');\n }\n }\n\n if (this._options.isAccordion) {\n this._accordionContainer = InkElement.findUpwardsByClass(\n this._element, 'accordion');\n if (!this._accordionContainer) {\n Ink.warn('Ink.UI.Toggle_1: This toggle has the isToggle option set to `true`, but is not a descendant of an element with the class \"accordion\"! Because of this, it won\\'t be able to find other toggles in the same accordion and cooperate with them.');\n }\n }\n\n this._constructing = true;\n\n this._bindEvents();\n\n if (this._options.initialState !== null) {\n this.setState(this._options.initialState, true);\n } else {\n // Add initial classes matching the current \"display\" of the object.\n var state = Css.getStyle(this._targets[0], 'display') !== 'none';\n this.setState(state, true);\n }\n // Aditionally, remove any inline \"display\" style.\n for (i = 0, len = this._targets.length; i < len; i++) {\n if (this._targets[i].style.display) {\n this._targets[i].style.display = ''; // becomes default\n }\n }\n\n this._element.setAttribute('data-is-toggle-trigger', 'true');\n\n this._constructing = false;\n },\n\n /**\n * @method _bindEvents\n * @private\n */\n _bindEvents: function () {\n if ( this._options.triggerEvent ) {\n InkEvent.on(\n this._element,\n this._options.triggerEvent,\n Ink.bind(this._onTriggerEvent, this));\n }\n if( this._options.closeOnClick ){\n InkEvent.observe( document, 'click', Ink.bind(this._onOutsideClick, this));\n }\n if( this._options.closeOnInsideClick ) {\n var sel = this._options.closeOnInsideClick;\n if (sel.toString() === 'true') {\n sel = '*';\n }\n InkEvent.observeMulti(this._targets, 'click', Ink.bind(function (e) {\n if ( InkElement.findUpwardsBySelector(InkEvent.element(e), sel) ) {\n this.setState(false, true);\n }\n }, this));\n }\n },\n\n /**\n * Event handler. It's responsible for handling the `triggerEvent` as defined in the options.\n *\n * This will trigger the toggle.\n *\n * @method _onTriggerEvent\n * @param {Event} event\n * @private\n */\n _onTriggerEvent: function( event ){\n // When the togglee is a child of the toggler, we get the togglee's events here. We have to check that this event is for us.\n var target = InkEvent.element(event);\n\n var isAncestorOfClickedElement = InkArray.some(this._targets, function (thisOne) {\n return thisOne === target || InkElement.isAncestorOf(thisOne, target);\n });\n\n if (!this._options.canToggleAnAncestor && isAncestorOfClickedElement) {\n return;\n }\n\n var has = this.getState();\n this.setState(!has, true);\n if (!has && this._firstTime) {\n this._firstTime = false;\n }\n\n InkEvent.stopDefault(event);\n },\n\n /**\n * Be compatible with accordions\n *\n * @method _updateAccordion\n **/\n _updateAccordion: function () {\n if (!this._accordionContainer) { return; }\n if (this.getState() === false) { return; }\n\n var elms = Selector.select('[data-is-toggle-trigger]', this._accordionContainer);\n for (var i = 0; i < elms.length; i++) {\n var otherToggle = Toggle.getInstance(elms[i]);\n if (otherToggle && (otherToggle !== this) && otherToggle.getState() === true) {\n otherToggle.setState(false, true);\n }\n }\n },\n\n /**\n * Click handler. Will handle clicks outside the toggle component.\n *\n * @method _onOutsideClick\n * @param {Event} event\n * @private\n */\n _onOutsideClick: function( event ){\n var tgtEl = InkEvent.element(event);\n var shades;\n\n if (!InkElement.isAncestorOf(document.documentElement, tgtEl)) {\n // Because if the element was removed while the click event was\n // bubbling, we can't tell where it came from\n return;\n }\n\n if (InkElement.findUpwardsBySelector(tgtEl, '[data-is-toggle-trigger=\"true\"]')) { return; }\n\n var ancestorOfTargets = InkArray.some(this._targets, function (target) {\n return InkElement.isAncestorOf(target, tgtEl) || target === tgtEl;\n });\n\n if( (this._element === tgtEl) || InkElement.isAncestorOf(this._element, tgtEl) || ancestorOfTargets) {\n return;\n } else if( (shades = Ink.ss('.ink-shade')).length ) {\n var shadesLength = shades.length;\n\n for( var i = 0; i < shadesLength; i++ ){\n if( InkElement.isAncestorOf(shades[i],tgtEl) && InkElement.isAncestorOf(shades[i],this._element) ){\n return;\n }\n }\n }\n\n this.setState(false, true); // dismiss\n },\n\n /**\n * Sets the state of the toggle. (on/off)\n *\n * @method setState\n * @param {Boolean} on New state (on/off)\n * @param {Boolean} callHandler Whether to call the onChangeState handler.\n * @return {void}\n */\n setState: function (on, callHandler) {\n if (on === this.getState() && !this._constructing) { return; }\n\n var i, len;\n if (this._group && on) {\n for (i = 0, len = this._group.length; i < len; i++) {\n if (this._group[i].getState() === true) {\n this._group[i].setState(false, true);\n }\n }\n }\n\n if (callHandler && typeof this._options.onChangeState === 'function') {\n var ret = this._options.onChangeState(on);\n if (ret === false) { return false; } // Canceled by the event handler\n }\n for (i = 0, len = this._targets.length; i < len; i++) {\n Css.addRemoveClassName(this._targets[i], this._options.classNameOn, on);\n Css.addRemoveClassName(this._targets[i], this._options.classNameOff, !on);\n }\n Css.addRemoveClassName(this._element, 'active', on);\n\n if (this._accordionContainer) {\n this._updateAccordion();\n }\n },\n\n /**\n * Gets the state of the toggle. (on/off)\n *\n * @method getState\n *\n * @return {Boolean} whether the toggle is toggled on.\n */\n getState: function () {\n return Css.hasClassName(this._element, 'active');\n }\n };\n\n Common.createUIComponent(Toggle);\n\n return Toggle;\n});\n","/**\n * Content Tooltips\n * @module Ink.UI.Tooltip_1\n * @version 1\n */\nInk.createModule('Ink.UI.Tooltip', '1', ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1', 'Ink.Dom.Selector_1', 'Ink.Util.Array_1', 'Ink.Dom.Css_1', 'Ink.Dom.Browser_1'], function (Common, InkEvent, InkElement, Selector, InkArray, Css) {\n 'use strict';\n\n /**\n * Tooltips are useful as a means to display information about functionality while avoiding clutter.\n *\n * Tooltips show up when you hover elements which \"have\" tooltips.\n *\n * This class will \"give\" a tooltip to many elements, selected by its first argument (`target`). This is contrary to the other UI modules in Ink, which are created once per element.\n *\n * You can define options either through the second argument of the Tooltip constructor, or as data-attributes in each `target` element. Options set through data-attributes all start with \"data-tip\", and override options passed into the Tooltip constructor.\n *\n * @class Ink.UI.Tooltip\n * @constructor\n *\n * @param {Element|String} target Target element or selector of elements, to display the tooltips on.\n * @param {Object} [options] Options object\n * @param {String} [options.text] Text content for the tooltip.\n * @param {String} [options.html] HTML for the tooltip. Same as above, but won't escape HTML.\n * @param {String} [options.where] Positioning for the tooltip. Options are 'up', 'down', 'left', 'right', 'mousemove' (follows the cursor), and 'mousefix' (stays fixed). Defaults to 'up'.\n * \n * @param {String} [options.color] Color of the tooltip. Options are red, orange, blue, green and black. Default is white.\n * @param {Number} [options.fade] Number of seconds to fade in/out. Defaults to 0.3.\n * @param {Boolean} [options.forever] Flag to prevent the tooltip from being erased when the mouse hovers away from the target.\n * @param {Number} [options.timeout] Number of seconds the tooltip will stay open. Useful together with options.forever. Defaults to 0.\n * @param {Number} [options.delay] Time the tooltip waits until it is displayed. Useful to avoid getting the attention of the user unnecessarily\n * @param {Element|Selector} [options.template] Element or selector containing HTML to be cloned into the tooltips. Can be a hidden element, because CSS `display` is set to `block`.\n * @param {String} [options.templatefield] Selector within the template element to choose where the text is inserted into the tooltip. Useful when a wrapper DIV is required.\n * @param {Number} [options.left] Spacing from the target to the tooltip, when `where` is `mousemove` or `mousefix`. Defaults to 10.\n * @param {Number} [options.top] Spacing from the target to the tooltip, when `where` is `mousemove` or `mousefix`. Defaults to 10.\n * @param {Number} [options.spacing] Spacing between the tooltip and the target element, when `where` is not `mousemove` or `mousefix`. Defaults to 8.\n * \n * @sample Ink_UI_Tooltip_1.html\n */\n function Tooltip(element, options) {\n this._init(element, options || {});\n }\n\n function EachTooltip(root, elm) {\n this._init(root, elm);\n }\n\n var transitionDurationName,\n transitionPropertyName,\n transitionTimingFunctionName;\n (function () { // Feature detection\n var test = document.createElement('DIV');\n var names = ['transition', 'oTransition', 'msTransition', 'mozTransition',\n 'webkitTransition'];\n for (var i = 0; i < names.length; i++) {\n if (typeof test.style[names[i] + 'Duration'] !== 'undefined') {\n transitionDurationName = names[i] + 'Duration';\n transitionPropertyName = names[i] + 'Property';\n transitionTimingFunctionName = names[i] + 'TimingFunction';\n break;\n }\n }\n }());\n\n // Body or documentElement\n var bodies = document.getElementsByTagName('body');\n var body = bodies.length ? bodies[0] : document.documentElement;\n\n Tooltip.prototype = {\n _init: function(element, options) {\n var elements;\n\n this.options = Ink.extendObj({\n where: 'up',\n zIndex: 10000,\n left: 10,\n top: 10,\n spacing: 8,\n forever: 0,\n color: '',\n timeout: 0,\n delay: 0,\n template: null,\n templatefield: null,\n fade: 0.3,\n text: ''\n }, options || {});\n\n if (typeof element === 'string') {\n elements = Selector.select(element);\n } else if (typeof element === 'object') {\n elements = [element];\n } else {\n throw 'Element expected';\n }\n\n this.tooltips = [];\n\n for (var i = 0, len = elements.length; i < len; i++) {\n this.tooltips[i] = new EachTooltip(this, elements[i]);\n }\n },\n /**\n * Destroys the tooltips created by this instance\n *\n * @method destroy\n * @return {void}\n * @public\n */\n destroy: function () {\n InkArray.each(this.tooltips, function (tooltip) {\n tooltip._destroy();\n });\n this.tooltips = null;\n this.options = null;\n }\n };\n\n EachTooltip.prototype = {\n _oppositeDirections: {\n left: 'right',\n right: 'left',\n up: 'down',\n down: 'up'\n },\n _init: function(root, elm) {\n InkEvent.observe(elm, 'mouseover', Ink.bindEvent(this._onMouseOver, this));\n InkEvent.observe(elm, 'focus', Ink.bindEvent(this._onMouseOver, this));\n InkEvent.observe(elm, 'mouseout', Ink.bindEvent(this._onMouseOut, this));\n InkEvent.observe(elm, 'blur', Ink.bindEvent(this._onMouseOut, this));\n InkEvent.observe(elm, 'mousemove', Ink.bindEvent(this._onMouseMove, this));\n\n this.root = root;\n this.element = elm;\n this._delayTimeout = null;\n this.tooltip = null;\n\n Common.registerInstance(this, this.element);\n },\n _makeTooltip: function (mousePosition) {\n if (!this._getOpt('text') &&\n !this._getOpt('html') &&\n !InkElement.hasAttribute(this.element, 'title')) {\n return false;\n }\n\n var tooltip = this._createTooltipElement();\n\n if (this.tooltip) {\n this._removeTooltip();\n }\n\n this.tooltip = tooltip;\n\n this._fadeInTooltipElement(tooltip);\n this._placeTooltipElement(tooltip, mousePosition);\n\n InkEvent.observe(tooltip, 'mouseover', Ink.bindEvent(this._onTooltipMouseOver, this));\n\n var timeout = this._getFloatOpt('timeout');\n if (timeout) {\n setTimeout(Ink.bind(function () {\n if (this.tooltip === tooltip) {\n this._removeTooltip();\n }\n }, this), timeout * 1000);\n }\n },\n _createTooltipElement: function () {\n var template = this._getOpt('template'), // User template instead of our HTML\n templatefield = this._getOpt('templatefield'),\n \n tooltip, // The element we float\n field; // Element where we write our message. Child or same as the above\n\n if (template) { // The user told us of a template to use. We copy it.\n var temp = document.createElement('DIV');\n temp.innerHTML = Common.elOrSelector(template, 'options.template').outerHTML;\n tooltip = temp.firstChild;\n \n if (templatefield) {\n field = Selector.select(templatefield, tooltip);\n if (field) {\n field = field[0];\n } else {\n throw 'options.templatefield must be a valid selector within options.template';\n }\n } else {\n field = tooltip; // Assume same element if user did not specify a field\n }\n } else { // We create the default structure\n tooltip = document.createElement('DIV');\n Css.addClassName(tooltip, 'ink-tooltip');\n Css.addClassName(tooltip, this._getOpt('color'));\n\n field = document.createElement('DIV');\n Css.addClassName(field, 'content');\n\n tooltip.appendChild(field);\n }\n \n if (this._getOpt('html')) {\n field.innerHTML = this._getOpt('html');\n } else if (this._getOpt('text')) {\n InkElement.setTextContent(field, this._getOpt('text'));\n } else {\n InkElement.setTextContent(field, this.element.getAttribute('title'));\n }\n tooltip.style.display = 'block';\n tooltip.style.position = 'absolute';\n tooltip.style.zIndex = this._getIntOpt('zIndex');\n\n return tooltip;\n },\n _fadeInTooltipElement: function (tooltip) {\n var fadeTime = this._getFloatOpt('fade');\n if (transitionDurationName && fadeTime) {\n tooltip.style.opacity = '0';\n tooltip.style[transitionDurationName] = fadeTime + 's';\n tooltip.style[transitionPropertyName] = 'opacity';\n tooltip.style[transitionTimingFunctionName] = 'ease-in-out';\n setTimeout(function () {\n tooltip.style.opacity = '1';\n }, 0); // Wait a tick\n }\n },\n _placeTooltipElement: function (tooltip, mousePosition) {\n var where = this._getOpt('where');\n\n if (mousePosition === null && (where === 'mousemove' || where === 'mousefix')) {\n // When there are no mouse coords available (focus event)\n where = 'up';\n }\n\n if (where === 'mousemove' || where === 'mousefix') {\n var mPos = mousePosition;\n this._setPos(mPos[0], mPos[1]);\n body.appendChild(tooltip);\n } else if (where.match(/(up|down|left|right)/)) {\n body.appendChild(tooltip);\n var targetElementPos = InkElement.offset(this.element);\n var tleft = targetElementPos[0],\n ttop = targetElementPos[1];\n\n var centerh = (InkElement.elementWidth(this.element) / 2) - (InkElement.elementWidth(tooltip) / 2),\n centerv = (InkElement.elementHeight(this.element) / 2) - (InkElement.elementHeight(tooltip) / 2);\n var spacing = this._getIntOpt('spacing');\n\n var tooltipDims = InkElement.elementDimensions(tooltip);\n var elementDims = InkElement.elementDimensions(this.element);\n\n var maxX = InkElement.scrollWidth() + InkElement.viewportWidth();\n var maxY = InkElement.scrollHeight() + InkElement.viewportHeight();\n \n where = this._getWhereValueInsideViewport(where, {\n left: tleft - tooltipDims[0],\n right: tleft + tooltipDims[0],\n top: ttop + tooltipDims[1],\n bottom: ttop + tooltipDims[1]\n }, {\n right: maxX,\n bottom: maxY\n });\n \n if (where === 'up') {\n ttop -= tooltipDims[1];\n ttop -= spacing;\n tleft += centerh;\n } else if (where === 'down') {\n ttop += elementDims[1];\n ttop += spacing;\n tleft += centerh;\n } else if (where === 'left') {\n tleft -= tooltipDims[0];\n tleft -= spacing;\n ttop += centerv;\n } else if (where === 'right') {\n tleft += elementDims[0];\n tleft += spacing;\n ttop += centerv;\n }\n \n var arrow = null;\n if (where.match(/(up|down|left|right)/)) {\n arrow = document.createElement('SPAN');\n Css.addClassName(arrow, 'arrow');\n Css.addClassName(arrow, this._oppositeDirections[where]);\n tooltip.appendChild(arrow);\n }\n\n var tooltipLeft = tleft;\n var tooltipTop = ttop;\n\n var toBottom = (tooltipTop + tooltipDims[1]) - maxY;\n var toRight = (tooltipLeft + tooltipDims[0]) - maxX;\n var toLeft = 0 - tooltipLeft;\n var toTop = 0 - tooltipTop;\n\n if (toBottom > 0) {\n if (arrow) { arrow.style.top = (tooltipDims[1] / 2) + toBottom + 'px'; }\n tooltipTop -= toBottom;\n } else if (toTop > 0) {\n if (arrow) { arrow.style.top = (tooltipDims[1] / 2) - toTop + 'px'; }\n tooltipTop += toTop;\n } else if (toRight > 0) {\n if (arrow) { arrow.style.left = (tooltipDims[0] / 2) + toRight + 'px'; }\n tooltipLeft -= toRight;\n } else if (toLeft > 0) {\n if (arrow) { arrow.style.left = (tooltipDims[0] / 2) - toLeft + 'px'; }\n tooltipLeft += toLeft;\n }\n\n tooltip.style.left = tooltipLeft + 'px';\n tooltip.style.top = tooltipTop + 'px';\n }\n },\n\n /**\n * Get a value for \"where\" (left/right/up/down) which doesn't put the\n * tooltip off the screen\n *\n * @method _getWhereValueInsideViewport\n * @param where {String} \"where\" value which was given by the user and we might change\n * @param bbox {BoundingBox} A bounding box like what you get from getBoundingClientRect ({top, bottom, left, right}) with pixel positions from the top left corner of the viewport.\n * @param viewport {BoundingBox} Bounding box for the viewport. \"top\" and \"left\" are omitted because these coordinates are relative to the top-left corner of the viewport so they are zero.\n *\n * @TODO: we can't use getBoundingClientRect in this case because it returns {0,0,0,0} on our uncreated tooltip.\n */\n _getWhereValueInsideViewport: function (where, bbox, viewport) {\n if (where === 'left' && bbox.left < 0) {\n return 'right';\n } else if (where === 'right' && bbox.right > viewport.right) {\n return 'left';\n } else if (where === 'up' && bbox.top < 0) {\n return 'down';\n } else if (where === 'down' && bbox.bottom > viewport.bottom) {\n return 'up';\n }\n\n return where;\n },\n _removeTooltip: function() {\n var tooltip = this.tooltip;\n if (!tooltip) {return;}\n\n var remove = Ink.bind(InkElement.remove, {}, tooltip);\n\n if (this._getOpt('where') !== 'mousemove' && transitionDurationName) {\n tooltip.style.opacity = 0;\n // remove() will operate on correct tooltip, although this.tooltip === null then\n setTimeout(remove, this._getFloatOpt('fade') * 1000);\n } else {\n remove();\n }\n this.tooltip = null;\n },\n _getOpt: function (option) {\n var dataAttrVal = InkElement.data(this.element)[InkElement._camelCase('tip-' + option)];\n if (dataAttrVal /* either null or \"\" may signify the absense of this attribute*/) {\n return dataAttrVal;\n }\n var instanceOption = this.root.options[option];\n if (typeof instanceOption !== 'undefined') {\n return instanceOption;\n }\n },\n _getIntOpt: function (option) {\n return parseInt(this._getOpt(option), 10);\n },\n _getFloatOpt: function (option) {\n return parseFloat(this._getOpt(option), 10);\n },\n _destroy: function () {\n if (this.tooltip) {\n InkElement.remove(this.tooltip);\n }\n this.root = null; // Cyclic reference = memory leaks\n this.element = null;\n this.tooltip = null;\n },\n _onMouseOver: function(e) {\n // on IE < 10 you can't access the mouse event not even a tick after it fired\n var mousePosition;\n if (e.type !== 'mouseover') {\n // No mouse coords available\n mousePosition = null;\n } else {\n mousePosition = this._getMousePosition(e);\n }\n var delay = this._getFloatOpt('delay');\n if (delay) {\n this._delayTimeout = setTimeout(Ink.bind(function () {\n if (!this.tooltip) {\n this._makeTooltip(mousePosition);\n }\n this._delayTimeout = null;\n }, this), delay * 1000);\n } else {\n this._makeTooltip(mousePosition);\n }\n },\n _onMouseMove: function(e) {\n if (this._getOpt('where') === 'mousemove' && this.tooltip) {\n var mPos = this._getMousePosition(e);\n this._setPos(mPos[0], mPos[1]);\n }\n },\n _onMouseOut: function () {\n if (!this._getIntOpt('forever')) {\n this._removeTooltip();\n }\n if (this._delayTimeout) {\n clearTimeout(this._delayTimeout);\n this._delayTimeout = null;\n }\n },\n _onTooltipMouseOver: function () {\n if (this.tooltip) { // If tooltip is already being removed, this has no effect\n this._removeTooltip();\n }\n },\n _setPos: function(left, top) {\n left += this._getIntOpt('left');\n top += this._getIntOpt('top');\n var pageDims = this._getPageXY();\n if (this.tooltip) {\n var elmDims = [InkElement.elementWidth(this.tooltip), InkElement.elementHeight(this.tooltip)];\n var scrollDim = this._getScroll();\n\n if((elmDims[0] + left - scrollDim[0]) >= (pageDims[0] - 20)) {\n left = (left - elmDims[0] - this._getIntOpt('left') - 10);\n }\n if((elmDims[1] + top - scrollDim[1]) >= (pageDims[1] - 20)) {\n top = (top - elmDims[1] - this._getIntOpt('top') - 10);\n }\n\n this.tooltip.style.left = left + 'px';\n this.tooltip.style.top = top + 'px';\n }\n },\n _getPageXY: function() {\n var cWidth = 0;\n var cHeight = 0;\n if( typeof( window.innerWidth ) === 'number' ) {\n cWidth = window.innerWidth;\n cHeight = window.innerHeight;\n } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {\n cWidth = document.documentElement.clientWidth;\n cHeight = document.documentElement.clientHeight;\n } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {\n cWidth = document.body.clientWidth;\n cHeight = document.body.clientHeight;\n }\n return [parseInt(cWidth, 10), parseInt(cHeight, 10)];\n },\n _getScroll: function() {\n var dd = document.documentElement, db = document.body;\n if (dd && (dd.scrollLeft || dd.scrollTop)) {\n return [dd.scrollLeft, dd.scrollTop];\n } else if (db) {\n return [db.scrollLeft, db.scrollTop];\n } else {\n return [0, 0];\n }\n },\n _getMousePosition: function(e) {\n return [parseInt(InkEvent.pointerX(e), 10), parseInt(InkEvent.pointerY(e), 10)];\n }\n };\n\n return Tooltip;\n});\n","/**\n * Elements in a tree structure\n * @module Ink.UI.TreeView_1\n * @version 1\n */\nInk.createModule('Ink.UI.TreeView', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, Event, Css, Element, Selector, InkArray ) {\n 'use strict';\n\n\n /**\n * Shows elements in a tree structure which can be expanded and contracted.\n * A TreeView is built with \"node\"s and \"children\". \"node\"s are `li` tags, and \"children\" are `ul` tags.\n * You can build your TreeView out of a regular UL and LI element structure which you already use to display lists with several levels.\n * If you want a node to be open when the TreeView is built, just add the data-open=\"true\" attribute to it.\n * \n * @class Ink.UI.TreeView\n * @constructor\n * @version 1\n * @param {String|Element} selector Element or selector.\n * @param {String} [options] Options object, containing:\n * @param {String} [options.node] Selector for the nodes. Defaults to 'li'.\n * @param {String} [options.children] Selector for the children. Defaults to 'ul'.\n * @param {String} [options.parentClass] CSS classes to be added to parent nodes. Defaults to 'parent'.\n * @param {String} [options.openClass] CSS classes to be added to the icon when a parent is open. Defaults to 'fa fa-minus-circle'.\n * @param {String} [options.closedClass] CSS classes to be added to the icon when a parent is closed. Defaults to 'fa fa-plus-circle'.\n * @param {String} [options.hideClass] CSS Class to toggle visibility of the children. Defaults to 'hide-all'.\n * @param {String} [options.iconTag] The name of icon tag. The component tries to find a tag with that name as a direct child of the node. If it doesn't find it, it creates it. Defaults to 'i'.\n * @param {Boolean} [options.stopDefault] Flag to stops the default behavior of the click handler. Defaults to true.\n * @example\n * \n * \n * \n * @sample Ink_UI_TreeView_1.html\n */\n function TreeView() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n TreeView._name = 'TreeView_1';\n\n TreeView._optionDefinition = {\n 'node': ['String', 'li'],\n 'children': ['String','ul'],\n 'parentClass': ['String','parent'],\n 'openNodeClass': ['String', 'open'],\n 'openClass': ['String','fa fa-minus-circle'],\n 'closedClass': ['String','fa fa-plus-circle'],\n 'hideClass': ['String','hide-all'],\n 'iconTag': ['String', 'i'],\n 'stopDefault' : ['Boolean', true]\n };\n\n TreeView.prototype = {\n /**\n * Init function called by the constructor. Sets the necessary event handlers.\n * \n * @method _init\n * @private\n */\n _init: function(){\n this._handlers = {\n click: Ink.bindEvent(this._onClick,this)\n };\n\n Event.on(this._element, 'click', this._options.node, this._handlers.click);\n\n InkArray.each(Ink.ss(this._options.node, this._element), Ink.bind(function(item){\n if( this.isParent(item) ) {\n Css.addClassName(item, this._options.parentClass);\n\n var isOpen = this.isOpen(item);\n if( !this._getIcon(item) ){\n Element.create(this._options.iconTag, { insertTop: item });\n }\n\n this._setNodeOpen(item, isOpen);\n }\n },this));\n },\n\n _getIcon: function (node) {\n return Ink.s('> ' + this._options.iconTag, node);\n },\n\n /**\n * Checks if a node is open.\n *\n * @method isOpen\n * @param {Element} node The tree node to check\n * @return {Boolean} Whether the node is open.\n **/\n isOpen: function (node) {\n if (!this._getChild(node)) {\n throw new Error('not a node!');\n }\n\n return node.getAttribute('data-open') === 'true' ||\n Css.hasClassName(node, this._options.openNodeClass);\n },\n\n /**\n * Checks if a node is a parent.\n *\n * @method isParent\n * @param {Element} node Node to check\n * @return {Boolean} Whether `node` is a parent.\n **/\n isParent: function (node) {\n return Css.hasClassName(node, this._options.parentClass) ||\n this._getChild(node) != null;\n },\n\n _setNodeOpen: function (node, beOpen) {\n var child = this._getChild(node);\n if (child) {\n Css.setClassName(child, this._options.hideClass, !beOpen);\n var icon = this._getIcon(node);\n\n node.setAttribute('data-open', beOpen);\n\n /*\n * Don't refactor this to\n *\n * setClassName(el, className, status); setClassName(el, className, !status);\n *\n * because it won't work with multiple classes.\n *\n * Doing:\n * setClassName(el, 'fa fa-whatever', true);setClassName(el, 'fa fa-whatever-else', false);\n *\n * will remove 'fa' although it is a class we want.\n */\n\n var toAdd = beOpen ? this._options.openClass : this._options.closedClass;\n var toRemove = beOpen ? this._options.closedClass : this._options.openClass;\n Css.removeClassName(icon, toRemove);\n Css.addClassName(icon, toAdd);\n\n Css.setClassName(node, this._options.openNodeClass, beOpen);\n } else {\n Ink.error('Ink.UI.TreeView: node', node, 'is not a node!');\n }\n },\n\n /**\n * Opens one of the tree nodes\n *\n * Make sure you pass the node's Element\n * @method open\n * @param {Element} node The node you wish to open.\n * @return {void}\n **/\n open: function (node) {\n this._setNodeOpen(node, true);\n },\n\n /**\n * Closes one of the tree nodes\n *\n * Make sure you pass the node's Element\n * @method close\n * @param {Element} node The node you wish to close.\n * @return {void}\n **/\n close: function (node) {\n this._setNodeOpen(node, false);\n },\n\n /**\n * Toggles a node state\n *\n * @method toggle\n * @param {Element} node The node to toggle.\n * @return {void}\n **/\n toggle: function (node) {\n if (this.isOpen(node)) {\n this.close(node);\n } else {\n this.open(node);\n }\n },\n\n /**\n * @method _getChild\n **/\n _getChild: function (node) {\n return Selector.select(this._options.children, node)[0] || null;\n },\n\n /**\n * Handles the click event (as specified in the _init function).\n * \n * @method _onClick\n * @param {Event} ev DOM click event.\n * @return {void}\n * @private\n */\n _onClick: function(ev){\n /**\n * Summary:\n * If the clicked element is a \"node\" as defined in the options, will check if it has any \"child\".\n * If so, will toggle its state and stop the event's default behavior if the stopDefault option is true.\n **/\n\n if (!this.isParent(ev.currentTarget) ||\n Selector.matchesSelector(ev.target, this._options.node) ||\n Selector.matchesSelector(ev.target, this._options.children)) {\n return;\n }\n\n if (this._options.stopDefault){\n ev.preventDefault();\n }\n\n this.toggle(ev.currentTarget);\n }\n };\n\n Common.createUIComponent(TreeView);\n\n return TreeView;\n});\n","Ink.createModule('Ink.UI.Upload', '1', [\n 'Ink.Dom.Event_1',\n 'Ink.Dom.Element_1',\n 'Ink.Dom.Browser_1',\n 'Ink.UI.Common_1'\n], function(Event, Element, Browser, Common) {\n 'use strict';\n\n var DirectoryReader = function(options) {\n this.init(options);\n };\n\n DirectoryReader.prototype = {\n init: function(options) {\n this._options = Ink.extendObj({\n entry: undefined,\n maxDepth: 10\n }, options || {});\n\n try {\n this._read();\n } catch(e) {\n Ink.error(e);\n }\n },\n\n\n _read: function() {\n if(!this._options.entry) {\n Ink.error('You must specify the entry!');\n return;\n }\n\n try {\n this._readDirectories();\n } catch(e) {\n Ink.error(e);\n }\n },\n\n\n _readDirectories: function() {\n var entries = [],\n running = false,\n maxDepth = 0;\n\n /* TODO return as tree because much better well */\n var _readEntries = Ink.bind(function(currentEntry) {\n var dir = currentEntry.createReader();\n running = true;\n\n dir.readEntries(Ink.bind(function(res) {\n if(res.length > 0) {\n for(var i = 0, len = res.length; i=0; i--) {\n if(typeof(arr[i]) === 'undefined' || arr[i] === null || arr[i] === '') {\n arr.splice(i, 1);\n }\n }\n return arr;\n }\n };\n\n var Queue = {\n lists: [],\n items: [],\n\n\n /**\n * Create new queue list\n * @function create\n * @public\n * @param {String} list name\n * @param {Function} function to iterate on items\n * @return {Object} list id\n */\n create: function(name) {\n var id;\n name = String(name);\n this.lists.push({name: name});\n id = this.lists.length - 1;\n return id;\n },\n\n\n getItems: function(parentId) {\n if(!parentId) {\n return this.items;\n }\n var items = [];\n for(var i = 0, len = this.items.length; i=0; i--) {\n if(this.items[i] && id === this.items[i].parentId) {\n this.remove(this.items[i].parentId, this.items[i].pid);\n }\n }\n if(!keepList) {\n this.lists.splice(id, 1);\n }\n return true;\n } catch(e) {\n Ink.error('Purge: invalid id');\n return false;\n }\n },\n\n\n /**\n * add an item to a list\n * @function add\n * @public\n * @param {String} name\n * @param {Object} item\n * @return {Number} pid\n */\n add: function(parentId, item, priority) {\n if(!this.lists[parentId]) {\n return false;\n }\n if(typeof(item) !== 'object') {\n item = String(item);\n }\n\n var pid = parseInt(Math.round(Math.random() * 100000) + \"\" + Math.round(Math.random() * 100000), 10);\n priority = priority || 0;\n\n this.items.push({parentId: parentId, item: item, priority: priority || 0, pid: pid});\n return pid;\n },\n\n\n /**\n * View list\n * @function view\n * @public\n * @param {Number} list id\n * @param {Number} process id\n * @return {Object} item\n */\n view: function(parentId, pid) {\n var id = this._searchByPid(parentId, pid);\n if(id === false) {\n return false;\n }\n return this.items[id];\n },\n\n\n /**\n * Remove an item\n * @function remove\n * @public\n * @param {Object} item\n * @return {Object|Boolean} removed item or false if not found\n */\n remove: function(parentId, pid) {\n try {\n var id = this._searchByPid(parentId, pid);\n if(id === false) {\n return false;\n }\n this.items.splice(id, 1);\n return true;\n } catch(e) {\n Ink.error('Remove: invalid id');\n return false;\n }\n },\n\n _searchByPid: function(parentId, pid) {\n if(!parentId && typeof(parentId) === 'boolean' || !pid) {\n return false;\n }\n\n parentId = parseInt(parentId, 10);\n pid = parseInt(pid, 10);\n\n if(isNaN(parentId) || isNaN(pid)) {\n return false;\n }\n\n for(var i = 0, len = this.items.length; i this._options.minSizeToUseChunks;\n },\n\n\n _dropEventHandler: function(ev) {\n Event.stop(ev);\n\n this.publish('DropComplete', ev.dataTransfer);\n\n var data = ev.dataTransfer;\n\n if(!data || !data.files || !data.files.length) {\n return false;\n }\n\n this._files = data.files;\n this._files = Array.prototype.slice.call(this._files || [], 0);\n\n // check if webkitGetAsEntry exists on first item\n if(data.items && data.items[0] && data.items[0].webkitGetAsEntry) {\n if(!this._options.foldersEnabled) {\n return setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);\n }\n var entry, folders = [];\n for(var i = ev.dataTransfer.items.length-1; i>=0; i--) {\n entry = ev.dataTransfer.items[i].webkitGetAsEntry();\n if(entry && entry.isDirectory) {\n folders.push(entry);\n this._files[i].isDirectory = true;\n this._files.splice(i, 1);\n }\n }\n // starting callback hell\n this._addFolderToQueue(folders, Ink.bind(function() {\n setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);\n }, this));\n } else {\n setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);\n }\n\n return true;\n },\n\n\n _addFolderToQueue: function(folders, cb) {\n var files = [], invalidFolders = {};\n\n if(!folders || !folders.length) {\n cb();\n return files;\n }\n\n var getFiles = function(entries) {\n var files = [];\n for(var i = 0, len = entries.length; i this._options.maxFilesize) {\n this.publish('MaxSizeFailure', file, this._options.maxFilesize);\n continue;\n }\n\n fileID = parseInt(Math.round(Math.random() * 100000) + \"\" + Math.round(Math.random() * 100000), 10);\n o = { id: i, data: file, fileID: fileID, directory: file.isDirectory };\n Queue.add(this._queueId, o);\n\n this.publish('FileAddedToQueue', o);\n }\n this._processQueue(true);\n this._files = [];\n },\n\n\n _processQueue: function(internalUpload) {\n if(this._queueRunning) {\n return false;\n }\n\n this.running = 0;\n var max = 1, i = 0, items,\n queueLen = Queue.items.length;\n this._queueRunning = true;\n\n this.interval = setInterval(Ink.bind(function() {\n if(Queue.items.length === i && this.running === 0) {\n Queue.purge(this._queueId, true);\n this._queueRunning = false;\n clearInterval(this.interval);\n this.publish('QueueEnd', this._queueId, queueLen);\n }\n\n items = Queue.getItems(this._queueId);\n\n if(this.running < max && items[i]) {\n if(!items[i].canceled) {\n _doRequest.call(this, items[i].pid, items[i].item.data, items[i].item.fileID, items[i].item.directory, internalUpload);\n this.running++;\n i++;\n } else {\n var j = i;\n while(items[j] && items[j].canceled) {\n i++;\n j++;\n }\n }\n return true;\n }\n return false;\n }, this), 100);\n\n\n var _doRequest = function(pid, data, fileID, directory, internalUpload) {\n var o = {\n file: data,\n fileID: fileID,\n cb: Ink.bind(function() {\n this.running--;\n }, this)\n };\n if(internalUpload) {\n if(directory) {\n // do magic\n o.cb();\n } else {\n this._upload(o);\n }\n }\n };\n\n return true;\n },\n\n\n _upload: function(o) {\n var file = o.file,\n xhr = new XMLHttpRequest(),\n fileID = o.fileID;\n\n this.publish('BeforeUpload', file, this._options.extraData, fileID, xhr, this._supportChunks(file.size));\n\n var forceAbort = function(showError) {\n if(o.cb && typeof(o.cb === 'function')) {\n o.cb();\n }\n\n this.publish('OnProgress', {\n length: file.size,\n lengthComputable: true,\n loaded: file.size,\n total: file.size\n }, file, fileID);\n this.publish('EndUpload', file, fileID, (showError ? { error: true } : true));\n this.publish('InvalidFile', file, 'name');\n xhr.abort();\n };\n\n if(this._options.INVALID_FILE_NAME && this._options.INVALID_FILE_NAME instanceof RegExp) {\n if(this._options.INVALID_FILE_NAME.test(o.file.name)) {\n forceAbort.call(this);\n return;\n }\n }\n\n // If file was renamed, abort it\n // FU OPERA: Opera always return lastModified date as null\n if(!file.lastModifiedDate && !Ink.Dom.Browser.OPERA) {\n forceAbort.call(this, true);\n return;\n }\n\n xhr.upload.onprogress = Ink.bind(this.publish, this, 'OnProgress', file, fileID);\n\n var endpoint, method;\n if(this._supportChunks(file.size)) {\n if(file.size <= file.chunk_offset) {\n endpoint = this._options.endpointChunkCommit;\n method = 'POST';\n } else {\n endpoint = this._options.endpointChunk;\n if(file.chunk_upload_id) {\n endpoint += '?upload_id=' + file.chunk_upload_id;\n }\n if(file.chunk_offset) {\n endpoint += '&offset=' + file.chunk_offset;\n }\n method = 'PUT';\n }\n } else {\n endpoint = this._options.endpoint;\n method = 'POST';\n }\n\n xhr.open(method, endpoint, true);\n xhr.withCredentials = true;\n xhr.setRequestHeader(\"x-requested-with\", \"XMLHttpRequest\");\n if(this._supportChunks(file.size)) {\n xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n }\n\n var fd = new FormData(),\n blob;\n\n if(\"Blob\" in window && typeof Blob === 'function') {\n blob = new Blob([file], { type: file.type });\n if(this._supportChunks(file.size)) {\n file.chunk_offset = file.chunk_offset || 0;\n blob = blob.slice(file.chunk_offset, file.chunk_offset + this._options.chunkSize);\n } else {\n fd.append(this._options.fileFormName, blob, file.name);\n }\n } else {\n fd.append(this._options.fileFormName, file);\n }\n\n if(!this._supportChunks(file.size)) {\n for(var k in this._options.extraData) {\n if(this._options.extraData.hasOwnProperty(k)) {\n fd.append(k, this._options.extraData[k]);\n }\n }\n } else {\n fd.append('upload_id', file.chunk_upload_id);\n fd.append('path', file.upload_path);\n }\n\n if(!file.hasParent) {\n if(!this._supportChunks(file.size)) {\n xhr.send(fd);\n } else {\n if(file.size <= file.chunk_offset) {\n xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name);\n } else {\n xhr.send(blob);\n }\n }\n } else {\n this.publish('cbCreateFolder', file.parentID, file.fullPath, this._options.extraData, this._folders, file.rootPath, Ink.bind(function() {\n if(!this._supportChunks(file.size)) {\n xhr.send(fd);\n } else {\n if(file.size <= file.chunk_offset) {\n xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name);\n } else {\n xhr.send(blob);\n }\n }\n }, this));\n }\n\n\n xhr.onload = Ink.bindEvent(function() {\n /* jshint boss:true */\n if(this._supportChunks(file.size) && file.size > file.chunk_offset) {\n if(xhr.response) {\n var response = JSON.parse(xhr.response);\n\n // check expected offset\n var invalidOffset = file.chunk_offset && response.offset !== (file.chunk_offset + this._options.chunkSize) && file.size !== response.offset;\n if(invalidOffset) {\n if(o.cb) {\n o.cb();\n }\n this.publish('ErrorUpload', file, fileID);\n } else {\n file.chunk_upload_id = response.upload_id;\n file.chunk_offset = response.offset;\n file.chunk_expires = response.expires;\n this._upload(o);\n }\n } else {\n if(o.cb) {\n o.cb();\n }\n this.publish('ErrorUpload', file, fileID);\n }\n return (xhr = null);\n }\n\n if(o.cb) {\n o.cb();\n }\n\n if(xhr.responseText && xhr['status'] < 400) {\n this.publish('EndUpload', file, fileID, xhr.responseText);\n } else {\n this.publish('ErrorUpload', file, fileID);\n }\n return (xhr = null);\n }, this);\n\n\n xhr.onerror = Ink.bindEvent(function() {\n if(o.cb) {\n o.cb();\n }\n this.publish('ErrorUpload', file, fileID);\n }, this);\n\n xhr.onabort = Ink.bindEvent(function() {\n if(o.cb) {\n o.cb();\n }\n this.publish('AbortUpload', file, fileID, {\n abortAll: Ink.bind(this.abortAll, this),\n abortOne: Ink.bind(this.abortOne, this)\n });\n }, this);\n },\n\n\n abortAll: function() {\n if(!this._queueRunning) {\n return false;\n }\n clearInterval(this.interval);\n this._queueRunning = false;\n Queue.purge(this._queueId, true);\n return true;\n },\n\n abortOne: function(id, cb) {\n var items = Queue.getItems(0),\n o;\n for(var i = 0, len = items.length; i [ [1, 1], [2, 2], [3], [1] ]\n * InkArray.groupBy([1.1, 1.2, 2.1], { key: Math.floor }) // -> [ [1.1, 1.2], [2.1] ]\n * InkArray.groupBy([1.1, 1.2, 2.1], { key: Math.floor, pairs: true }) // -> [ [1, [1.1, 1.2]], [2, [2.1]] ]\n *\n **/\n groupBy: function (arr, options) {\n options = options || {};\n var ret = [];\n var latestGroup;\n function eq(a, b) {\n return outKey(a) === outKey(b);\n }\n function outKey(item) {\n if (typeof options.key === 'function') {\n return options.key(item);\n } else {\n return item;\n }\n }\n\n for (var i = 0, len = arr.length; i < len; i++) {\n latestGroup = [arr[i]];\n\n // Chunkin'\n while ((i + 1 < len) && eq(arr[i], arr[i + 1])) {\n latestGroup.push(arr[i + 1]);\n i++;\n }\n\n if (options.pairs) {\n ret.push([outKey(arr[i]), latestGroup]);\n } else {\n ret.push(latestGroup);\n }\n }\n return ret;\n },\n\n /**\n * Replacement for Array.prototype.reduce.\n *\n * Uses Array.prototype.reduce if available.\n *\n * Produces a single result from a list of values by calling an \"aggregator\" function.\n *\n * Falls back to Array.prototype.reduce if available.\n *\n * @method reduce\n * @param {Array} array Input array to be reduced.\n * @param {Function} callback `function (previousValue, currentValue, index, all) { return {Mixed} }` to execute for each value.\n * @param {Mixed} initial Object used as the first argument to the first call of `callback`\n * @return {Mixed} Reduced array.\n *\n * @example\n * var sum = InkArray.reduce([1, 2, 3], function (a, b) { return a + b; }); // -> 6\n */\n reduce: function (array, callback, initial) {\n if (arrayProto.reduce) {\n return arrayProto.reduce.apply(array, arrayProto.slice.call(arguments, 1));\n }\n\n // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Polyfill\n var t = Object( array ), len = t.length >>> 0, k = 0, value;\n if ( arguments.length >= 3 ) {\n value = initial;\n } else {\n while ( k < len && !(k in t) ) k++;\n if ( k >= len )\n throw new TypeError('Reduce of empty array with no initial value');\n value = t[ k++ ];\n }\n for ( ; k < len ; k++ ) {\n if ( k in t ) {\n value = callback( value, t[k], k, t );\n }\n }\n return value;\n },\n\n /**\n * Checks if a value exists in array\n *\n * @method inArray\n * @public\n * @static\n * @param {Mixed} value Value to check\n * @param {Array} arr Array to search in\n * @return {Boolean} True if value exists in the array\n * @sample Ink_Util_Array_inArray.html\n */\n inArray: function(value, arr) {\n if (typeof arr === 'object') {\n for (var i = 0, f = arr.length; i < f; ++i) {\n if (arr[i] === value) {\n return true;\n }\n }\n }\n return false;\n },\n\n /**\n * Sorts an array of objects by an object property\n *\n * @method sortMulti\n * @param {Array} arr Array of objects to sort\n * @param {String} key Property to sort by\n * @return {Array|Boolean} False if it's not an array, returns a sorted array if it's an array.\n * @public\n * @static\n * @sample Ink_Util_Array_sortMulti.html\n */\n sortMulti: function(arr, key) {\n if (typeof arr === 'undefined' || arr.constructor !== Array) { return false; }\n if (typeof key !== 'string') { return arr.sort(); }\n if (arr.length > 0) {\n if (typeof(arr[0][key]) === 'undefined') { return false; }\n arr.sort(function(a, b){\n var x = a[key];\n var y = b[key];\n return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n });\n }\n return arr;\n },\n\n /**\n * Gets the indexes of a value in an array\n *\n * @method keyValue\n * @param {String} value Value to search for.\n * @param {Array} arr Array to run the search in.\n * @param {Boolean} [first] Flag to stop the search at the first match. It also returns an index number instead of an array of indexes.\n * @return {Boolean|Number|Array} False for no matches. Array of matches or first match index.\n * @public\n * @static\n * @sample Ink_Util_Array_keyValue.html\n */\n keyValue: function(value, arr, first) {\n if (typeof value !== 'undefined' && typeof arr === 'object' && this.inArray(value, arr)) {\n var aKeys = [];\n for (var i = 0, f = arr.length; i < f; ++i) {\n if (arr[i] === value) {\n if (typeof first !== 'undefined' && first === true) {\n return i;\n } else {\n aKeys.push(i);\n }\n }\n }\n return aKeys;\n }\n return false;\n },\n\n /**\n * Shuffles an array.\n *\n * @method shuffle\n * @param {Array} arr Array to shuffle\n * @return {Array|Boolean} Shuffled Array or false if not an array.\n * @public\n * @static\n * @sample Ink_Util_Array_shuffle.html\n */\n shuffle: function(arr) {\n if (typeof(arr) !== 'undefined' && arr.constructor !== Array) { return false; }\n var total = arr.length,\n tmp1 = false,\n rnd = false;\n\n while (total--) {\n rnd = Math.floor(Math.random() * (total + 1));\n tmp1 = arr[total];\n arr[total] = arr[rnd];\n arr[rnd] = tmp1;\n }\n return arr;\n },\n\n /**\n * Runs a function through each of the elements of an array.\n *\n * Uses Array.prototype.forEach if available.\n *\n * @method forEach\n * @param {Array} array The array to be cycled/iterated\n * @param {Function} callback The function receives as arguments the value, index and array.\n * @param {Mixed} context The value of `this` inside the `callback` you passed.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Array_forEach.html\n */\n forEach: function(array, callback, context) {\n if (arrayProto.forEach) {\n return arrayProto.forEach.call(array, callback, context);\n }\n for (var i = 0, len = array.length >>> 0; i < len; i++) {\n callback.call(context, array[i], i, array);\n }\n },\n\n /**\n * Alias for backwards compatibility. See forEach\n *\n * @method each\n * @param {Mixed} [forEachArguments] (see forEach)\n * @return {void} (see forEach)\n */\n each: function () {\n InkArray.forEach.apply(InkArray, arrayProto.slice.call(arguments));\n },\n\n /**\n * Runs a function for each item in the array.\n * Uses Array.prototype.map if available.\n * That function will receive each item as an argument and its return value will change the corresponding array item.\n * @method map\n * @param {Array} array The array to map over\n * @param {Function} mapFn The map function. Will take `(item, index, array)` as arguments and the `this` value will be the `context` argument you pass to this function.\n * @param {Object} [context] Object to be `this` in the map function.\n * @return {Array} A copy of the original array, with all of its items processed by the map function.\n *\n * @sample Ink_Util_Array_map.html\n */\n map: function (array, mapFn, context) {\n if (arrayProto.map) {\n return arrayProto.map.call(array, mapFn, context);\n }\n var mapped = new Array(len);\n for (var i = 0, len = array.length >>> 0; i < len; i++) {\n mapped[i] = mapFn.call(context, array[i], i, array);\n }\n return mapped;\n },\n\n /**\n * Filters an array based on a truth test.\n * This method runs a test function on all the array values and returns a new array with all the values that pass the test.\n * @method filter\n * @param {Array} array The array to filter\n * @param {Function} test A test function taking `(item, index, array)`\n * @param {Object} [context] Object to be `this` in the test function.\n * @return {Array} Returns the filtered array\n *\n * @sample Ink_Util_Array_filter.html\n */\n filter: function (array, test, context) {\n if (arrayProto.filter) {\n return arrayProto.filter.call(array, test, context);\n }\n var filtered = [],\n val = null;\n for (var i = 0, len = array.length; i < len; i++) {\n val = array[i]; // it might be mutated\n if (test.call(context, val, i, array)) {\n filtered.push(val);\n }\n }\n return filtered;\n },\n\n /**\n * Checks if some element in the array passes a truth test\n *\n * @method some\n * @param {Array} arr The array to iterate through\n * @param {Function} cb The callback to be called on the array's elements. It receives the value, the index and the array as arguments.\n * @param {Object} context Object of the callback function\n * @return {Boolean} True if the callback returns true at any point, false otherwise\n * @public\n * @static\n * @sample Ink_Util_Array_some.html\n */\n some: function(arr, cb, context){\n\n if (arr === null){\n throw new TypeError('First argument is invalid.');\n }\n\n var t = Object(arr);\n var len = t.length >>> 0;\n if (typeof cb !== \"function\"){ throw new TypeError('Second argument must be a function.'); }\n\n for (var i = 0; i < len; i++) {\n if (i in t && cb.call(context, t[i], i, t)){ return true; }\n }\n\n return false;\n },\n\n /**\n * Compares the values of two arrays and return the matches\n *\n * @method intersect\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n * @return {Array} Empty array if one of the arrays is false (or do not intersect) | Array with the intersected values\n * @public\n * @static\n * @sample Ink_Util_Array_intersect.html\n */\n intersect: function(arr1, arr2) {\n if (!arr1 || !arr2 || arr1 instanceof Array === false || arr2 instanceof Array === false) {\n return [];\n }\n\n var shared = [];\n for (var i = 0, I = arr1.length; i 0) {\n for (x = start; x < stop; x += step) {\n r.push(x);\n }\n } else {\n for (x = start; x > stop; x += step) {\n r.push(x);\n }\n }\n\n return r;\n },\n\n /**\n * Inserts a value on a specified index\n *\n * @method insert\n * @param {Array} arr Array where the value will be inserted\n * @param {Number} idx Index of the array where the value should be inserted\n * @param {Mixed} value Value to be inserted\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Array_insert.html\n */\n insert: function(arr, idx, value) {\n arr.splice(idx, 0, value);\n },\n\n /**\n * Removes a range of values from the array\n *\n * @method remove\n * @param {Array} arr Array where the value will be removed\n * @param {Number} from Index of the array where the removal will start removing.\n * @param {Number} rLen Number of items to be removed from the index onwards.\n * @return {Array} An array with the remaining values\n * @public\n * @static\n * @sample Ink_Util_Array_remove.html\n */\n remove: function(arr, from, rLen){\n var output = [];\n\n for(var i = 0, iLen = arr.length; i < iLen; i++){\n if(i >= from && i < from + rLen){\n continue;\n }\n\n output.push(arr[i]);\n }\n\n return output;\n }\n };\n\n return InkArray;\n\n});\n","/**\n * Binary Packing algorithm implementation\n * @module Ink.Util.BinPack_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.BinPack', '1', [], function() {\n\n 'use strict';\n\n /*jshint boss:true */\n\n // https://github.com/jakesgordon/bin-packing/\n\n /*\n Copyright (c) 2011, 2012, 2013 Jake Gordon and contributors\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\n\n\n var Packer = function(w, h) {\n this.init(w, h);\n };\n\n Packer.prototype = {\n\n init: function(w, h) {\n this.root = { x: 0, y: 0, w: w, h: h };\n },\n\n fit: function(blocks) {\n var n, node, block;\n for (n = 0; n < blocks.length; ++n) {\n block = blocks[n];\n if (node = this.findNode(this.root, block.w, block.h)) {\n block.fit = this.splitNode(node, block.w, block.h);\n }\n }\n },\n\n findNode: function(root, w, h) {\n if (root.used) {\n return this.findNode(root.right, w, h) || this.findNode(root.down, w, h);\n }\n else if ((w <= root.w) && (h <= root.h)) {\n return root;\n }\n else {\n return null;\n }\n },\n\n splitNode: function(node, w, h) {\n node.used = true;\n node.down = { x: node.x, y: node.y + h, w: node.w, h: node.h - h };\n node.right = { x: node.x + w, y: node.y, w: node.w - w, h: h };\n return node;\n }\n\n };\n\n\n\n var GrowingPacker = function() {};\n\n GrowingPacker.prototype = {\n\n fit: function(blocks) {\n var n, node, block, len = blocks.length;\n var w = len > 0 ? blocks[0].w : 0;\n var h = len > 0 ? blocks[0].h : 0;\n this.root = { x: 0, y: 0, w: w, h: h };\n for (n = 0; n < len ; n++) {\n block = blocks[n];\n if (node = this.findNode(this.root, block.w, block.h)) {\n block.fit = this.splitNode(node, block.w, block.h);\n }\n else {\n block.fit = this.growNode(block.w, block.h);\n }\n }\n },\n\n findNode: function(root, w, h) {\n if (root.used) {\n return this.findNode(root.right, w, h) || this.findNode(root.down, w, h);\n }\n else if ((w <= root.w) && (h <= root.h)) {\n return root;\n }\n else {\n return null;\n }\n },\n\n splitNode: function(node, w, h) {\n node.used = true;\n node.down = { x: node.x, y: node.y + h, w: node.w, h: node.h - h };\n node.right = { x: node.x + w, y: node.y, w: node.w - w, h: h };\n return node;\n },\n\n growNode: function(w, h) {\n var canGrowDown = (w <= this.root.w);\n var canGrowRight = (h <= this.root.h);\n\n var shouldGrowRight = canGrowRight && (this.root.h >= (this.root.w + w)); // attempt to keep square-ish by growing right when height is much greater than width\n var shouldGrowDown = canGrowDown && (this.root.w >= (this.root.h + h)); // attempt to keep square-ish by growing down when width is much greater than height\n\n if (shouldGrowRight) {\n return this.growRight(w, h);\n }\n else if (shouldGrowDown) {\n return this.growDown(w, h);\n }\n else if (canGrowRight) {\n return this.growRight(w, h);\n }\n else if (canGrowDown) {\n return this.growDown(w, h);\n }\n else {\n return null; // need to ensure sensible root starting size to avoid this happening\n }\n },\n\n growRight: function(w, h) {\n this.root = {\n used: true,\n x: 0,\n y: 0,\n w: this.root.w + w,\n h: this.root.h,\n down: this.root,\n right: { x: this.root.w, y: 0, w: w, h: this.root.h }\n };\n var node;\n if (node = this.findNode(this.root, w, h)) {\n return this.splitNode(node, w, h);\n }\n else {\n return null;\n }\n },\n\n growDown: function(w, h) {\n this.root = {\n used: true,\n x: 0,\n y: 0,\n w: this.root.w,\n h: this.root.h + h,\n down: { x: 0, y: this.root.h, w: this.root.w, h: h },\n right: this.root\n };\n var node;\n if (node = this.findNode(this.root, w, h)) {\n return this.splitNode(node, w, h);\n }\n else {\n return null;\n }\n }\n\n };\n\n\n\n var sorts = {\n random: function() { return Math.random() - 0.5; },\n w: function(a, b) { return b.w - a.w; },\n h: function(a, b) { return b.h - a.h; },\n a: function(a, b) { return b.area - a.area; },\n max: function(a, b) { return Math.max(b.w, b.h) - Math.max(a.w, a.h); },\n min: function(a, b) { return Math.min(b.w, b.h) - Math.min(a.w, a.h); },\n height: function(a, b) { return sorts.msort(a, b, ['h', 'w']); },\n width: function(a, b) { return sorts.msort(a, b, ['w', 'h']); },\n area: function(a, b) { return sorts.msort(a, b, ['a', 'h', 'w']); },\n maxside: function(a, b) { return sorts.msort(a, b, ['max', 'min', 'h', 'w']); },\n msort: function(a, b, criteria) { /* sort by multiple criteria */\n var diff, n;\n for (n = 0; n < criteria.length; ++n) {\n diff = sorts[ criteria[n] ](a, b);\n if (diff !== 0) {\n return diff;\n }\n }\n return 0;\n }\n };\n\n\n\n // end of Jake's code\n\n\n\n // aux, used to display blocks in unfitted property\n var toString = function() {\n return [this.w, ' x ', this.h].join('');\n };\n\n\n\n /**\n * Binary Packing algorithm implementation\n *\n * Based on the work of Jake Gordon\n *\n * see https://github.com/jakesgordon/bin-packing/\n *\n * @namespace Ink.Util.BinPack\n * @version 1\n * @static\n */\n var BinPack = {\n\n /**\n * @method binPack\n * @param {Object} o Options\n * @param {Array} o.blocks Array of items with width and height integer attributes.\n * @param {Array} [o.dimensions] Flag to fix container dimensions\n * @param {String} [o.sorter] Sorting function. One of: random, height, width, area, maxside\n * @return {Object} Returns an object containing container dimensions, filled ratio, fitted blocks, unfitted blocks and all blocks\n * @static\n */\n binPack: function(o) {\n var i, f, bl;\n\n\n\n // calculate area if not there already\n for (i = 0, f = o.blocks.length; i < f; ++i) {\n bl = o.blocks[i];\n if (! ('area' in bl) ) {\n bl.area = bl.w * bl.h;\n }\n }\n\n\n\n // apply algorithm\n var packer = o.dimensions ? new Packer(o.dimensions[0], o.dimensions[1]) : new GrowingPacker();\n\n if (!o.sorter) { o.sorter = 'maxside'; }\n\n o.blocks.sort( sorts[ o.sorter ] );\n\n packer.fit(o.blocks);\n\n var dims2 = [packer.root.w, packer.root.h];\n\n\n\n // layout is done here, generating report data...\n var fitted = [];\n var unfitted = [];\n\n for (i = 0, f = o.blocks.length; i < f; ++i) {\n bl = o.blocks[i];\n if (bl.fit) {\n fitted.push(bl);\n }\n else {\n bl.toString = toString; // TO AID SERIALIZATION\n unfitted.push(bl);\n }\n }\n\n var area = dims2[0] * dims2[1];\n var fit = 0;\n for (i = 0, f = fitted.length; i < f; ++i) {\n bl = fitted[i];\n fit += bl.area;\n }\n\n return {\n dimensions: dims2,\n filled: fit / area,\n blocks: o.blocks,\n fitted: fitted,\n unfitted: unfitted\n };\n }\n };\n\n\n\n return BinPack;\n\n});","/**\n * Cookie Utilities\n * @module Ink.Util.Cookie_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Cookie', '1', [], function() {\n 'use strict';\n\n /**\n * @namespace Ink.Util.Cookie_1\n */\n var Cookie = {\n\n /**\n * Gets an object with the current page cookies, or a specific cookie if you specify the `name`.\n *\n * @method get\n * @param {String} [name] The cookie name.\n * @return {String|Object} If the name is specified, it returns the value of that key. Otherwise it returns the full cookie object\n * @public\n * @static\n * @sample Ink_Util_Cookie_get.html\n */\n get: function(name)\n {\n var cookie = document.cookie || false;\n\n var _Cookie = {};\n\n if(cookie) {\n cookie = cookie.replace(new RegExp(\"; \", \"g\"), ';');\n\n var aCookie = cookie.split(';');\n var aItem = [];\n if(aCookie.length > 0) {\n for(var i=0; i < aCookie.length; i++) {\n aItem = aCookie[i].split('=');\n if(aItem.length === 2) {\n _Cookie[aItem[0]] = decodeURIComponent(aItem[1]);\n }\n }\n }\n if(name) {\n if(typeof(_Cookie[name]) !== 'undefined') {\n return _Cookie[name];\n } else {\n return null;\n }\n }\n }\n return _Cookie;\n },\n\n /**\n * Sets a cookie.\n *\n * @method set\n * @param {String} name Cookie name.\n * @param {String} value Cookie value.\n * @param {Number} [expires] Number of seconds the cookie will be valid for.\n * @param {String} [path] Path for the cookie. Defaults to '/'.\n * @param {String} [domain] Domain for the cookie. Defaults to current hostname.\n * @param {Boolean} [secure] Flag for secure. Default 'false'.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Cookie_set.html\n */\n set: function(name, value, expires, path, domain, secure)\n {\n var sName;\n if(!name || value===false || typeof(name) === 'undefined' || typeof(value) === 'undefined') {\n return false;\n } else {\n sName = name+'='+encodeURIComponent(value);\n }\n var sExpires = false;\n var sPath = false;\n var sDomain = false;\n var sSecure = false;\n\n if(expires && typeof(expires) !== 'undefined' && !isNaN(expires)) {\n var oDate = new Date();\n var sDate = (parseInt(Number(oDate.valueOf()), 10) + (Number(parseInt(expires, 10)) * 1000));\n\n var nDate = new Date(sDate);\n var expiresString = nDate.toGMTString();\n\n var re = new RegExp(\"([^\\\\s]+)(\\\\s\\\\d\\\\d)\\\\s(\\\\w\\\\w\\\\w)\\\\s(.*)\");\n expiresString = expiresString.replace(re, \"$1$2-$3-$4\");\n\n sExpires = 'expires='+expiresString;\n } else {\n if(typeof(expires) !== 'undefined' && !isNaN(expires) && Number(parseInt(expires, 10))===0) {\n sExpires = '';\n } else {\n sExpires = 'expires=Thu, 01-Jan-2037 00:00:01 GMT';\n }\n }\n\n if(path && typeof(path) !== 'undefined') {\n sPath = 'path='+path;\n } else {\n sPath = 'path=/';\n }\n\n if(domain) {\n sDomain = 'domain='+domain;\n } else if (/\\./.test(window.location.hostname)) {\n // When trying to set domain=localhost or any other domain\n // without dots, setting the cookie fails.\n // Anyways, the cookies are bound to the current domain by default so let it be.\n sDomain = 'domain='+window.location.hostname;\n }\n\n if(secure && typeof(secure) !== 'undefined') {\n sSecure = secure;\n } else {\n sSecure = false;\n }\n\n document.cookie = sName +\n '; ' + sExpires +\n '; ' + sPath +\n (sDomain ? '; ' + sDomain : '') +\n '; ' + sSecure;\n },\n\n /**\n * Deletes a cookie.\n *\n * @method remove\n * @param {String} cookieName Cookie name.\n * @param {String} [path] Path of the cookie. Defaults to '/'.\n * @param {String} [domain] Domain of the cookie. Defaults to current hostname.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Cookie_remove.html\n */\n remove: function(cookieName, path, domain) {\n var expiresDate = -1;\n\n this.set(cookieName, 'deleted', expiresDate, path, domain);\n }\n };\n\n return Cookie;\n\n});\n","/**\n * Date utility functions\n * @module Ink.Util.Date_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Date', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Date_1 \n */\n var InkDate = {\n\n /**\n * Function that returns the string representation of the month [PT only]\n *\n * @method _months\n * @param {Number} index Month javascript (0 to 11)\n * @return {String} The month's name\n * @private\n * @static\n * @example\n * console.log( InkDate._months(0) ); // Result: Janeiro\n */\n _months: function(index){\n var _m = ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];\n return _m[index];\n },\n\n /**\n * Function that returns the month [PT only] ( 0 to 11 )\n *\n * @method _iMonth\n * @param {String} month Month javascript (0 to 11)\n * @return {Number} The month's number\n * @private\n * @static\n * @example\n * console.log( InkDate._iMonth('maio') ); // Result: 4\n */\n _iMonth : function( month )\n {\n if ( Number( month ) ) { return +month - 1; }\n return {\n 'janeiro' : 0 ,\n 'jan' : 0 ,\n 'fevereiro' : 1 ,\n 'fev' : 1 ,\n 'março' : 2 ,\n 'mar' : 2 ,\n 'abril' : 3 ,\n 'abr' : 3 ,\n 'maio' : 4 ,\n 'mai' : 4 ,\n 'junho' : 5 ,\n 'jun' : 5 ,\n 'julho' : 6 ,\n 'jul' : 6 ,\n 'agosto' : 7 ,\n 'ago' : 7 ,\n 'setembro' : 8 ,\n 'set' : 8 ,\n 'outubro' : 9 ,\n 'out' : 9 ,\n 'novembro' : 10 ,\n 'nov' : 10 ,\n 'dezembro' : 11 ,\n 'dez' : 11\n }[ month.toLowerCase( ) ];\n } ,\n\n /**\n * Function that returns the representation the day of the week [PT Only]\n *\n * @method _wDays\n * @param {Number} index Week's day index\n * @return {String} The week's day name\n * @private\n * @static\n * @example\n * console.log( InkDate._wDays(0) ); // Result: Domingo\n */\n _wDays: function(index){\n var _d = ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'];\n return _d[index];\n },\n\n /**\n * Function that returns day of the week in javascript 1 to 7\n *\n * @method _iWeek\n * @param {String} week Week's day name\n * @return {Number} The week's day index\n * @private\n * @static\n * @example\n * console.log( InkDate._iWeek('quarta') ); // Result: 3\n */\n _iWeek: function( week )\n {\n if ( Number( week ) ) { return +week || 7; }\n return {\n 'segunda' : 1 ,\n 'seg' : 1 ,\n 'terça' : 2 ,\n 'ter' : 2 ,\n 'quarta' : 3 ,\n 'qua' : 3 ,\n 'quinta' : 4 ,\n 'qui' : 4 ,\n 'sexta' : 5 ,\n 'sex' : 5 ,\n 'sábado' : 6 ,\n 'sáb' : 6 ,\n 'domingo' : 7 ,\n 'dom' : 7\n }[ week.toLowerCase( ) ];\n },\n\n /**\n * Function that returns the number of days of a given month (m) on a given year (y)\n *\n * @method _daysInMonth\n * @param {Number} _m Month\n * @param {Number} _y Year\n * @return {Number} Number of days of a give month on a given year\n * @private\n * @static\n * @example\n * console.log( InkDate._daysInMonth(2,2013) ); // Result: 28\n */\n _daysInMonth: function(_m,_y){\n var nDays;\n\n if(_m===1 || _m===3 || _m===5 || _m===7 || _m===8 || _m===10 || _m===12)\n {\n nDays= 31;\n }\n else if ( _m===4 || _m===6 || _m===9 || _m===11)\n {\n nDays = 30;\n }\n else\n {\n if((_y%400===0) || (_y%4===0 && _y%100!==0))\n {\n nDays = 29;\n }\n else\n {\n nDays = 28;\n }\n }\n return nDays;\n },\n\n /**\n * Formats a date object.\n * This works exactly as php date() function. http://php.net/manual/en/function.date.php\n *\n * @method get\n * @param {String} format The format in which the date it will be formatted.\n * @param {Date} [_date] The date to format. Can receive unix timestamp or a date object. Defaults to current time.\n * @return {String} Formatted date\n * @public\n * @static\n * @sample Ink_Util_Date_get.html \n */\n get: function(format, _date){\n /*jshint maxcomplexity:65 */\n if(typeof(format) === 'undefined' || format === ''){\n format = \"Y-m-d\";\n }\n\n\n var iFormat = format.split(\"\");\n var result = new Array(iFormat.length);\n var escapeChar = \"\\\\\";\n var jsDate;\n\n if (typeof(_date) === 'undefined'){\n jsDate = new Date();\n } else if (typeof(_date)==='number'){\n jsDate = new Date(_date*1000);\n } else {\n jsDate = new Date(_date);\n }\n\n var jsFirstDay, jsThisDay, jsHour;\n /* This switch is presented in the same order as in php date function (PHP 5.2.2) */\n for (var i = 0; i < iFormat.length; i++) {\n switch(iFormat[i]) {\n case escapeChar:\n result[i] = iFormat[i+1];\n i++;\n break;\n\n\n /* DAY */\n case \"d\": /* Day of the month, 2 digits with leading zeros; ex: 01 to 31 */\n var jsDay = jsDate.getDate();\n result[i] = (String(jsDay).length > 1) ? jsDay : \"0\" + jsDay;\n break;\n\n case \"D\": /* A textual representation of a day, three letters; Seg to Dom */\n result[i] = this._wDays(jsDate.getDay()).substring(0, 3);\n break;\n\n case \"j\": /* Day of the month without leading zeros; ex: 1 to 31 */\n result[i] = jsDate.getDate();\n break;\n\n case \"l\": /* A full textual representation of the day of the week; Domingo to Sabado */\n result[i] = this._wDays(jsDate.getDay());\n break;\n\n case \"N\": /* ISO-8601 numeric representation of the day of the week; 1 (Segunda) to 7 (Domingo) */\n result[i] = jsDate.getDay() || 7;\n break;\n\n case \"S\": /* English ordinal suffix for the day of the month, 2 characters; st, nd, rd or th. Works well with j */\n var temp = jsDate.getDate();\n var suffixes = [\"st\", \"nd\", \"rd\"];\n var suffix = \"\";\n\n if (temp >= 11 && temp <= 13) {\n result[i] = \"th\";\n } else {\n result[i] = (suffix = suffixes[String(temp).substr(-1) - 1]) ? (suffix) : (\"th\");\n }\n break;\n\n case \"w\": /* Numeric representation of the day of the week; 0 (for Sunday) through 6 (for Saturday) */\n result[i] = jsDate.getDay();\n break;\n\n case \"z\": /* The day of the year (starting from 0); 0 to 365 */\n jsFirstDay = Date.UTC(jsDate.getFullYear(), 0, 0);\n jsThisDay = Date.UTC(jsDate.getFullYear(), jsDate.getMonth(), jsDate.getDate());\n result[i] = Math.floor((jsThisDay - jsFirstDay) / (1000 * 60 * 60 * 24));\n break;\n\n /* WEEK */\n case \"W\": /* ISO-8601 week number of year, weeks starting on Monday; ex: 42 (the 42nd week in the year) */\n var jsYearStart = new Date( jsDate.getFullYear( ) , 0 , 1 );\n jsFirstDay = jsYearStart.getDay() || 7;\n\n var days = Math.floor( ( jsDate - jsYearStart ) / ( 24 * 60 * 60 * 1000 ) + 1 );\n\n result[ i ] = Math.ceil( ( days - ( 8 - jsFirstDay ) ) / 7 ) + 1;\n break;\n\n\n /* MONTH */\n case \"F\": /* A full textual representation of a month, such as Janeiro or Marco; Janeiro a Dezembro */\n result[i] = this._months(jsDate.getMonth());\n break;\n\n case \"m\": /* Numeric representation of a month, with leading zeros; 01 to 12 */\n var jsMonth = String(jsDate.getMonth() + 1);\n result[i] = (jsMonth.length > 1) ? jsMonth : \"0\" + jsMonth;\n break;\n\n case \"M\": /* A short textual representation of a month, three letters; Jan a Dez */\n result[i] = this._months(jsDate.getMonth()).substring(0,3);\n break;\n\n case \"n\": /* Numeric representation of a month, without leading zeros; 1 a 12 */\n result[i] = jsDate.getMonth() + 1;\n break;\n\n case \"t\": /* Number of days in the given month; ex: 28 */\n result[i] = this._daysInMonth(jsDate.getMonth()+1,jsDate.getYear());\n break;\n\n /* YEAR */\n case \"L\": /* Whether it's a leap year; 1 if it is a leap year, 0 otherwise. */\n var jsYear = jsDate.getFullYear();\n result[i] = (jsYear % 4) ? false : ( (jsYear % 100) ? true : ( (jsYear % 400) ? false : true ) );\n break;\n\n case \"o\": /* ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. */\n throw '\"o\" not implemented!';\n\n case \"Y\": /* A full numeric representation of a year, 4 digits; 1999 */\n result[i] = jsDate.getFullYear();\n break;\n\n case \"y\": /* A two digit representation of a year; 99 */\n result[i] = String(jsDate.getFullYear()).substring(2);\n break;\n\n /* TIME */\n case \"a\": /* Lowercase Ante meridiem and Post meridiem; am or pm */\n result[i] = (jsDate.getHours() < 12) ? \"am\" : \"pm\";\n break;\n\n case \"A\": /* Uppercase Ante meridiem and Post meridiem; AM or PM */\n result[i] = (jsDate.getHours < 12) ? \"AM\" : \"PM\";\n break;\n\n case \"B\": /* Swatch Internet time; 000 through 999 */\n throw '\"B\" not implemented!';\n\n case \"g\": /* 12-hour format of an hour without leading zeros; 1 to 12 */\n jsHour = jsDate.getHours();\n result[i] = (jsHour <= 12) ? jsHour : (jsHour - 12);\n break;\n\n case \"G\": /* 24-hour format of an hour without leading zeros; 1 to 23 */\n result[i] = String(jsDate.getHours());\n break;\n\n case \"h\": /* 12-hour format of an hour with leading zeros; 01 to 12 */\n jsHour = String(jsDate.getHours());\n jsHour = (jsHour <= 12) ? jsHour : (jsHour - 12);\n result[i] = (jsHour.length > 1) ? jsHour : \"0\" + jsHour;\n break;\n\n case \"H\": /* 24-hour format of an hour with leading zeros; 01 to 24 */\n jsHour = String(jsDate.getHours());\n result[i] = (jsHour.length > 1) ? jsHour : \"0\" + jsHour;\n break;\n\n case \"i\": /* Minutes with leading zeros; 00 to 59 */\n var jsMinute = String(jsDate.getMinutes());\n result[i] = (jsMinute.length > 1) ? jsMinute : \"0\" + jsMinute;\n break;\n\n case \"s\": /* Seconds with leading zeros; 00 to 59; */\n var jsSecond = String(jsDate.getSeconds());\n result[i] = (jsSecond.length > 1) ? jsSecond : \"0\" + jsSecond;\n break;\n\n case \"u\": /* Microseconds */\n throw '\"u\" not implemented!';\n\n\n /* TIMEZONE */\n\n case \"e\": /* Timezone identifier */\n throw '\"e\" not implemented!';\n\n case \"I\": /* \"1\" if Daylight Savings Time, \"0\" otherwise. Works only on the northern hemisphere */\n jsFirstDay = new Date(jsDate.getFullYear(), 0, 1);\n result[i] = (jsDate.getTimezoneOffset() !== jsFirstDay.getTimezoneOffset()) ? (1) : (0);\n break;\n\n case \"O\": /* Difference to Greenwich time (GMT) in hours */\n var jsMinZone = jsDate.getTimezoneOffset();\n var jsMinutes = jsMinZone % 60;\n jsHour = String(((jsMinZone - jsMinutes) / 60) * -1);\n\n if (jsHour.charAt(0) !== \"-\") {\n jsHour = \"+\" + jsHour;\n }\n\n jsHour = (jsHour.length === 3) ? (jsHour) : (jsHour.replace(/([+\\-])(\\d)/, \"$1\" + 0 + \"$2\"));\n result[i] = jsHour + jsMinutes + \"0\";\n break;\n\n case \"P\": /* Difference to Greenwich time (GMT) with colon between hours and minutes */\n throw '\"P\" not implemented!';\n\n case \"T\": /* Timezone abbreviation */\n throw '\"T\" not implemented!';\n\n case \"Z\": /* Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. */\n result[i] = jsDate.getTimezoneOffset() * 60;\n break;\n\n\n /* FULL DATE/TIME */\n\n case \"c\": /* ISO 8601 date */\n throw '\"c\" not implemented!';\n\n case \"r\": /* RFC 2822 formatted date */\n var jsDayName = this._wDays(jsDate.getDay()).substr(0, 3);\n var jsMonthName = this._months(jsDate.getMonth()).substr(0, 3);\n result[i] = jsDayName + \", \" + jsDate.getDate() + \" \" + jsMonthName + this.get(\" Y H:i:s O\",jsDate);\n break;\n\n case \"U\": /* Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) */\n result[i] = Math.floor(jsDate.getTime() / 1000);\n break;\n\n default:\n result[i] = iFormat[i];\n }\n }\n\n return result.join('');\n\n },\n\n /**\n * Creates a date object based on a format string.\n * This works exactly as php date() function. http://php.net/manual/en/function.date.php\n *\n * @method set\n * @param {String} [format] The format in which the date will be formatted. Defaults to 'Y-m-d'\n * @param {String} str_date The date formatted.\n * @return {Date} Date object based on the formatted date and format\n * @public\n * @static\n * @sample Ink_Util_Date_set.html \n */\n set : function( format , str_date ) {\n if ( typeof str_date === 'undefined' ) { return ; }\n if ( typeof format === 'undefined' || format === '' ) { format = \"Y-m-d\"; }\n\n var iFormat = format.split(\"\");\n var result = new Array( iFormat.length );\n var escapeChar = \"\\\\\";\n var mList;\n\n var objIndex = {\n year : undefined ,\n month : undefined ,\n day : undefined ,\n dayY : undefined ,\n dayW : undefined ,\n week : undefined ,\n hour : undefined ,\n hourD : undefined ,\n min : undefined ,\n sec : undefined ,\n msec : undefined ,\n ampm : undefined ,\n diffM : undefined ,\n diffH : undefined ,\n date : undefined\n };\n\n var matches = 0;\n\n /* This switch is presented in the same order as in php date function (PHP 5.2.2) */\n for ( var i = 0; i < iFormat.length; i++) {\n switch( iFormat[ i ] ) {\n case escapeChar:\n result[i] = iFormat[ i + 1 ];\n i++;\n break;\n\n /* DAY */\n case \"d\": /* Day of the month, 2 digits with leading zeros; ex: 01 to 31 */\n result[ i ] = '(\\\\d{2})';\n objIndex.day = { original : i , match : matches++ };\n break;\n\n case \"j\": /* Day of the month without leading zeros; ex: 1 to 31 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.day = { original : i , match : matches++ };\n break;\n\n case \"D\": /* A textual representation of a day, three letters; Seg to Dom */\n result[ i ] = '([\\\\wá]{3})';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"l\": /* A full textual representation of the day of the week; Domingo to Sabado */\n result[i] = '([\\\\wá]{5,7})';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"N\": /* ISO-8601 numeric representation of the day of the week; 1 (Segunda) to 7 (Domingo) */\n result[ i ] = '(\\\\d)';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"w\": /* Numeric representation of the day of the week; 0 (for Sunday) through 6 (for Saturday) */\n result[ i ] = '(\\\\d)';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"S\": /* English ordinal suffix for the day of the month, 2 characters; st, nd, rd or th. Works well with j */\n result[ i ] = '\\\\w{2}';\n break;\n\n case \"z\": /* The day of the year (starting from 0); 0 to 365 */\n result[ i ] = '(\\\\d{1,3})';\n objIndex.dayY = { original : i , match : matches++ };\n break;\n\n /* WEEK */\n case \"W\": /* ISO-8601 week number of year, weeks starting on Monday; ex: 42 (the 42nd week in the year) */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.week = { original : i , match : matches++ };\n break;\n\n /* MONTH */\n case \"F\": /* A full textual representation of a month, such as Janeiro or Marco; Janeiro a Dezembro */\n result[ i ] = '([\\\\wç]{4,9})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"M\": /* A short textual representation of a month, three letters; Jan a Dez */\n result[ i ] = '(\\\\w{3})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"m\": /* Numeric representation of a month, with leading zeros; 01 to 12 */\n result[ i ] = '(\\\\d{2})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"n\": /* Numeric representation of a month, without leading zeros; 1 a 12 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"t\": /* Number of days in the given month; ex: 28 */\n result[ i ] = '\\\\d{2}';\n break;\n\n /* YEAR */\n case \"L\": /* Whether it's a leap year; 1 if it is a leap year, 0 otherwise. */\n result[ i ] = '\\\\w{4,5}';\n break;\n\n case \"o\": /* ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. */\n throw '\"o\" not implemented!';\n\n case \"Y\": /* A full numeric representation of a year, 4 digits; 1999 */\n result[ i ] = '(\\\\d{4})';\n objIndex.year = { original : i , match : matches++ };\n break;\n\n case \"y\": /* A two digit representation of a year; 99 */\n result[ i ] = '(\\\\d{2})';\n if ( typeof objIndex.year === 'undefined' || iFormat[ objIndex.year.original ] !== 'Y' ) {\n objIndex.year = { original : i , match : matches++ };\n }\n break;\n\n /* TIME */\n case \"a\": /* Lowercase Ante meridiem and Post meridiem; am or pm */\n result[ i ] = '(am|pm)';\n objIndex.ampm = { original : i , match : matches++ };\n break;\n\n case \"A\": /* Uppercase Ante meridiem and Post meridiem; AM or PM */\n result[ i ] = '(AM|PM)';\n objIndex.ampm = { original : i , match : matches++ };\n break;\n\n case \"B\": /* Swatch Internet time; 000 through 999 */\n throw '\"B\" not implemented!';\n\n case \"g\": /* 12-hour format of an hour without leading zeros; 1 to 12 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.hourD = { original : i , match : matches++ };\n break;\n\n case \"G\": /* 24-hour format of an hour without leading zeros; 1 to 23 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.hour = { original : i , match : matches++ };\n break;\n\n case \"h\": /* 12-hour format of an hour with leading zeros; 01 to 12 */\n result[ i ] = '(\\\\d{2})';\n objIndex.hourD = { original : i , match : matches++ };\n break;\n\n case \"H\": /* 24-hour format of an hour with leading zeros; 01 to 24 */\n result[ i ] = '(\\\\d{2})';\n objIndex.hour = { original : i , match : matches++ };\n break;\n\n case \"i\": /* Minutes with leading zeros; 00 to 59 */\n result[ i ] = '(\\\\d{2})';\n objIndex.min = { original : i , match : matches++ };\n break;\n\n case \"s\": /* Seconds with leading zeros; 00 to 59; */\n result[ i ] = '(\\\\d{2})';\n objIndex.sec = { original : i , match : matches++ };\n break;\n\n case \"u\": /* Microseconds */\n throw '\"u\" not implemented!';\n\n /* TIMEZONE */\n case \"e\": /* Timezone identifier */\n throw '\"e\" not implemented!';\n\n case \"I\": /* \"1\" if Daylight Savings Time, \"0\" otherwise. Works only on the northern hemisphere */\n result[i] = '\\\\d';\n break;\n\n case \"O\": /* Difference to Greenwich time (GMT) in hours */\n result[ i ] = '([-+]\\\\d{4})';\n objIndex.diffH = { original : i , match : matches++ };\n break;\n\n case \"P\": /* Difference to Greenwich time (GMT) with colon between hours and minutes */\n throw '\"P\" not implemented!';\n\n case \"T\": /* Timezone abbreviation */\n throw '\"T\" not implemented!';\n\n case \"Z\": /* Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. */\n result[ i ] = '(\\\\-?\\\\d{1,5})';\n objIndex.diffM = { original : i , match : matches++ };\n break;\n\n /* FULL DATE/TIME */\n case \"c\": /* ISO 8601 date */\n throw '\"c\" not implemented!';\n\n case \"r\": /* RFC 2822 formatted date */\n result[ i ] = '([\\\\wá]{3}, \\\\d{1,2} \\\\w{3} \\\\d{4} \\\\d{2}:\\\\d{2}:\\\\d{2} [+\\\\-]\\\\d{4})';\n objIndex.date = { original : i , match : matches++ };\n break;\n\n case \"U\": /* Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) */\n result[ i ] = '(\\\\d{1,13})';\n objIndex.date = { original : i , match : matches++ };\n break;\n\n default:\n result[ i ] = iFormat[ i ];\n }\n }\n\n var pattr = new RegExp( result.join('') );\n\n try {\n mList = str_date.match( pattr );\n if ( !mList ) { return; }\n }\n catch ( e ) { return ; }\n\n var _haveDatetime = typeof objIndex.date !== 'undefined';\n\n var _haveYear = typeof objIndex.year !== 'undefined';\n\n var _haveYDay = typeof objIndex.dayY !== 'undefined';\n\n var _haveDay = typeof objIndex.day !== 'undefined';\n var _haveMonth = typeof objIndex.month !== 'undefined';\n var _haveMonthDay = _haveMonth && _haveDay;\n var _haveOnlyDay = !_haveMonth && _haveDay;\n\n var _haveWDay = typeof objIndex.dayW !== 'undefined';\n var _haveWeek = typeof objIndex.week !== 'undefined';\n var _haveWeekWDay = _haveWeek && _haveWDay;\n var _haveOnlyWDay = !_haveWeek && _haveWDay;\n\n var _validDate = _haveYDay || _haveMonthDay || !_haveYear && _haveOnlyDay || _haveWeekWDay || !_haveYear && _haveOnlyWDay;\n var _noDate = !_haveYear && !_haveYDay && !_haveDay && !_haveMonth && !_haveWDay && !_haveWeek;\n\n var _haveHour12 = typeof objIndex.hourD !== 'undefined' && typeof objIndex.ampm !== 'undefined';\n var _haveHour24 = typeof objIndex.hour !== 'undefined';\n var _haveHour = _haveHour12 || _haveHour24;\n\n var _haveMin = typeof objIndex.min !== 'undefined';\n var _haveSec = typeof objIndex.sec !== 'undefined';\n var _haveMSec = typeof objIndex.msec !== 'undefined';\n\n var _haveMoreM = !_noDate || _haveHour;\n var _haveMoreS = _haveMoreM || _haveMin;\n\n var _haveDiffM = typeof objIndex.diffM !== 'undefined';\n var _haveDiffH = typeof objIndex.diffH !== 'undefined';\n //var _haveGMT = _haveDiffM || _haveDiffH;\n var hour;\n var min;\n\n if ( _haveDatetime ) {\n if ( iFormat[ objIndex.date.original ] === 'U' ) {\n return new Date( +mList[ objIndex.date.match + 1 ] * 1000 );\n }\n\n var dList = mList[ objIndex.date.match + 1 ].match( /\\w{3}, (\\d{1,2}) (\\w{3}) (\\d{4}) (\\d{2}):(\\d{2}):(\\d{2}) ([+\\-]\\d{4})/ );\n hour = +dList[ 4 ] + ( +dList[ 7 ].slice( 0 , 3 ) );\n min = +dList[ 5 ] + ( dList[ 7 ].slice( 0 , 1 ) + dList[ 7 ].slice( 3 ) ) / 100 * 60;\n\n return new Date( dList[ 3 ] , this._iMonth( dList[ 2 ] ) , dList[ 1 ] , hour , min , dList[ 6 ] );\n }\n\n var _d = new Date( );\n var year;\n var month;\n var day;\n var sec;\n var msec;\n var gmt;\n\n if ( !_validDate && !_noDate ) { return ; }\n\n if ( _validDate ) {\n if ( _haveYear ) {\n var _y = _d.getFullYear( ) - 50 + '';\n year = mList[ objIndex.year.match + 1 ];\n if ( iFormat[ objIndex.year.original ] === 'y' ) {\n year = +_y.slice( 0 , 2 ) + ( year >= ( _y ).slice( 2 ) ? 0 : 1 ) + year;\n }\n } else {\n year = _d.getFullYear();\n }\n\n if ( _haveYDay ) {\n month = 0;\n day = mList[ objIndex.dayY.match + 1 ];\n } else if ( _haveDay ) {\n if ( _haveMonth ) {\n month = this._iMonth( mList[ objIndex.month.match + 1 ] );\n } else {\n month = _d.getMonth( );\n }\n\n day = mList[ objIndex.day.match + 1 ];\n } else {\n month = 0;\n\n var week;\n if ( _haveWeek ) {\n week = mList[ objIndex.week.match + 1 ];\n } else {\n week = this.get( 'W' , _d );\n }\n\n day = ( week - 2 ) * 7 + ( 8 - ( ( new Date( year , 0 , 1 ) ).getDay( ) || 7 ) ) + this._iWeek( mList[ objIndex.week.match + 1 ] );\n }\n\n if ( month === 0 && day > 31 ) {\n var aux = new Date( year , month , day );\n month = aux.getMonth( );\n day = aux.getDate( );\n }\n }\n else {\n year = _d.getFullYear( );\n month = _d.getMonth( );\n day = _d.getDate( );\n }\n\n if ( _haveHour12 ) { hour = +mList[ objIndex.hourD.match + 1 ] + ( mList[ objIndex.ampm.match + 1 ] === 'pm' ? 12 : 0 ); }\n else if ( _haveHour24 ) { hour = mList[ objIndex.hour.match + 1 ]; }\n else if ( _noDate ) { hour = _d.getHours( ); }\n else { hour = '00'; }\n\n if ( _haveMin ) { min = mList[ objIndex.min.match + 1 ]; }\n else if ( !_haveMoreM ) { min = _d.getMinutes( ); }\n else { min = '00'; }\n\n if ( _haveSec ) { sec = mList[ objIndex.sec.match + 1 ]; }\n else if ( !_haveMoreS ) { sec = _d.getSeconds( ); }\n else { sec = '00'; }\n\n if ( _haveMSec ) { msec = mList[ objIndex.msec.match + 1 ]; }\n else { msec = '000'; }\n\n if ( _haveDiffH ) { gmt = mList[ objIndex.diffH.match + 1 ]; }\n else if ( _haveDiffM ) { gmt = String( -1 * mList[ objIndex.diffM.match + 1 ] / 60 * 100 ).replace( /^(\\d)/ , '+$1' ).replace( /(^[\\-+])(\\d{3}$)/ , '$10$2' ); }\n else { gmt = '+0000'; }\n\n return new Date( year, month, day, hour, min, sec );\n }\n };\n\n\n return InkDate;\n\n});\n","/**\n * Dump/Profiling Utilities\n * @module Ink.Util.Dumper_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Dumper', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Dumper_1 \n */\n\n var Dumper = {\n\n /**\n * Hex code for the 'tab'\n * \n * @property _tab\n * @type {String}\n * @private\n * @readOnly\n * @static\n *\n */\n _tab: '\\xA0\\xA0\\xA0\\xA0',\n\n /**\n * Function that returns the argument passed formatted\n *\n * @method _formatParam\n * @param {Mixed} param The thing to format.\n * @return {String} The argument passed formatted\n * @private\n * @static\n */\n _formatParam: function(param)\n {\n var formated = '';\n\n switch(typeof(param)) {\n case 'string':\n formated = '(string) '+param;\n break;\n case 'number':\n formated = '(number) '+param;\n break;\n case 'boolean':\n formated = '(boolean) '+param;\n break;\n case 'object':\n if(param !== null) {\n if(param.constructor === Array) {\n formated = 'Array \\n{\\n' + this._outputFormat(param, 0) + '\\n}';\n } else {\n formated = 'Object \\n{\\n' + this._outputFormat(param, 0) + '\\n}';\n }\n } else {\n formated = 'null';\n }\n break;\n default:\n formated = false;\n }\n\n return formated;\n },\n\n /**\n * Function that returns the tabs concatenated\n *\n * @method _getTabs\n * @param {Number} numberOfTabs Number of Tabs\n * @return {String} Tabs concatenated\n * @private\n * @static\n */\n _getTabs: function(numberOfTabs)\n {\n var tabs = '';\n for(var _i = 0; _i < numberOfTabs; _i++) {\n tabs += this._tab;\n }\n return tabs;\n },\n\n /**\n * Function that formats the parameter to display.\n *\n * @method _outputFormat\n * @param {Mixed} param The thing to format.\n * @param {Number} indent Indentation level.\n * @return {String} The parameter passed formatted to displat\n * @private\n * @static\n */\n _outputFormat: function(param, indent)\n {\n var formated = '';\n //var _strVal = false;\n var _typeof = false;\n for(var key in param) {\n if(param[key] !== null) {\n if(typeof(param[key]) === 'object' && (param[key].constructor === Array || param[key].constructor === Object)) {\n if(param[key].constructor === Array) {\n _typeof = 'Array';\n } else if(param[key].constructor === Object) {\n _typeof = 'Object';\n }\n formated += this._tab + this._getTabs(indent) + '[' + key + '] => '+_typeof+'\\n';\n formated += this._tab + this._getTabs(indent) + '{\\n';\n formated += this._outputFormat(param[key], indent + 1) + this._tab + this._getTabs(indent) + '}\\n';\n } else if(param[key].constructor === Function) {\n continue;\n } else {\n formated = formated + this._tab + this._getTabs(indent) + '[' + key + '] => ' + param[key] + '\\n';\n }\n } else {\n formated = formated + this._tab + this._getTabs(indent) + '[' + key + '] => null \\n';\n }\n }\n return formated;\n },\n\n /**\n * Prints variable structure.\n *\n * @method printDump\n * @param {Mixed} param Variable to be dumped.\n * @param {DOMElement|String} [target] Element to print the dump on.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Dumper_printDump.html \n */\n printDump: function(param, target)\n {\n /*jshint evil:true */\n if(!target || typeof(target) === 'undefined') {\n document.write('
      '+this._formatParam(param)+'
      ');\n } else {\n if(typeof(target) === 'string') {\n document.getElementById(target).innerHTML = '
      ' + this._formatParam(param) + '
      ';\n } else if(typeof(target) === 'object') {\n target.innerHTML = '
      '+this._formatParam(param)+'
      ';\n } else {\n throw \"TARGET must be an element or an element ID\";\n }\n }\n },\n\n /**\n * Get a variable's structure.\n *\n * @method returnDump\n * @param {Mixed} param Variable to get the structure.\n * @return {String} The variable's structure.\n * @public\n * @static\n * @sample Ink_Util_Dumper_returnDump.html \n */\n returnDump: function(param)\n {\n return this._formatParam(param);\n },\n\n /**\n * Alert a variable's structure.\n *\n * @method alertDump\n * @param {Mixed} param Variable to be dumped.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Dumper_alertDump.html \n */\n alertDump: function(param)\n {\n window.alert(this._formatParam(param).replace(/()(Array|Object)(<\\/b>)/g, \"$2\"));\n },\n\n /**\n * Prints the variable structure to a new window.\n *\n * @method windowDump\n * @param {Mixed} param Variable to be dumped.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Dumper_windowDump.html \n */\n windowDump: function(param)\n {\n var dumperwindow = 'dumperwindow_'+(Math.random() * 10000);\n var win = window.open('',\n dumperwindow,\n 'width=400,height=300,left=50,top=50,status,menubar,scrollbars,resizable'\n );\n win.document.open();\n win.document.write('
      '+this._formatParam(param)+'
      ');\n win.document.close();\n win.focus();\n }\n\n };\n\n return Dumper;\n\n});\n","/**\n * Internationalization Utilities \n * @module Ink.Util.I18n_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.I18n', '1', [], function () {\n 'use strict';\n\n var pattrText = /\\{(?:(\\{.*?})|(?:%s:)?(\\d+)|(?:%s)?|([\\w-]+))}/g;\n\n var funcOrVal = function( ret , args ) {\n if ( typeof ret === 'function' ) {\n return ret.apply(this, args);\n } else if (typeof ret !== undefined) {\n return ret;\n } else {\n return '';\n }\n };\n\n /**\n * You can use this module to internationalize your applications. It roughly emulates GNU gettext's API.\n *\n * @class Ink.Util.I18n\n * @constructor\n *\n * @param {Object} dict Object mapping language codes (in the form of `pt_PT`, `pt_BR`, `fr`, `en_US`, etc.) to their `dictionaries`\n * @param {String} [lang='pt_PT'] language code of the target language\n * @param {Boolean} [testMode=false] Sets the test mode (see `testMode()`) on construction.\n *\n * @sample Ink_Util_I18n_1.html\n */\n var I18n = function( dict , lang , testMode ) {\n if ( !( this instanceof I18n ) ) { return new I18n( dict , lang , testMode ); }\n\n this.reset( )\n .lang( lang )\n .testMode( testMode )\n .append( dict || { } , lang );\n };\n\n I18n.prototype = {\n reset: function( ) {\n this._dicts = [ ];\n this._dict = { };\n this._testMode = false;\n this._lang = this._gLang;\n\n return this;\n },\n /**\n * Adds translation strings for the helper to use.\n *\n * @method append\n * @param {Object} dict Object containing language objects identified by their language code\n * @return {I18n} (itself)\n *\n * @sample Ink_Util_I18n_1_append.html\n */\n append: function( dict ) {\n this._dicts.push( dict );\n\n this._dict = Ink.extendObj(this._dict , dict[ this._lang ] );\n\n return this;\n },\n /**\n * Gets or sets the language.\n * If there are more dictionaries available in cache, they will be loaded.\n *\n * @method lang\n * @param {String} [lang] Language code to set this instance to. Omit this argument if you want to get the language code instead.\n * @return {String|I18n} The language code, if called without arguments, or this I18n instance if called with an argument.\n */\n lang: function( lang ) {\n if ( !arguments.length ) { return this._lang; }\n\n if ( lang && this._lang !== lang ) {\n this._lang = lang;\n\n this._dict = { };\n\n for ( var i = 0, l = this._dicts.length; i < l; i++ ) {\n this._dict = Ink.extendObj( this._dict , this._dicts[ i ][ lang ] || { } );\n }\n }\n\n return this;\n },\n /**\n * Sets or unsets test mode.\n * In test mode, unknown strings are wrapped in `[ ... ]`. This is useful for debugging your application and to make sure all your translation keys are in place.\n *\n * @method testMode\n * @param {Boolean} [newTestMode] Flag to set the test mode state. Omit this argument to *get* the current testMode instead.\n * @return {String|I18n} The current testMode, if called without arguments, or this I18n instance if called with an argument.\n *\n */\n testMode: function( newTestMode ) {\n if ( !arguments.length ) { return !!this._testMode; }\n\n if ( newTestMode !== undefined ) { this._testMode = !!newTestMode; }\n\n return this;\n },\n\n /**\n * Gest a key from the current dictionary\n *\n * @method getKey\n * @param {String} key Key you wish to get from the dictionary.\n * @return {Mixed} The object which happened to be in the current language dictionary on the given key.\n *\n * @sample Ink_Util_I18n_1_getKey.html\n */\n getKey: function( key ) {\n var ret;\n var gLang = this._gLang;\n var lang = this._lang;\n \n if ( key in this._dict ) {\n ret = this._dict[ key ];\n } else {\n I18n.langGlobal( lang );\n \n ret = this._gDict[ key ];\n \n I18n.langGlobal( gLang );\n }\n \n return ret;\n },\n\n /**\n * Translates a string.\n * Given a translation key, return a translated string, with replaced parameters.\n * When a translated string is not available, the original string is returned unchanged.\n *\n * @method text\n * @param {String} str Key to look for in i18n dictionary (which is returned verbatim if unknown)\n * @param {Object} [namedParms] Named replacements. Replaces {named} with values in this object.\n * @param {String} [args] Replacement #1 (replaces first {} and all {1})\n * @param {String} [arg2] Replacement #2 (replaces second {} and all {2})\n * @param {String} [argn...] Replacement #n (replaces nth {} and all {n})\n *\n * @return {String} Translated string.\n *\n * @sample Ink_Util_I18n_1_text.html\n */\n text: function( str /*, replacements...*/ ) {\n if ( typeof str !== 'string' ) { return; } // Backwards-compat\n\n var pars = Array.prototype.slice.call( arguments , 1 );\n var idx = 0;\n var isObj = typeof pars[ 0 ] === 'object';\n\n var original = this.getKey( str );\n if ( original === undefined ) { original = this._testMode ? '[' + str + ']' : str; }\n if ( typeof original === 'number' ) { original += ''; }\n\n if (typeof original === 'string') {\n original = original.replace( pattrText , function( m , $1 , $2 , $3 ) {\n var ret =\n $1 ? $1 :\n $2 ? pars[ $2 - ( isObj ? 0 : 1 ) ] :\n $3 ? pars[ 0 ][ $3 ] || '' :\n pars[ (idx++) + ( isObj ? 1 : 0 ) ];\n return funcOrVal( ret , [idx].concat(pars) );\n });\n return original;\n }\n \n return (\n typeof original === 'function' ? original.apply( this , pars ) :\n original instanceof Array ? funcOrVal( original[ pars[ 0 ] ] , pars ) :\n typeof original === 'object' ? funcOrVal( original[ pars[ 0 ] ] , pars ) :\n '');\n },\n\n /**\n * Translates and pluralizes text.\n * Given a singular string, a plural string and a number, translates either the singular or plural string.\n *\n * @method ntext\n *\n * @param {String} strSin Word to use when count is 1\n * @param {String} strPlur Word to use otherwise\n * @param {Number} count Number which defines which word to use\n * @param {Mixed} [args...] Extra arguments, to be passed to `text()`\n *\n * @return {String} Pluralized text string.\n *\n * @sample Ink_Util_I18n_1_ntext.html\n */\n ntext: function( strSin , strPlur , count ) {\n var pars = Array.prototype.slice.apply( arguments );\n var original;\n\n if ( pars.length === 2 && typeof strPlur === 'number' ) {\n original = this.getKey( strSin );\n if ( !( original instanceof Array ) ) { return ''; }\n\n pars.splice( 0 , 1 );\n original = original[ strPlur === 1 ? 0 : 1 ];\n } else {\n pars.splice( 0 , 2 );\n original = count === 1 ? strSin : strPlur;\n }\n\n return this.text.apply( this , [ original ].concat( pars ) );\n },\n\n /**\n * Gets the ordinal suffix of a number.\n *\n * This works by using transforms (in the form of Objects or Functions) passed into the function or found in the special key `_ordinals` in the active language dictionary.\n *\n * @method ordinal\n *\n * @param {Number} num Input number\n * @param {Object|Function} [options]={} Dictionaries for translating. Each of these options' fallback is found in the current language's dictionary. The lookup order is the following: `exceptions`, `byLastDigit`, `default`. Each of these may be either an `Object` or a `Function`. If it's a function, it is called (with `number` and `digit` for any function except for byLastDigit, which is called with the `lastDigit` of the number in question), and if the function returns a string, that is used. If it's an object, the property is looked up using `obj[prop]`. If what is found is a string, it is used directly.\n * @param {Object|Function} [options.byLastDigit]={} If the language requires the last digit to be considered, mappings of last digits to ordinal suffixes can be created here.\n * @param {Object|Function} [options.exceptions]={} Map unique, special cases to their ordinal suffixes.\n *\n * @returns {String} Ordinal suffix for `num`.\n *\n * @sample Ink_Util_I18n_1_ordinal.html\n **/\n ordinal: function( num ) {\n if ( num === undefined ) { return ''; }\n\n var lastDig = +num.toString( ).slice( -1 );\n\n var ordDict = this.getKey( '_ordinals' );\n if ( ordDict === undefined ) { return ''; }\n\n if ( typeof ordDict === 'string' ) { return ordDict; }\n\n var ret;\n\n if ( typeof ordDict === 'function' ) {\n ret = ordDict( num , lastDig );\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n if ( 'exceptions' in ordDict ) {\n ret = typeof ordDict.exceptions === 'function' ? ordDict.exceptions( num , lastDig ) :\n num in ordDict.exceptions ? funcOrVal( ordDict.exceptions[ num ] , [num , lastDig] ) :\n undefined;\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n if ( 'byLastDigit' in ordDict ) {\n ret = typeof ordDict.byLastDigit === 'function' ? ordDict.byLastDigit( lastDig , num ) :\n lastDig in ordDict.byLastDigit ? funcOrVal( ordDict.byLastDigit[ lastDig ] , [lastDig , num] ) :\n undefined;\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n if ( 'default' in ordDict ) {\n ret = funcOrVal( ordDict['default'] , [ num , lastDig ] );\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n return '';\n },\n\n /**\n * Create an alias.\n *\n * Returns an alias to this I18n instance. It contains the I18n methods documented here, but is also a function. If you call it, it just calls `text()`. This is commonly assigned to \"_\".\n *\n * @method alias\n * @returns {Function} an alias to `text()` on this instance. You can also access the rest of the translation API through this alias.\n *\n * @sample Ink_Util_I18n_1_alias.html\n */\n alias: function( ) {\n var ret = Ink.bind( I18n.prototype.text , this );\n ret.ntext = Ink.bind( I18n.prototype.ntext , this );\n ret.append = Ink.bind( I18n.prototype.append , this );\n ret.ordinal = Ink.bind( I18n.prototype.ordinal , this );\n ret.testMode = Ink.bind( I18n.prototype.testMode , this );\n\n return ret;\n }\n };\n\n /**\n * Resets I18n global state (global dictionaries, and default language for instances)\n *\n * @method reset\n * @return {void}\n * @static\n *\n **/\n I18n.reset = function( ) {\n I18n.prototype._gDicts = [ ];\n I18n.prototype._gDict = { };\n I18n.prototype._gLang = 'pt_PT';\n };\n I18n.reset( );\n\n /**\n * Adds a dictionary to be used in all I18n instances for the corresponding language.\n *\n * @method appendGlobal\n * @static\n *\n * @param {Object} dict Dictionary to be added\n * @param {String} lang Language fo the dictionary being added\n * @return {void}\n *\n */\n I18n.appendGlobal = function( dict , lang ) {\n if ( lang ) {\n if ( !( lang in dict ) ) {\n var obj = { };\n\n obj[ lang ] = dict;\n\n dict = obj;\n }\n\n if ( lang !== I18n.prototype._gLang ) { I18n.langGlobal( lang ); }\n }\n\n I18n.prototype._gDicts.push( dict );\n\n Ink.extendObj( I18n.prototype._gDict , dict[ I18n.prototype._gLang ] );\n };\n\n /**\n * Gets or sets the current default language of I18n instances.\n *\n * @method langGlobal\n * @param {String} [lang] the new language for all I18n instances. Omit this argument if you wish to *get* the current default language instead.\n *\n * @static\n *\n * @return {String} language code, or nothing if not used as a setter.\n */\n I18n.langGlobal = function( lang ) {\n if ( !arguments.length ) { return I18n.prototype._gLang; }\n\n if ( lang && I18n.prototype._gLang !== lang ) {\n I18n.prototype._gLang = lang;\n\n I18n.prototype._gDict = { };\n\n for ( var i = 0, l = I18n.prototype._gDicts.length; i < l; i++ ) {\n Ink.extendObj( I18n.prototype._gDict , I18n.prototype._gDicts[ i ][ lang ] || { } );\n }\n }\n };\n\n return I18n;\n});","/**\n * JSON Utilities\n * @module Ink.Util.Json_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Json', '1', [], function() {\n 'use strict';\n\n var function_call = Function.prototype.call;\n var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n\n function twoDigits(n) {\n var r = '' + n;\n if (r.length === 1) {\n return '0' + r;\n } else {\n return r;\n }\n }\n\n var dateToISOString = Date.prototype.toISOString ?\n Ink.bind(function_call, Date.prototype.toISOString) :\n function(date) {\n // Adapted from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString\n return date.getUTCFullYear() +\n '-' + twoDigits( date.getUTCMonth() + 1 ) +\n '-' + twoDigits( date.getUTCDate() ) +\n 'T' + twoDigits( date.getUTCHours() ) +\n ':' + twoDigits( date.getUTCMinutes() ) +\n ':' + twoDigits( date.getUTCSeconds() ) +\n '.' + String( (date.getUTCMilliseconds()/1000).toFixed(3) ).slice( 2, 5 ) +\n 'Z';\n };\n\n /**\n * Use this class to convert JSON strings to JavaScript objects\n * `.parse()` and also to do the opposite operation `.stringify()`.\n * Internally, the standard JSON implementation is used if available\n * Otherwise, the functions mimic the standard implementation.\n *\n * Here's how to produce JSON from an existing object:\n * \n * Ink.requireModules(['Ink.Util.Json_1'], function (Json) {\n * var obj = {\n * key1: 'value1',\n * key2: 'value2',\n * keyArray: ['arrayValue1', 'arrayValue2', 'arrayValue3']\n * };\n * Json.stringify(obj); // The above object as a JSON string\n * });\n *\n * And here is how to parse JSON:\n *\n * Ink.requireModules(['Ink.Util.Json_1'], function (Json) {\n * var source = '{\"key\": \"value\", \"array\": [true, null, false]}';\n * Json.parse(source); // The above JSON string as an object\n * });\n *\n * @namespace Ink.Util.Json_1 \n * @static\n * \n */\n var InkJson = {\n _nativeJSON: window.JSON || null,\n\n _convertToUnicode: false,\n\n // Escape characters so as to embed them in JSON strings\n _escape: function (theString) {\n var _m = { '\\b': '\\\\b', '\\t': '\\\\t', '\\n': '\\\\n', '\\f': '\\\\f', '\\r': '\\\\r', '\"': '\\\\\"', '\\\\': '\\\\\\\\' };\n\n if (/[\"\\\\\\x00-\\x1f]/.test(theString)) {\n theString = theString.replace(/([\\x00-\\x1f\\\\\"])/g, function(a, b) {\n var c = _m[b];\n if (c) {\n return c;\n }\n c = b.charCodeAt();\n return '\\\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);\n });\n }\n\n return theString;\n },\n\n // A character conversion map\n _toUnicode: function (theString)\n {\n if(!this._convertToUnicode) {\n return this._escape(theString);\n } else {\n var unicodeString = '';\n var inInt = false;\n var theUnicode = false;\n var i = 0;\n var total = theString.length;\n while(i < total) {\n inInt = theString.charCodeAt(i);\n if( (inInt >= 32 && inInt <= 126) ||\n //(inInt >= 48 && inInt <= 57) ||\n //(inInt >= 65 && inInt <= 90) ||\n //(inInt >= 97 && inInt <= 122) ||\n inInt === 8 ||\n inInt === 9 ||\n inInt === 10 ||\n inInt === 12 ||\n inInt === 13 ||\n inInt === 32 ||\n inInt === 34 ||\n inInt === 47 ||\n inInt === 58 ||\n inInt === 92) {\n\n if(inInt === 34 || inInt === 92 || inInt === 47) {\n theUnicode = '\\\\'+theString.charAt(i);\n } else if(inInt === 8) {\n theUnicode = '\\\\b';\n } else if(inInt === 9) {\n theUnicode = '\\\\t';\n } else if(inInt === 10) {\n theUnicode = '\\\\n';\n } else if(inInt === 12) {\n theUnicode = '\\\\f';\n } else if(inInt === 13) {\n theUnicode = '\\\\r';\n } else {\n theUnicode = theString.charAt(i);\n }\n } else {\n if(this._convertToUnicode) {\n theUnicode = theString.charCodeAt(i).toString(16)+''.toUpperCase();\n while (theUnicode.length < 4) {\n theUnicode = '0' + theUnicode;\n }\n theUnicode = '\\\\u' + theUnicode;\n } else {\n theUnicode = theString.charAt(i);\n }\n }\n unicodeString += theUnicode;\n\n i++;\n }\n\n return unicodeString;\n }\n\n },\n\n _stringifyValue: function(param) {\n if (typeof param === 'string') {\n return '\"' + this._toUnicode(param) + '\"';\n } else if (typeof param === 'number' && (isNaN(param) || !isFinite(param))) { // Unusable numbers go null\n return 'null';\n } else if (typeof param === 'undefined' || param === null) { // And so does undefined\n return 'null';\n } else if (typeof param.toJSON === 'function') {\n var t = param.toJSON();\n if (typeof t === 'string') {\n return '\"' + this._escape(t) + '\"';\n } else {\n return this._escape(t.toString());\n }\n } else if (typeof param === 'number' || typeof param === 'boolean') { // These ones' toString methods return valid JSON.\n return '' + param;\n } else if (typeof param === 'function') {\n return 'null'; // match JSON.stringify\n } else if (param.constructor === Date) {\n return '\"' + this._escape(dateToISOString(param)) + '\"';\n } else if (param.constructor === Array) {\n var arrayString = '';\n for (var i = 0, len = param.length; i < len; i++) {\n if (i > 0) {\n arrayString += ',';\n }\n arrayString += this._stringifyValue(param[i]);\n }\n return '[' + arrayString + ']';\n } else { // Object\n var objectString = '';\n for (var k in param) {\n if ({}.hasOwnProperty.call(param, k)) {\n if (objectString !== '') {\n objectString += ',';\n }\n objectString += '\"' + this._escape(k) + '\": ' + this._stringifyValue(param[k]);\n }\n }\n return '{' + objectString + '}';\n }\n },\n\n /**\n * Serializes a JSON object into a string.\n *\n * @method stringify\n * @param {Object} input Data to be serialized into JSON\n * @param {Boolean} convertToUnicode When `true`, converts string contents to unicode \\uXXXX\n * @return {String} Serialized string\n *\n * @sample Ink_Util_Json_stringify.html \n */\n stringify: function(input, convertToUnicode) {\n this._convertToUnicode = !!convertToUnicode;\n if(!this._convertToUnicode && this._nativeJSON) {\n return this._nativeJSON.stringify(input);\n }\n return this._stringifyValue(input); // And recurse.\n },\n \n /**\n * Parses a JSON text through a function\n * \n * @method parse\n * @param text {String} Input string\n * @param reviver {Function} Function receiving `(key, value)`, and `this`=(containing object), used to walk objects.\n * \n * @return {Object} JSON object\n *\n * @sample Ink_Util_Json_parse.html \n */\n /* From https://github.com/douglascrockford/JSON-js/blob/master/json.js */\n parse: function (text, reviver) {\n /*jshint evil:true*/\n\n// The parse method takes a text and an optional reviver function, and returns\n// a JavaScript value if the text is a valid JSON text.\n\n var j;\n\n function walk(holder, key) {\n\n// The walk method is used to recursively walk the resulting structure so\n// that modifications can be made.\n\n var k, v, value = holder[key];\n if (value && typeof value === 'object') {\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = walk(value, k);\n if (v !== undefined) {\n value[k] = v;\n } else {\n delete value[k];\n }\n }\n }\n }\n return reviver.call(holder, key, value);\n }\n\n\n// Parsing happens in four stages. In the first stage, we replace certain\n// Unicode characters with escape sequences. JavaScript handles many characters\n// incorrectly, either silently deleting them, or treating them as line endings.\n\n text = String(text);\n cx.lastIndex = 0;\n if (cx.test(text)) {\n text = text.replace(cx, function (a) {\n return '\\\\u' +\n ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n });\n }\n\n// In the second stage, we run the text against regular expressions that look\n// for non-JSON patterns. We are especially concerned with '()' and 'new'\n// because they can cause invocation, and '=' because it can cause mutation.\n// But just to be safe, we want to reject all unexpected forms.\n\n// We split the second stage into 4 regexp operations in order to work around\n// crippling inefficiencies in IE's and Safari's regexp engines. First we\n// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we\n// replace all simple value tokens with ']' characters. Third, we delete all\n// open brackets that follow a colon or comma or that begin the text. Finally,\n// we look to see that the remaining characters are only whitespace or ']' or\n// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.\n\n if (/^[\\],:{}\\s]*$/\n .test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')\n .replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']')\n .replace(/(?:^|:|,)(?:\\s*\\[)+/g, ''))) {\n\n// In the third stage we use the eval function to compile the text into a\n// JavaScript structure. The '{' operator is subject to a syntactic ambiguity\n// in JavaScript: it can begin a block or an object literal. We wrap the text\n// in parens to eliminate the ambiguity.\n\n j = eval('(' + text + ')');\n\n// In the optional fourth stage, we recursively walk the new structure, passing\n// each name/value pair to a reviver function for possible transformation.\n\n return typeof reviver === 'function' ?\n walk({'': j}, '') :\n j;\n }\n\n// If the text is not JSON parseable, then a SyntaxError is thrown.\n\n throw new SyntaxError('JSON.parse');\n }\n };\n\n return InkJson;\n});\n","/**\n * String Utilities\n * @module Ink.Util.String_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.String', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.String_1 \n */\n var InkUtilString = {\n\n /**\n * List of special chars\n * \n * @property _chars\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _chars: ['&','à','á','â','ã','ä','å','æ','ç','è','é',\n 'ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô',\n 'õ','ö','ø','ù','ú','û','ü','ý','þ','ÿ','À',\n 'Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë',\n 'Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö',\n 'Ø','Ù','Ú','Û','Ü','Ý','Þ','€','\\\"','ß','<',\n '>','¢','£','¤','¥','¦','§','¨','©','ª','«',\n '¬','\\xad','®','¯','°','±','²','³','´','µ','¶',\n '·','¸','¹','º','»','¼','½','¾'],\n\n /**\n * List of the special characters' html entities\n * \n * @property _entities\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _entities: ['amp','agrave','aacute','acirc','atilde','auml','aring',\n 'aelig','ccedil','egrave','eacute','ecirc','euml','igrave',\n 'iacute','icirc','iuml','eth','ntilde','ograve','oacute',\n 'ocirc','otilde','ouml','oslash','ugrave','uacute','ucirc',\n 'uuml','yacute','thorn','yuml','Agrave','Aacute','Acirc',\n 'Atilde','Auml','Aring','AElig','Ccedil','Egrave','Eacute',\n 'Ecirc','Euml','Igrave','Iacute','Icirc','Iuml','ETH','Ntilde',\n 'Ograve','Oacute','Ocirc','Otilde','Ouml','Oslash','Ugrave',\n 'Uacute','Ucirc','Uuml','Yacute','THORN','euro','quot','szlig',\n 'lt','gt','cent','pound','curren','yen','brvbar','sect','uml',\n 'copy','ordf','laquo','not','shy','reg','macr','deg','plusmn',\n 'sup2','sup3','acute','micro','para','middot','cedil','sup1',\n 'ordm','raquo','frac14','frac12','frac34'],\n\n /**\n * List of accented chars\n * \n * @property _accentedChars\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _accentedChars:['à','á','â','ã','ä','å',\n 'è','é','ê','ë',\n 'ì','í','î','ï',\n 'ò','ó','ô','õ','ö',\n 'ù','ú','û','ü',\n 'ç','ñ',\n 'À','Á','Â','Ã','Ä','Å',\n 'È','É','Ê','Ë',\n 'Ì','Í','Î','Ï',\n 'Ò','Ó','Ô','Õ','Ö',\n 'Ù','Ú','Û','Ü',\n 'Ç','Ñ'],\n\n /**\n * List of the accented chars (above), but without the accents\n * \n * @property _accentedRemovedChars\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _accentedRemovedChars:['a','a','a','a','a','a',\n 'e','e','e','e',\n 'i','i','i','i',\n 'o','o','o','o','o',\n 'u','u','u','u',\n 'c','n',\n 'A','A','A','A','A','A',\n 'E','E','E','E',\n 'I','I','I','I',\n 'O','O','O','O','O',\n 'U','U','U','U',\n 'C','N'],\n /**\n * Object that contains the basic HTML unsafe chars, as keys, and their HTML entities as values\n * \n * @property _htmlUnsafeChars\n * @type {Object}\n * @private\n * @readOnly\n * @static\n */\n _htmlUnsafeChars:{'<':'<','>':'>','&':'&','\"':'"',\"'\":'''},\n\n /**\n * Capitalizes a word.\n * If param as more than one word, it converts first letter of all words that have more than 2 letters\n *\n * @method ucFirst\n * @param {String} string String to capitalize.\n * @param {Boolean} [firstWordOnly]=false Flag to capitalize only the first word.\n * @return {String} Camel cased string.\n * @public\n * @static\n * @sample Ink_Util_String_ucFirst.html \n */\n ucFirst: function(string, firstWordOnly) {\n var replacer = firstWordOnly ? /(^|\\s)(\\w)(\\S{2,})/ : /(^|\\s)(\\w)(\\S{2,})/g;\n return string ? String(string).replace(replacer, function(_, $1, $2, $3){\n return $1 + $2.toUpperCase() + $3.toLowerCase();\n }) : string;\n },\n\n /**\n * Trims whitespace from strings\n *\n * @method trim\n * @param {String} string String to be trimmed\n * @return {String} Trimmed string\n * @public\n * @static\n * @sample Ink_Util_String_trim.html \n */\n trim: function(string)\n {\n if (typeof string === 'string') {\n return string.replace(/^\\s+|\\s+$|\\n+$/g, '');\n }\n return string;\n },\n\n /**\n * Strips HTML tags from strings\n *\n * @method stripTags\n * @param {String} string String to strip tags from.\n * @param {String} allowed Comma separated list of allowed tags.\n * @return {String} Stripped string\n * @public\n * @static\n * @sample Ink_Util_String_stripTags.html \n */\n stripTags: function(string, allowed)\n {\n if (allowed && typeof allowed === 'string') {\n var aAllowed = InkUtilString.trim(allowed).split(',');\n var aNewAllowed = [];\n var cleanedTag = false;\n for(var i=0; i < aAllowed.length; i++) {\n if(InkUtilString.trim(aAllowed[i]) !== '') {\n cleanedTag = InkUtilString.trim(aAllowed[i].replace(/(<|\\>)/g, '').replace(/\\s/, ''));\n aNewAllowed.push('(<'+cleanedTag+'\\\\s[^>]+>|<(\\\\s|\\\\/)?(\\\\s|\\\\/)?'+cleanedTag+'>)');\n }\n }\n var strAllowed = aNewAllowed.join('|');\n var reAllowed = new RegExp(strAllowed, \"i\");\n\n var aFoundTags = string.match(new RegExp(\"<[^>]*>\", \"g\"));\n\n for(var j=0; j < aFoundTags.length; j++) {\n if(!aFoundTags[j].match(reAllowed)) {\n string = string.replace((new RegExp(aFoundTags[j], \"gm\")), '');\n }\n }\n return string;\n } else {\n return string.replace(/<[^\\>]+\\>/g, '');\n }\n },\n\n /**\n * Encodes string into HTML entities.\n *\n * @method htmlEntitiesEncode\n * @param {String} string Input string.\n * @return {String} HTML encoded string.\n * @public\n * @static\n * @sample Ink_Util_String_htmlEntitiesEncode.html \n */\n htmlEntitiesEncode: function(string)\n {\n if (string && string.replace) {\n var re = false;\n for (var i = 0; i < InkUtilString._chars.length; i++) {\n re = new RegExp(InkUtilString._chars[i], \"gm\");\n string = string.replace(re, '&' + InkUtilString._entities[i] + ';');\n }\n }\n return string;\n },\n\n /**\n * Decodes string from HTML entities.\n *\n * @method htmlEntitiesDecode\n * @param {String} string String to be decoded\n * @return {String} Decoded string\n * @public\n * @static\n * @sample Ink_Util_String_htmlEntitiesDecode.html \n */\n htmlEntitiesDecode: function(string)\n {\n if (string && string.replace) {\n var re = false;\n for (var i = 0; i < InkUtilString._entities.length; i++) {\n re = new RegExp(\"&\"+InkUtilString._entities[i]+\";\", \"gm\");\n string = string.replace(re, InkUtilString._chars[i]);\n }\n string = string.replace(/&#[^;]+;?/g, function($0){\n if ($0.charAt(2) === 'x') {\n return String.fromCharCode(parseInt($0.substring(3), 16));\n }\n else {\n return String.fromCharCode(parseInt($0.substring(2), 10));\n }\n });\n }\n return string;\n },\n\n /**\n * Encode a string to UTF-8.\n *\n * @method utf8Encode\n * @param {String} string String to be encoded\n * @return {String} string UTF-8 encoded string\n * @public\n * @static\n */\n utf8Encode: function(string) {\n /*jshint bitwise:false*/\n string = string.replace(/\\r\\n/g,\"\\n\");\n var utfstring = \"\";\n\n for (var n = 0; n < string.length; n++) {\n\n var c = string.charCodeAt(n);\n\n if (c < 128) {\n utfstring += String.fromCharCode(c);\n }\n else if((c > 127) && (c < 2048)) {\n utfstring += String.fromCharCode((c >> 6) | 192);\n utfstring += String.fromCharCode((c & 63) | 128);\n }\n else {\n utfstring += String.fromCharCode((c >> 12) | 224);\n utfstring += String.fromCharCode(((c >> 6) & 63) | 128);\n utfstring += String.fromCharCode((c & 63) | 128);\n }\n\n }\n return utfstring;\n },\n\n /**\n * Truncates a string without breaking words. Inserts an ellipsis HTML entity at the end of the string if it's too long.\n *\n * @method shortString\n * @param {String} str String to truncate\n * @param {Number} n Number of chars of the short string\n * @return {String} Truncated string, or the original `str` if it's shorter than `n`\n * @public\n * @static\n * @sample Ink_Util_String_shortString.html \n */\n shortString: function(str,n) {\n var words = str.split(' ');\n var resultstr = '';\n for(var i = 0; i < words.length; i++ ){\n if((resultstr + words[i] + ' ').length>=n){\n resultstr += '…';\n break;\n }\n resultstr += words[i] + ' ';\n }\n return resultstr;\n },\n\n /**\n * Truncates a string, breaking words and adding ... at the end.\n *\n * @method truncateString\n * @param {String} str String to truncate\n * @param {Number} length Limit for the returned string, ellipsis included.\n * @return {String} Truncated String\n * @public\n * @static\n * @sample Ink_Util_String_truncateString.html \n */\n truncateString: function(str, length) {\n if(str.length - 1 > length) {\n return str.substr(0, length - 1) + \"\\u2026\";\n } else {\n return str;\n }\n },\n\n /**\n * Decodes a string from UTF-8.\n *\n * @method utf8Decode\n * @param {String} string String to be decoded\n * @return {String} Decoded string\n * @public\n * @static\n */\n utf8Decode: function(string) {\n /*jshint bitwise:false*/\n var ret = \"\";\n var i = 0, c = 0, c2 = 0, c3 = 0;\n\n while ( i < string.length ) {\n\n c = string.charCodeAt(i);\n\n if (c < 128) {\n ret += String.fromCharCode(c);\n i++;\n }\n else if((c > 191) && (c < 224)) {\n c2 = string.charCodeAt(i+1);\n ret += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n i += 2;\n }\n else {\n c2 = string.charCodeAt(i+1);\n c3 = string.charCodeAt(i+2);\n ret += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n i += 3;\n }\n\n }\n return ret;\n },\n\n /**\n * Removes all accented characters from a string.\n *\n * @method removeAccentedChars\n * @param {String} string String to remove accents from\n * @return {String} String without accented chars\n * @public\n * @static\n * @sample Ink_Util_String_removeAccentedChars.html \n */\n removeAccentedChars: function(string)\n {\n var newString = string;\n var re = false;\n for (var i = 0; i < InkUtilString._accentedChars.length; i++) {\n re = new RegExp(InkUtilString._accentedChars[i], \"gm\");\n newString = newString.replace(re, '' + InkUtilString._accentedRemovedChars[i] + '');\n }\n return newString;\n },\n\n /**\n * Count the number of occurrences of a specific needle in a haystack\n *\n * @method substrCount\n * @param {String} haystack String to search in\n * @param {String} needle String to search for\n * @return {Number} Number of occurrences\n * @public\n * @static\n * @sample Ink_Util_String_substrCount.html \n */\n substrCount: function(haystack,needle)\n {\n return haystack ? haystack.split(needle).length - 1 : 0;\n },\n\n /**\n * Eval a JSON - We recommend you Ink.Util.Json\n *\n * @method evalJSON\n * @param {String} strJSON JSON string to eval\n * @param {Boolean} sanitize Flag to sanitize input\n * @return {Object} JS Object\n * @public\n * @static\n */\n evalJSON: function(strJSON, sanitize) {\n /* jshint evil:true */\n if( (typeof sanitize === 'undefined' || sanitize === null) || InkUtilString.isJSON(strJSON)) {\n try {\n if(typeof(JSON) !== \"undefined\" && typeof(JSON.parse) !== 'undefined'){\n return JSON.parse(strJSON);\n }\n return eval('('+strJSON+')');\n } catch(e) {\n throw new Error('ERROR: Bad JSON string...');\n }\n }\n },\n\n /**\n * Checks if a string is a valid JSON object (string encoded)\n *\n * @method isJSON\n * @param {String} str String to check\n * @return {Boolean} Return whether it's JSON.\n * @public\n * @static\n */\n isJSON: function(str)\n {\n str = str.replace(/\\\\./g, '@').replace(/\"[^\"\\\\\\n\\r]*\"/g, '');\n return (/^[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]*$/).test(str);\n },\n\n /**\n * Escapes unsafe html chars as HTML entities\n *\n * @method htmlEscapeUnsafe\n * @param {String} str String to escape\n * @return {String} Escaped string\n * @public\n * @static\n * @sample Ink_Util_String_htmlEscapeUnsafe.html \n */\n htmlEscapeUnsafe: function(str){\n var chars = InkUtilString._htmlUnsafeChars;\n return str !== null ? String(str).replace(/[<>&'\"]/g,function(c){return chars[c];}) : str;\n },\n\n /**\n * Normalizes whitespace in string.\n * String is trimmed and sequences of whitespaces are collapsed.\n *\n * @method normalizeWhitespace\n * @param {String} str String to normalize\n * @return {String} Normalized string\n * @public\n * @static\n * @sample Ink_Util_String_normalizeWhitespace.html \n */\n normalizeWhitespace: function(str){\n return str !== null ? InkUtilString.trim(String(str).replace(/\\s+/g,' ')) : str;\n },\n\n /**\n * Converts string to unicode.\n *\n * @method toUnicode\n * @param {String} str String to convert\n * @return {String} Unicoded String\n * @public\n * @static\n * @sample Ink_Util_String_toUnicode.html \n */\n toUnicode: function(str) {\n if (typeof str === 'string') {\n var unicodeString = '';\n var inInt = false;\n var theUnicode = false;\n var total = str.length;\n var i=0;\n\n while(i < total)\n {\n inInt = str.charCodeAt(i);\n if( (inInt >= 32 && inInt <= 126) ||\n inInt === 8 ||\n inInt === 9 ||\n inInt === 10 ||\n inInt === 12 ||\n inInt === 13 ||\n inInt === 32 ||\n inInt === 34 ||\n inInt === 47 ||\n inInt === 58 ||\n inInt === 92) {\n\n /*\n if(inInt == 34 || inInt == 92 || inInt == 47) {\n theUnicode = '\\\\'+str.charAt(i);\n } else {\n }\n */\n if(inInt === 8) {\n theUnicode = '\\\\b';\n } else if(inInt === 9) {\n theUnicode = '\\\\t';\n } else if(inInt === 10) {\n theUnicode = '\\\\n';\n } else if(inInt === 12) {\n theUnicode = '\\\\f';\n } else if(inInt === 13) {\n theUnicode = '\\\\r';\n } else {\n theUnicode = str.charAt(i);\n }\n } else {\n theUnicode = str.charCodeAt(i).toString(16)+''.toUpperCase();\n while (theUnicode.length < 4) {\n theUnicode = '0' + theUnicode;\n }\n theUnicode = '\\\\u' + theUnicode;\n }\n unicodeString += theUnicode;\n\n i++;\n }\n return unicodeString;\n }\n },\n\n /**\n * Escapes a unicode character.\n *\n * @method escape\n * @param {String} c Character to escape\n * @return {String} Escaped character. Returns \\xXX if hex smaller than 0x100, otherwise \\uXXXX\n * @public\n * @static\n * @sample Ink_Util_String_escape.html \n */\n escape: function(c) {\n var hex = (c).charCodeAt(0).toString(16).split('');\n if (hex.length < 3) {\n while (hex.length < 2) { hex.unshift('0'); }\n hex.unshift('x');\n }\n else {\n while (hex.length < 4) { hex.unshift('0'); }\n hex.unshift('u');\n }\n\n hex.unshift('\\\\');\n return hex.join('');\n },\n\n /**\n * Unescapes a unicode character escape sequence\n *\n * @method unescape\n * @param {String} es Escape sequence\n * @return {String} String un-unicoded\n * @public\n * @static\n * @sample Ink_Util_String_unescape.html \n */\n unescape: function(es) {\n var idx = es.lastIndexOf('0');\n idx = idx === -1 ? 2 : Math.min(idx, 2);\n //console.log(idx);\n var hexNum = es.substring(idx);\n //console.log(hexNum);\n var num = parseInt(hexNum, 16);\n return String.fromCharCode(num);\n },\n\n /**\n * Escapes unicode characters in a string as unicode character entities (`\\x##`, where the `##` are hex digits).\n *\n * @method escapeText\n * @param {String} txt String with characters outside the ASCII printable range (32 < charCode < 127)\n * @param {Array} [whiteList] Whitelist of characters which should NOT be escaped\n * @return {String} String escaped with unicode character entities.\n * @public\n * @static\n * @sample Ink_Util_String_escapeText.html \n */\n escapeText: function(txt, whiteList) {\n if (whiteList === undefined) {\n whiteList = ['[', ']', '\\'', ','];\n }\n var txt2 = [];\n var c, C;\n for (var i = 0, f = txt.length; i < f; ++i) {\n c = txt[i];\n C = c.charCodeAt(0);\n if (C < 32 || C > 126 && whiteList.indexOf(c) === -1) {\n c = InkUtilString.escape(c);\n }\n txt2.push(c);\n }\n return txt2.join('');\n },\n\n /**\n * Regex to check escaped strings\n *\n * @property escapedCharRegex\n * @type {Regex}\n * @public\n * @readOnly\n * @static\n */\n escapedCharRegex: /(\\\\x[0-9a-fA-F]{2})|(\\\\u[0-9a-fA-F]{4})/g,\n\n /**\n * Removes unicode entities (in the format \"\\x##\" or \"\\u####\", where \"#\" is a hexadecimal digit)\n *\n * @method unescapeText\n * @param {String} txt Text you intend to remove unicode character entities.\n * @return {String} Unescaped string\n * @public\n * @static\n * @sample Ink_Util_String_unescapeText.html \n */\n unescapeText: function(txt) {\n /*jshint boss:true */\n var m;\n while (m = InkUtilString.escapedCharRegex.exec(txt)) {\n m = m[0];\n txt = txt.replace(m, InkUtilString.unescape(m));\n InkUtilString.escapedCharRegex.lastIndex = 0;\n }\n return txt;\n },\n\n /**\n * Compares two strings.\n *\n * @method strcmp\n * @param {String} str1 First String\n * @param {String} str2 Second String\n * @return {Number} 0 if given strings are equal, 1 if str1 is greater than str2, and -1 if str2 is greater than str1.\n * @public\n * @static\n * @sample Ink_Util_String_strcmp.html \n */\n strcmp: function(str1, str2) {\n return ((str1 === str2) ? 0 : ((str1 > str2) ? 1 : -1));\n },\n\n /**\n * Splits a string into smaller chunks\n *\n * @method packetize\n * @param {String} str String to divide\n * @param {Number} maxLen Maximum chunk size (in characters)\n * @return {Array} Chunks of the original string\n * @public\n * @static\n * @sample Ink_Util_String_packetize.html \n */\n packetize: function(str, maxLen) {\n var len = str.length;\n var parts = new Array( Math.ceil(len / maxLen) );\n var chars = str.split('');\n var sz, i = 0;\n while (len) {\n sz = Math.min(maxLen, len);\n parts[i++] = chars.splice(0, sz).join('');\n len -= sz;\n }\n return parts;\n }\n };\n\n return InkUtilString;\n\n});\n","/**\n * URL Utilities\n * @module Ink.Util.Url_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Url', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Url_1\n */\n var Url = {\n\n /**\n * Auxiliary string for encoding\n *\n * @property _keyStr\n * @type {String}\n * @readOnly\n * @private\n */\n _keyStr : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n\n\n /**\n * Gets URL of current page\n *\n * @method getUrl\n * @return {String} Current URL\n * @public\n * @static\n * @sample Ink_Util_Url_getUrl.html \n */\n getUrl: function()\n {\n return window.location.href;\n },\n\n /**\n * Generates an URL string.\n *\n * @method genQueryString\n * @param {String} uri Base URL\n * @param {Object} params Object to transform to query string\n * @return {String} URI with query string set\n * @public\n * @static\n * @sample Ink_Util_Url_genQueryString.html \n */\n genQueryString: function(uri, params) {\n var hasQuestionMark = uri.indexOf('?') !== -1;\n var sep, pKey, pValue, parts = [uri];\n\n for (pKey in params) {\n if (params.hasOwnProperty(pKey)) {\n if (!hasQuestionMark) {\n sep = '?';\n hasQuestionMark = true;\n } else {\n sep = '&';\n }\n pValue = params[pKey];\n if (typeof pValue !== 'number' && !pValue) {\n pValue = '';\n }\n parts = parts.concat([sep, encodeURIComponent(pKey), '=', encodeURIComponent(pValue)]);\n }\n }\n\n return parts.join('');\n },\n\n /**\n * Gets an object from an URL encoded string.\n *\n * @method getQueryString\n * @param {String} [str] URL String. When not specified it uses the current URL.\n * @return {Object} Key-Value pair object\n * @public\n * @static\n * @sample Ink_Util_Url_getQueryString.html \n */\n getQueryString: function(str)\n {\n var url;\n if(str && typeof(str) !== 'undefined') {\n url = str;\n } else {\n url = this.getUrl();\n }\n var aParams = {};\n if(url.match(/\\?(.+)/i)) {\n var queryStr = url.replace(/^(.*)\\?([^\\#]+)(\\#(.*))?/g, \"$2\");\n if(queryStr.length > 0) {\n var aQueryStr = queryStr.split(/[;&]/);\n for(var i=0; i < aQueryStr.length; i++) {\n var pairVar = aQueryStr[i].split('=');\n aParams[decodeURIComponent(pairVar[0])] = (typeof(pairVar[1]) !== 'undefined' && pairVar[1]) ? decodeURIComponent(pairVar[1]) : false;\n }\n }\n }\n return aParams;\n },\n\n /**\n * Gets the URL hash value\n *\n * @method getAnchor\n * @param {String} [str] URL String. Defaults to current page URL.\n * @return {String|Boolean} Hash in the URL. If there's no hash, returns false.\n * @public\n * @static\n * @sample Ink_Util_Url_getAnchor.html \n */\n getAnchor: function(str)\n {\n var url;\n if(str && typeof(str) !== 'undefined') {\n url = str;\n } else {\n url = this.getUrl();\n }\n var anchor = false;\n if(url.match(/#(.+)/)) {\n anchor = url.replace(/([^#]+)#(.*)/, \"$2\");\n }\n return anchor;\n },\n\n /**\n * Gets the anchor string of an URL\n *\n * @method getAnchorString\n * @param {String} [string] URL to parse. Defaults to current URL.\n * @return {Object} Key-value pair object of the URL's hashtag 'variables'\n * @public\n * @static\n * @sample Ink_Util_Url_getAnchorString.html \n */\n getAnchorString: function(string)\n {\n var url;\n if(string && typeof(string) !== 'undefined') {\n url = string;\n } else {\n url = this.getUrl();\n }\n var aParams = {};\n if(url.match(/#(.+)/i)) {\n var anchorStr = url.replace(/^([^#]+)#(.*)?/g, \"$2\");\n if(anchorStr.length > 0) {\n var aAnchorStr = anchorStr.split(/[;&]/);\n for(var i=0; i < aAnchorStr.length; i++) {\n var pairVar = aAnchorStr[i].split('=');\n aParams[decodeURIComponent(pairVar[0])] = (typeof(pairVar[1]) !== 'undefined' && pairVar[1]) ? decodeURIComponent(pairVar[1]) : false;\n }\n }\n }\n return aParams;\n },\n\n\n /**\n * Parses URL string into URL parts\n *\n * @method parseUrl\n * @param {String} url URL to be parsed\n * @return {Object} Parsed URL as a key-value object.\n * @public\n * @static\n * @sample Ink_Util_Url_parseUrl.html \n */\n parseUrl: function(url) {\n var aURL = {};\n if(url && typeof url === 'string') {\n if(url.match(/^([^:]+):\\/\\//i)) {\n var re = /^([^:]+):\\/\\/([^\\/]*)\\/?([^\\?#]*)\\??([^#]*)#?(.*)/i;\n if(url.match(re)) {\n aURL.scheme = url.replace(re, \"$1\");\n aURL.host = url.replace(re, \"$2\");\n aURL.path = '/'+url.replace(re, \"$3\");\n aURL.query = url.replace(re, \"$4\") || false;\n aURL.fragment = url.replace(re, \"$5\") || false;\n }\n } else {\n var re1 = new RegExp(\"^([^\\\\?]+)\\\\?([^#]+)#(.*)\", \"i\");\n var re2 = new RegExp(\"^([^\\\\?]+)\\\\?([^#]+)#?\", \"i\");\n var re3 = new RegExp(\"^([^\\\\?]+)\\\\??\", \"i\");\n if(url.match(re1)) {\n aURL.scheme = false;\n aURL.host = false;\n aURL.path = url.replace(re1, \"$1\");\n aURL.query = url.replace(re1, \"$2\");\n aURL.fragment = url.replace(re1, \"$3\");\n } else if(url.match(re2)) {\n aURL.scheme = false;\n aURL.host = false;\n aURL.path = url.replace(re2, \"$1\");\n aURL.query = url.replace(re2, \"$2\");\n aURL.fragment = false;\n } else if(url.match(re3)) {\n aURL.scheme = false;\n aURL.host = false;\n aURL.path = url.replace(re3, \"$1\");\n aURL.query = false;\n aURL.fragment = false;\n }\n }\n if(aURL.host) {\n var regPort = /^(.*?)\\\\:(\\\\d+)$/i;\n // check for port\n if(aURL.host.match(regPort)) {\n var tmpHost1 = aURL.host;\n aURL.host = tmpHost1.replace(regPort, \"$1\");\n aURL.port = tmpHost1.replace(regPort, \"$2\");\n } else {\n aURL.port = false;\n }\n // check for user and pass\n if(aURL.host.match(/@/i)) {\n var tmpHost2 = aURL.host;\n aURL.host = tmpHost2.split('@')[1];\n var tmpUserPass = tmpHost2.split('@')[0];\n if(tmpUserPass.match(/\\:/)) {\n aURL.user = tmpUserPass.split(':')[0];\n aURL.pass = tmpUserPass.split(':')[1];\n } else {\n aURL.user = tmpUserPass;\n aURL.pass = false;\n }\n }\n }\n }\n return aURL;\n },\n\n /**\n * Formats an URL object into an URL string.\n *\n * @method format\n * @param {String|Location|Object} urlObj Window.location, a.href, or parseUrl object to format\n * @return {String} Full URL.\n */\n format: function (urlObj) {\n var protocol = '';\n var host = '';\n var path = '';\n var frag = '';\n var query = '';\n\n if (typeof urlObj.protocol === 'string') {\n protocol = urlObj.protocol + '//'; // here it comes with the colon\n } else if (typeof urlObj.scheme === 'string') {\n protocol = urlObj.scheme + '://';\n }\n\n host = urlObj.host || urlObj.hostname || '';\n path = urlObj.path || '';\n\n if (typeof urlObj.query === 'string') {\n query = urlObj.query;\n } else if (typeof urlObj.search === 'string') {\n query = urlObj.search.replace(/^\\?/, '');\n }\n if (typeof urlObj.fragment === 'string') {\n frag = urlObj.fragment;\n } else if (typeof urlObj.hash === 'string') {\n frag = urlObj.hash.replace(/#$/, '');\n }\n\n return [\n protocol,\n host,\n path,\n query && '?' + query,\n frag && '#' + frag\n ].join('');\n },\n\n /**\n * Gets the last loaded script element\n *\n * @method currentScriptElement\n * @param {String} [match] String to match against the script src attribute\n * @return {DOMElement|Boolean} Returns the `script` DOM Element or false if unable to find it.\n * @public\n * @static\n * @sample Ink_Util_Url_currentScriptElement.html \n */\n currentScriptElement: function(match)\n {\n var aScripts = document.getElementsByTagName('script');\n if(typeof(match) === 'undefined') {\n if(aScripts.length > 0) {\n return aScripts[(aScripts.length - 1)];\n } else {\n return false;\n }\n } else {\n var curScript = false;\n var re = new RegExp(\"\"+match+\"\", \"i\");\n for(var i=0, total = aScripts.length; i < total; i++) {\n curScript = aScripts[i];\n if(re.test(curScript.src)) {\n return curScript;\n }\n }\n return false;\n }\n }\n };\n\n return Url;\n\n});\n","/**\n * Validation Utilities\n * @module Ink.Util.Validator_1\n * @version 1\n */\n \nInk.createModule('Ink.Util.Validator', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Validator_1 \n */\n var Validator = {\n\n /**\n * List of country codes avaible for the isPhone method\n *\n * @property _countryCodes\n * @type {Array}\n * @private\n * @static\n * @readOnly\n */\n _countryCodes : [\n 'AO',\n 'CV',\n 'MZ',\n 'PT'\n ],\n\n /**\n * International number for portugal\n *\n * @property _internacionalPT\n * @type {Number}\n * @private\n * @static\n * @readOnly\n *\n */\n _internacionalPT: 351,\n\n /**\n * List of all portuguese number prefixes\n *\n * @property _indicativosPT\n * @type {Object}\n * @private\n * @static\n * @readOnly\n *\n */\n _indicativosPT: {\n 21: 'lisboa',\n 22: 'porto',\n 231: 'mealhada',\n 232: 'viseu',\n 233: 'figueira da foz',\n 234: 'aveiro',\n 235: 'arganil',\n 236: 'pombal',\n 238: 'seia',\n 239: 'coimbra',\n 241: 'abrantes',\n 242: 'ponte de sôr',\n 243: 'santarém',\n 244: 'leiria',\n 245: 'portalegre',\n 249: 'torres novas',\n 251: 'valença',\n 252: 'vila nova de famalicão',\n 253: 'braga',\n 254: 'peso da régua',\n 255: 'penafiel',\n 256: 'são joão da madeira',\n 258: 'viana do castelo',\n 259: 'vila real',\n 261: 'torres vedras',\n 262: 'caldas da raínha',\n 263: 'vila franca de xira',\n 265: 'setúbal',\n 266: 'évora',\n 268: 'estremoz',\n 269: 'santiago do cacém',\n 271: 'guarda',\n 272: 'castelo branco',\n 273: 'bragança',\n 274: 'proença-a-nova',\n 275: 'covilhã',\n 276: 'chaves',\n 277: 'idanha-a-nova',\n 278: 'mirandela',\n 279: 'moncorvo',\n 281: 'tavira',\n 282: 'portimão',\n 283: 'odemira',\n 284: 'beja',\n 285: 'moura',\n 286: 'castro verde',\n 289: 'faro',\n 291: 'funchal, porto santo',\n 292: 'corvo, faial, flores, horta, pico',\n 295: 'angra do heroísmo, graciosa, são jorge, terceira',\n 296: 'ponta delgada, são miguel, santa maria',\n\n 91 : 'rede móvel 91 (Vodafone / Yorn)',\n 93 : 'rede móvel 93 (Optimus)',\n 96 : 'rede móvel 96 (TMN)',\n 92 : 'rede móvel 92 (TODOS)',\n //925 : 'rede móvel 925 (TMN 925)',\n //926 : 'rede móvel 926 (TMN 926)',\n //927 : 'rede móvel 927 (TMN 927)',\n //922 : 'rede móvel 922 (Phone-ix)',\n\n 707: 'número único',\n 760: 'número único',\n 800: 'número grátis',\n 808: 'chamada local',\n 30: 'voip'\n },\n /**\n * International number for Cabo Verde\n *\n * @property _internacionalCV\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalCV: 238,\n\n /**\n * List of all Cabo Verde number prefixes\n *\n * @property _indicativosCV\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosCV: {\n 2: 'fixo',\n 91: 'móvel 91',\n 95: 'móvel 95',\n 97: 'móvel 97',\n 98: 'móvel 98',\n 99: 'móvel 99'\n },\n /**\n * International number for Angola\n *\n * @property _internacionalAO\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalAO: 244,\n\n /**\n * List of all Angola number prefixes\n *\n * @property _indicativosAO\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosAO: {\n 2: 'fixo',\n 91: 'móvel 91',\n 92: 'móvel 92'\n },\n /**\n * International number for Mozambique\n *\n * @property _internacionalMZ\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalMZ: 258,\n\n /**\n * List of all Mozambique number prefixes\n *\n * @property _indicativosMZ\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosMZ: {\n 2: 'fixo',\n 82: 'móvel 82',\n 84: 'móvel 84'\n },\n\n /**\n * International number for Timor\n *\n * @property _internacionalTL\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalTL: 670,\n\n /**\n * List of all Timor number prefixes\n *\n * @property _indicativosTL\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosTL: {\n 3: 'fixo',\n 7: 'móvel 7'\n },\n\n /**\n * Regular expression groups for several groups of characters\n *\n * http://en.wikipedia.org/wiki/C0_Controls_and_Basic_Latin\n * http://en.wikipedia.org/wiki/Plane_%28Unicode%29#Basic_Multilingual_Plane\n * http://en.wikipedia.org/wiki/ISO_8859-1\n *\n * @property _characterGroups\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _characterGroups: {\n numbers: ['0-9'],\n asciiAlpha: ['a-zA-Z'],\n latin1Alpha: ['a-zA-Z', '\\u00C0-\\u00FF'],\n unicodeAlpha: ['a-zA-Z', '\\u00C0-\\u00FF', '\\u0100-\\u1FFF', '\\u2C00-\\uD7FF'],\n /* whitespace characters */\n space: [' '],\n dash: ['-'],\n underscore: ['_'],\n nicknamePunctuation: ['_.-'],\n\n singleLineWhitespace: ['\\t '],\n newline: ['\\n'],\n whitespace: ['\\t\\n\\u000B\\f\\r\\u00A0 '],\n\n asciiPunctuation: ['\\u0021-\\u002F', '\\u003A-\\u0040', '\\u005B-\\u0060', '\\u007B-\\u007E'],\n latin1Punctuation: ['\\u0021-\\u002F', '\\u003A-\\u0040', '\\u005B-\\u0060', '\\u007B-\\u007E', '\\u00A1-\\u00BF', '\\u00D7', '\\u00F7'],\n unicodePunctuation: ['\\u0021-\\u002F', '\\u003A-\\u0040', '\\u005B-\\u0060', '\\u007B-\\u007E', '\\u00A1-\\u00BF', '\\u00D7', '\\u00F7', '\\u2000-\\u206F', '\\u2E00-\\u2E7F', '\\u3000-\\u303F']\n },\n\n /**\n * Creates a regular expression for several character groups.\n *\n * @method createRegExp\n *\n * @param {Object} groups\n * Groups to build regular expressions for. Possible keys are:\n *\n * - **numbers**: 0-9\n * - **asciiAlpha**: a-z, A-Z\n * - **latin1Alpha**: asciiAlpha, plus printable characters in latin-1\n * - **unicodeAlpha**: unicode alphanumeric characters.\n * - **space**: ' ', the space character.\n * - **dash**: dash character.\n * - **underscore**: underscore character.\n * - **nicknamePunctuation**: dash, dot, underscore\n * - **singleLineWhitespace**: space and tab (whitespace which only spans one line).\n * - **newline**: newline character ('\\n')\n * - **whitespace**: whitespace characters in the ASCII character set.\n * - **asciiPunctuation**: punctuation characters in the ASCII character set.\n * - **latin1Punctuation**: punctuation characters in latin-1.\n * - **unicodePunctuation**: punctuation characters in unicode.\n *\n * @returns {RegExp} A regular expression with the given groups.\n */\n createRegExp: function (groups) {\n var re = '^[';\n for (var key in groups) if (groups.hasOwnProperty(key)) {\n if (!(key in Validator._characterGroups)) {\n throw new Error('group ' + key + ' is not a valid character group');\n } else if (groups[key]) {\n re += Validator._characterGroups[key].join('');\n }\n }\n if (re === '^[') {\n // No changes\n return new RegExp('$^'); // match nothing\n }\n return new RegExp(re + ']*?$');\n },\n\n /**\n * Checks if a field has the required groups.\n *\n * @method checkCharacterGroups\n * @param {String} s The validation string\n * @param {Object} [groups={}] What groups are included. See `createRegExp`\n * @return {Boolean} Whether this is a valid string (all groups pass).\n * @sample Ink_Util_Validator_checkCharacterGroups.html \n */\n checkCharacterGroups: function (s, groups) {\n return Validator.createRegExp(groups).test(s);\n },\n\n /**\n * Checks if a field contains unicode printable characters.\n *\n * @method unicode\n * @param {String} s The validation string\n * @param {Object} [options={}] Optional configuration object. See createRegexp\n * @return {Boolean} Whether this is a valid unicode string.\n */\n unicode: function (s, options) {\n return Validator.checkCharacterGroups(s, Ink.extendObj({\n unicodeAlpha: true}, options));\n },\n\n /**\n * Checks if a field only contains latin-1 alphanumeric characters. \n * Takes options for allowing singleline whitespace, cross-line whitespace and punctuation.\n *\n * @method latin1\n *\n * @param {String} s The validation string\n * @param {Object} [options={}] Optional configuration object. See createRegexp\n * @return {Boolean} Whether this is a valid latin1 string.\n * @sample Ink_Util_Validator_latin1.html \n */\n latin1: function (s, options) {\n return Validator.checkCharacterGroups(s, Ink.extendObj({\n latin1Alpha: true}, options));\n },\n\n /**\n * Checks if a field only contains only ASCII alphanumeric characters. \n * Takes options for allowing singleline whitespace, cross-line whitespace and punctuation.\n *\n * @method ascii\n *\n * @param {String} s The validation string\n * @param {Object} [options={}] Optional configuration object. See createRegexp\n * @return {Boolean} Whether this is a valid ascii string.\n * @sample Ink_Util_Validator_ascii.html \n */\n ascii: function (s, options) {\n return Validator.checkCharacterGroups(s, Ink.extendObj({\n asciiAlpha: true}, options));\n },\n\n /**\n * Checks if a number is a valid\n *\n * @method number\n * @param {String} numb The number\n * @param {Object} [options] Further options\n * @param {String} [options.decimalSep='.'] Allow decimal separator.\n * @param {String} [options.thousandSep=\",\"] Strip this character from the number.\n * @param {String} [options.negative=false] Allow negative numbers.\n * @param {String} [options.decimalPlaces=null] Maximum number of decimal places. Use `0` for an integer number.\n * @param {Number} [options.max=null] Maximum number\n * @param {Number} [options.min=null] Minimum number\n * @param {Boolean}[options.returnNumber=false] When this option is `true`, return the number itself when the value is valid.\n * @return {Boolean|Number} `false` when invalid, `true` when valid. If `options.returnNumber` is `true`, return the parsed, valid number or `false`.\n * @sample Ink_Util_Validator_number.html \n */\n number: function (numb, options) {\n numb = numb + '';\n options = Ink.extendObj({\n decimalSep: '.',\n thousandSep: '',\n negative: true,\n decimalPlaces: null,\n maxDigits: null,\n max: null,\n min: null,\n returnNumber: false\n }, options || {});\n // smart recursion thing sets up aliases for options.\n if (options.thousandSep) {\n numb = numb.replace(new RegExp('\\\\' + options.thousandSep, 'g'), '');\n options.thousandSep = '';\n return Validator.number(numb, options);\n }\n if (options.negative === false) {\n options.min = 0;\n options.negative = true;\n return Validator.number(numb, options);\n }\n if (options.decimalSep !== '.') {\n numb = numb.replace(new RegExp('\\\\' + options.decimalSep, 'g'), '.');\n }\n\n if (!/^(-)?(\\d+)?(\\.\\d+)?$/.test(numb) || numb === '') {\n return false; // forbidden character found\n }\n \n var split;\n if (options.decimalSep && numb.indexOf(options.decimalSep) !== -1) {\n split = numb.split(options.decimalSep);\n if (options.decimalPlaces !== null &&\n split[1].length > options.decimalPlaces) {\n return false;\n }\n } else {\n split = ['' + numb, ''];\n }\n \n if (options.maxDigits!== null) {\n if (split[0].replace(/-/g, '').length > options.maxDigits) {\n return split;\n }\n }\n \n // Now look at the actual float\n var ret = parseFloat(numb);\n \n if (options.maxExcl !== null && ret >= options.maxExcl ||\n options.minExcl !== null && ret <= options.minExcl) {\n return false;\n }\n if (options.max !== null && ret > options.max ||\n options.min !== null && ret < options.min) {\n return false;\n }\n \n if (options.returnNumber) {\n return ret;\n } else {\n return true;\n }\n },\n\n /**\n * Checks if a year is Leap \"Bissexto\"\n *\n * @method _isLeapYear\n * @param {Number} year Year to be checked\n * @return {Boolean} True if it is a leap year.\n * @private\n * @static\n * @example\n * Ink.requireModules(['Ink.Util.Validator_1'], function( InkValidator ){\n * console.log( InkValidator._isLeapYear( 2004 ) ); // Result: true\n * console.log( InkValidator._isLeapYear( 2006 ) ); // Result: false\n * });\n */\n _isLeapYear: function(year){\n var yearRegExp = /^\\d{4}$/;\n\n if(yearRegExp.test(year)){\n return ((year%4) ? false: ((year%100) ? true : ((year%400)? false : true)) );\n }\n\n return false;\n },\n\n /**\n * Object with the date formats available for validation\n *\n * @property _dateParsers\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _dateParsers: {\n 'yyyy-mm-dd': {day:5, month:3, year:1, sep: '-', parser: /^(\\d{4})(\\-)(\\d{1,2})(\\-)(\\d{1,2})$/},\n 'yyyy/mm/dd': {day:5, month:3, year:1, sep: '/', parser: /^(\\d{4})(\\/)(\\d{1,2})(\\/)(\\d{1,2})$/},\n 'yy-mm-dd': {day:5, month:3, year:1, sep: '-', parser: /^(\\d{2})(\\-)(\\d{1,2})(\\-)(\\d{1,2})$/},\n 'yy/mm/dd': {day:5, month:3, year:1, sep: '/', parser: /^(\\d{2})(\\/)(\\d{1,2})(\\/)(\\d{1,2})$/},\n 'dd-mm-yyyy': {day:1, month:3, year:5, sep: '-', parser: /^(\\d{1,2})(\\-)(\\d{1,2})(\\-)(\\d{4})$/},\n 'dd/mm/yyyy': {day:1, month:3, year:5, sep: '/', parser: /^(\\d{1,2})(\\/)(\\d{1,2})(\\/)(\\d{4})$/},\n 'dd-mm-yy': {day:1, month:3, year:5, sep: '-', parser: /^(\\d{1,2})(\\-)(\\d{1,2})(\\-)(\\d{2})$/},\n 'dd/mm/yy': {day:1, month:3, year:5, sep: '/', parser: /^(\\d{1,2})(\\/)(\\d{1,2})(\\/)(\\d{2})$/}\n },\n\n /**\n * Gets the number of days in a given month of a given year\n *\n * @method _daysInMonth\n * @param {Number} _m Month (1 to 12)\n * @param {Number} _y Year\n * @return {Number} Returns the number of days in a given month of a given year\n * @private\n * @static\n * @example\n * Ink.requireModules(['Ink.Util.Validator_1'], function( InkValidator ){\n * console.log( InkValidator._daysInMonth( 2, 2004 ) ); // Result: 29\n * console.log( InkValidator._daysInMonth( 2, 2006 ) ); // Result: 28\n * });\n */\n _daysInMonth: function(_m,_y){\n var nDays=0;\n\n _m = parseInt(_m, 10);\n _y = parseInt(_y, 10);\n\n if(_m===1 || _m===3 || _m===5 || _m===7 || _m===8 || _m===10 || _m===12) {\n nDays= 31;\n } else if ( _m===4 || _m===6 || _m===9 || _m===11) {\n nDays = 30;\n } else if (_m===2) {\n if((_y%400===0) || (_y%4===0 && _y%100!==0)) {\n nDays = 29;\n } else {\n nDays = 28;\n }\n }\n\n return nDays;\n },\n\n\n\n /**\n * Checks if a date is valid\n *\n * @method _isValidDate\n * @param {Number} year Year fragment of your date.\n * @param {Number} month Month fragment of your date.\n * @param {Number} day Day fragment of your date.\n * @return {Boolean} True if valid\n * @private\n * @static\n * @example\n * Ink.requireModules(['Ink.Util.Validator_1'], function( InkValidator ){\n * console.log( InkValidator._isValidDate( 2004, 2, 29 ) ); // Result: true\n * console.log( InkValidator._isValidDate( 2006, 2, 29 ) ); // Result: false\n * });\n */\n _isValidDate: function(year, month, day){\n var yearRegExp = /^\\d{4}$/;\n var validOneOrTwo = /^\\d{1,2}$/;\n if(yearRegExp.test(year) && validOneOrTwo.test(month) && validOneOrTwo.test(day)){\n if(month>=1 && month<=12 && day>=1 && this._daysInMonth(month,year)>=day){\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if an email address is valid\n *\n * @method email\n * @param {String} email String containing the e-mail.\n * @return {Boolean} `true` if it's a valid e-mail address.\n * @public\n * @static\n * @sample Ink_Util_Validator_mail.html \n */\n email: function(email)\n {\n var emailValido = new RegExp(\"^[_a-z0-9-]+((\\\\.|\\\\+)[_a-z0-9-]+)*@([\\\\w]*-?[\\\\w]*\\\\.)+[a-z]{2,4}$\", \"i\");\n return !!emailValido.test(email);\n },\n\n /**\n * Deprecated. Alias for email(). Use it instead.\n *\n * @method mail\n * @public\n * @param {String} mail See `email`\n * @returns {Boolean} See `email`\n * @static\n * @private\n */\n mail: function (mail) { return Validator.email(mail); },\n\n /**\n * Checks if an url is valid\n *\n * @method url\n * @param {String} url URL to be checked\n * @param {Boolean} [full] If true, validates a full URL (one that should start with 'http')\n * @return {Boolean} True if valid\n * @public\n * @static\n * @sample Ink_Util_Validator_url.html \n */\n url: function(url, full)\n {\n if(typeof full === \"undefined\" || full === false) {\n var reHTTP = new RegExp(\"(^(http\\\\:\\\\/\\\\/|https\\\\:\\\\/\\\\/)(.+))\", \"i\");\n if(reHTTP.test(url) === false) {\n url = 'http://'+url;\n }\n }\n\n var reUrl = new RegExp(\"^(http:\\\\/\\\\/|https:\\\\/\\\\/)([\\\\w]*(-?[\\\\w]*)*\\\\.)+[a-z]{2,4}\", \"i\");\n if(reUrl.test(url) === false) {\n return false;\n } else {\n return true;\n }\n },\n\n /**\n * Checks if a phone is valid in Portugal\n *\n * @method isPTPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Portuguese Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isPTPhone.html\n */\n isPTPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosPT) {\n if(typeof(this._indicativosPT[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n\n var re351 = /^(00351|\\+351)/;\n if(re351.test(phone)) {\n phone = phone.replace(re351, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{9}/i;\n if(phone.length === 9 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Alias function for isPTPhone\n *\n * @method isPortuguesePhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Portuguese Phone\n * @public\n * @static\n */\n isPortuguesePhone: function(phone)\n {\n return this.isPTPhone(phone);\n },\n\n /**\n * Checks if a phone is valid in Cabo Verde\n *\n * @method isCVPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Cape Verdean Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isCVPhone.html \n */\n isCVPhone: function(phone)\n {\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosCV) {\n if(typeof(this._indicativosCV[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n\n var re238 = /^(00238|\\+238)/;\n if(re238.test(phone)) {\n phone = phone.replace(re238, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{7}/i;\n if(phone.length === 7 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a phone is valid in Angola\n *\n * @method isAOPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Angolan Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isAOPhone.html \n */\n isAOPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosAO) {\n if(typeof(this._indicativosAO[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n\n var re244 = /^(00244|\\+244)/;\n if(re244.test(phone)) {\n phone = phone.replace(re244, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{9}/i;\n if(phone.length === 9 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a phone is valid in Mozambique\n *\n * @method isMZPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Mozambican Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isMZPhone.html \n */\n isMZPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosMZ) {\n if(typeof(this._indicativosMZ[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n var re258 = /^(00258|\\+258)/;\n if(re258.test(phone)) {\n phone = phone.replace(re258, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{8,9}/i;\n if((phone.length === 9 || phone.length === 8) && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n if(phone.indexOf('2') === 0 && phone.length === 8) {\n return true;\n } else if(phone.indexOf('8') === 0 && phone.length === 9) {\n return true;\n }\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a phone is valid in Timor\n *\n * @method isTLPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid phone from Timor-Leste\n * @public\n * @static\n * @sample Ink_Util_Validator_isTLPhone.html \n */\n isTLPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosTL) {\n if(typeof(this._indicativosTL[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n var re670 = /^(00670|\\+670)/;\n if(re670.test(phone)) {\n phone = phone.replace(re670, \"\");\n }\n\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{7}/i;\n if(phone.length === 7 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a number is a phone number.\n * This method validates the number in all country codes available the ones set in the second param\n *\n * @method isPhone\n * @param {String} phone Phone number to validate\n * @param {String|Array} [countryCode] Country code or array of countries to validate\n * @return {Boolean} True if it's a valid phone in any country available\n * @public\n * @static\n * @sample Ink_Util_Validator_isPhone.html\n */\n isPhone: function(){\n var index;\n\n if(arguments.length===0){\n return false;\n }\n\n var phone = arguments[0];\n\n if(arguments.length>1){\n if(arguments[1].constructor === Array){\n var func;\n for(index=0; index= 0 && match[i-1] <= 100){\n valid = true;\n } else {\n return false;\n }\n }\n // check 0 to 255 values\n if(i===1 || i===3 || i===5 && (typeof match[i+1] === \"undefined\" || match[i+1] === \"\")){\n if(typeof match[i] !== \"undefined\" && match[i] >= 0 && match[i] <= 255){\n valid = true;\n } else {\n return false;\n }\n }\n }\n }\n\n // hsl range check\n if((match = hsl.exec(str)) !== null || (match = hsla.exec(str)) !== null){\n i = match.length;\n while(i--){\n // check percentage values\n if(i===3 || i===5){\n if(typeof match[i-1] !== \"undefined\" && typeof match[i] !== \"undefined\" && match[i] !== \"\" &&\n match[i-1] >= 0 && match[i-1] <= 100){\n valid = true;\n } else {\n return false;\n }\n }\n // check 0 to 360 value\n if(i===1){\n if(typeof match[i] !== \"undefined\" && match[i] >= 0 && match[i] <= 360){\n valid = true;\n } else {\n return false;\n }\n }\n }\n }\n\n return valid;\n },\n\n /**\n * Checks if the value is a valid IP. \n *\n * @method isIP\n * @param {String} value Value to be checked\n * @param {String} ipType Type of IP to be validated. The values are: ipv4, ipv6. By default is ipv4.\n * @return {Boolean} True if the value is a valid IP address. False if not.\n * @sample Ink_Util_Validator_isIP.html \n */\n isIP: function( value, ipType ){\n if( typeof value !== 'string' ){\n return false;\n }\n\n ipType = (ipType || 'ipv4').toLowerCase();\n\n switch( ipType ){\n case 'ipv4':\n return (/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/).test(value);\n case 'ipv6':\n return (/^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/).test(value);\n default:\n return false;\n }\n },\n\n /**\n * Credit Card specifications, to be used in the credit card verification.\n *\n * @property _creditCardSpecs\n * @type {Object}\n * @private\n */\n _creditCardSpecs: {\n 'default': {\n 'length': '13,14,15,16,17,18,19',\n 'prefix': /^.+/,\n 'luhn': true\n },\n\n 'american express': {\n 'length': '15',\n 'prefix': /^3[47]/,\n 'luhn' : true\n },\n\n 'diners club': {\n 'length': '14,16',\n 'prefix': /^36|55|30[0-5]/,\n 'luhn' : true\n },\n\n 'discover': {\n 'length': '16',\n 'prefix': /^6(?:5|011)/,\n 'luhn' : true\n },\n\n 'jcb': {\n 'length': '15,16',\n 'prefix': /^3|1800|2131/,\n 'luhn' : true\n },\n\n 'maestro': {\n 'length': '16,18',\n 'prefix': /^50(?:20|38)|6(?:304|759)/,\n 'luhn' : true\n },\n\n 'mastercard': {\n 'length': '16',\n 'prefix': /^5[1-5]/,\n 'luhn' : true\n },\n\n 'visa': {\n 'length': '13,16',\n 'prefix': /^4/,\n 'luhn' : true\n }\n },\n\n /**\n * Luhn function, to be used when validating credit card numbers\n * @method _luhn\n * @private\n * @param {Number} num Given credit card number\n * @returns {Boolean} Whether the credit card number is valid.\n */\n _luhn: function (num){\n\n num = parseInt(num,10);\n\n if ( (typeof num !== 'number') && (num % 1 !== 0) ){\n // Luhn can only be used on nums!\n return false;\n }\n\n num = num+'';\n // Check num length\n var length = num.length;\n\n // Checksum of the card num\n var i;\n var checksum = 0;\n\n for (i = length - 1; i >= 0; i -= 2)\n {\n // Add up every 2nd digit, starting from the right\n checksum += parseInt(num.substr(i, 1),10);\n }\n\n for (i = length - 2; i >= 0; i -= 2)\n {\n // Add up every 2nd digit doubled, starting from the right\n var dbl = parseInt(num.substr(i, 1) * 2,10);\n\n // Subtract 9 from the dbl where value is greater than 10\n checksum += (dbl >= 10) ? (dbl - 9) : dbl;\n }\n\n // If the checksum is a multiple of 10, the number is valid\n return (checksum % 10 === 0);\n },\n\n /**\n * Checks if a number is of a specific credit card type\n * @method isCreditCard\n * @param {String} num Number to be validates\n * @param {String|Array} creditCardType Credit card type or list of types. See _creditCardSpecs for the list of supported values.\n * @return {Boolean} Whether the number is of that credit card type (or at least one of `creditCardType` if you pass in an array).\n * @sample Ink_Util_Validator_isCreditCard.html \n */\n isCreditCard: function(num, creditCardType){\n\n if ( /\\d+/.test(num) === false ){\n return false;\n }\n\n if ( typeof creditCardType === 'undefined' ){\n creditCardType = 'default';\n }\n else if ( creditCardType instanceof Array ){\n var i, ccLength = creditCardType.length;\n for ( i=0; i < ccLength; i++ ){\n // Test each type for validity\n if (this.isCreditCard(num, creditCardType[i]) ){\n return true;\n }\n }\n\n return false;\n }\n\n // Check card type\n creditCardType = creditCardType.toLowerCase();\n\n if ( typeof this._creditCardSpecs[creditCardType] === 'undefined' ){\n return false;\n }\n\n // Check card number length\n var length = num.length+'';\n\n // Validate the card length by the card type\n if ( this._creditCardSpecs[creditCardType]['length'].split(\",\").indexOf(length) === -1 ){\n return false;\n }\n\n // Check card number prefix\n if ( !this._creditCardSpecs[creditCardType]['prefix'].test(num) ){\n return false;\n }\n\n // No Luhn check required\n if (this._creditCardSpecs[creditCardType]['luhn'] === false){\n return true;\n }\n\n return this._luhn(num);\n }\n };\n\n return Validator;\n\n});\n"]} \ No newline at end of file diff --git a/dist/js/ink-ui.js b/dist/js/ink-ui.js index 864ed8d95..3a9661f7d 100644 --- a/dist/js/ink-ui.js +++ b/dist/js/ink-ui.js @@ -2174,7 +2174,7 @@ Ink.createModule('Ink.UI.DatePicker', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1', var parentIsControl = Selector.matchesSelector( this._element.parentNode, - '.ink-form .control-group .control'); + '.ink-form .control-group .control, .ink-form .control-group .control > *'); if (parentIsControl) { this._wrapper = this._element.parentNode; diff --git a/dist/js/ink-ui.min.js b/dist/js/ink-ui.min.js index 7156b823b..491121f45 100644 --- a/dist/js/ink-ui.min.js +++ b/dist/js/ink-ui.min.js @@ -1,4 +1,4 @@ -Ink.createModule("Ink.UI.Animate",1,["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1"],function(a,b,c){"use strict";function d(){a.BaseUIComponent.apply(this,arguments)}var e=function(a){return"animationName"in a.style?"animation":"webkitAnimationName"in a.style?"webkitAnimation":null}(document.createElement("div")),f={animation:"animationend",webkitAnimation:"webkitAnimationEnd"}[e];return d._name="Animate_1",d._optionDefinition={trigger:["Element",null],duration:["String","slow"],animation:["String"],removeClass:["Boolean",!0],onEnd:["Function",function(){}]},d.prototype._init=function(){isNaN(parseInt(this._options.duration,10))||(this._options.duration=parseInt(this._options.duration,10)),this._options.trigger?b.observe(this._options.trigger,"click",Ink.bind(function(){this.animate()},this)):this.animate()},d.prototype.animate=function(){d.animate(this._element,this._options.animation,this._options)},Ink.extendObj(d,{_animationPrefix:e,animationSupported:!!e,animationEndEventName:f,animate:function(b,g,h){function i(a){a.target===b&&a.animationName===g&&(h.onEnd&&h.onEnd(a),h.removeClass&&c.removeClassName(b,g),"string"==typeof h.duration&&c.removeClassName(b,h.duration),b.removeEventListener(f,i,!1))}return b=a.elOrSelector(b),"number"==typeof h||"string"==typeof h?h={duration:h}:h||(h={}),"function"==typeof arguments[3]&&(h.onEnd=arguments[3]),"number"!=typeof h.duration&&"string"!=typeof h.duration&&(h.duration=400),d.animationSupported?("number"==typeof h.duration?b.style[e+"Duration"]=h.duration+"ms":"string"==typeof h.duration&&c.addClassName(b,h.duration),c.addClassName(b,["animated",g]),void b.addEventListener(f,i,!1)):void(h.onEnd&&setTimeout(function(){h.onEnd(null)},0))}}),a.createUIComponent(d),d}),Ink.createModule("Ink.UI.Carousel","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.UI.Pagination_1","Ink.Dom.Browser_1","Ink.Dom.Selector_1"],function(a,b,c,d,e,f){"use strict";function g(a,b,c){return Math.min(c,Math.max(b,a))}function h(){a.BaseUIComponent.apply(this,arguments)}function i(a,b){a.style.transitionProperty=a.style.oTransitionProperty=a.style.msTransitionProperty=a.style.mozTransitionProperty=a.style.webkitTransitionProperty=b}var j=window.requestAnimationFrame||function(a){return setTimeout(a,1e3/30)};return h._name="Carousel_1",h._optionDefinition={autoAdvance:["Integer",0],axis:["String","x"],initialPage:["Integer",0],spaceAfterLastSlide:["Boolean",!0],keyboardSupport:["Boolean",!1],pagination:["String",null],onChange:["Function",null],onInit:["Function",function(){}],swipe:["Boolean",!0]},h.prototype={_init:function(){this._handlers={paginationChange:Ink.bindMethod(this,"_onPaginationChange"),windowResize:b.throttle(Ink.bindMethod(this,"refit"),200)},b.observe(window,"resize",this._handlers.windowResize),this._isY="y"===this._options.axis;var a=Ink.s("ul.stage",this._element);a.style.width="100%",this._ulEl=a,d.removeTextNodeChildren(a),null==this._options.pagination&&(this._currentPage=this._options.initialPage),this.refit(),this._isY&&(this._ulEl.style.whiteSpace="normal"),this._options.swipe&&(b.observe(this._element,"touchstart",Ink.bindMethod(this,"_onTouchStart")),b.observe(this._element,"touchmove",Ink.bindMethod(this,"_onTouchMove")),b.observe(this._element,"touchend",Ink.bindMethod(this,"_onTouchEnd"))),this._setUpPagination(),this._setUpAutoAdvance(),this._options.onInit.call(this,this)},refit:function(){var a=this._isY,b=function(b,c){return b?c?d.outerDimensions(b)[a?0:1]:d.outerDimensions(b)[a?1:0]:0};this._liEls=Ink.ss("li.slide",this._ulEl);var c=this._liEls.length,e=this._ulEl.getBoundingClientRect();this._ctnLength=a?e.bottom-e.top:e.right-e.left,this._elLength=b(this._liEls[0]),this._slidesPerPage=Math.floor(this._ctnLength/this._elLength)||1,isFinite(this._slidesPerPage)||(this._slidesPerPage=1);var f=Math.ceil(c/this._slidesPerPage),h=this._numPages!==f;this._numPages=f,this._deltaLength=this._slidesPerPage*this._elLength,this._IE7(),this._pagination&&h&&this._pagination.setSize(this._numPages),this.setPage(g(this.getPage(),0,this._numPages-1))},_setUpPagination:function(){this._options.pagination?(a.isDOMElement(this._options.pagination)||"string"==typeof this._options.pagination?this._pagination=new e(this._options.pagination,{size:this._numPages,onChange:this._handlers.paginationChange}):(this._pagination=this._options.pagination,this._pagination.setOnChange(this._handlers.paginationChange),this._pagination.setSize(this._numPages)),this._pagination.setCurrent(this._options.initialPage||0)):this._currentPage=this._options.initialPage||0},_setUpAutoAdvance:function(){if(this._options.autoAdvance){var a=this;setTimeout(function b(){a.nextPage(!0),setTimeout(b,a._options.autoAdvance)},this._options.autoAdvance)}},_IE7:function(){if(f.IE&&""+f.version.split(".")[0]=="7")for(var a=Ink.ss("li.slide",this._ulEl),b=function(b,d){a[c].style[b]=d},c=0,d=a.length;d>c;c++)b("position","absolute"),b(this._isY?"top":"left",c*this._elLength+"px")},_onTouchStart:function(a){if(!(a.touches.length>1)){this._swipeData={x:b.pointerX(a),y:b.pointerY(a)};var c=this._ulEl.getBoundingClientRect();this._swipeData.firstUlPos=c[this._isY?"top":"left"],this._swipeData.inUlX=this._swipeData.x-c.left,this._swipeData.inUlY=this._swipeData.y-c.top,i(this._ulEl,"none"),this._touchMoveIsFirstTouchMove=!0}},_onTouchMove:function(a){if(!(a.touches.length>1)){var c=b.pointerX(a),d=b.pointerY(a),e=this._swipeData.y-d,f=this._swipeData.x-c;if(this._touchMoveIsFirstTouchMove){var g=Math.abs(e),h=Math.abs(f);this._touchMoveIsFirstTouchMove=void 0,this._scrolling=this._isY?h>g:g>h,this._scrolling||this._onAnimationFrame()}!this._scrolling&&this._swipeData&&(b.stopDefault(a),this._swipeData.pointerDelta=this._isY?e:f,this._swipeData.pointerPos=this._isY?d:c)}},_onAnimationFrame:function(){var a=this._swipeData;if(a&&!this._scrolling&&!this._touchMoveIsFirstTouchMove){var b=this._element.getBoundingClientRect(),c;c=this._isY?a.pointerPos-a.inUlY-b.top:a.pointerPos-a.inUlX-b.left,this._ulEl.style[this._isY?"top":"left"]=c+"px",j(Ink.bindMethod(this,"_onAnimationFrame"))}},_onTouchEnd:function(a){if(this._swipeData&&this._swipeData.pointerPos&&!this._scrolling&&!this._touchMoveIsFirstTouchMove){var c=.1,d=this._swipeData.pointerDelta,e=this.getPage(),f=d/this._elLength/this._slidesPerPage;Math.abs(f)>c&&(e+=Math[0>d?"floor":"ceil"](f)),e=g(e,0,this._numPages-1),isNaN(e)||this.setPage(e),b.stopDefault(a)}i(this._ulEl,null),this._swipeData=null,this._touchMoveIsFirstTouchMove=void 0,this._scrolling=void 0},_onPaginationChange:function(a){this._setPage(a.getCurrent())},getPage:function(){return this._pagination?this._pagination.getCurrent():this._currentPage||0},getPagination:function(){return this._pagination||null},setPage:function(a,b){return b&&(a%=this._numPages,0>a&&(a=this._numPages-a)),a=g(a,0,this._numPages-1),a===this._currentPage?void(this._swipeData&&this._setPage(a)):void(this._pagination?this._pagination.setCurrent(a):this._setPage(a))},_setPage:function(a){var b=a*this._deltaLength,c=a===this._numPages-1;if(!this._options.spaceAfterLastSlide&&c&&a>0){var d=this._liEls.length-a*this._slidesPerPage;d2)&&r('the "defaults" argument must be an object mapping option names to [typestring, optional] arrays.'),k=a in h?o._coerce_from_string(m,h[a],a,b):i,k!==i?o._options_validate(k,m)?k:(s("("+a+" option) Invalid "+m+" "+q(k)),n):a in d?d[a]:n!==i?n:void r("Option "+a+" is required!")}"string"!=typeof b&&(e=d,d=c,c=b,b=""),d=d||{};var g={},h=e?a.data(e):{},k,l,m,n,p=function(a){return b&&(a=b+': "'+(""+a).replace(/"/,'\\"')+'"'),a},q=function(a){return'"'+(""+a).replace(/"/,'\\"')+'"'},r=function(a){throw new Error(p(a))},s=function(a){Ink.error(p(a)+". Ignoring option.")};for(var t in c)c.hasOwnProperty(t)&&(g[t]=f(t));return g},_coerce_from_string:function(a,b,c,d){return a in o._coerce_funcs?o._coerce_funcs[a](b,c,d):b},_options_validate:function(a,b){return b in o._options_validate_types?o._options_validate_types[b].call(o,a):!1},_coerce_funcs:function(){var a={element:function(a){return o.elOrSelector(a,"")},elements:function(a){return o.elsOrSelector(a,"",!1)},object:function(a){return a},number:function(a){return parseFloat(a)},"boolean":function(a){return!("false"===a||""===a||null===a)},string:function(a){return a},"function":function(a,b,c){return Ink.error(c+': You cannot specify the option "'+b+"\" through data-attributes because it's a function"),i}};return a["float"]=a.integer=a.number,a}(),_options_validate_types:function(){var a={string:function(a){return"string"==typeof a},number:function(a){return"number"==typeof a&&!isNaN(a)&&isFinite(a)},integer:function(a){return a===Math.round(a)},element:function(a){return o.isDOMElement(a)},elements:function(a){return a&&"object"==typeof a&&"number"==typeof a.length&&a.length},"boolean":function(a){return"boolean"==typeof a},object:function(){return!0}};return a["float"]=a.number,a}(),clone:function(a){try{return JSON.parse(JSON.stringify(a))}catch(b){throw new Error("Given object cannot have loops!")}},childIndex:a.parentIndexOf,ajaxJSON:function(a,c,d){new b(a,{evalJS:"force",method:"POST",parameters:c,onSuccess:function(a){try{if(a=a.responseJSON,"ok"!==a.status)throw"server error: "+a.message;d(null,a)}catch(b){d(b)}},onFailure:function(){d("communication failure")}})},currentLayout:function(){var a,b,e,f,g,h=d.select("#ink-layout-detector")[0];if(!h){h=document.createElement("div"),h.id="ink-layout-detector";for(e in o.Layouts)o.Layouts.hasOwnProperty(e)&&(f=o.Layouts[e],g=document.createElement("div"),g.className="show-"+f+" hide-all",g.setAttribute("data-ink-layout",f),h.appendChild(g));document.body.appendChild(h)}for(a=0,b=h.children.length;b>a;++a)if(g=h.children[a],"block"===c.getStyle(g,"display"))return g.getAttribute("data-ink-layout");return"large"},hashSet:function(a){if("object"!=typeof a)throw new TypeError("o should be an object!");var b=e.getAnchorString();b=Ink.extendObj(b,a),window.location.hash=e.genQueryString("",b).substring(1)},cleanChildren:function(b){if(!o.isDOMElement(b))throw new Error("Please provide a valid DOMElement");a.setHTML(b,"")},storeIdAndClasses:function(a,b){if(!o.isDOMElement(a))throw"Please provide a valid Element as first parameter";var c=a.id;c&&(b._id=c);var d=a.className;d&&(b._classes=d)},restoreIdAndClasses:function(a,b){if(!o.isDOMElement(a))throw"Please provide a valid Element as first parameter";b._id&&a.id!==b._id&&(a.id=b._id),b._classes&&-1===a.className.indexOf(b._classes)&&(a.className?a.className+=" "+b._classes:a.className=b._classes),b._instanceId&&!a.getAttribute("data-instance")&&a.setAttribute("data-instance",b._instanceId)},_warnDoubleInstantiation:function(a,b){function c(a){return(a.constructor&&a.constructor._name||a._name||"").replace(/_.*?$/,"")}var d=o.getInstance(a);if(""!==c(b)&&d){var e=c(b);if(e){for(var f=0,g=d.length;g>f;f++)if(e===c(d[f]))return Ink.warn("Creating more than one "+e+"for the same element.","(Was creating a "+e+" on:",a,")."),!1;return!0}}},registerInstance:function(a,b){if(a){if(b||(b=a._element),!o.isDOMElement(b))throw new TypeError("Ink.UI.Common.registerInstance: The element passed in is not a DOM element!");if(o._warnDoubleInstantiation(b,a)===!1)return!1;var c=n.get(b);return c||(c=[],n.set(b,c)),c.push(a),!0}},unregisterInstance:function(a){if(a&&a._element)for(var b=n.get(a._element),c=0,d=b.length;d>c;c++)b[c]===a&&b.splice(c,1)},getInstance:function(a,b){var c=a;if(a=o.elOrSelector(a),!o.isDOMElement(a))return Ink.warn("Ink.UI.Common: getInstance called on non-element ("+c+")"),[];var d=n.get(a);if(d||(d=[]),"function"!=typeof b)return d;for(var e=0,f=d.length;f>e;e++)if(d[e]instanceof b)return d[e];return null},getInstanceFromSelector:function(a){return o.getInstance(a)},getInstanceIds:function(){if(m.length>0)return m;var a=[];for(var b in l)l.hasOwnProperty(b)&&a.push(b);return a},getInstances:function(){if(m.length>0)return m;var a=[];for(var b in l)l.hasOwnProperty(b)&&a.push(l[b]);return a},destroyComponent:function(){o.unregisterInstance(this),this._element.parentNode.removeChild(this._element)}};return h._validateInstance=function(a){var b;if("function"!=typeof a._validate)return!0;try{b=a._validate()}catch(c){b=c}return b instanceof Error?(a._validationError=b,!1):!0},h._stubInstance=function(a,b,c){g(b.prototype,a),g(h.prototype,a),Ink.warn(c+" was not correctly created. "+(a._validationError||""))},h.getInstance=function(a){return a=o.elOrSelector(a),o.getInstance(a,this)},Ink.extendObj(h.prototype,{getOption:function(a){return!this.constructor||a in this.constructor._optionDefinition?this._options[a]:void Ink.error('"'+a+'" is not an option for '+this.constructor._name)},setOption:function(a,b){return!this.constructor||a in this.constructor._optionDefinition?void(this._options[a]=b):void Ink.error('"'+a+" is not an option for "+this.constructor._name)},getElement:function(){return this._element}}),o.BaseUIComponent=h,o.createUIComponent=function r(a,b){function c(a,b){if(!a)throw new Error("Ink.UI_1.createUIComponent: "+b)}function d(b,d,e){var f=a[b];c("undefined"!=typeof f,a+" doesn't have a \""+b+'" property. '+e),c(d&&typeof f===d,"typeof "+a+"."+b+' is not "'+d+'". '+e)}a._componentOptions=b||{},c("function"==typeof a,"constructor argument is not a function!"),d("_name","string","This property is used for error messages. Set it to the full module path and version (Ink.My.Module_1)."),d("_optionDefinition","object","This property contains the option names, types and defaults. See Ink.UI.Common.options() for reference.");var e=a.prototype;a.prototype="function"==typeof Object.create?Object.create(h.prototype):function f(){function a(){}return a.prototype=h.prototype,new a}(),Ink.extendObj(a.prototype,e),a.prototype.constructor=a,Ink.extendObj(a,h)},o}),Ink.createModule("Ink.UI.DatePicker","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1","Ink.Util.Date_1","Ink.Dom.Browser_1"],function(a,b,c,d,e,f,g){"use strict";function h(a,b,c){return a>c&&(a=c),b>a&&(a=b),a}function i(a){var b=a.split("-");return j(+b[0],+b[1]-1,+b[2])}function j(a,b,c){return{_year:a,_month:b,_day:c}}function k(a){return{_year:a.getFullYear(),_month:a.getMonth(),_day:a.getDate()}}function l(){a.BaseUIComponent.apply(this,arguments)}return l._name="DatePicker_1",l._optionDefinition={autoOpen:["Boolean",!1],cleanText:["String","Clear"],closeText:["String","Close"],pickerField:["Element",null],containerElement:["Element",null],cssClass:["String","ink-calendar bottom"],dateRange:["String",null],displayInSelect:["Boolean",!1],dayField:["Element",null],monthField:["Element",null],yearField:["Element",null],format:["String","yyyy-mm-dd"],nextLinkText:["String","»"],ofText:["String"," of "],onFocus:["Boolean",!0],onMonthSelected:["Function",null],onSetDate:["Function",null],onYearSelected:["Function",null],position:["String","right"],prevLinkText:["String","«"],showClean:["Boolean",!0],showClose:["Boolean",!0],shy:["Boolean",!0],startDate:["String",null],startWeekDay:["Number",1],validDayFn:["Function",null],validMonthFn:["Function",null],validYearFn:["Function",null],nextValidDateFn:["Function",null],prevValidDateFn:["Function",null],yearRange:["String",null],month:["Object",{1:"January",2:"February",3:"March",4:"April",5:"May",6:"June",7:"July",8:"August",9:"September",10:"October",11:"November",12:"December"}],wDay:["Object",{0:"Sunday",1:"Monday",2:"Tuesday",3:"Wednesday",4:"Thursday",5:"Friday",6:"Saturday"}]},l.prototype={_init:function(){this._options.format=this._dateParsers[this._options.format]||this._options.format,this._hoverPicker=!1,this._picker=this._options.pickerField||null,this._setMinMax(this._options.dateRange||this._options.yearRange),this.setDate(this._options.startDate?this._options.startDate:this._element&&this._element.value?this._element.value:new Date),(this._options.startWeekDay<0||this._options.startWeekDay>6)&&(Ink.warn('Ink.UI.DatePicker_1: option "startWeekDay" must be between 0 (sunday) and 6 (saturday)'),this._options.startWeekDay=h(this._options.startWeekDay,0,6)),Ink.extendObj(this._options,this._lang||{}),this._render(),this._listenToContainerObjectEvents()},_validate:function(){if(this._options.displayInSelect&&!(this._options.dayField&&this._options.monthField&&this._options.yearField))throw new Error("Ink.UI.DatePicker: displayInSelect option enabled.Please specify dayField, monthField and yearField selectors.")},_render:function(){this._containerObject=document.createElement("div"),this._containerObject.className=this._options.cssClass+" ink-datepicker-calendar hide-all",this._renderSuperTopBar();var b=document.createElement("div");b.className="ink-calendar-top",this._monthDescContainer=document.createElement("div"),this._monthDescContainer.className="ink-calendar-month_desc",this._monthPrev=document.createElement("div"),this._monthPrev.className="ink-calendar-prev",this._monthPrev.appendChild(d.create("a",{href:"#prev",className:"change_month_prev",setHTML:this._options.prevLinkText})),this._monthNext=document.createElement("div"),this._monthNext.className="ink-calendar-next",this._monthNext.appendChild(d.create("a",{href:"#next",className:"change_month_next",setHTML:this._options.nextLinkText})),b.appendChild(this._monthPrev),b.appendChild(this._monthDescContainer),b.appendChild(this._monthNext),this._monthContainer=document.createElement("div"),this._monthContainer.className="ink-calendar-month",this._containerObject.appendChild(b),this._containerObject.appendChild(this._monthContainer),this._monthSelector=this._renderMonthSelector(),this._containerObject.appendChild(this._monthSelector),this._yearSelector=document.createElement("ul"),this._yearSelector.className="ink-calendar-year-selector",this._containerObject.appendChild(this._yearSelector),(!this._options.onFocus||this._options.displayInSelect)&&(this._picker=this._options.pickerField?a.elOrSelector(this._options.pickerField,"pickerField"):d.create("a",{href:"#open_cal",setHTML:"open",insertBottom:this._element.parentNode,className:"ink-datepicker-picker-field"})),this._appendDatePickerToDom(),this._renderMonth(),this._monthChanger=d.create("a",{href:"#monthchanger",className:"ink-calendar-link-month",setTextContent:this._options.month[this._month+1]}),this._ofText=d.create("span",{className:"ink-calendar-of-text",setHTML:this._options.ofText}),this._yearChanger=d.create("a",{href:"#yearchanger",className:"ink-calendar-link-year",setTextContent:this._year}),this._monthDescContainer.appendChild(this._monthChanger),this._monthDescContainer.appendChild(this._ofText),this._monthDescContainer.appendChild(this._yearChanger),this._options.inline?this.show():this._addOpenCloseEvents(),this._addDateChangeHandlersToInputs()},_addDateChangeHandlersToInputs:function(){var a=this._element;this._options.displayInSelect&&(a=[this._options.dayField,this._options.monthField,this._options.yearField]),b.observeMulti(a,"change",Ink.bindEvent(function(){this._updateDate(),this._showDefaultView(),this.setDate(),this._inline||this._hoverPicker||this._hide(!0)},this))},show:function(){this._updateDate(),this._renderMonth(),c.removeClassName(this._containerObject,"hide-all")},_addOpenCloseEvents:function(){var a=this._picker||this._element;b.observe(a,"click",Ink.bindEvent(function(a){b.stop(a),this.show()},this)),this._options.autoOpen&&this.show(),this._options.displayInSelect||b.observe(a,"blur",Ink.bindEvent(function(){this._hoverPicker||this._hide(!0)},this)),this._options.shy&&b.observe(document,"click",Ink.bindEvent(function(a){for(var c=b.element(a),e=[this._options.dayField,this._options.monthField,this._options.yearField,this._picker,this._element],f=0,g=e.length;g>f;f++)if(e[f]&&d.descendantOf(e[f],c))return;this._hide(!0)},this))},_renderMonthSelector:function(){var a=document.createElement("ul");a.className="ink-calendar-month-selector";for(var b=document.createElement("ul"),c=1;12>=c;c++)b.appendChild(this._renderMonthButton(c)),c%4===0&&(a.appendChild(b),b=document.createElement("ul"));return a},_renderMonthButton:function(a){var b=document.createElement("li");return b.appendChild(d.create("a",{"data-cal-month":a,setTextContent:this._options.month[a].substring(0,3)})),b},_appendDatePickerToDom:function(){if(this._options.containerElement){var b=a.elOrSelector(this._options.containerElement);b.appendChild(this._containerObject)}var c=e.matchesSelector(this._element.parentNode,".ink-form .control-group .control");c?(this._wrapper=this._element.parentNode,this._wrapperIsControl=!0):(this._wrapper=d.create("div",{className:"ink-datepicker-wrapper"}),d.wrap(this._element,this._wrapper)),d.insertAfter(this._containerObject,this._element)},_renderSuperTopBar:function(){this._options.showClose&&this._options.showClean&&(this._superTopBar=document.createElement("div"),this._superTopBar.className="ink-calendar-top-options",this._options.showClean&&this._superTopBar.appendChild(d.create("a",{className:"clean",setHTML:this._options.cleanText})),this._options.showClose&&this._superTopBar.appendChild(d.create("a",{className:"close",setHTML:this._options.closeText})),this._containerObject.appendChild(this._superTopBar))},_listenToContainerObjectEvents:function(){b.observe(this._containerObject,"mouseover",Ink.bindEvent(function(a){b.stop(a),this._hoverPicker=!0},this)),b.observe(this._containerObject,"mouseout",Ink.bindEvent(function(a){b.stop(a),this._hoverPicker=!1},this)),b.observe(this._containerObject,"click",Ink.bindEvent(this._onClick,this))},_onClick:function(a){var d=b.element(a);return c.hasClassName(d,"ink-calendar-off")?(b.stopDefault(a),null):(b.stop(a),this._onRelativeChangerClick(d),this._onAbsoluteChangerClick(d),c.hasClassName(d,"ink-calendar-link-month")?this._showMonthSelector():c.hasClassName(d,"ink-calendar-link-year")?this._showYearSelector():c.hasClassName(d,"clean")?this._clean():c.hasClassName(d,"close")&&this._hide(!1),void this._updateDescription())},_onRelativeChangerClick:function(a){var b={change_year_next:1,change_year_prev:-1},c={change_month_next:1,change_month_prev:-1};a.className in c?this._updateCal(c[a.className]):a.className in b&&this._showYearSelector(b[a.className])},_onAbsoluteChangerClick:function(a){var b=d.data(a);Number(b.calDay)?(this.setDate(new Date(this._year,this._month,b.calDay)),this._hide()):Number(b.calMonth)?(this._month=Number(b.calMonth)-1,this._showDefaultView(),this._updateCal()):Number(b.calYear)&&this._changeYear(Number(b.calYear))},_changeYear:function(a){a=+a,isNaN(a)||(this._year=a,"function"==typeof this._options.onYearSelected&&this._options.onYearSelected(this,{year:this._year}),this._showMonthSelector())},_clean:function(){this._options.displayInSelect?(this._options.yearField.selectedIndex=0,this._options.monthField.selectedIndex=0,this._options.dayField.selectedIndex=0):this._element.value=""},_hide:function(a){a=void 0===a?!0:a,(a===!1||a&&this._options.shy)&&c.addClassName(this._containerObject,"hide-all")},_setMinMax:function(a){function b(){c._min=d,c._max=e}var c=this,d={_year:-Number.MAX_VALUE,_month:0,_day:1},e={_year:Number.MAX_VALUE,_month:11,_day:31};if(!a)return b();var g=a.split(":"),j=/^(\d{4})((\-)(\d{1,2})((\-)(\d{1,2}))?)?$/;f.each([{name:"_min",date:g[0],noLim:d},{name:"_max",date:g[1],noLim:e}],Ink.bind(function(a){var b=a.noLim;if("NOW"===a.date.toUpperCase()){var c=new Date;b=k(c)}else"EVER"===a.date.toUpperCase()?b=a.noLim:j.test(a.date)&&(b=i(a.date),b._month=h(b._month,0,11),b._day=h(b._day,1,this._daysInMonth(b._year,b._month+1)));this[a.name]=b},this));var l=-1!==this._dateCmp(this._max,this._min);l||b()},_fitDateToRange:function(a){return this._isValidDate(a)||(a=k(new Date)),-1===this._dateCmp(a,this._min)?Ink.extendObj({},this._min):1===this._dateCmp(a,this._max)?Ink.extendObj({},this._max):Ink.extendObj({},a)},_dateWithinRange:function(a){return arguments.length||(a=this),!this._dateAboveMax(a)&&!this._dateBelowMin(a)},_dateAboveMax:function(a){return 1===this._dateCmp(a,this._max)},_dateBelowMin:function(a){return-1===this._dateCmp(a,this._min)},_dateCmp:function(a,b){return this._dateCmpUntil(a,b,"_day")},_dateCmpUntil:function(a,b,c){var d=["_year","_month","_day"],e=-1;do{if(e++,a[d[e]]>b[d[e]])return 1;if(a[d[e]]this._min._year){var f=d.create("li");f.appendChild(d.create("a",{href:"#year_prev",className:"change_year_prev",setHTML:this._options.prevLinkText})),e.appendChild(f)}else e.appendChild(d.create("li",{setHTML:" "}));for(var g=1;11>g;g++)g%4===0&&(e=d.create("ul"),this._yearSelector.appendChild(e)),c=b+g-1,e.appendChild(this._getYearButton(c));if(cthis._max._year||b+9=1&&+a._month+1<=12&&+a._day>=1&&+a._day<=this._daysInMonth(a._year,a._month+1)},_isDate:function(a,b){try{if("undefined"==typeof a)return!1;var c=g.set(a,b);if(c&&this._isValidDate(k(c)))return!0}catch(d){}return!1},_acceptableDay:function(a){return this._acceptableDateComponent(a,"validDayFn")},_acceptableMonth:function(a){return this._acceptableDateComponent(a,"validMonthFn")},_acceptableYear:function(a){return this._acceptableDateComponent(a,"validYearFn")},_acceptableDateComponent:function(a,b){return this._options[b]?this._callUserCallbackBool(this._options[b],a):this._dateWithinRange(a)},_writeDateInFormat:function(){return g.get(this._options.format,this.getDate()) +Ink.createModule("Ink.UI.Animate",1,["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1"],function(a,b,c){"use strict";function d(){a.BaseUIComponent.apply(this,arguments)}var e=function(a){return"animationName"in a.style?"animation":"webkitAnimationName"in a.style?"webkitAnimation":null}(document.createElement("div")),f={animation:"animationend",webkitAnimation:"webkitAnimationEnd"}[e];return d._name="Animate_1",d._optionDefinition={trigger:["Element",null],duration:["String","slow"],animation:["String"],removeClass:["Boolean",!0],onEnd:["Function",function(){}]},d.prototype._init=function(){isNaN(parseInt(this._options.duration,10))||(this._options.duration=parseInt(this._options.duration,10)),this._options.trigger?b.observe(this._options.trigger,"click",Ink.bind(function(){this.animate()},this)):this.animate()},d.prototype.animate=function(){d.animate(this._element,this._options.animation,this._options)},Ink.extendObj(d,{_animationPrefix:e,animationSupported:!!e,animationEndEventName:f,animate:function(b,g,h){function i(a){a.target===b&&a.animationName===g&&(h.onEnd&&h.onEnd(a),h.removeClass&&c.removeClassName(b,g),"string"==typeof h.duration&&c.removeClassName(b,h.duration),b.removeEventListener(f,i,!1))}return b=a.elOrSelector(b),"number"==typeof h||"string"==typeof h?h={duration:h}:h||(h={}),"function"==typeof arguments[3]&&(h.onEnd=arguments[3]),"number"!=typeof h.duration&&"string"!=typeof h.duration&&(h.duration=400),d.animationSupported?("number"==typeof h.duration?b.style[e+"Duration"]=h.duration+"ms":"string"==typeof h.duration&&c.addClassName(b,h.duration),c.addClassName(b,["animated",g]),void b.addEventListener(f,i,!1)):void(h.onEnd&&setTimeout(function(){h.onEnd(null)},0))}}),a.createUIComponent(d),d}),Ink.createModule("Ink.UI.Carousel","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.UI.Pagination_1","Ink.Dom.Browser_1","Ink.Dom.Selector_1"],function(a,b,c,d,e,f){"use strict";function g(a,b,c){return Math.min(c,Math.max(b,a))}function h(){a.BaseUIComponent.apply(this,arguments)}function i(a,b){a.style.transitionProperty=a.style.oTransitionProperty=a.style.msTransitionProperty=a.style.mozTransitionProperty=a.style.webkitTransitionProperty=b}var j=window.requestAnimationFrame||function(a){return setTimeout(a,1e3/30)};return h._name="Carousel_1",h._optionDefinition={autoAdvance:["Integer",0],axis:["String","x"],initialPage:["Integer",0],spaceAfterLastSlide:["Boolean",!0],keyboardSupport:["Boolean",!1],pagination:["String",null],onChange:["Function",null],onInit:["Function",function(){}],swipe:["Boolean",!0]},h.prototype={_init:function(){this._handlers={paginationChange:Ink.bindMethod(this,"_onPaginationChange"),windowResize:b.throttle(Ink.bindMethod(this,"refit"),200)},b.observe(window,"resize",this._handlers.windowResize),this._isY="y"===this._options.axis;var a=Ink.s("ul.stage",this._element);a.style.width="100%",this._ulEl=a,d.removeTextNodeChildren(a),null==this._options.pagination&&(this._currentPage=this._options.initialPage),this.refit(),this._isY&&(this._ulEl.style.whiteSpace="normal"),this._options.swipe&&(b.observe(this._element,"touchstart",Ink.bindMethod(this,"_onTouchStart")),b.observe(this._element,"touchmove",Ink.bindMethod(this,"_onTouchMove")),b.observe(this._element,"touchend",Ink.bindMethod(this,"_onTouchEnd"))),this._setUpPagination(),this._setUpAutoAdvance(),this._options.onInit.call(this,this)},refit:function(){var a=this._isY,b=function(b,c){return b?c?d.outerDimensions(b)[a?0:1]:d.outerDimensions(b)[a?1:0]:0};this._liEls=Ink.ss("li.slide",this._ulEl);var c=this._liEls.length,e=this._ulEl.getBoundingClientRect();this._ctnLength=a?e.bottom-e.top:e.right-e.left,this._elLength=b(this._liEls[0]),this._slidesPerPage=Math.floor(this._ctnLength/this._elLength)||1,isFinite(this._slidesPerPage)||(this._slidesPerPage=1);var f=Math.ceil(c/this._slidesPerPage),h=this._numPages!==f;this._numPages=f,this._deltaLength=this._slidesPerPage*this._elLength,this._IE7(),this._pagination&&h&&this._pagination.setSize(this._numPages),this.setPage(g(this.getPage(),0,this._numPages-1))},_setUpPagination:function(){this._options.pagination?(a.isDOMElement(this._options.pagination)||"string"==typeof this._options.pagination?this._pagination=new e(this._options.pagination,{size:this._numPages,onChange:this._handlers.paginationChange}):(this._pagination=this._options.pagination,this._pagination.setOnChange(this._handlers.paginationChange),this._pagination.setSize(this._numPages)),this._pagination.setCurrent(this._options.initialPage||0)):this._currentPage=this._options.initialPage||0},_setUpAutoAdvance:function(){if(this._options.autoAdvance){var a=this;setTimeout(function b(){a.nextPage(!0),setTimeout(b,a._options.autoAdvance)},this._options.autoAdvance)}},_IE7:function(){if(f.IE&&""+f.version.split(".")[0]=="7")for(var a=Ink.ss("li.slide",this._ulEl),b=function(b,d){a[c].style[b]=d},c=0,d=a.length;d>c;c++)b("position","absolute"),b(this._isY?"top":"left",c*this._elLength+"px")},_onTouchStart:function(a){if(!(a.touches.length>1)){this._swipeData={x:b.pointerX(a),y:b.pointerY(a)};var c=this._ulEl.getBoundingClientRect();this._swipeData.firstUlPos=c[this._isY?"top":"left"],this._swipeData.inUlX=this._swipeData.x-c.left,this._swipeData.inUlY=this._swipeData.y-c.top,i(this._ulEl,"none"),this._touchMoveIsFirstTouchMove=!0}},_onTouchMove:function(a){if(!(a.touches.length>1)){var c=b.pointerX(a),d=b.pointerY(a),e=this._swipeData.y-d,f=this._swipeData.x-c;if(this._touchMoveIsFirstTouchMove){var g=Math.abs(e),h=Math.abs(f);this._touchMoveIsFirstTouchMove=void 0,this._scrolling=this._isY?h>g:g>h,this._scrolling||this._onAnimationFrame()}!this._scrolling&&this._swipeData&&(b.stopDefault(a),this._swipeData.pointerDelta=this._isY?e:f,this._swipeData.pointerPos=this._isY?d:c)}},_onAnimationFrame:function(){var a=this._swipeData;if(a&&!this._scrolling&&!this._touchMoveIsFirstTouchMove){var b=this._element.getBoundingClientRect(),c;c=this._isY?a.pointerPos-a.inUlY-b.top:a.pointerPos-a.inUlX-b.left,this._ulEl.style[this._isY?"top":"left"]=c+"px",j(Ink.bindMethod(this,"_onAnimationFrame"))}},_onTouchEnd:function(a){if(this._swipeData&&this._swipeData.pointerPos&&!this._scrolling&&!this._touchMoveIsFirstTouchMove){var c=.1,d=this._swipeData.pointerDelta,e=this.getPage(),f=d/this._elLength/this._slidesPerPage;Math.abs(f)>c&&(e+=Math[0>d?"floor":"ceil"](f)),e=g(e,0,this._numPages-1),isNaN(e)||this.setPage(e),b.stopDefault(a)}i(this._ulEl,null),this._swipeData=null,this._touchMoveIsFirstTouchMove=void 0,this._scrolling=void 0},_onPaginationChange:function(a){this._setPage(a.getCurrent())},getPage:function(){return this._pagination?this._pagination.getCurrent():this._currentPage||0},getPagination:function(){return this._pagination||null},setPage:function(a,b){return b&&(a%=this._numPages,0>a&&(a=this._numPages-a)),a=g(a,0,this._numPages-1),a===this._currentPage?void(this._swipeData&&this._setPage(a)):void(this._pagination?this._pagination.setCurrent(a):this._setPage(a))},_setPage:function(a){var b=a*this._deltaLength,c=a===this._numPages-1;if(!this._options.spaceAfterLastSlide&&c&&a>0){var d=this._liEls.length-a*this._slidesPerPage;d2)&&r('the "defaults" argument must be an object mapping option names to [typestring, optional] arrays.'),k=a in h?o._coerce_from_string(m,h[a],a,b):i,k!==i?o._options_validate(k,m)?k:(s("("+a+" option) Invalid "+m+" "+q(k)),n):a in d?d[a]:n!==i?n:void r("Option "+a+" is required!")}"string"!=typeof b&&(e=d,d=c,c=b,b=""),d=d||{};var g={},h=e?a.data(e):{},k,l,m,n,p=function(a){return b&&(a=b+': "'+(""+a).replace(/"/,'\\"')+'"'),a},q=function(a){return'"'+(""+a).replace(/"/,'\\"')+'"'},r=function(a){throw new Error(p(a))},s=function(a){Ink.error(p(a)+". Ignoring option.")};for(var t in c)c.hasOwnProperty(t)&&(g[t]=f(t));return g},_coerce_from_string:function(a,b,c,d){return a in o._coerce_funcs?o._coerce_funcs[a](b,c,d):b},_options_validate:function(a,b){return b in o._options_validate_types?o._options_validate_types[b].call(o,a):!1},_coerce_funcs:function(){var a={element:function(a){return o.elOrSelector(a,"")},elements:function(a){return o.elsOrSelector(a,"",!1)},object:function(a){return a},number:function(a){return parseFloat(a)},"boolean":function(a){return!("false"===a||""===a||null===a)},string:function(a){return a},"function":function(a,b,c){return Ink.error(c+': You cannot specify the option "'+b+"\" through data-attributes because it's a function"),i}};return a["float"]=a.integer=a.number,a}(),_options_validate_types:function(){var a={string:function(a){return"string"==typeof a},number:function(a){return"number"==typeof a&&!isNaN(a)&&isFinite(a)},integer:function(a){return a===Math.round(a)},element:function(a){return o.isDOMElement(a)},elements:function(a){return a&&"object"==typeof a&&"number"==typeof a.length&&a.length},"boolean":function(a){return"boolean"==typeof a},object:function(){return!0}};return a["float"]=a.number,a}(),clone:function(a){try{return JSON.parse(JSON.stringify(a))}catch(b){throw new Error("Given object cannot have loops!")}},childIndex:a.parentIndexOf,ajaxJSON:function(a,c,d){new b(a,{evalJS:"force",method:"POST",parameters:c,onSuccess:function(a){try{if(a=a.responseJSON,"ok"!==a.status)throw"server error: "+a.message;d(null,a)}catch(b){d(b)}},onFailure:function(){d("communication failure")}})},currentLayout:function(){var a,b,e,f,g,h=d.select("#ink-layout-detector")[0];if(!h){h=document.createElement("div"),h.id="ink-layout-detector";for(e in o.Layouts)o.Layouts.hasOwnProperty(e)&&(f=o.Layouts[e],g=document.createElement("div"),g.className="show-"+f+" hide-all",g.setAttribute("data-ink-layout",f),h.appendChild(g));document.body.appendChild(h)}for(a=0,b=h.children.length;b>a;++a)if(g=h.children[a],"block"===c.getStyle(g,"display"))return g.getAttribute("data-ink-layout");return"large"},hashSet:function(a){if("object"!=typeof a)throw new TypeError("o should be an object!");var b=e.getAnchorString();b=Ink.extendObj(b,a),window.location.hash=e.genQueryString("",b).substring(1)},cleanChildren:function(b){if(!o.isDOMElement(b))throw new Error("Please provide a valid DOMElement");a.setHTML(b,"")},storeIdAndClasses:function(a,b){if(!o.isDOMElement(a))throw"Please provide a valid Element as first parameter";var c=a.id;c&&(b._id=c);var d=a.className;d&&(b._classes=d)},restoreIdAndClasses:function(a,b){if(!o.isDOMElement(a))throw"Please provide a valid Element as first parameter";b._id&&a.id!==b._id&&(a.id=b._id),b._classes&&-1===a.className.indexOf(b._classes)&&(a.className?a.className+=" "+b._classes:a.className=b._classes),b._instanceId&&!a.getAttribute("data-instance")&&a.setAttribute("data-instance",b._instanceId)},_warnDoubleInstantiation:function(a,b){function c(a){return(a.constructor&&a.constructor._name||a._name||"").replace(/_.*?$/,"")}var d=o.getInstance(a);if(""!==c(b)&&d){var e=c(b);if(e){for(var f=0,g=d.length;g>f;f++)if(e===c(d[f]))return Ink.warn("Creating more than one "+e+"for the same element.","(Was creating a "+e+" on:",a,")."),!1;return!0}}},registerInstance:function(a,b){if(a){if(b||(b=a._element),!o.isDOMElement(b))throw new TypeError("Ink.UI.Common.registerInstance: The element passed in is not a DOM element!");if(o._warnDoubleInstantiation(b,a)===!1)return!1;var c=n.get(b);return c||(c=[],n.set(b,c)),c.push(a),!0}},unregisterInstance:function(a){if(a&&a._element)for(var b=n.get(a._element),c=0,d=b.length;d>c;c++)b[c]===a&&b.splice(c,1)},getInstance:function(a,b){var c=a;if(a=o.elOrSelector(a),!o.isDOMElement(a))return Ink.warn("Ink.UI.Common: getInstance called on non-element ("+c+")"),[];var d=n.get(a);if(d||(d=[]),"function"!=typeof b)return d;for(var e=0,f=d.length;f>e;e++)if(d[e]instanceof b)return d[e];return null},getInstanceFromSelector:function(a){return o.getInstance(a)},getInstanceIds:function(){if(m.length>0)return m;var a=[];for(var b in l)l.hasOwnProperty(b)&&a.push(b);return a},getInstances:function(){if(m.length>0)return m;var a=[];for(var b in l)l.hasOwnProperty(b)&&a.push(l[b]);return a},destroyComponent:function(){o.unregisterInstance(this),this._element.parentNode.removeChild(this._element)}};return h._validateInstance=function(a){var b;if("function"!=typeof a._validate)return!0;try{b=a._validate()}catch(c){b=c}return b instanceof Error?(a._validationError=b,!1):!0},h._stubInstance=function(a,b,c){g(b.prototype,a),g(h.prototype,a),Ink.warn(c+" was not correctly created. "+(a._validationError||""))},h.getInstance=function(a){return a=o.elOrSelector(a),o.getInstance(a,this)},Ink.extendObj(h.prototype,{getOption:function(a){return!this.constructor||a in this.constructor._optionDefinition?this._options[a]:void Ink.error('"'+a+'" is not an option for '+this.constructor._name)},setOption:function(a,b){return!this.constructor||a in this.constructor._optionDefinition?void(this._options[a]=b):void Ink.error('"'+a+" is not an option for "+this.constructor._name)},getElement:function(){return this._element}}),o.BaseUIComponent=h,o.createUIComponent=function r(a,b){function c(a,b){if(!a)throw new Error("Ink.UI_1.createUIComponent: "+b)}function d(b,d,e){var f=a[b];c("undefined"!=typeof f,a+" doesn't have a \""+b+'" property. '+e),c(d&&typeof f===d,"typeof "+a+"."+b+' is not "'+d+'". '+e)}a._componentOptions=b||{},c("function"==typeof a,"constructor argument is not a function!"),d("_name","string","This property is used for error messages. Set it to the full module path and version (Ink.My.Module_1)."),d("_optionDefinition","object","This property contains the option names, types and defaults. See Ink.UI.Common.options() for reference.");var e=a.prototype;a.prototype="function"==typeof Object.create?Object.create(h.prototype):function f(){function a(){}return a.prototype=h.prototype,new a}(),Ink.extendObj(a.prototype,e),a.prototype.constructor=a,Ink.extendObj(a,h)},o}),Ink.createModule("Ink.UI.DatePicker","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1","Ink.Util.Date_1","Ink.Dom.Browser_1"],function(a,b,c,d,e,f,g){"use strict";function h(a,b,c){return a>c&&(a=c),b>a&&(a=b),a}function i(a){var b=a.split("-");return j(+b[0],+b[1]-1,+b[2])}function j(a,b,c){return{_year:a,_month:b,_day:c}}function k(a){return{_year:a.getFullYear(),_month:a.getMonth(),_day:a.getDate()}}function l(){a.BaseUIComponent.apply(this,arguments)}return l._name="DatePicker_1",l._optionDefinition={autoOpen:["Boolean",!1],cleanText:["String","Clear"],closeText:["String","Close"],pickerField:["Element",null],containerElement:["Element",null],cssClass:["String","ink-calendar bottom"],dateRange:["String",null],displayInSelect:["Boolean",!1],dayField:["Element",null],monthField:["Element",null],yearField:["Element",null],format:["String","yyyy-mm-dd"],nextLinkText:["String","»"],ofText:["String"," of "],onFocus:["Boolean",!0],onMonthSelected:["Function",null],onSetDate:["Function",null],onYearSelected:["Function",null],position:["String","right"],prevLinkText:["String","«"],showClean:["Boolean",!0],showClose:["Boolean",!0],shy:["Boolean",!0],startDate:["String",null],startWeekDay:["Number",1],validDayFn:["Function",null],validMonthFn:["Function",null],validYearFn:["Function",null],nextValidDateFn:["Function",null],prevValidDateFn:["Function",null],yearRange:["String",null],month:["Object",{1:"January",2:"February",3:"March",4:"April",5:"May",6:"June",7:"July",8:"August",9:"September",10:"October",11:"November",12:"December"}],wDay:["Object",{0:"Sunday",1:"Monday",2:"Tuesday",3:"Wednesday",4:"Thursday",5:"Friday",6:"Saturday"}]},l.prototype={_init:function(){this._options.format=this._dateParsers[this._options.format]||this._options.format,this._hoverPicker=!1,this._picker=this._options.pickerField||null,this._setMinMax(this._options.dateRange||this._options.yearRange),this.setDate(this._options.startDate?this._options.startDate:this._element&&this._element.value?this._element.value:new Date),(this._options.startWeekDay<0||this._options.startWeekDay>6)&&(Ink.warn('Ink.UI.DatePicker_1: option "startWeekDay" must be between 0 (sunday) and 6 (saturday)'),this._options.startWeekDay=h(this._options.startWeekDay,0,6)),Ink.extendObj(this._options,this._lang||{}),this._render(),this._listenToContainerObjectEvents()},_validate:function(){if(this._options.displayInSelect&&!(this._options.dayField&&this._options.monthField&&this._options.yearField))throw new Error("Ink.UI.DatePicker: displayInSelect option enabled.Please specify dayField, monthField and yearField selectors.")},_render:function(){this._containerObject=document.createElement("div"),this._containerObject.className=this._options.cssClass+" ink-datepicker-calendar hide-all",this._renderSuperTopBar();var b=document.createElement("div");b.className="ink-calendar-top",this._monthDescContainer=document.createElement("div"),this._monthDescContainer.className="ink-calendar-month_desc",this._monthPrev=document.createElement("div"),this._monthPrev.className="ink-calendar-prev",this._monthPrev.appendChild(d.create("a",{href:"#prev",className:"change_month_prev",setHTML:this._options.prevLinkText})),this._monthNext=document.createElement("div"),this._monthNext.className="ink-calendar-next",this._monthNext.appendChild(d.create("a",{href:"#next",className:"change_month_next",setHTML:this._options.nextLinkText})),b.appendChild(this._monthPrev),b.appendChild(this._monthDescContainer),b.appendChild(this._monthNext),this._monthContainer=document.createElement("div"),this._monthContainer.className="ink-calendar-month",this._containerObject.appendChild(b),this._containerObject.appendChild(this._monthContainer),this._monthSelector=this._renderMonthSelector(),this._containerObject.appendChild(this._monthSelector),this._yearSelector=document.createElement("ul"),this._yearSelector.className="ink-calendar-year-selector",this._containerObject.appendChild(this._yearSelector),(!this._options.onFocus||this._options.displayInSelect)&&(this._picker=this._options.pickerField?a.elOrSelector(this._options.pickerField,"pickerField"):d.create("a",{href:"#open_cal",setHTML:"open",insertBottom:this._element.parentNode,className:"ink-datepicker-picker-field"})),this._appendDatePickerToDom(),this._renderMonth(),this._monthChanger=d.create("a",{href:"#monthchanger",className:"ink-calendar-link-month",setTextContent:this._options.month[this._month+1]}),this._ofText=d.create("span",{className:"ink-calendar-of-text",setHTML:this._options.ofText}),this._yearChanger=d.create("a",{href:"#yearchanger",className:"ink-calendar-link-year",setTextContent:this._year}),this._monthDescContainer.appendChild(this._monthChanger),this._monthDescContainer.appendChild(this._ofText),this._monthDescContainer.appendChild(this._yearChanger),this._options.inline?this.show():this._addOpenCloseEvents(),this._addDateChangeHandlersToInputs()},_addDateChangeHandlersToInputs:function(){var a=this._element;this._options.displayInSelect&&(a=[this._options.dayField,this._options.monthField,this._options.yearField]),b.observeMulti(a,"change",Ink.bindEvent(function(){this._updateDate(),this._showDefaultView(),this.setDate(),this._inline||this._hoverPicker||this._hide(!0)},this))},show:function(){this._updateDate(),this._renderMonth(),c.removeClassName(this._containerObject,"hide-all")},_addOpenCloseEvents:function(){var a=this._picker||this._element;b.observe(a,"click",Ink.bindEvent(function(a){b.stop(a),this.show()},this)),this._options.autoOpen&&this.show(),this._options.displayInSelect||b.observe(a,"blur",Ink.bindEvent(function(){this._hoverPicker||this._hide(!0)},this)),this._options.shy&&b.observe(document,"click",Ink.bindEvent(function(a){for(var c=b.element(a),e=[this._options.dayField,this._options.monthField,this._options.yearField,this._picker,this._element],f=0,g=e.length;g>f;f++)if(e[f]&&d.descendantOf(e[f],c))return;this._hide(!0)},this))},_renderMonthSelector:function(){var a=document.createElement("ul");a.className="ink-calendar-month-selector";for(var b=document.createElement("ul"),c=1;12>=c;c++)b.appendChild(this._renderMonthButton(c)),c%4===0&&(a.appendChild(b),b=document.createElement("ul"));return a},_renderMonthButton:function(a){var b=document.createElement("li");return b.appendChild(d.create("a",{"data-cal-month":a,setTextContent:this._options.month[a].substring(0,3)})),b},_appendDatePickerToDom:function(){if(this._options.containerElement){var b=a.elOrSelector(this._options.containerElement);b.appendChild(this._containerObject)}var c=e.matchesSelector(this._element.parentNode,".ink-form .control-group .control, .ink-form .control-group .control > *");c?(this._wrapper=this._element.parentNode,this._wrapperIsControl=!0):(this._wrapper=d.create("div",{className:"ink-datepicker-wrapper"}),d.wrap(this._element,this._wrapper)),d.insertAfter(this._containerObject,this._element)},_renderSuperTopBar:function(){this._options.showClose&&this._options.showClean&&(this._superTopBar=document.createElement("div"),this._superTopBar.className="ink-calendar-top-options",this._options.showClean&&this._superTopBar.appendChild(d.create("a",{className:"clean",setHTML:this._options.cleanText})),this._options.showClose&&this._superTopBar.appendChild(d.create("a",{className:"close",setHTML:this._options.closeText})),this._containerObject.appendChild(this._superTopBar))},_listenToContainerObjectEvents:function(){b.observe(this._containerObject,"mouseover",Ink.bindEvent(function(a){b.stop(a),this._hoverPicker=!0},this)),b.observe(this._containerObject,"mouseout",Ink.bindEvent(function(a){b.stop(a),this._hoverPicker=!1},this)),b.observe(this._containerObject,"click",Ink.bindEvent(this._onClick,this))},_onClick:function(a){var d=b.element(a);return c.hasClassName(d,"ink-calendar-off")?(b.stopDefault(a),null):(b.stop(a),this._onRelativeChangerClick(d),this._onAbsoluteChangerClick(d),c.hasClassName(d,"ink-calendar-link-month")?this._showMonthSelector():c.hasClassName(d,"ink-calendar-link-year")?this._showYearSelector():c.hasClassName(d,"clean")?this._clean():c.hasClassName(d,"close")&&this._hide(!1),void this._updateDescription())},_onRelativeChangerClick:function(a){var b={change_year_next:1,change_year_prev:-1},c={change_month_next:1,change_month_prev:-1};a.className in c?this._updateCal(c[a.className]):a.className in b&&this._showYearSelector(b[a.className])},_onAbsoluteChangerClick:function(a){var b=d.data(a);Number(b.calDay)?(this.setDate(new Date(this._year,this._month,b.calDay)),this._hide()):Number(b.calMonth)?(this._month=Number(b.calMonth)-1,this._showDefaultView(),this._updateCal()):Number(b.calYear)&&this._changeYear(Number(b.calYear))},_changeYear:function(a){a=+a,isNaN(a)||(this._year=a,"function"==typeof this._options.onYearSelected&&this._options.onYearSelected(this,{year:this._year}),this._showMonthSelector())},_clean:function(){this._options.displayInSelect?(this._options.yearField.selectedIndex=0,this._options.monthField.selectedIndex=0,this._options.dayField.selectedIndex=0):this._element.value=""},_hide:function(a){a=void 0===a?!0:a,(a===!1||a&&this._options.shy)&&c.addClassName(this._containerObject,"hide-all")},_setMinMax:function(a){function b(){c._min=d,c._max=e}var c=this,d={_year:-Number.MAX_VALUE,_month:0,_day:1},e={_year:Number.MAX_VALUE,_month:11,_day:31};if(!a)return b();var g=a.split(":"),j=/^(\d{4})((\-)(\d{1,2})((\-)(\d{1,2}))?)?$/;f.each([{name:"_min",date:g[0],noLim:d},{name:"_max",date:g[1],noLim:e}],Ink.bind(function(a){var b=a.noLim;if("NOW"===a.date.toUpperCase()){var c=new Date;b=k(c)}else"EVER"===a.date.toUpperCase()?b=a.noLim:j.test(a.date)&&(b=i(a.date),b._month=h(b._month,0,11),b._day=h(b._day,1,this._daysInMonth(b._year,b._month+1)));this[a.name]=b},this));var l=-1!==this._dateCmp(this._max,this._min);l||b()},_fitDateToRange:function(a){return this._isValidDate(a)||(a=k(new Date)),-1===this._dateCmp(a,this._min)?Ink.extendObj({},this._min):1===this._dateCmp(a,this._max)?Ink.extendObj({},this._max):Ink.extendObj({},a)},_dateWithinRange:function(a){return arguments.length||(a=this),!this._dateAboveMax(a)&&!this._dateBelowMin(a)},_dateAboveMax:function(a){return 1===this._dateCmp(a,this._max)},_dateBelowMin:function(a){return-1===this._dateCmp(a,this._min)},_dateCmp:function(a,b){return this._dateCmpUntil(a,b,"_day")},_dateCmpUntil:function(a,b,c){var d=["_year","_month","_day"],e=-1;do{if(e++,a[d[e]]>b[d[e]])return 1;if(a[d[e]]this._min._year){var f=d.create("li");f.appendChild(d.create("a",{href:"#year_prev",className:"change_year_prev",setHTML:this._options.prevLinkText})),e.appendChild(f)}else e.appendChild(d.create("li",{setHTML:" "}));for(var g=1;11>g;g++)g%4===0&&(e=d.create("ul"),this._yearSelector.appendChild(e)),c=b+g-1,e.appendChild(this._getYearButton(c));if(cthis._max._year||b+9=1&&+a._month+1<=12&&+a._day>=1&&+a._day<=this._daysInMonth(a._year,a._month+1)},_isDate:function(a,b){try{if("undefined"==typeof a)return!1;var c=g.set(a,b);if(c&&this._isValidDate(k(c)))return!0}catch(d){}return!1},_acceptableDay:function(a){return this._acceptableDateComponent(a,"validDayFn")},_acceptableMonth:function(a){return this._acceptableDateComponent(a,"validMonthFn")},_acceptableYear:function(a){return this._acceptableDateComponent(a,"validYearFn")},_acceptableDateComponent:function(a,b){return this._options[b]?this._callUserCallbackBool(this._options[b],a):this._dateWithinRange(a)},_writeDateInFormat:function(){return g.get(this._options.format,this.getDate()) },setDate:function(a){if(a&&"function"==typeof a.getDate&&(a=[a.getFullYear(),a.getMonth()+1,a.getDate()].join("-")),/\d{4}-\d{1,2}-\d{1,2}/.test(a)){var b=a.split("-");this._year=+b[0],this._month=+b[1]-1,this._day=+b[2]}this._setDate()},getDate:function(){if(!this._day)throw"Ink.UI.DatePicker: Still picking a date. Cannot getDate now!";return new Date(this._year,this._month,this._day)},_setDate:function(a){if(a){var b=d.data(a);this._day=+b.calDay||this._day}var c=this._fitDateToRange(this);this._year=c._year,this._month=c._month,this._day=c._day,this._options.displayInSelect?(this._options.dayField.value=this._day,this._options.monthField.value=this._month+1,this._options.yearField.value=this._year):this._element.value=this._writeDateInFormat(),this._options.onSetDate&&this._options.onSetDate(this,{date:this.getDate()})},_updateCal:function(a){"function"==typeof this._options.onMonthSelected&&this._options.onMonthSelected(this,{year:this._year,month:this._month}),a&&null===this._updateMonth(a)||this._renderMonth()},_daysInMonth:function(a,b){var c={2:a%400===0||a%4===0&&a%100!==0?29:28,4:30,6:30,9:30,11:30};return c[b]||31},_updateMonth:function(a){var b;return a>0?b=this._getNextMonth():0>a&&(b=this._getPrevMonth()),b?(this._year=b._year,this._month=b._month,void(this._day=b._day)):null},_getNextMonth:function(a){return this._tryLeap(a,"Month","next",function(a){return a._month+=1,a._month>11&&(a._month=0,a._year+=1),a})},_getPrevMonth:function(a){return this._tryLeap(a,"Month","prev",function(a){return a._month-=1,a._month<0&&(a._month=11,a._year-=1),a})},_getPrevYear:function(a){return this._tryLeap(a,"Year","prev",function(a){return a._year-=1,a})},_getNextYear:function(a){return this._tryLeap(a,"Year","next",function(a){return a._year+=1,a})},_tryLeap:function(a,b,c,d){a=a||{_year:this._year,_month:this._month,_day:this._day};var e="prev"===c?"_min":"_max",f=this[e];if(0===this._dateCmpUntil(a,f,b))return null;var g=this._options[c+"ValidDateFn"];if(g)return this._callUserCallbackDate(g,a);a=d(a);var h=this._daysInMonth(a._year,a._month+1);return a._day>h&&(a._day=h),a=this._fitDateToRange(a),this["_acceptable"+b](a)?a:null},_getNextDecade:function(a){a=a||{_year:this._year,_month:this._month,_day:this._day};var b=this._getCurrentDecade(a);return b+10>this._max._year?null:b+10},_getPrevDecade:function(a){a=a||{_year:this._year,_month:this._month,_day:this._day};var b=this._getCurrentDecade(a);return b-10e&&(e+=7),e},_getDayButtons:function(a,b){var c=this._daysInMonth(a,b+1),e=document.createDocumentFragment(),f=d.create("ul");e.appendChild(f);for(var g=this._getFirstDayIndex(a,b),h=0;g>h;h++)f.appendChild(d.create("li",{className:"ink-calendar-empty",setHTML:" "}));for(var i=1;c>=i;i++)(i-1+g)%7===0&&(f=d.create("ul"),e.appendChild(f)),f.appendChild(this._getDayButton(a,b,i));return e},_getDayButton:function(a,b,c){var e={},f=j(a,b,c);this._acceptableDay(f)?(e["data-cal-day"]=c,this._day&&0===this._dateCmp(f,this)&&(e.className="ink-calendar-on")):e.className="ink-calendar-off",e.setTextContent=c;var g=d.create("li");return g.appendChild(d.create("a",e)),g},_getMonthCalendarHeader:function(a){for(var b=d.create("ul",{className:"ink-calendar-header"}),c,e=0;7>e;e++)c=(a+e)%7,b.appendChild(d.create("li",{setTextContent:this._options.wDay[c].substring(0,1)}));return b},_addMonthClassNames:function(a){f.forEach((a||this._monthSelector).getElementsByTagName("a"),Ink.bindMethod(this,"_addMonthButtonClassNames"))},_addMonthButtonClassNames:function(a){var b=d.data(a);if(!b.calMonth)throw"not a calendar month button!";var e=+b.calMonth-1;if(e===this._month)c.addClassName(a,"ink-calendar-on"),c.removeClassName(a,"ink-calendar-off");else{c.removeClassName(a,"ink-calendar-on");var f=!this._acceptableMonth({_year:this._year,_month:e});c.addRemoveClassName(a,"ink-calendar-off",f)}},lang:function(a){this._lang=a},showMonth:function(){this._renderMonth()},isMonthRendered:function(){var a=e.select(".ink-calendar-header",this._containerObject)[0];return"none"!==c.getStyle(a.parentNode,"display")&&"none"!==c.getStyle(a.parentNode.parentNode,"display")},destroy:function(){d.unwrap(this._element),d.remove(this._wrapper),d.remove(this._containerObject),a.unregisterInstance.call(this)}},a.createUIComponent(l),l}),Ink.createModule("Ink.UI.Draggable","1",["Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Browser_1","Ink.Dom.Selector_1","Ink.UI.Common_1"],function(a,b,c,d,e,f){"use strict";function g(a,b,c){return a=Math.min(a,c),a=Math.max(a,b)}function h(){f.BaseUIComponent.apply(this,arguments)}var i=0,j=1;return h._name="Draggable_1",h._optionDefinition={constraint:["String",!1],constraintElm:["Element",!1],top:["Number",!1],right:["Number",!1],bottom:["Number",!1],left:["Number",!1],handle:["Element",!1],revert:["Boolean",!1],cursor:["String","move"],zIndex:["Number",9999],fps:["Number",0],droppableProxy:["Element",!1],mouseAnchor:["String",void 0],dragClass:["String","drag"],skipChildren:["Boolean",!0],onStart:["Function",!1],onEnd:["Function",!1],onDrag:["Function",!1],onChange:["Function",!1]},h.prototype={_init:function(){var a=this._options;this.constraintElm=a.constraintElm&&f.elOrSelector(a.constraintElm),this.handle=!1,this.elmStartPosition=!1,this.active=!1,this.dragged=!1,this.prevCoords=!1,this.placeholder=!1,this.position=!1,this.zindex=!1,this.firstDrag=!0,a.fps&&(this.deltaMs=1e3/a.fps,this.lastRunAt=0),this.handlers={},this.handlers.start=Ink.bindEvent(this._onStart,this),this.handlers.dragFacade=Ink.bindEvent(this._onDragFacade,this),this.handlers.drag=Ink.bindEvent(this._onDrag,this),this.handlers.end=Ink.bindEvent(this._onEnd,this),this.handlers.selectStart=function(a){return b.stop(a),!1},this.handle=this._options.handle?f.elOrSelector(this._options.handle):this._element,this.handle.style.cursor=a.cursor,b.observe(this.handle,"touchstart",this.handlers.start),b.observe(this.handle,"mousedown",this.handlers.start),d.IE&&b.observe(this._element,"selectstart",this.handlers.selectStart)},destroy:function(){b.stopObserving(this.handle,"touchstart",this.handlers.start),b.stopObserving(this.handle,"mousedown",this.handlers.start),d.IE&&b.stopObserving(this._element,"selectstart",this.handlers.selectStart)},_getCoords:function(b){var c=[a.scrollWidth(),a.scrollHeight()];return{x:(b.touches?b.touches[0].clientX:b.clientX)+c[i],y:(b.touches?b.touches[0].clientY:b.clientY)+c[j]}},_cloneStyle:function(b,d){d.className=b.className,d.style.borderWidth="0",d.style.padding="0",d.style.position="absolute",d.style.width=a.elementWidth(b)+"px",d.style.height=a.elementHeight(b)+"px",d.style.left=a.elementLeft(b)+"px",d.style.top=a.elementTop(b)+"px",d.style.cssFloat=c.getStyle(b,"float"),d.style.display=c.getStyle(b,"display")},_onStart:function(d){if(!this.active&&b.isLeftClick(d)||"undefined"==typeof d.button){var e=b.element(d);if(this._options.skipChildren&&e!==this.handle)return;b.stop(d),c.addClassName(this._element,this._options.dragClass),this.elmStartPosition=[a.elementLeft(this._element),a.elementTop(this._element)];var f=[parseInt(c.getStyle(this._element,"left"),10),parseInt(c.getStyle(this._element,"top"),10)],g=a.elementDimensions(this._element);this.originalPosition=[f[i]?f[i]:null,f[j]?f[j]:null],this.delta=this._getCoords(d),this.active=!0,this.position=c.getStyle(this._element,"position"),this.zindex=c.getStyle(this._element,"zIndex");var h=document.createElement("div");if(h.style.position=this.position,h.style.width=g[i]+"px",h.style.height=g[j]+"px",h.style.marginTop=c.getStyle(this._element,"margin-top"),h.style.marginBottom=c.getStyle(this._element,"margin-bottom"),h.style.marginLeft=c.getStyle(this._element,"margin-left"),h.style.marginRight=c.getStyle(this._element,"margin-right"),h.style.borderWidth="0",h.style.padding="0",h.style.cssFloat=c.getStyle(this._element,"float"),h.style.display=c.getStyle(this._element,"display"),h.style.visibility="hidden",this.delta2=[this.delta.x-this.elmStartPosition[i],this.delta.y-this.elmStartPosition[j]],this._options.mouseAnchor){var k=this._options.mouseAnchor.split(" "),l=[g[i],g[j]];"left"===k[0]?l[i]=0:"center"===k[0]&&(l[i]=parseInt(l[i]/2,10)),"top"===k[1]?l[j]=0:"center"===k[1]&&(l[j]=parseInt(l[j]/2,10)),this.applyDelta=[this.delta2[i]-l[i],this.delta2[j]-l[j]]}var m=this._options.fps?"dragFacade":"drag";if(this.placeholder=h,this._options.onStart&&this._options.onStart(this._element,d),this._options.droppableProxy){this.proxy=document.createElement("div"),g=[window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight];var n=this.proxy.style;n.width=g[i]+"px",n.height=g[j]+"px",n.position="fixed",n.left="0",n.top="0",n.zIndex=this._options.zIndex+1,n.backgroundColor="#FF0000",c.setOpacity(this.proxy,0);for(var o=document.body.firstChild;o&&1!==o.nodeType;)o=o.nextSibling;document.body.insertBefore(this.proxy,o),b.observe(this.proxy,"mousemove",this.handlers[m]),b.observe(this.proxy,"touchmove",this.handlers[m])}else b.observe(document,"mousemove",this.handlers[m]);return this._element.style.position="absolute",this._element.style.zIndex=this._options.zIndex,this._element.parentNode.insertBefore(this.placeholder,this._element),this._onDrag(d),b.observe(document,"mouseup",this.handlers.end),b.observe(document,"touchend",this.handlers.end),!1}},_onDragFacade:function(a){var b=+new Date;(!this.lastRunAt||b>this.lastRunAt+this.deltaMs)&&(this.lastRunAt=b,this._onDrag(a))},_onDrag:function(c){if(this.active){b.stop(c),this.dragged=!0;var d=this._getCoords(c),e=d.x,f=d.y,h=this._options,k=!1,l=!1;if(this.prevCoords&&e!==this.prevCoords.x||f!==this.prevCoords.y){h.onDrag&&h.onDrag(this._element,c),this.prevCoords=d,k=this.elmStartPosition[i]+e-this.delta.x,l=this.elmStartPosition[j]+f-this.delta.y;var m=a.elementDimensions(this._element);if(this.constraintElm){var n=a.offset(this.constraintElm),o=a.elementDimensions(this.constraintElm),p=n[j]+(h.top||0),q=n[j]+o[j]-(h.bottom||0),r=n[i]+(h.left||0),s=n[i]+o[i]-(h.right||0);l=g(l,p,q-m[j]),k=g(k,r,s-m[i])}else if(h.constraint){var t=h.right===!1?a.pageWidth()-m[i]:h.right,u=h.left===!1?0:h.left,v=h.top===!1?0:h.top,w=h.bottom===!1?a.pageHeight()-m[j]:h.bottom;("horizontal"===h.constraint||"both"===h.constraint)&&(k=g(k,u,t)),("vertical"===h.constraint||"both"===h.constraint)&&(l=g(l,v,w))}var x=Ink.getModule("Ink.UI.Droppable_1");if(this.firstDrag&&(x&&x.updateAll(),this.firstDrag=!1),k&&(this._element.style.left=k+"px"),l&&(this._element.style.top=l+"px"),x){var y=this._options.mouseAnchor?{x:e-this.applyDelta[i],y:f-this.applyDelta[j]}:d;x.action(y,"drag",c,this._element)}h.onChange&&h.onChange(this)}}},_onEnd:function(d){if(b.stopObserving(document,"mousemove",this.handlers.drag),b.stopObserving(document,"touchmove",this.handlers.drag),this._options.fps&&this._onDrag(d),c.removeClassName(this._element,this._options.dragClass),this.active&&this.dragged){this._options.droppableProxy&&document.body.removeChild(this.proxy),this.pt&&(a.remove(this.pt),this.pt=void 0),this.placeholder&&a.remove(this.placeholder),this._options.revert&&(this._element.style.position=this.position,this._element.style.zIndex=null!==this.zindex?this.zindex:"auto",this._element.style.left=this.originalPosition[i]?this.originalPosition[i]+"px":"",this._element.style.top=this.originalPosition[j]?this.originalPosition[j]+"px":""),this._options.onEnd&&this._options.onEnd(this._element,d);var e=Ink.getModule("Ink.UI.Droppable_1");e&&e.action(this._getCoords(d),"drop",d,this._element),this.position=!1,this.zindex=!1,this.firstDrag=!0}this.active=!1,this.dragged=!1}},f.createUIComponent(h),h}),Ink.createModule("Ink.UI.Drawer","1",["Ink.UI.Common_1","Ink.Dom.Loaded_1","Ink.Dom.Selector_1","Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Css_1"],function(a,b,c,d,e,f){"use strict";function g(a){if(document.addEventListener){m&&h();var b=!1;m=function(c){return"mousedown"===c.type||"mouseup"===c.type?void(b="mousedown"===c.type):void(b||a(c.target))},document.addEventListener("focus",m,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("mouseup",m,!0)}}function h(){document.addEventListener&&m&&(document.removeEventListener("focus",m,!0),document.removeEventListener("mousedown",m,!0),document.removeEventListener("mouseup",m,!0),m=null)}function i(a){for(var b=Ink.ss("[tabindex]",a),c=null,d=null,e=0;ef)&&(c=f,d=b[e])}if(d)return d.focus(),!0;var g=Ink.s(l,a);return g?(g.focus(),!0):!1}function j(a){return'Ink.UI.Drawer_1: Could not find the "'+a+'" element on this page. Please make sure it exists.'}function k(b,c){a.isDOMElement(b)||(c=b),a.BaseUIComponent.apply(this,[document.body,c])}var l=['[tabindex]:not([tabindex="-1"])',"input","select","textarea","button","object","a[href]","area"].join(","),m=null,n=function(a){var b={WebkitTransitionProperty:"webkitTransitionEnd",transitionProperty:"transitionend"};for(var c in b)if(b.hasOwnProperty(c)&&void 0!==a.style[c])return{styleProp:c,eventName:b[c]};return!1}(document.createElement("div"));return k.transitionSupport=n,k._name="Drawer_1",k._optionDefinition={parentSelector:["String",".ink-drawer"],leftDrawer:["String",".left-drawer"],leftTrigger:["String",".left-drawer-trigger"],rightDrawer:["String",".right-drawer"],rightTrigger:["String",".right-drawer-trigger"],contentDrawer:["String",".content-drawer"],mode:["String","push"],sides:["String","both"]},k.prototype={_init:function(){function a(a){a.drawer&&a.triggers.length?b=!0:c=j(a.drawer?a.drawerOption:a.triggerOption)}if(this._contentDrawers=Ink.ss(this._options.contentDrawer),this._leftDrawer=Ink.s(this._options.leftDrawer),this._leftTriggers=Ink.ss(this._options.leftTrigger),this._rightDrawer=Ink.s(this._options.rightDrawer),this._rightTriggers=Ink.ss(this._options.rightTrigger),f.addClassName(document.body,"ink-drawer"),0===this._contentDrawers.length)throw new Error('Ink.UI.Drawer_1: Could not find any "'+this._options.contentDrawer+'" elements on this page. Please make sure you have at least one.');switch(this._options.sides){case"both":this._triggers=this._options.leftTrigger+", "+this._options.rightTrigger+", "+this._options.contentDrawer;break;case"left":this._triggers=this._options.leftTrigger+", "+this._options.contentDrawer;break;case"right":this._triggers=this._options.rightTrigger+", "+this._options.contentDrawer}var b=!1,c=null;("left"===this._options.sides||"both"===this._options.sides)&&a({name:"left",drawer:this._leftDrawer,drawerOption:this._options.leftDrawer,triggers:this._leftTriggers,triggerOption:this._options.leftTrigger}),("right"===this._options.sides||"both"===this._options.sides)&&a({name:"right",drawer:this._rightDrawer,drawerOption:this._options.rightDrawer,triggers:this._rightTriggers,triggerOption:this._options.rightTrigger}),b||Ink.warn(c),this._isOpen=!1,this._direction=void 0,this._handlers={click:Ink.bindEvent(this._onClick,this),afterTransition:Ink.bindEvent(this._afterTransition,this)},this._addEvents()},_onClick:function(a){var b=d.findUpwardsBySelector(a.currentTarget,this._options.leftTrigger)?"left":d.findUpwardsBySelector(a.currentTarget,this._options.rightTrigger)?"right":null;if(b)return void this._onTriggerClicked(a,b);if(this._isOpen){var c=d.findUpwardsBySelector(a.currentTarget,this._options.contentDrawer),e=d.isLink(a.target);(c||e)&&this.close(),c&&a.preventDefault()}},_onTriggerClicked:function(a,b){this._isOpen?this.close():this.open(b),a.preventDefault()},_afterTransition:function(){this._isOpen||f.removeClassName(this._getRecentDrawer(),"show")},_addEvents:function(){e.on(document.body,"click",this._triggers+', a[href*="#"]',this._handlers.click)},_getRecentDrawer:function(){return"left"===this._direction?this._leftDrawer:"right"===this._direction?this._rightDrawer:null},open:function(a){this._isOpen=!0,this._direction=a;var b=this._getRecentDrawer();f.addClassName(b,"show"),setTimeout(Ink.bind(function(){f.addClassName(document.body,[this._options.mode,a])},this),0),n&&this._transitionWillOccur(b)&&e.one(b,n.eventName,function(){f.removeClassName(b,"show");var a=+b.offsetWidth;f.addClassName(b,"show")});var c=document.activeElement,j=i(b);g(Ink.bind(function(a){var e=d.isAncestorOf(b,a);e||(this.close(),h(),j&&c&&c.focus())},this))},_transitionWillOccur:function(a){return!(!n||!f.getStyle(a,n.styleProp))},close:function(){if(this._isOpen!==!1){var a=this._getRecentDrawer();if(a){h(),this._isOpen=!1;var b=null;n&&(b=this._transitionWillOccur(this._getRecentDrawer())),f.removeClassName(document.body,[this._options.mode,this._direction]),b?e.one(document.body,n.eventName,this._handlers.afterTransition):this._handlers.afterTransition()}}}},a.createUIComponent(k),k}),Ink.createModule("Ink.UI.Dropdown","1",["Ink.UI.Common_1","Ink.UI.Toggle_1","Ink.Dom.Event_1","Ink.Dom.Element_1"],function(a,b,c,d){"use strict";function e(){a.BaseUIComponent.apply(this,arguments)}return e._name="Dropdown_1",e._optionDefinition={target:["Element"],hoverOpen:["Number",null],dismissOnInsideClick:["Boolean",!1],dismissOnOutsideClick:["Boolean",!0],dismissAfter:["Number",null],onInsideClick:["Function",null],onOutsideClick:["Function",null],onOpen:["Function",null],onDismiss:["Function",null]},e.prototype={_init:function(){this._toggle=new b(this._element,{target:this._options.target,closeOnInsideClick:null,closeOnClick:!1,onChangeState:Ink.bind(function(a){return this._openOrDismiss(a,!0,!0)},this)}),c.observeMulti([this._options.target,this._element],"mouseout",Ink.bindMethod(this,"_onMouseOut")),c.observeMulti([this._options.target,this._element],"mouseover",Ink.bindMethod(this,"_onMouseOver")),c.observe(this._options.target,"click",Ink.bindMethod(this,"_onInsideClick")),c.observe(document,"click",Ink.bindMethod(this,"_onOutsideClick"))},_onMouseOver:function(){"number"==typeof this._options.hoverOpen&&this._toggle.getState()===!1&&(clearTimeout(this._openTimeout),this._openTimeout=setTimeout(Ink.bindMethod(this,"open",!0),1e3*this._options.hoverOpen)),"number"==typeof this._options.dismissAfter&&clearTimeout(this._dismissTimeout)},_onMouseOut:function(){"number"==typeof this._options.dismissAfter&&this._toggle.getState()===!0&&(clearTimeout(this._dismissTimeout),this._dismissTimeout=setTimeout(Ink.bindMethod(this,"dismiss",!0),1e3*this._options.dismissAfter)),"number"==typeof this._options.hoverOpen&&clearTimeout(this._openTimeout)},_onInsideClick:function(a){var b=this._handlerCall("onInsideClick",c.element(a));b!==!1&&this._options.dismissOnInsideClick&&this.dismiss(!0)},_onOutsideClick:function(a){var b=c.element(a),e=d.findUpwardsHaving(b,Ink.bind(function(a){return a===this._element},this)),f=d.findUpwardsHaving(b,Ink.bind(function(a){return a===this._options.target},this));if(!e&&!f){var g=this._handlerCall("onOutsideClick",b);if(g===!1)return;this._options.dismissOnOutsideClick&&this.dismiss(!0)}},dismiss:function(a){this._openOrDismiss(!1,a,arguments[1])},open:function(a){this._openOrDismiss(!0,a,arguments[1])},_openOrDismiss:function(a,b,c){if(!this._toggle||this._toggle.getState()!==a){if(b&&this._handlerCall(a?"onOpen":"onDismiss")===!1)return!1;c||this._toggle.setState(a),clearTimeout(this._dismissTimeout),clearTimeout(this._openTimeout)}},_handlerCall:function(a){return this._options[a]?this._options[a].call(this,[].slice.call(arguments,1)):void 0}},a.createUIComponent(e),e}),Ink.createModule("Ink.UI.Droppable","1",["Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.UI.Common_1","Ink.Util.Array_1","Ink.Dom.Selector_1"],function(a,b,c,d,e,f){"use strict";var g=function(a){return function(b){return c.addClassName(a,b)}},h=function(a){return function(b){return c.removeClassName(a,b)}},i={debug:!1,_droppables:[],_draggables:[],add:function(b,c){function e(a){a.style.position="inherit"}b=d.elOrSelector(b,"Droppable.add target element");var f=Ink.extendObj({hoverClass:c.hoverclass||!1,accept:!1,onHover:!1,onDrop:!1,onDropOut:!1},c||{},a.data(b));"string"==typeof f.hoverClass&&(f.hoverClass=f.hoverClass.split(/\s+/));var g=this,h={move:function(a,b){e(a),b.appendChild(a)},copy:function(a,b){e(a),b.appendChild(a.cloneNode(!0))},revert:function(a){g._findDraggable(a).originalParent.appendChild(a),e(a)}},i;if("string"==typeof f.onHover&&(i=f.onHover,f.onHover=h[i],void 0===f.onHover))throw new Error("Unknown hover event handler: "+i);if("string"==typeof f.onDrop&&(i=f.onDrop,f.onDrop=h[i],void 0===f.onDrop))throw new Error("Unknown drop event handler: "+i);if("string"==typeof f.onDropOut&&(i=f.onDropOut,f.onDropOut=h[i],void 0===f.onDropOut))throw new Error("Unknown dropOut event handler: "+i);var j={element:b,data:{},options:f};this._droppables.push(j),this._update(j)},_findData:function(a){for(var b=this._droppables,c=0,d=b.length;d>c;c++)if(b[c].element===a)return b[c]},_findDraggable:function(a){for(var b=this._draggables,c=0,d=b.length;d>c;c++)if(b[c].element===a)return b[c]},updateAll:function(){e.each(this._droppables,i._update)},update:function(a){this._update(this._findData(a))},_update:function(b){var c=b.data,d=b.element;c.left=a.offsetLeft(d),c.top=a.offsetTop(d),c.right=c.left+a.elementWidth(d),c.bottom=c.top+a.elementHeight(d)},remove:function(a){a=d.elOrSelector(a);for(var b=this._droppables.length,c=0;b>c;c++)if(this._droppables[c].element===a){this._droppables.splice(c,1);break}return b!==this._droppables.length},action:function(a,b,c,d){e.each(this._droppables,Ink.bind(function(i){var j=i.data,k=i.options,l=i.element;(!k.accept||f.matches(k.accept,[d]).length)&&("drag"!==b||this._findDraggable(d)||this._draggables.push({element:d,originalParent:d.parentNode}),a.x>=j.left&&a.x<=j.right&&a.y>=j.top&&a.y<=j.bottom?"drag"===b?(k.hoverClass&&e.each(k.hoverClass,g(l)),k.onHover&&k.onHover(d,l)):"drop"===b&&(k.hoverClass&&e.each(k.hoverClass,h(l)),k.onDrop&&k.onDrop(d,l,c)):"drag"===b&&k.hoverClass?e.each(k.hoverClass,h(l)):"drop"===b&&k.onDropOut&&k.onDropOut(d,l,c))},this))}};return i}),Ink.createModule("Ink.UI.FormValidator","1",["Ink.Dom.Element_1","Ink.Dom.Css_1","Ink.Util.Validator_1","Ink.Dom.Selector_1"],function(a,b,c,d){"use strict";function e(a){if(!a.name)return[];if(!a.form)return d.select('[name="'+a.name+'"]');var b=a.form[a.name];return b?("undefined"==typeof b.length&&(b=[b]),b):function(){for(var b=[],c=Ink.ss("*",a.form),d=0;d0?(b.onError?b.onError(c):this._showError(a,c),!1):(b.onError||this._clearError(a),this._clearCache(),b.onSuccess&&b.onSuccess(),!0)},reset:function(){this._clearError(),this._clearCache()},_free:function(){this.element=null,this.custom=!1,this.confirmGroup=!1},_clearCache:function(){this.element=null,this.elements=[],this.custom=!1,this.confirmGroup=!1},_getElements:function(){var a=this.elements[this.element.id]=[];this.confirmElms[this.element.id]=[];for(var c=d.select(":input",this.element),e=!1,f=0,g=c.length;g>f;f++){e=c[f];var h=(e.getAttribute("type")+"").toLowerCase();if("radio"===h||"checkbox"===h){if(0===a.length||e.getAttribute("type")!==a[a.length-1].getAttribute("type")&&e.getAttribute("name")!==a[a.length-1].getAttribute("name"))for(var i in this._flagMap)if(b.hasClassName(e,i)){a.push(e);break}}else{for(var j in this._flagMap)if(b.hasClassName(e,j)&&"ink-fv-confirm"!==j){a.push(e);break}b.hasClassName(e,"ink-fv-confirm")&&(this.confirmElms[this.element.id].push(e),this.hasConfirm[this.element.id]=!0)}}},_validateElements:function(){var a;this._getElements(),this.hasConfirm[this.element.id]===!0&&(a=this._makeConfirmGroups());for(var c=[],d=!1,e=!1,f,g=0,h=this.elements[this.element.id].length;h>g;g++)if(f=!1,d=this.elements[this.element.id][g],!d.disabled)for(var i in this._flagMap)if(b.hasClassName(d,i))if("ink-fv-custom"!==i&&"ink-fv-confirm"!==i)this._isValid(d,i)||(f?c[c.length-1].errors.push(i):(c.push({elm:d,errors:[i]}),f=!0));else if("ink-fv-confirm"!==i)e=this._isCustomValid(d),e.length>0&&c.push({elm:d,errors:[i],custom:e});else if("ink-fv-confirm"===i)continue;return c=this._validateConfirmGroups(a,c)},_validateConfirmGroups:function(a,b){var c=!1;for(var d in a)a.hasOwnProperty(d)&&(c=a[d],2===c.length&&c[0].value!==c[1].value&&b.push({elm:c[1],errors:["ink-fv-confirm"]}));return b},_makeConfirmGroups:function(){var a;if(this.confirmGroup&&this.confirmGroup.length>0){a={};for(var c=!1,d=!1,e=0,f=this.confirmElms[this.element.id].length;f>e;e++){c=this.confirmElms[this.element.id][e];for(var g=0,h=this.confirmGroup.length;h>g;g++)d=this.confirmGroup[g],b.hasClassName(c,d)&&("undefined"==typeof a[d]?a[d]=[c]:a[d].push(c))}return a}return 2===this.confirmElms[this.element.id].length&&(a={"ink-fv-confirm":[this.confirmElms[this.element.id][0],this.confirmElms[this.element.id][1]]}),a;return!1},_isCustomValid:function(a){for(var c=[],d=!1,e=0,f=this.custom.length;f>e;e++)d=this.custom[e],b.hasClassName(a,d.flag)&&(d.callback(a,d.msg)||c.push({flag:d.flag,msg:d.msg}));return c},_isValid:function(a,d){var f=a.nodeName.toLowerCase(),g=(a.getAttribute("type")||"").toLowerCase(),h=this._trim(a.value);if("ink-fv-required"!==d&&"checkbox"!==g&&"radio"!==g&&""===h)return!b.hasClassName(a,"ink-fv-required");switch(d){case"ink-fv-required":if("select"===f)return a.selectedIndex>0?!0:!1;if("checkbox"!==g&&"radio"!==g)return""!==h;if("checkbox"===g||"radio"===g){for(var i=e(a),j=0,k=i.length;k>j;j++)if(i[j].checked===!0)return!0;return!1}return!1;case"ink-fv-email":return c.mail(a.value);case"ink-fv-url":return c.url(a.value);case"ink-fv-number":return!isNaN(Number(a.value))&&isFinite(Number(a.value));case"ink-fv-phone_pt":return c.isPTPhone(a.value);case"ink-fv-phone_cv":return c.isCVPhone(a.value);case"ink-fv-phone_ao":return c.isAOPhone(a.value);case"ink-fv-phone_mz":return c.isMZPhone(a.value);case"ink-fv-date":var l=Ink.getModule("Ink.Dom.Element",1),m=l.data(a),n="yyyy-mm-dd";if(b.hasClassName(a,"ink-datepicker")&&"format"in m?n=m.format:"validFormat"in m&&(n=m.validFormat),!(n in c._dateParsers)){var o=[];for(var p in c._dateParsers)c._dateParsers.hasOwnProperty(p)&&o.push(p);throw new Error("The attribute data-valid-format must be one of the following values: "+o.join(", "))}return c.isDate(n,a.value);case"ink-fv-custom":}return!1},_showError:function(a,b){this._clearError(a);for(var c=!1,d=0,e=b.length;e>d;d++)c=b[d].elm,c&&this._showAnErrorOnElement(c,b[d])},_showAnErrorOnElement:function(c,d){var e=a.findUpwardsByClass(c,"control-group"),f=a.findUpwardsByClass(c,"control"),g=[this._errorClassName,this._errorTypeClassName].join(" "),h=a.create("p",{className:g});h.innerHTML="ink-fv-custom"!==d.errors[0]?this._flagMap[d.errors[0]].msg:d.custom[0].msg;var i=f||e;i?i.appendChild(h):a.insertAfter(h,c),f&&("ink-fv-required"===d.errors[0]?b.addClassName(e,"validation error"):b.addClassName(e,"validation warning"))},_clearError:function(c){for(var d=c.getElementsByTagName("p"),e,f,g=d.length-1;g>=0;g--)e=d[g],b.hasClassName(e,this._errorClassName)&&(f=a.findUpwardsBySelector(e,".control-group"),f&&b.removeClassName(f,["validation","error","warning"]),b.hasClassName(e,this._errorClassName,!0)&&a.remove(e));var h=c.getElementsByTagName("ul");for(g=h.length-1;g>=0;g--)e=h[g],b.hasClassName(e,"control-group")&&b.removeClassName(e,"validation error")},_trim:function(a){return"string"==typeof a?a.replace(/^\s+|\s+$|\n+$/g,""):void 0}};return f}),Ink.createModule("Ink.UI.FormValidator","2",["Ink.UI.Common_1","Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Selector_1","Ink.Dom.Css_1","Ink.Util.Array_1","Ink.Util.I18n_1","Ink.Util.Validator_1"],function(a,b,c,d,e,f,g,h){"use strict";function i(){a.BaseUIComponent.apply(this,arguments)}function j(){a.BaseUIComponent.apply(this,arguments)}var k={required:function(a){return"undefined"!=typeof a&&!/^\s*$/.test(a)},min_length:function(a,b){return"string"==typeof a&&a.length>=parseInt(b,10)},max_length:function(a,b){return"string"==typeof a&&a.length<=parseInt(b,10)},exact_length:function(a,b){return"string"==typeof a&&a.length===parseInt(b,10)},email:function(a){return"string"==typeof a&&h.mail(a)},url:function(a,b){return b=b||!1,"string"==typeof a&&h.url(a,b)},ip:function(a,b){return"string"!=typeof a?!1:h.isIP(a,b)},phone:function(a,b){if("string"!=typeof a)return!1;var c=b?b.toUpperCase():"";return h["is"+c+"Phone"](a)},credit_card:function(a,b){return"string"!=typeof a?!1:h.isCreditCard(a,b||"default")},date:function(a,b){return"string"==typeof a&&h.isDate(b,a)},alpha:function(a,b){return h.ascii(a,{singleLineWhitespace:b})},text:function(a,b,c){return h.unicode(a,{singleLineWhitespace:b,unicodePunctuation:c})},latin:function(a,b,c){return"string"!=typeof a?!1:h.latin1(a,{latin1Punctuation:b,singleLineWhitespace:c})},alpha_numeric:function(a){return h.ascii(a,{numbers:!0})},alpha_dash:function(a){return h.ascii(a,{dash:!0,underscore:!0})},digit:function(a){return"string"==typeof a&&/^[0-9]{1}$/.test(a)},integer:function(a,b){return h.number(a,{negative:!b,decimalPlaces:0})},decimal:function(a,b,c,d){return h.number(a,{decimalSep:b||".",decimalPlaces:+c||null,maxDigits:+d})},numeric:function(a,b,c,d){return b=b||".",-1!==a.indexOf(b)?k.decimal(a,b,c,d):k.integer(a)},range:function(a,b,c,d){return a=+a,b=+b,c=+c,isNaN(a)||isNaN(b)||isNaN(c)?!1:b>a||a>c?!1:d?(a-b)%d===0:!0},color:function(a){return h.isColor(a)},matches:function(a,b){var c=this.getFormElements()[b][0],d=c.getValue();return c._rules.required&&""===d?!1:a===d}},l=new g({en_US:{"formvalidator.required":"The {field} filling is mandatory","formvalidator.min_length":"The {field} must have a minimum size of {param1} characters","formvalidator.max_length":"The {field} must have a maximum size of {param1} characters","formvalidator.exact_length":"The {field} must have an exact size of {param1} characters","formvalidator.email":"The {field} must have a valid e-mail address","formvalidator.url":"The {field} must have a valid URL","formvalidator.ip":"The {field} does not contain a valid {param1} IP address","formvalidator.phone":"The {field} does not contain a valid {param1} phone number","formvalidator.credit_card":"The {field} does not contain a valid {param1} credit card","formvalidator.date":"The {field} should contain a date in the {param1} format","formvalidator.alpha":"The {field} should only contain letters","formvalidator.text":"The {field} should only contain alphabetic characters","formvalidator.latin":"The {field} should only contain alphabetic characters","formvalidator.alpha_numeric":"The {field} should only contain letters or numbers","formvalidator.alpha_dash":"The {field} should only contain letters or dashes","formvalidator.digit":"The {field} should only contain a digit","formvalidator.integer":"The {field} should only contain an integer","formvalidator.decimal":"The {field} should contain a valid decimal number","formvalidator.numeric":"The {field} should contain a number","formvalidator.range":"The {field} should contain a number between {param1} and {param2}","formvalidator.color":"The {field} should contain a valid color","formvalidator.matches":"The {field} should match the field {param1}","formvalidator.validation_function_not_found":"The rule {rule} has not been defined"},pt_PT:{"formvalidator.required":"Preencher {field} é obrigatório","formvalidator.min_length":"{field} deve ter no mínimo {param1} caracteres","formvalidator.max_length":"{field} tem um tamanho máximo de {param1} caracteres","formvalidator.exact_length":"{field} devia ter exactamente {param1} caracteres","formvalidator.email":"{field} deve ser um e-mail válido","formvalidator.url":"O {field} deve ser um URL válido","formvalidator.ip":"{field} não tem um endereço IP {param1} válido","formvalidator.phone":"{field} deve ser preenchido com um número de telefone {param1} válido.","formvalidator.credit_card":"{field} não tem um cartão de crédito {param1} válido","formvalidator.date":"{field} deve conter uma data no formato {param1}","formvalidator.alpha":"O campo {field} deve conter apenas caracteres alfabéticos","formvalidator.text":"O campo {field} deve conter apenas caracteres alfabéticos","formvalidator.latin":"O campo {field} deve conter apenas caracteres alfabéticos","formvalidator.alpha_numeric":"{field} deve conter apenas letras e números","formvalidator.alpha_dash":"{field} deve conter apenas letras e traços","formvalidator.digit":"{field} destina-se a ser preenchido com apenas um dígito","formvalidator.integer":"{field} deve conter um número inteiro","formvalidator.decimal":"{field} deve conter um número válido","formvalidator.numeric":"{field} deve conter um número válido","formvalidator.range":"{field} deve conter um número entre {param1} e {param2}","formvalidator.color":"{field} deve conter uma cor válida","formvalidator.matches":"{field} deve corresponder ao campo {param1}","formvalidator.validation_function_not_found":"[A regra {rule} não foi definida]"}},"en_US"); return i._name="FormElement_1",i._optionDefinition={label:["String",null],rules:["String",null],form:["Object"]},i.prototype={_init:function(){this._errors={},this._rules={},this._value=null,null===this._options.label&&(this._options.label=this._getLabel())},_getLabel:function(){var a=b.findUpwardsBySelector(this._element,".control-group label");return a?b.textContent(a):this._element.name||this._element.id||""},_parseRules:function(a){this._rules={},a=a.split("|");var b,c=a.length,d,e,f;if(c>0)for(b=0;c>b;b++)if(d=a[b])if(-1!==(f=d.indexOf("["))){e=d.substr(f+1),e=e.split("]"),e=e[0],e=e.split(",");for(var g=0,h=e.length;h>g;g++)e[g]="true"===e[g]?!0:"false"===e[g]?!1:e[g];e.splice(0,0,this.getValue()),d=d.substr(0,f),this._rules[d]=e}else this._rules[d]=[this.getValue()]},_addError:function(a){for(var b=this._rules[a]||[],c={field:this._options.label,value:this.getValue()},d=1;d"),this._errorMessages.push(f)},this)),!1)}},a.createUIComponent(j),j.FormElement=i,j.validationFunctions=k,j}),Ink.createModule("Ink.UI.ImageQuery","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Util.Array_1"],function(a,b,c,d){"use strict";function e(){a.BaseUIComponent.apply(this,arguments)}return e._name="ImageQuery_1",e._optionDefinition={src:["String"],retina:["String",void 0],queries:["Object"],onLoad:["Function",null]},e.prototype={_init:function(){var a;if(-1!==(a=this._element.src.lastIndexOf("?"))){var c=this._element.src.substr(a);this._filename=this._element.src.replace(c,"").split("/").pop()+c}else this._filename=this._element.src.split("/").pop();this._options.queries||(this._options.queries=[]),this._options.queries=d.sortMulti(this._options.queries,"width").reverse(),"function"==typeof this._options.onLoad&&b.observe(this._element,"load",Ink.bindEvent(this._onLoad,this)),this._onResize(),b.observe(window,"resize",b.throttle(Ink.bindMethod(this,"_onResize"),400))},_onResize:function(){if(this._options.queries.length){var a=this._findCurrentQuery();this._element.src=this.getQuerySrc(a)}},_findCurrentQuery:function(){for(var a=c.viewportWidth(),b=this._options.queries,d=b.length-1,e=0;d>e;e+=1)if(b[e].width<=a)return b[e];return b[d]},getQuerySrc:function(a){var b=a.src||this._options.src;if(window.devicePixelRatio>1&&void 0!==this._options.retina&&(b=a.retina||this._options.retina),a.file=this._filename,"function"==typeof b&&(b=b.apply(this,[this._element,a]),"string"!=typeof b))throw'[ImageQuery] :: "src" callback does not return a string';return b=b.replace(/{:(.*?)}/g,function(b,c){return a[c]}),delete a.file,b},_onLoad:function(){this._options.onLoad.call(this)}},a.createUIComponent(e),e}),Ink.createModule("Ink.UI.LazyLoad","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1"],function(a,b,c){"use strict";function d(){a.BaseUIComponent.apply(this,arguments)}return d._name="LazyLoad_1",d._optionDefinition={item:["String",".lazyload-item"],placeholder:["String",null],source:["String","data-src"],destination:["String","src"],delay:["Number",100],delta:["Number",0],image:["Boolean",!0],scrollElement:["Element",window],touchEvents:["Boolean",!0],onInsideViewport:["Function",!1],onAfterAttributeChange:["Function",!1],autoInit:["Boolean",!0]},d.prototype={_init:function(){this._aData=[],this._hasEvents=!1,this._options.autoInit&&this._activate()},_activate:function(){this._getData(),this._hasEvents||this._addEvents(),this._onScrollThrottled()},_getData:function(){for(var a=Ink.ss(this._options.item,this._element),b=null,d=0,e=a.length;e>d;d++)null==this._options.placeholder||c.hasAttribute(a[d],this._options.destination)||a[d].setAttribute(this._options.destination,this._options.placeholder),b=a[d].getAttribute(this._options.source),null===b&&this._options.image||this._aData.push({elm:a[d],original:b})},_addEvents:function(){this._onScrollThrottled=b.throttle(Ink.bindEvent(this._onScroll,this),this._options.delay),"ontouchmove"in document.documentElement&&this._options.touchEvents&&b.observe(document.documentElement,"touchmove",this._onScrollThrottled),b.observe(this._options.scrollElement,"scroll",this._onScrollThrottled),this._hasEvents=!0},_removeEvents:function(){"ontouchmove"in document.documentElement&&this._options.touchEvents&&b.stopObserving(document.documentElement,"touchmove",this._onScrollThrottled),b.stopObserving(this._options.scrollElement,"scroll",this._onScrollThrottled),this._hasEvents=!1},_onScroll:function(){for(var a,b=0;bthis.originalStatus[c]?this._modalDiv.style[h(c)]:Math.round(.9*b[c])+"px")},this)),this._resizeContainer(),this._reposition()},_onShadeClick:function(a){var f=b.element(a);if(f===this._modalShadow)this.dismiss();else if(c.hasClassName(f,"ink-close")||c.hasClassName(f,"ink-dismiss")||d.findUpwardsBySelector(f,".ink-close,.ink-dismiss")||this._options.closeOnClick&&(!d.descendantOf(this._shadeElement,f)||f===this._shadeElement)){for(var g=e.select(".ink-alert",this._shadeElement),h=g.length,i=0;h>i;i++)if(d.descendantOf(g[i],f))return;this.dismiss(),this._isOpen||b.stop(a)}},_onKeyDown:function(a){27===a.keyCode&&this._isOpen&&this._options.closeOnEscape&&k[k.length-1]===this&&(this.dismiss(),this._isOpen||b.stop(a))},_resizeContainer:function(){var a=d.elementHeight(this._modalDiv);this._modalHeader=e.select(".modal-header",this._modalDiv)[0],this._modalHeader&&(a-=d.elementHeight(this._modalHeader)),this._modalFooter=e.select(".modal-footer",this._modalDiv)[0],this._modalFooter&&(a-=d.elementHeight(this._modalFooter)),this._contentContainer.style.height=a+"px",a!==d.elementHeight(this._contentContainer)&&(this._contentContainer.style.height=~~(a-(d.elementHeight(this._contentContainer)-a))+"px"),this._markupMode},open:function(a){if(this.isOpen())return!1;a&&b.stop(a);var e="CSS1Compat"===document.compatMode?document.documentElement:document.body;c.addClassName(this._modalShadow,"ink-shade"),this._modalShadow.style.display=this._modalDiv.style.display="block",this._modalShadow.offsetHeight,c.addClassName(this._modalShadow,"visible"),c.addClassName(this._modalDiv,"visible"),this._contentElement=this._modalDiv,this._shadeElement=this._modalShadow,this._markupMode||this.setContentMarkup(this._options.markup);var i={width:-1!==(""+this._options.width).indexOf("%"),height:-1!==(""+this._options.height).indexOf("%")};f.forEach(["width","height"],Ink.bind(function(a){void 0!==this._options[a]?(this._modalDiv.style[a]=this._options[a],i[a]||(this._modalDiv.style[h(a)]=d["element"+g(a)](this._modalDiv)+"px")):this._modalDiv.style[h(a)]=d["element"+g(a)](this._modalDiv)+"px",i[a]&&parseInt(e["client"+h(a)],10)<=parseInt(this._modalDiv.style[a],10)&&(this._modalDiv.style[a]=Math.round(.9*parseInt(e["client"+h(a)],10))+"px")},this)),this.originalStatus={viewportHeight:d.elementHeight(e),viewportWidth:d.elementWidth(e),height:d.elementHeight(this._modalDiv),width:d.elementWidth(this._modalDiv)},this._options.responsive?(this._onResize(!0),b.observe(window,"resize",this._handlers.resize)):(this._resizeContainer(),this._reposition()),this._options.onShow&&this._options.onShow(this),b.observe(this._shadeElement,"click",this._handlers.click),this._options.closeOnEscape&&b.observe(document,"keydown",this._handlers.keyDown),this._isOpen=!0,k.push(this),c.addClassName(document.documentElement,"ink-modal-open")},isOpen:function(){return this._isOpen},dismiss:function(){if(this._isOpen){if(this._options.onDismiss){var a=this._options.onDismiss(this);if(a===!1)return}if(this._isOpen=!1,this._options.responsive&&b.stopObserving(window,"resize",this._handlers.resize),this._markupMode?(c.removeClassName(this._modalDiv,"visible"),c.removeClassName(this._modalShadow,"visible"),this._waitForFade(this._modalShadow,Ink.bind(function(){this._modalShadow.style.display="none"},this))):(this._modalShadow.parentNode.removeChild(this._modalShadow),this.destroy()),k=f.remove(k,f.keyValue(this,k),1),0===k.length){var d=document.documentElement;c.removeClassName(d,"ink-modal-open")}}},_waitForFade:function(a,d){if(!j)return d();if("ontransitionend"in a)return b.observeOnce(a,"transitionEnd",d);var e=5,f=function(){+c.getStyle(a,"opacity")>0&&e>0?(e--,setTimeout(f,250)):d()};setTimeout(f,500)},destroy:function(){a.unregisterInstance(this._instanceId)},getContentElement:function(){return this._contentContainer},setContentMarkup:function(a){if(this._markupMode)this._contentContainer.innerHTML=a;else{if(this._modalDiv.innerHTML=[a].join(""),this._contentContainer=e.select(".modal-body",this._modalDiv),!this._contentContainer.length){var b=e.select(".modal-header",this._modalDiv),g=e.select(".modal-footer",this._modalDiv);f.each(b,d.remove),f.each(g,d.remove);var h=document.createElement("div");c.addClassName(h,"modal-body"),h.innerHTML=this._modalDiv.innerHTML,this._modalDiv.innerHTML="";var i=b.concat([h]).concat(g);f.each(i,Ink.bindMethod(this._modalDiv,"appendChild")),this._contentContainer=e.select(".modal-body",this._modalDiv)}this._contentContainer=this._contentContainer[0]}this._contentElement=this._modalDiv,this._resizeContainer()}},a.createUIComponent(i,{elementIsOptional:!0}),i}),Ink.createModule("Ink.UI.Pagination","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1"],function(a,b,c,d,e){"use strict";function f(){a.BaseUIComponent.apply(this,arguments)}var g=function(a,b,c){var d=document.createElement("a");if(d.setAttribute("href","#"),"number"==typeof b&&d.setAttribute("data-index",b),c&&c.wrapText){var e=document.createElement("span");d.appendChild(e),e.innerHTML=a}else d.innerHTML=a;return d};return f._name="Pagination_1",f._optionDefinition={size:["Integer",null],totalItemCount:["Integer",null],itemsPerPage:["Integer",null],maxSize:["Integer",null],start:["Integer",1],sideButtons:["Boolean",1],firstLabel:["String","First"],lastLabel:["String","Last"],previousLabel:["String","Previous"],nextLabel:["String","Next"],previousPageLabel:["String",null],nextPageLabel:["String",null],onChange:["Function",void 0],hashParameter:["String","page"],parentTag:["String","ul"],childTag:["String","li"],wrapperClass:["String","ink-navigation"],paginationClass:["String","pagination"],activeClass:["String","active"],disabledClass:["String","disabled"],hideClass:["String","hide-all"],previousClass:["String","previous"],previousPageClass:["String","previousPage"],nextClass:["String","next"],nextPageClass:["String","nextPage"],firstClass:["String","first"],lastClass:["String","last"],numberFormatter:["Function",function(a){return a+1}],autoWrap:["Boolean",!1]},f.prototype={_init:function(){this._options.previousPageLabel||(this._options.previousPageLabel=this._options.previousLabel+" "+this._options.maxSize),this._options.nextPageLabel||(this._options.nextPageLabel=this._options.nextLabel+" "+this._options.maxSize),this._handlers={click:Ink.bindEvent(this._onClick,this)},a.isInteger(this._options.totalItemCount)&&a.isInteger(this._options.itemsPerPage)?this._size=this._calculateSize(this._options.totalItemCount,this._options.itemsPerPage):a.isInteger(this._options.size)?this._size=this._options.size:(Ink.error("Ink.UI.Pagination: Please supply a size option or totalItemCount and itemsPerPage options."),this._size=0),this._current=this._options.start-1,this._itemLiEls=[],this._generateMarkup(this._element),this._updateItems(),this._observe()},_observe:function(){b.observeDelegated(this._element,"click","."+this._options.paginationClass+" > "+this._options.childTag,this._handlers.click)},_calculateSize:function(a,b){return Math.ceil(a/b)},_updateItems:function(){var a=this._itemLiEls,b=this._size===a.length,d,e,f;if(b)for(d=0,e=this._size;e>d;++d)c.setClassName(a[d],this._options.activeClass,d===this._current);else{for(d=a.length-1;d>=0;--d)this._ulEl.removeChild(a[d]);for(a=[],d=0,e=this._size;e>d;++d)f=document.createElement(this._options.childTag),f.appendChild(g(this._options.numberFormatter(d,this._size),d)),c.setClassName(f,this._options.activeClass,d===this._current),this._nextEl?this._ulEl.insertBefore(f,this._nextEl):this._ulEl.appendChild(f),a.push(f);this._itemLiEls=a}if(this._options.maxSize){var h=Math.floor(this._current/this._options.maxSize),i=this._options.maxSize*h,j=i+this._options.maxSize-1;for(d=0,e=this._size;e>d;++d)f=a[d],c.setClassName(f,this._options.hideClass,i>d||d>j);this._pageStart=i,this._pageEnd=j,this._page=h,c.setClassName(this._prevPageEl,this._options.disabledClass,!this.hasPreviousPage()),c.setClassName(this._nextPageEl,this._options.disabledClass,!this.hasNextPage()),c.setClassName(this._firstEl,this._options.disabledClass,this.isFirst()),c.setClassName(this._lastEl,this._options.disabledClass,this.isLast())}this._prevEl&&!this._options.autoWrap&&c.setClassName(this._prevEl,this._options.disabledClass,!this.hasPrevious()),this._nextEl&&!this._options.autoWrap&&c.setClassName(this._nextEl,this._options.disabledClass,!this.hasNext())},_generateMarkup:function(a){c.addClassName(a,"ink-navigation");var b=Ink.s("."+this._options.paginationClass,a),d=!1;b?d=!0:(b=document.createElement(this._options.parentTag),c.addClassName(b,this._options.paginationClass));var e=c.hasClassName(b,"chevron"),f=c.hasClassName(b,"dotted"),h=Ink.bind(function(a,d){var e=document.createElement(this._options.childTag),f=g(this._options[a+"Label"],void 0,{wrapText:d&&d.wrapText});return c.addClassName(e,this._options[a+"Class"]),e.appendChild(f),b.appendChild(e),e},this);!f&&this._options.maxSize&&(this._firstEl=h("first"),this._prevPageEl=h("previousPage")),(f&&this._options.sideButtons===!0||!f&&this._options.sideButtons)&&(this._prevEl=h("previous",{wrapText:e}),this._nextEl=h("next",{wrapText:e})),!f&&this._options.maxSize&&(this._nextPageEl=h("nextPage"),this._lastEl=h("last")),d||a.appendChild(b),this._ulEl=b},_onClick:function(a){b.stop(a);var d=b.element(a);if(!c.hasClassName(d,this._options.activeClass)&&!c.hasClassName(d,this._options.disabledClass)){var f=c.hasClassName(d,this._options.previousClass),g=c.hasClassName(d,this._options.nextClass),h=c.hasClassName(d,this._options.previousPageClass),i=c.hasClassName(d,this._options.nextPageClass),j=c.hasClassName(d,this._options.firstClass),k=c.hasClassName(d,this._options.lastClass);if(j)this.setCurrent(0);else if(k)this.setCurrent(this._size-1);else if(h||i)this.setCurrent((h?-1:1)*this._options.maxSize,!0,!!this._options.autoWrap);else if(f||g)this.setCurrent(f?-1:1,!0,!!this._options.autoWrap);else{var l=e.select("[data-index]",d)[0],m=l&&parseInt(l.getAttribute("data-index"),10);this.setCurrent(m)}}},setOnChange:function(a){if(a&&"function"!=typeof a)throw new TypeError("onChange option must be a function!");this._options.onChange=a},setSize:function(b){if(!a.isInteger(b))throw new TypeError("1st argument must be an integer number!");this._size=b,this._updateItems(),this._current=0},setSizeInItems:function(a,b){var c=Math.ceil(a/b);this.setSize(c)},setCurrent:function(b,c,d){if(!a.isInteger(b))throw new TypeError("1st argument must be an integer number!");c&&(b+=this._current),d?(b%=this._size,0>b&&(b+=this._size)):(b>this._size-1&&(b=this._size-1),0>b&&(b=0)),this._current=b,this._updateItems(),this._options.onChange&&this._options.onChange(this,b)},next:function(a){this.setCurrent(1,!0,a)},previous:function(a){this.setCurrent(-1,!0,a)},getSize:function(){return this._size},getCurrent:function(){return this._current},isFirst:function(){return 0===this._current},isLast:function(){return this._current===this._size-1},hasPrevious:function(){return this._current>0},hasNext:function(){return this._currentthis._options.maxSize-1},hasNextPage:function(){return this._options.maxSize&&this._size-this._current>=this._options.maxSize+1},destroy:a.destroyComponent},a.createUIComponent(f),f}),Ink.createModule("Ink.UI.ProgressBar","1",["Ink.UI.Common_1","Ink.Dom.Selector_1"],function(a,b){"use strict";function c(){a.BaseUIComponent.apply(this,arguments)}return c._name="ProgressBar_1",c._optionDefinition={startValue:["Number",0],onStart:["Function",function(){}],onEnd:["Function",function(){}]},c.prototype={_init:function(){if(this._value=this._options.startValue,this._elementBar=b.select(".bar",this._element),this._elementBar.length<1)throw new Error("[Ink.UI.ProgressBar] :: Bar element not found");this._elementBar=this._elementBar[0],this.setValue(this._options.startValue)},setValue:function(a){this._options.onStart.call(this,this._value),a=parseInt(a,10),isNaN(a)||0>a?a=0:a>100&&(a=100),this._value=a,this._elementBar.style.width=this._value+"%",this._options.onEnd.call(this,this._value)}},a.createUIComponent(c),c}),Ink.createModule("Ink.UI.SmoothScroller","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Dom.Css_1"],function(a,b,c,d,e){"use strict";var f=window.requestAnimationFrame||function(a){return setTimeout(a,10)},g=window.cancelAnimationFrame||function(a){clearTimeout(a)},h={speed:10,changeHash:!0,margin:0,scroll:function(a,b){var d=Math.round(c.scrollHeight()),e=Math.round(a-(b.margin||0));d+=e>d?Math.ceil((e-d)/b.speed):(e-d)/b.speed,g(h.interval),d!==e&&h.offsetTop!==d?h.interval=f(Ink.bindMethod(h,"scroll",a,b),document.body):h.onDone(b),window.scrollTo(0,d),h.offsetTop=d},init:function(a){b.on(document,"click",a||"a.scrollableLink, a.ink-smooth-scroll",h.onClick)},render:function(){},onClick:function(b){var d=b.currentTarget,f=(location+"").replace(/#.*?$/,""),g=(d.href+"").replace(/#.*?$/,"");if(g===f){var i=d.getAttribute("data-hash")||(d.getAttribute("href")||"").replace(/^.*?#/,"");if(i){b.preventDefault();var j="ul > li.active > "+k,k='a[name="'+i+'"],#'+i,l=Ink.s(k),m=Ink.s(j);if(m=m&&m.parentNode,l){e.hasClassName(d.parentNode,"active")||(m&&e.removeClassName(m,"active"),e.addClassName(d.parentNode,"active"));var n=a.options("SmoothScroller link options",{margin:["Number",h.margin],speed:["Number",h.speed],changeHash:["Boolean",h.changeHash]},{},d);h.hash=i,h.scroll(c.offsetTop(l),n)}}}},onDone:function(a){a.changeHash===!0&&(window.location.hash=h.hash),h.hash=h.offsetTop=null}};return h}),Ink.createModule("Ink.UI.SortableList","1",["Ink.UI.Common_1","Ink.Dom.Css_1","Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Dom.Selector_1"],function(a,b,c,d,e){"use strict";function f(){a.BaseUIComponent.apply(this,arguments)}var g="ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0;return f._name="SortableList_1",f._optionDefinition={placeholderClass:["String","placeholder"],draggedClass:["String","hide-all"],draggingClass:["String","dragging"],dragSelector:["String","> li"],handleSelector:["String",":not(button, button *, a[href], a[href] *)"],moveSelector:["String",!1],swap:["Boolean",!1],cancelMouseOut:["Boolean",!1],onDrop:["Function",function(){}]},f.prototype={_init:function(){this._handlers={down:Ink.bind(this._onDown,this),move:Ink.bind(this._onMove,this),up:Ink.bind(this._onUp,this)},this._isMoving=!1,this._down=g?"touchstart mousedown":"mousedown",this._move=g?"touchmove mousemove":"mousemove",this._up=g?"touchend mouseup":"mouseup",this._observe()},_observe:function(){c.on(this._element,this._down,this._options.dragSelector,this._handlers.down),c.on(this._element,this._move,this._options.dragSelector,this._handlers.move),this._options.cancelMouseOut&&c.on(this._element,"mouseleave",Ink.bind(this.stopMoving,this)),c.on(document.documentElement,this._up,this._handlers.up)},_onDown:function(a){if(!(this._isMoving||this._placeholder||this._options.handleSelector&&!e.matchesSelector(a.target,this._options.handleSelector))){var b=a.currentTarget;return this._isMoving=b,this._placeholder=b.cloneNode(!0),this._movePlaceholder(b),this._addMovingClasses(),!1}},_onMove:function(a){var b=a.currentTarget;if("touchmove"===a.type){var c=a.touches[0];b=document.elementFromPoint(c.clientX,c.clientY),b=d.findUpwardsBySelector(b,this._options.dragSelector)}this.validateMove(b),a.preventDefault()},_onUp:function(a){return this._isMoving&&this._placeholder&&a.currentTarget!==this._isMoving&&a.currentTarget!==this._placeholder?(d.insertBefore(this._isMoving,this._placeholder),this.stopMoving(),this._options.onDrop.call(this,{droppedElement:a.currentTarget}),!1):void 0},_addMovingClasses:function(){b.addClassName(this._placeholder,this._options.placeholderClass),b.addClassName(this._isMoving,this._options.draggedClass),b.addClassName(document.documentElement,this._options.draggingClass)},_removeMovingClasses:function(){this._isMoving&&b.removeClassName(this._isMoving,this._options.draggedClass),this._placeholder&&b.removeClassName(this._placeholder,this._options.placeholderClass),b.removeClassName(document.documentElement,this._options.draggingClass)},_movePlaceholder:function(a){var b=this._placeholder,c,e,f,g;b?this._options.swap?(d.insertAfter(b,a),d.insertBefore(a,this._isMoving),d.insertBefore(this._isMoving,b)):(c=d.offset(a),e=d.offset(this._placeholder),f=c[1]>e[1],g=c[0]>e[0],f&&g||!f&&!g?d.insertBefore(b,a):d.insertAfter(b,a),d.insertBefore(this._isMoving,b)):d.insertAfter(b,a)},destroy:a.destroyComponent,stopMoving:function(){this._removeMovingClasses(),d.remove(this._placeholder),this._placeholder=!1,this._isMoving=!1},validateMove:function(a){a&&this._isMoving&&this._placeholder&&a!==this._placeholder&&a!==this._isMoving&&(!this._options.moveSelector||e.matchesSelector(a,this._options.moveSelector)?this._movePlaceholder(a):this.stopMoving())}},a.createUIComponent(f),f}),Ink.createModule("Ink.UI.Spy","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1"],function(a,b,c,d,e){"use strict";function f(a){for(var b=0,c=m.length;c>b;b++)if(m[b][0]===a)return b;return null}function g(a,b){var c=f(b);null===c?m.push([b,[a]]):m[c][1].push(a)}function h(){n||(n=!0,b.observe(document,"scroll",b.throttle(i,300)))}function i(){for(var a=0,b=m.length;b>a;a++)j(m[a][0],m[a][1])}function j(a,b){for(var f=k(b),g=e.select("li.active",a),h=0,i=g.length;i>h;h++)c.removeClassName(g[h],"active");if(null!==f){var j='a[href$="#'+(f.name||f.id)+'"]',l=e.select(j,a);for(h=0,i=l.length;i>h;h++)c.addClassName(d.findUpwardsByTag(l[h],"li"),"active")}}function k(a){for(var b=-1/0,c,d,e=0,f=a.length;f>e;e++)d=a[e].getBoundingClientRect(),d.top<=0&&d.top>b&&(b=d.top,c=e);return void 0===c?null:a[c]}function l(){a.BaseUIComponent.apply(this,arguments)}var m=[],n=!1;return l._name="Spy_1",l._optionDefinition={target:["Element",void 0],activeClass:["String","active"]},l.prototype={_init:function(){g(this._element,this._options.target),h(),i()}},a.createUIComponent(l),l}),Ink.createModule("Ink.UI.Stacker",1,["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1"],function(a,b,c){"use strict";function d(){a.BaseUIComponent.apply(this,arguments)}return d._name="Stacker_1",d._optionDefinition={column:["String",".stacker-column"],item:["String",".stacker-item"],customBreakPoints:["Object",null],largeMax:["Number",Number.MAX_VALUE],largeMin:["Number",961],mediumMax:["Number",960],mediumMin:["Number",651],smallMax:["Number",650],smallMin:["Number",0],largeCols:["Integer",3],mediumCols:["Integer",2],smallCols:["Integer",1],isOrdered:["Boolean",!0],onRunCallback:["Function",null],onResizeCallback:["Function",null],onAPIReloadCallback:["Function",null]},d.prototype={_init:function(){this._aList=[],this._curLayout="large",this._runFirstTime=!1,this._getPageItemsToList(),(this._canApplyLayoutChange()||!this._runFirstTime)&&(this._runFirstTime=!0,this._applyLayoutChange(),"function"==typeof this._options.onRunCallback&&this._options.onRunCallback(this._curLayout)),this._addEvents()},addItem:function(a){this._aList.push(a)},reloadItems:function(){this._applyLayoutChange(),"function"==typeof this._options.onAPIReloadCallback&&this._options.onAPIReloadCallback(this._curLayout)},_addEvents:function(){b.observe(window,"resize",Ink.bindEvent(this._onResize,this))},_onResize:function(){this._canApplyLayoutChange()&&(this._removeDomItems(),this._applyLayoutChange(),"function"==typeof this._options.onResizeCallback&&this._options.onResizeCallback(this._curLayout))},_setCurLayout:function(){var a=c.viewportWidth();if(this._options.customBreakpoints&&"object"==typeof this._options.customBreakPoints){for(var b in this._options.customBreakPoints)if(this._options.customBreakPoints.hasOwnProperty(b)&&a>=Number(this._options.customBreakPoints[b].min)&&a<=Number(this._options.customBreakPoints[b].max)&&this._curLayout!==b)return void(this._curLayout=b)}else a<=Number(this._options.largeMax)&&a>=Number(this._options.largeMin)&&"large"!==this._curLayout?this._curLayout="large":a>=Number(this._options.mediumMin)&&a<=Number(this._options.mediumMax)&&"medium"!==this._curLayout?this._curLayout="medium":a>=Number(this._options.smallMin)&&a<=Number(this._options.smallMax)&&"small"!==this._curLayout&&(this._curLayout="small") },_getColumnsToShow:function(){return Number(this._options.customBreakPoints&&"object"==typeof this._options.customBreakPoints?this._options.customBreakPoints[this._curLayout].cols:this._options[this._curLayout+"Cols"])},_canApplyLayoutChange:function(){var a=this._curLayout;return this._setCurLayout(),a!==this._curLayout?!0:!1},_getPageItemsToList:function(){this._aColumn=Ink.ss(this._options.column,this._element);var a=this._aColumn.length,b=0;if(a>0){for(var c=0;c0&&this._options.isOrdered){for(var f=[],g=0;g0)for(var b=0;a>b;b++)for(var c=Ink.ss(this._options.item,this._aColumn[b]),d=c.length-1;d>=0;d--)c[d].parentNode.removeChild(c[d])},_applyLayoutChange:function(){var a=this._getColumnsToShow(),b=this._aList.length,c=0,d=0;if(a>0)for(;a>d;){if(this._aColumn[d].appendChild(this._aList[c]),c++,d++,c===b)return;d===a&&(d=0)}}},a.createUIComponent(d),d}),Ink.createModule("Ink.UI.Sticky","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Dom.Css_1"],function(a,b,c,d){"use strict";function e(){a.BaseUIComponent.apply(this,arguments)}return e._name="Sticky_1",e._optionDefinition={offsetBottom:["Integer",0],offsetTop:["Integer",0],topElement:["Element",null],wrapperClass:["String","ink-sticky-wrapper"],stickyClass:["String","ink-sticky-stuck"],inlineDimensions:["Boolean",!0],inlinePosition:["Boolean",!0],bottomElement:["Element",null],activateInLayouts:["String",null]},e.prototype={_init:function(){this._options.activateInLayouts&&(this._options.activateInLayouts=this._options.activateInLayouts.toString()),this._dims=null,this._options.offsetTop=parseInt(this._options.offsetTop,10)||0,this._options.offsetBottom=parseInt(this._options.offsetBottom,10)||0,this._options.topElement&&(this._options.topElement=a.elOrSelector(this._options.topElement,"Top Element")),this._options.bottomElement&&(this._options.bottomElement=a.elOrSelector(this._options.bottomElement,"Sticky bottom Element")),this._wrapper=c.create("div",{className:this._options.wrapperClass}),c.wrap(this._element,this._wrapper);var d=document.addEventListener?document:window;this._onScroll=Ink.bind(b.throttle(this._onScroll,33),this),b.observe(d,"scroll",this._onScroll),b.observe(window,"resize",Ink.bindEvent(b.throttle(this._onResize,100),this)),this._onScroll()},_isDisabledInLayout:function(){if(!this._options.activateInLayouts)return!1;var b=a.currentLayout();return b?-1===this._options.activateInLayouts.indexOf(b):!1},_onScroll:function(){var a=this._getDims(),b=c.scrollHeight(),d=this._isDisabledInLayout()||b<=a.top-this._options.offsetTop||this._options.topElement&&this._options.topElement.getBoundingClientRect().bottom+this._options.offsetTop>0;if(d)return void this._unstick();var e=this._options.offsetTop+a.height+c.scrollHeight(),f=document.body.scrollHeight;this._options.bottomElement&&(f=this._options.bottomElement.getBoundingClientRect().top+c.scrollHeight()),f-=this._options.offsetBottom,this._stickTo(f>e?"screen":"bottom")},_stickTo:function(a){var b=this._element.style,e=this._getDims();if(d.addClassName(this._element,this._options.stickyClass),this._wrapper.style.height=e.height+"px",this._inlineDimensions(e.height+"px",e.width+"px"),this._options.inlinePosition!==!1)if(b.left=e.left+"px","screen"===a)b.bottom=null,b.top=this._options.offsetTop+"px";else if("bottom"===a){var f=this._getBottomOffset(),g=c.scrollHeight()+c.viewportHeight(),h=c.pageHeight()-g;b.bottom=f-h+"px",b.top="auto"}},_unstick:function(){d.removeClassName(this._element,this._options.stickyClass),this._inlineDimensions(null,null),this._options.inlinePosition&&(this._element.style.left=null,this._element.style.top=null,this._element.style.bottom=null),this._wrapper.style.height=null,this._wrapper.style.width=null,this._dims=null},_onResize:function(){this._dims=null,this._onScroll()},_getDims:function(){if(null!==this._dims)return this._dims;var a=this._element.style,b=a.position,d=a.width;a.position="static",a.width=null;var e=c.outerDimensions(this._element),f=this._wrapper.getBoundingClientRect();return this._dims={height:e[1],width:e[0],left:f.left+c.scrollWidth(),top:f.top+c.scrollHeight()},a.position=b,a.width=d,this._dims},_inlineDimensions:function(a,b){this._options.inlineDimensions&&(this._element.style.height=a,this._element.style.width=b)},_getBottomOffset:function(){var a=this._options.offsetBottom;return this._options.bottomElement&&(a+=c.pageHeight()-c.offsetTop(this._options.bottomElement)),a}},a.createUIComponent(e),e}),Ink.createModule("Ink.UI.Swipe","1",["Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.UI.Common_1"],function(a,b,c){"use strict";function d(){"function"==typeof arguments[1]&&(arguments[1]={onEnd:arguments[1]}),c.BaseUIComponent.apply(this,arguments)}return d._name="Swipe_1",d._optionDefinition={onEnd:["Function",void 0],onStart:["Function",void 0],onMove:["Function",void 0],minDist:["Number",void 0],maxDist:["Number",void 0],minDuration:["Number",void 0],maxDuration:["Number",void 0],axis:["String",void 0],storeGesture:["Boolean",!1],stopEvents:["Boolean",!0]},d.prototype={_supported:"ontouchstart"in document.documentElement,_init:function(){this._handlers={down:Ink.bindEvent(this._onDown,this),move:Ink.bindEvent(this._onMove,this),up:Ink.bindEvent(this._onUp,this)};var b=document.body;a.observe(b,"touchstart",this._handlers.down),(this._options.storeGesture||this._options.onMove)&&a.observe(b,"touchmove",this._handlers.move),a.observe(b,"touchend",this._handlers.up),this._isOn=!1},_isMeOrParent:function(a,b){if(a){do{if(a===b)return!0;a=a.parentNode}while(a);return!1}},_pushGesture:function(a,b){this._options.storeGesture&&(this._gesture.push(a),this._time.push(b))},_onDown:function(b){1===b.changedTouches.length&&this._isMeOrParent(b.target,this._element)&&(this._options.stopEvents===!0&&a.stop(b),b=b.changedTouches[0],this._isOn=!0,this._target=b.target,this._t0=+new Date,this._p0=[b.pageX,b.pageY],this._options.storeGesture&&(this._gesture=[],this._time=[]),this._pushGesture(this._p0,0),this._options.onStart&&this._options.onStart({event:b,element:this._element,instance:this,position:this._p0,dt:0}))},_onMove:function(b){if(this._isOn&&1===b.changedTouches.length){this._options.stopEvents===!0&&a.stop(b),b=b.changedTouches[0];var c=+new Date,d=c-this._t0,e=[b.pageX,b.pageY];this._pushGesture(e,d),this._options.onMove&&this._options.onMove({event:b,element:this._element,instance:this,position:e,dt:d})}},_onUp:function(b){if(this._isOn&&1===b.changedTouches.length){this._options.stopEvents===!0&&a.stop(b),b=b.changedTouches[0],this._isOn=!1;var c=+new Date,d=[b.pageX,b.pageY],e=c-this._t0,f=[d[0]-this._p0[0],d[1]-this._p0[1]],g=Math.sqrt(f[0]*f[0]+f[1]*f[1]),h=Math.abs(f[0])>Math.abs(f[1])?"x":"y",i=this._options;i.minDist&&gi.maxDist||i.minDuration&&ei.maxDuration||i.axis&&h!==i.axis||this._options.onEnd&&this._options.onEnd({event:b,element:this._element,instance:this,gesture:this._gesture,time:this._time,axis:h,overallMovement:f,overallTime:e})}}},c.createUIComponent(d),d}),Ink.createModule("Ink.UI.Table","1",["Ink.Util.Url_1","Ink.UI.Pagination_1","Ink.Net.Ajax_1","Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1","Ink.Util.String_1","Ink.Util.Json_1"],function(a,b,c,d,e,f,g,h,i,j,k){"use strict";function l(a){return!isNaN(a)&&r.test(a)?parseInt(a,10):isNaN(a)?a:parseFloat(a)}function m(a,b){return a===b?0:a>b?1:-1}function n(a,b){var c=l(g.textContent(a)),d=l(g.textContent(b));return typeof c==typeof d?m(c,d):"number"==typeof c?1:-1;return m(c,d)}function o(a){if("undefined"!=typeof Object.keys)return Object.keys(a);var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(c);return b}function p(){d.BaseUIComponent.apply(this,arguments)}function q(a){return a}var r=/\d/g;return p._name="Table_1",p._optionDefinition={pageSize:["Integer",null],caretUpClass:["String","fa fa-caret-up"],caretDownClass:["String","fa fa-caret-down"],endpoint:["String",null],createEndpointUrl:["Function",null],createEndpointURL:["Function",null],getDataFromEndPoint:["Function",null],getDataFromEndpoint:["Function",null],processJSONRows:["Function",function(a){return"number"==typeof a.length?a:a.rows||null}],processJSONRow:["Function",q],processJSONField:["Function",q],processJSONHeaders:["Function",function(a){return a.fields}],processJSONTotalRows:["Function",function(a){return a.totalRows||a.length}],getSortKey:["Function",null],pagination:["Element",null],allowResetSorting:["Boolean",!1],visibleFields:["String",null],tdClassNames:["Object",{}],paginationOptions:["Object",null]},p.prototype={_validate:function(){if("table"!==this._element.nodeName.toLowerCase())throw new Error("[Ink.UI.Table] :: The element is not a table")},_init:function(){this._options.createEndpointUrl&&(this._options.createEndpointURL=this._options.createEndpointUrl),this._options.getDataFromEndPoint&&(this._options.getDataFromEndpoint=this._options.getDataFromEndpoint),this._markupMode=!this._options.endpoint,this._options.visibleFields&&(this._options.visibleFields=this._options.visibleFields.toString().split(/[, ]+/g)),this._thead=this._element.tHead||this._element.createTHead(),this._headers=h.select("th",this._thead),this._handlers={thClick:null},this._originalFields=[],this._sortableFields={},this._originalData=this._data=[],this._pagination=null,this._totalRows=0,this._handlers.thClick=e.on(this._element,"click",'thead th[data-sortable="true"]',Ink.bindMethod(this,"_onThClick")),this._markupMode?(this._resetSortOrder(),this._addHeadersClasses(),this._data=h.select("tbody tr",this._element),this._originalData=this._data.slice(0),this._totalRows=this._data.length,this._setPagination()):this._getData()},_addHeadersClasses:function(){for(var a,b,c=0,d=this._headers.length;d>c;c++)a=g.textContent(this._headers[c]),b=this._options.tdClassNames[a],b&&f.addClassName(this._headers[c],b)},_onThClick:function(a){var b=e.element(a),c=void 0!==this._options.pageSize;e.stop(a);var d=i.keyValue(b,this._headers,!0),f=d!==!1&&void 0!==this._sortableFields[d];if(f)if(!this._markupMode&&c)this._invertSortOrder(d,!1);else{"desc"===this._sortableFields[d]&&this._options.allowResetSorting?(this._setSortOrderOfColumn(d,null),this._data=this._originalData.slice(0)):this._invertSortOrder(d,!0);var g=h.select("tbody",this._element)[0];i.each(this._data,function(a){g.appendChild(a)}),this._pagination&&(this._pagination.setCurrent(0),this._paginate(1))}},_invertSortOrder:function(a,b){for(var c="asc"===this._sortableFields[a],d=0,e=this._headers.length;e>d;d++)this._setSortOrderOfColumn(d,null);b&&(this._sort(a),c&&this._data.reverse()),this._setSortOrderOfColumn(a,!c)},_setSortOrderOfColumn:function(a,b){var c=this._headers[a],d=[""],e="none";b===!0?(d=[''],e="asc"):b===!1&&(d=[''],e="desc"),this._sortableFields[a]=e,c.innerHTML=g.textContent(c)+d.join("")},_paginate:function(a){if(this._pagination){var b=this._options.pageSize,c=(a-1)*b,d=c+b;i.each(this._data,function(a,b){b>=c&&d>b?f.removeClassName(a,"hide-all"):f.addClassName(a,"hide-all")})}},_registerFieldNames:function(a){this._originalFields=[],i.forEach(a,Ink.bind(function(a){this._fieldIsVisible(a)&&this._originalFields.push(a)},this))},_fieldIsVisible:function(a){return!this._options.visibleFields||-1!==this._options.visibleFields.indexOf(a)},_sort:function(a){function b(b){return d.call(e,{columnIndex:a,columnName:c,data:g.textContent(b),element:b})}var c=g.textContent(this._headers[a]),d=this._options.getSortKey;d&&(d="function"==typeof d[c]?d[c]:"function"==typeof d?d:null);var e=this;this._data.sort(function(c,e){var f=Ink.ss("td",c)[a],g=Ink.ss("td",e)[a];return d?m(b(f),b(g)):n(f,g,a)})},_createHeadersFromJson:function(a){if(this._registerFieldNames(o(a)),!this._thead.children.length)for(var b=this._thead.insertRow(0),c,d=0,e=a.length;e>d;d++)this._fieldIsVisible(a[d])&&(c=g.create("th"),c=this._createSingleHeaderFromJson(a[d],c),b.appendChild(c),this._headers.push(c))},_createSingleHeaderFromJson:function(a,b){return a.sortable&&b.setAttribute("data-sortable","true"),a.label&&g.setTextContent(b,a.label),b},_resetSortOrder:function(){for(var a=0,b=this._headers.length;b>a;a++){var c=g.data(this._headers[a]);c.sortable&&"true"===c.sortable.toString()&&(this._sortableFields[a]="none")}},_createRowsFromJSON:function(a){var b=h.select("tbody",this._element)[0];b?g.setHTML(b,""):(b=document.createElement("tbody"),this._element.appendChild(b)),this._data=[];var c;for(var d in a)a.hasOwnProperty(d)&&(c=this._options.processJSONRow(a[d]),this._createSingleRowFromJson(b,c,d));this._originalData=this._data.slice(0)},_createSingleRowFromJson:function(a,b,c){var d=document.createElement("tr");a.appendChild(d);for(var e in b)b.hasOwnProperty(e)&&this._createFieldFromJson(d,b[e],e,c);this._data.push(d)},_createFieldFromJson:function(a,b,c,d){if(this._fieldIsVisible(c)){var e=this._options.processJSONField[c]||this._options.processJSONField,g;g="function"==typeof e?e(b,c,d):b;var h=this._elOrFieldData(g),i=this._options.tdClassNames[c];i&&f.addClassName(h,i),a.appendChild(h)}},_elOrFieldData:function(a){if(d.isDOMElement(a))return a;var b="string"==typeof a,c="number"==typeof a,e=g.create("td");if(b&&/^\s*? li.active",this._menu),h=0,i=g.length;i>h;h++)g[h]!==a&&c.removeClassName(g[h],"active");return this._activeMenuTab&&(c.removeClassName(this._activeMenuTab,"active"),c.removeClassName(this._activeSection,"active"),c.addClassName(this._activeSection,"hide-all")),this._activeMenuLink=a,this._activeMenuTab=this._activeMenuLink.parentNode,this._activeSection=e.select(f,this._element)[0],this._activeSection?(c.addClassName(this._activeMenuTab,"active"),c.addClassName(this._activeSection,"active"),c.removeClassName(this._activeSection,"hide-all"),void(b&&"undefined"!=typeof this._options.onChange&&this._options.onChange(this))):void(this._activeMenuLink=this._activeMenuTab=this._activeSection=null)},_onTabClickedGeneric:function(a){a.preventDefault();var b=!c.hasClassName(a.currentTarget,"ink-disabled")&&a.currentTarget!==this._activeMenuLink;b&&this._onTabClicked(a.currentTarget)},_onTabClicked:function(a){var b=a.getAttribute("href")||"";b=b.substr(b.indexOf("#")),b&&null!==Ink.i(this._dehashify(b))&&a!==this._activeMenuLink&&this.changeTab(a)},_hashify:function(a){return a?0===a.indexOf("#")?a:"#"+a:""},_dehashify:function(a){return a?(""+a).replace(/^#/,""):""},_findLinkByHref:function(a){if(!a)return null;if(1===a.nodeType){if(d.isAncestorOf(a,this._element))return null;for(var b=e.select("a",this._menu),c=a.getAttribute("id"),f=0,g=b.length;g>f;f++){if(b[f]===a||d.isAncestorOf(a,b[f]))return b[f];if(c&&c===this._dehashify(b[f].hash))return b[f]}return null}return a=this._hashify(a),e.select('a[href$="'+a+'"]',this._menu)[0]||null},changeTab:function(a){a=this._findLinkByHref(a),a&&!c.hasClassName(a,"ink-disabled")&&this._changeTab(a,!0)},disable:function(a){c.addClassName(this._findLinkByHref(a),"ink-disabled")},enable:function(a){c.removeClassName(this._findLinkByHref(a),"ink-disabled")},activeTab:function(){return this._activeSection.getAttribute("id")},activeMenuLink:function(){return this._activeMenuLink},activeSection:function(){return this._activeSection},destroy:a.destroyComponent},a.createUIComponent(f),f}),Ink.createModule("Ink.UI.TagField","1",["Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Browser_1","Ink.UI.Droppable_1","Ink.Util.Array_1","Ink.Dom.Selector_1","Ink.UI.Common_1"],function(a,b,c,d,e,f,g,h){"use strict";function i(){h.BaseUIComponent.apply(this,arguments)}var j=13,k=8,l=function(a){return!!a},m=1==="s,".split(/,/g).length,n=function(){var a=String.prototype.split,b=void 0===/()??/.exec("")[1],c;return c=function(c,d,e){if("[object RegExp]"!==Object.prototype.toString.call(d))return a.call(c,d,e);var f=[],g=(d.ignoreCase?"i":"")+(d.multiline?"m":"")+(d.extended?"x":"")+(d.sticky?"y":""),h=0,d=new RegExp(d.source,g+"g"),i,j,k,l;for(c+="",b||(i=new RegExp("^"+d.source+"$(?!\\s)",g)),e=void 0===e?-1>>>0:e>>>0;(j=d.exec(c))&&(k=j.index+j[0].length,!(k>h&&(f.push(c.slice(h,j.index)),!b&&j.length>1&&j[0].replace(i,function(){for(var a=1;a1&&j.index=e)));)d.lastIndex===j.index&&d.lastIndex++;return h===c.length?(l||!d.test(""))&&f.push(""):f.push(c.slice(h)),f.length>e?f.slice(0,e):f}}();return i._name="TagField_1",i._optionDefinition={tags:["String",[]],tagQuery:["Object",null],tagQueryAsync:["Object",null],allowRepeated:["Boolean",!1],maxTags:["Integer",-1],outSeparator:["String",","],separator:["String",/[,; ]+/g],autoSplit:["Boolean",!0]},i.prototype={_init:function(){var d=this._options;"string"==typeof d.separator&&(d.separator=new RegExp(d.separator,"g")),"string"==typeof d.tags&&(d.tags=this._readInput(d.tags)),c.addClassName(this._element,"hide-all"),this._viewElm=a.create("div",{className:"ink-tagfield",insertAfter:this._element}),this._input=a.create("input",{type:"text",className:"new-tag-input",insertBottom:this._viewElm});var e=[].concat(d.tags,this._tagsFromMarkup(this._element));this._tags=[],f.each(e,Ink.bindMethod(this,"_addTag")),b.observe(this._input,"keyup",Ink.bindEvent(this._onKeyUp,this)),b.observe(this._input,"change",Ink.bindEvent(this._onKeyUp,this)),b.observe(this._input,"keydown",Ink.bindEvent(this._onKeyDown,this)),b.observe(this._input,"blur",Ink.bindEvent(this._onBlur,this)),b.observe(this._viewElm,"click",Ink.bindEvent(this._refocus,this))},destroy:function(){a.remove(this._viewElm),c.removeClassName(this._element,"hide-all")},_tagsFromMarkup:function(b){var c=b.tagName.toLowerCase();if("input"===c)return this._readInput(b.value);if("select"===c)return f.map(b.getElementsByTagName("option"),function(b){return a.textContent(b)});throw new Error("Cannot read tags from a "+c+" tag. Unknown tag")},_tagsToMarkup:function(b,c){var d=c.tagName.toLowerCase();if("input"===d)this._options.separator&&(c.value=b.join(this._options.outSeparator));else{if("select"!==d)throw new Error("TagField: Cannot read tags from a "+d+" tag. Unknown tag");c.innerHTML="",f.each(b,function(b){var d=a.create("option",{selected:"selected"});a.setTextContent(d,b),c.appendChild(d)})}},_addTag:function(c){if(!(-1!==this._options.maxTags&&this._tags.length>=this._options.maxTags)){if(!this._options.allowRepeated&&f.inArray(c,this._tags,c)||!c)return!1;var d=a.create("span",{className:"ink-tag",setTextContent:c+" "}),e=a.create("span",{className:"remove fa fa-times",insertBottom:d});b.observe(e,"click",Ink.bindEvent(this._removeTag,this,null));var g=document.createTextNode(" ");this._tags.push(c),this._viewElm.insertBefore(d,this._input),this._viewElm.insertBefore(g,this._input),this._tagsToMarkup(this._tags,this._element)}},_readInput:function(a){return this._options.separator?f.filter(a.split(this._options.separator),l):[a]},_onKeyUp:function(){if(this._options.autoSplit){var a;if(a=m?n(this._input.value,this._options.separator):this._input.value.split(this._options.separator),!(a.length<=1)){var b=a[a.length-1];a=a.splice(0,a.length-1),a=f.filter(a,l),f.each(a,Ink.bind(this._addTag,this)),this._input.value=b}}},_onKeyDown:function(a){return a.which===j?this._onEnterKeyDown(a):a.which===k?this._onBackspaceKeyDown():void(this._removeConfirm&&this._unsetRemovingVisual(this._tags.length-1))},_onBackspaceKeyDown:function(){this._input.value||(this._removeConfirm?(this._unsetRemovingVisual(this._tags.length-1),this._removeTag(this._tags.length-1),this._removeConfirm=null):this._setRemovingVisual(this._tags.length-1))},_onEnterKeyDown:function(a){var c=this._input.value;c&&(this._addTag(c),this._input.value=""),b.stopDefault(a)},_onBlur:function(){this._addTag(this._input.value),this._input.value=""},_setRemovingVisual:function(a){var d=this._viewElm.children[a];d&&(c.addClassName(d,"tag-deleting"),this._removeRemovingVisualTimeout=setTimeout(Ink.bindMethod(this,"_unsetRemovingVisual",a),4e3),b.observe(this._input,"blur",Ink.bindMethod(this,"_unsetRemovingVisual",a)),this._removeConfirm=!0)},_unsetRemovingVisual:function(a){var b=this._viewElm.children[a];b&&(c.removeClassName(b,"tag-deleting"),clearTimeout(this._removeRemovingVisualTimeout)),this._removeConfirm=null},_removeTag:function(c){var d;if("object"==typeof c){var e=b.element(c).parentNode;d=a.parentIndexOf(this._viewElm,e)}else"number"==typeof c&&(d=c);this._tags=f.remove(this._tags,d,1),a.remove(this._viewElm.children[d]),this._tagsToMarkup(this._tags,this._element)},_refocus:function(a){return this._input.focus(),b.stop(a),!1}},h.createUIComponent(i),i}),Ink.createModule("Ink.UI.Toggle","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1"],function(a,b,c,d,e,f){"use strict";function g(){a.BaseUIComponent.apply(this,arguments)}return g._name="Toggle_1",g._optionDefinition={target:["Elements"],triggerEvent:["String","click"],closeOnClick:["Boolean",!0],canToggleAnAncestor:["Boolean",!1],isAccordion:["Boolean",!1],initialState:["Boolean",null],classNameOn:["String","show-all"],classNameOff:["String","hide-all"],closeOnInsideClick:["String","a[href]"],onChangeState:["Function",null]},g.prototype={_init:function(){var b,e;if(this._targets=a.elsOrSelector(this._options.target),this._options.closeOnClick=this._options.closeOnClick,null===this._options.initialState&&(this._options.initialState=c.hasClassName(this._targets[0],this._options.classNameOn)),"show-all"!==this._options.classNameOn||"hide-all"!==this._options.classNameOff)for(b=0,e=this._targets.length;e>b;b++)c.removeClassName(this._targets[b],"show-all"),c.removeClassName(this._targets[b],"hide-all");if(this._options.isAccordion&&(this._accordionContainer=d.findUpwardsByClass(this._element,"accordion"),this._accordionContainer||Ink.warn('Ink.UI.Toggle_1: This toggle has the isToggle option set to `true`, but is not a descendant of an element with the class "accordion"! Because of this, it won\'t be able to find other toggles in the same accordion and cooperate with them.')),this._constructing=!0,this._bindEvents(),null!==this._options.initialState)this.setState(this._options.initialState,!0);else{var f="none"!==c.getStyle(this._targets[0],"display");this.setState(f,!0)}for(b=0,e=this._targets.length;e>b;b++)this._targets[b].style.display&&(this._targets[b].style.display="");this._element.setAttribute("data-is-toggle-trigger","true"),this._constructing=!1},_bindEvents:function(){if(this._options.triggerEvent&&b.on(this._element,this._options.triggerEvent,Ink.bind(this._onTriggerEvent,this)),this._options.closeOnClick&&b.observe(document,"click",Ink.bind(this._onOutsideClick,this)),this._options.closeOnInsideClick){var a=this._options.closeOnInsideClick;"true"===a.toString()&&(a="*"),b.observeMulti(this._targets,"click",Ink.bind(function(c){d.findUpwardsBySelector(b.element(c),a)&&this.setState(!1,!0)},this))}},_onTriggerEvent:function(a){var c=b.element(a),e=f.some(this._targets,function(a){return a===c||d.isAncestorOf(a,c)});if(this._options.canToggleAnAncestor||!e){var g=this.getState();this.setState(!g,!0),!g&&this._firstTime&&(this._firstTime=!1),b.stopDefault(a)}},_updateAccordion:function(){if(this._accordionContainer&&this.getState()!==!1)for(var a=e.select("[data-is-toggle-trigger]",this._accordionContainer),b=0;bi;i++)if(d.isAncestorOf(e[i],c)&&d.isAncestorOf(e[i],this._element))return;this.setState(!1,!0)}}},setState:function(a,b){if(a!==this.getState()||this._constructing){var d,e;if(this._group&&a)for(d=0,e=this._group.length;e>d;d++)this._group[d].getState()===!0&&this._group[d].setState(!1,!0);if(b&&"function"==typeof this._options.onChangeState){var f=this._options.onChangeState(a);if(f===!1)return!1}for(d=0,e=this._targets.length;e>d;d++)c.addRemoveClassName(this._targets[d],this._options.classNameOn,a),c.addRemoveClassName(this._targets[d],this._options.classNameOff,!a);c.addRemoveClassName(this._element,"active",a),this._accordionContainer&&this._updateAccordion()}},getState:function(){return c.hasClassName(this._element,"active")}},a.createUIComponent(g),g}),Ink.createModule("Ink.UI.Tooltip","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1","Ink.Dom.Css_1","Ink.Dom.Browser_1"],function(a,b,c,d,e,f){"use strict";function g(a,b){this._init(a,b||{})}function h(a,b){this._init(a,b)}var i,j,k;!function(){for(var a=document.createElement("DIV"),b=["transition","oTransition","msTransition","mozTransition","webkitTransition"],c=0;ce;e++)this.tooltips[e]=new h(this,c[e])},destroy:function(){e.each(this.tooltips,function(a){a._destroy()}),this.tooltips=null,this.options=null}},h.prototype={_oppositeDirections:{left:"right",right:"left",up:"down",down:"up"},_init:function(c,d){b.observe(d,"mouseover",Ink.bindEvent(this._onMouseOver,this)),b.observe(d,"focus",Ink.bindEvent(this._onMouseOver,this)),b.observe(d,"mouseout",Ink.bindEvent(this._onMouseOut,this)),b.observe(d,"blur",Ink.bindEvent(this._onMouseOut,this)),b.observe(d,"mousemove",Ink.bindEvent(this._onMouseMove,this)),this.root=c,this.element=d,this._delayTimeout=null,this.tooltip=null,a.registerInstance(this,this.element)},_makeTooltip:function(a){if(!this._getOpt("text")&&!this._getOpt("html")&&!c.hasAttribute(this.element,"title"))return!1;var d=this._createTooltipElement();this.tooltip&&this._removeTooltip(),this.tooltip=d,this._fadeInTooltipElement(d),this._placeTooltipElement(d,a),b.observe(d,"mouseover",Ink.bindEvent(this._onTooltipMouseOver,this));var e=this._getFloatOpt("timeout");e&&setTimeout(Ink.bind(function(){this.tooltip===d&&this._removeTooltip()},this),1e3*e)},_createTooltipElement:function(){var b=this._getOpt("template"),e=this._getOpt("templatefield"),g,h;if(b){var i=document.createElement("DIV");if(i.innerHTML=a.elOrSelector(b,"options.template").outerHTML,g=i.firstChild,e){if(h=d.select(e,g),!h)throw"options.templatefield must be a valid selector within options.template";h=h[0]}else h=g}else g=document.createElement("DIV"),f.addClassName(g,"ink-tooltip"),f.addClassName(g,this._getOpt("color")),h=document.createElement("DIV"),f.addClassName(h,"content"),g.appendChild(h);return this._getOpt("html")?h.innerHTML=this._getOpt("html"):this._getOpt("text")?c.setTextContent(h,this._getOpt("text")):c.setTextContent(h,this.element.getAttribute("title")),g.style.display="block",g.style.position="absolute",g.style.zIndex=this._getIntOpt("zIndex"),g diff --git a/dist/js/ink-ui.min.js.map b/dist/js/ink-ui.min.js.map index f2a3bf765..8ce9a1c66 100644 --- a/dist/js/ink-ui.min.js.map +++ b/dist/js/ink-ui.min.js.map @@ -1 +1 @@ -{"version":3,"file":"ink-ui.min.js","sources":["../../src/js/Ink/UI/Animate/1/lib.js","../../src/js/Ink/UI/Carousel/1/lib.js","../../src/js/Ink/UI/Close/1/lib.js","../../src/js/Ink/UI/Common/1/lib.js","../../src/js/Ink/UI/DatePicker/1/lib.js","../../src/js/Ink/UI/Draggable/1/lib.js","../../src/js/Ink/UI/Drawer/1/lib.js","../../src/js/Ink/UI/Dropdown/1/lib.js","../../src/js/Ink/UI/Droppable/1/lib.js","../../src/js/Ink/UI/FormValidator/1/lib.js","../../src/js/Ink/UI/FormValidator/2/lib.js","../../src/js/Ink/UI/ImageQuery/1/lib.js","../../src/js/Ink/UI/LazyLoad/1/lib.js","../../src/js/Ink/UI/Modal/1/lib.js","../../src/js/Ink/UI/Pagination/1/lib.js","../../src/js/Ink/UI/ProgressBar/1/lib.js","../../src/js/Ink/UI/SmoothScroller/1/lib.js","../../src/js/Ink/UI/SortableList/1/lib.js","../../src/js/Ink/UI/Spy/1/lib.js","../../src/js/Ink/UI/Stacker/1/lib.js","../../src/js/Ink/UI/Sticky/1/lib.js","../../src/js/Ink/UI/Swipe/1/lib.js","../../src/js/Ink/UI/Table/1/lib.js","../../src/js/Ink/UI/Tabs/1/lib.js","../../src/js/Ink/UI/TagField/1/lib.js","../../src/js/Ink/UI/Toggle/1/lib.js","../../src/js/Ink/UI/Tooltip/1/lib.js","../../src/js/Ink/UI/TreeView/1/lib.js","../../src/js/Ink/UI/Upload/1/lib.js"],"names":["Ink","createModule","Common","InkEvent","Css","Animate","BaseUIComponent","apply","this","arguments","animationPrefix","el","style","document","createElement","animationEndEventName","animation","webkitAnimation","_name","_optionDefinition","trigger","duration","removeClass","onEnd","prototype","_init","isNaN","parseInt","_options","observe","bind","animate","_element","extendObj","_animationPrefix","animationSupported","element","options","onAnimationEnd","event","target","animationName","removeClassName","removeEventListener","elOrSelector","addClassName","addEventListener","setTimeout","createUIComponent","InkElement","Pagination","Browser","limitRange","n","min","max","Math","Carousel","setTransitionProperty","newTransition","transitionProperty","oTransitionProperty","msTransitionProperty","mozTransitionProperty","webkitTransitionProperty","requestAnimationFrame","window","cb","autoAdvance","axis","initialPage","spaceAfterLastSlide","keyboardSupport","pagination","onChange","onInit","swipe","_handlers","paginationChange","bindMethod","windowResize","throttle","_isY","ulEl","s","width","_ulEl","removeTextNodeChildren","_currentPage","refit","whiteSpace","_setUpPagination","_setUpAutoAdvance","call","size","elm","perpendicular","outerDimensions","_liEls","ss","numSlides","length","contRect","getBoundingClientRect","_ctnLength","bottom","top","right","left","_elLength","_slidesPerPage","floor","isFinite","numPages","ceil","numPagesChanged","_numPages","_deltaLength","_IE7","_pagination","setSize","setPage","getPage","isDOMElement","setOnChange","setCurrent","self","nextPage","IE","version","split","slides","stl","prop","val","i","len","_onTouchStart","touches","_swipeData","x","pointerX","y","pointerY","ulRect","firstUlPos","inUlX","inUlY","_touchMoveIsFirstTouchMove","_onTouchMove","deltaY","deltaX","aDeltaY","abs","aDeltaX","undefined","_scrolling","_onAnimationFrame","stopDefault","pointerDelta","pointerPos","swipeData","elRect","newPos","_onTouchEnd","snapToNext","curPage","progressInPages","_onPaginationChange","pgn","_setPage","getCurrent","getPagination","page","wrap","_lengthToGo","isLastPage","_itemsInLastPage","join","previousPage","getSlidesPerPage","getTotalPages","getStageElm","getSlidesList","getTotalSlides","Close","body","ev","findUpwardsByClass","toRemove","stop","remove","Ajax","Selector","Url","warnStub","constructor","warn","stub","obj","k","hasOwnProperty","Error","_componentOptions","elementIsOptional","error","elsOrSelector","isValidInstance","_validateInstance","e","registerInstance","_stubInstance","nothing","keys","Object","ret","push","es6WeakMapSupport","instances","WeakMap","_reg","domRegistry","get","getAttribute","set","thing","setAttribute","Layouts","TINY","SMALL","MEDIUM","LARGE","XLARGE","isInteger","fieldName","t","select","required","TypeError","fieldId","defaults","overrides","optionValue","key","type","lType","toLowerCase","defaultVal","invalidThrow","_coerce_funcs","fromDataAttrs","dataAttrs","_coerce_from_string","_options_validate","invalid","quote","out","data","invalidStr","str","replace","paramName","_options_validate_types","elements","object","number","parseFloat","boolean","string","function","integer","types","round","clone","o","JSON","parse","stringify","ex","childIndex","parentIndexOf","ajaxJSON","endpoint","params","evalJS","method","parameters","onSuccess","r","responseJSON","status","message","onFailure","currentLayout","f","v","detectorEl","id","className","appendChild","children","getStyle","hashSet","hashParams","getAnchorString","location","hash","genQueryString","substring","cleanChildren","parentEl","setHTML","storeIdAndClasses","fromEl","inObj","_id","classes","_classes","restoreIdAndClasses","toEl","indexOf","_instanceId","_warnDoubleInstantiation","newInstance","getName","getInstance","nameWithoutVersion","inst","unregisterInstance","splice","UIComponent","givenEl","getInstanceFromSelector","selector","getInstanceIds","res","getInstances","destroyComponent","parentNode","removeChild","instance","err","_validate","_validationError","name","getOption","setOption","value","getElement","theConstructor","assert","test","msg","assertProp","propType","propVal","_oldProto","create","hideF","F","Event","InkArray","InkDate","clamp","dateishFromYMDString","YMD","dateishFromYMD","year","month","day","_year","_month","_day","dateishFromDate","date","getFullYear","getMonth","getDate","DatePicker","autoOpen","cleanText","closeText","pickerField","containerElement","cssClass","dateRange","displayInSelect","dayField","monthField","yearField","format","nextLinkText","ofText","onFocus","onMonthSelected","onSetDate","onYearSelected","position","prevLinkText","showClean","showClose","shy","startDate","startWeekDay","validDayFn","validMonthFn","validYearFn","nextValidDateFn","prevValidDateFn","yearRange",1,2,3,4,5,6,7,8,9,10,11,12,"wDay","_dateParsers","_hoverPicker","_picker","_setMinMax","setDate","Date","_lang","_render","_listenToContainerObjectEvents","_containerObject","_renderSuperTopBar","calendarTop","_monthDescContainer","_monthPrev","href","_monthNext","_monthContainer","_monthSelector","_renderMonthSelector","_yearSelector","insertBottom","_appendDatePickerToDom","_renderMonth","_monthChanger","setTextContent","_ofText","_yearChanger","inline","show","_addOpenCloseEvents","_addDateChangeHandlersToInputs","fields","observeMulti","bindEvent","_updateDate","_showDefaultView","_inline","_hide","opener","cannotBe","descendantOf","ulSelector","mon","_renderMonthButton","liMonth","data-cal-month","appendTarget","parentIsControl","matchesSelector","_wrapper","_wrapperIsControl","insertAfter","_superTopBar","_onClick","elem","hasClassName","_onRelativeChangerClick","_onAbsoluteChangerClick","_showMonthSelector","_showYearSelector","_clean","_updateDescription","changeYear","change_year_next","change_year_prev","changeMonth","change_month_next","change_month_prev","_updateCal","elemData","Number","calDay","calMonth","calYear","_changeYear","selectedIndex","blur","noLimits","_min","noMinLimit","_max","noMaxLimit","MAX_VALUE","dates","rDate","each","noLim","lim","toUpperCase","now","_daysInMonth","valid","_dateCmp","_fitDateToRange","_isValidDate","_dateWithinRange","_dateAboveMax","_dateBelowMin","oth","_dateCmpUntil","depth","props","display","childNodes","_getPrevMonth","_getNextMonth","dataParsed","_parseDate","_setDate","inc","_incrementViewingYear","firstYear","thisYear","yearUl","prevYearLi","_getYearButton","nextYearLi","_acceptableYear","li","data-cal-year","_addMonthClassNames","dateStr","yearRegExp","validOneOrTwo","_isDate","_acceptableDay","_acceptableDateComponent","_acceptableMonth","userCb","_callUserCallbackBool","_writeDateInFormat","dateString","auxDate","objClicked","dt","_updateMonth","_y","_m","exceptions","incValue","_tryLeap","d","_getPrevYear","_getNextYear","atomName","directionName","advancer","maxOrMin","boundary","leapUserCb","_callUserCallbackDate","daysInThisMonth","_getNextDecade","decade","_getCurrentDecade","_getPrevDecade","_callUserCallbackBase","yyyy-mm-dd","yyyy/mm/dd","yy-mm-dd","yy/mm/dd","dd-mm-yyyy","dd/mm/yyyy","dd-mm-yy","dd/mm/yy","mm/dd/yyyy","mm-dd-yyyy","_getMonthCalendarHeader","_getDayButtons","_getFirstDayIndex","wDayFirst","getDay","result","daysInMonth","createDocumentFragment","ul","firstDayIndex","_getDayButton","attrs","dayButton","header","parent","forEach","getElementsByTagName","_addMonthButtonClassNames","btn","toDisable","addRemoveClassName","lang","showMonth","isMonthRendered","destroy","unwrap","between","Draggable","constraint","constraintElm","handle","revert","cursor","zIndex","fps","droppableProxy","mouseAnchor","dragClass","skipChildren","onStart","onDrag","elmStartPosition","active","dragged","prevCoords","placeholder","zindex","firstDrag","deltaMs","lastRunAt","handlers","start","_onStart","dragFacade","_onDragFacade","drag","_onDrag","end","_onEnd","selectStart","stopObserving","_getCoords","ps","scrollWidth","scrollHeight","clientX","clientY","_cloneStyle","src","dst","borderWidth","padding","elementWidth","height","elementHeight","elementLeft","elementTop","cssFloat","isLeftClick","button","tgtEl","pos","dims","elementDimensions","originalPosition","delta","div","marginTop","marginBottom","marginLeft","marginRight","visibility","delta2","parts","ad","applyDelta","dragHandlerName","proxy","innerWidth","documentElement","clientWidth","innerHeight","clientHeight","fs","backgroundColor","setOpacity","firstEl","firstChild","nodeType","nextSibling","insertBefore","mouseCoords","mPosX","mPosY","newX","newY","draggableSize","offset","constTop","constBottom","constLeft","constRight","pageWidth","pageHeight","Droppable","getModule","updateAll","mouseCoords2","action","pt","Loaded","Element","pageWideFocusListener","callback","onlyWrapper","_removePageWideFocusListener","mouseIsDown","focusFirstFocusableElementInside","container","withTabIndex","lowestTabIndex","lowestTabIndexElm","ind","tabIndex","focus","firstFocusable","sFocusableElms","elNotFound","Drawer","transitionSupport","transitions","WebkitTransitionProperty","styleProp","eventName","parentSelector","leftDrawer","leftTrigger","rightDrawer","rightTrigger","contentDrawer","mode","sides","validateSide","side","drawer","triggers","atLeastOneSide","errorMsg","drawerOption","triggerOption","_contentDrawers","_leftDrawer","_leftTriggers","_rightDrawer","_rightTriggers","_triggers","_isOpen","_direction","click","afterTransition","_afterTransition","_addEvents","clickedTrigger","findUpwardsBySelector","currentTarget","_onTriggerClicked","clickedInContent","clickedInLink","isLink","close","preventDefault","open","_getRecentDrawer","on","direction","drawerEl","_transitionWillOccur","one","uselessValue","offsetWidth","lastFocused","activeElement","didFocus","insideDrawer","isAncestorOf","transitioning","Toggle","Dropdown","hoverOpen","dismissOnInsideClick","dismissOnOutsideClick","dismissAfter","onInsideClick","onOutsideClick","onOpen","onDismiss","_toggle","closeOnInsideClick","closeOnClick","onChangeState","newState","_openOrDismiss","_onMouseOver","getState","clearTimeout","_openTimeout","_dismissTimeout","_onMouseOut","_onInsideClick","_handlerCall","dismiss","_onOutsideClick","foundElem","findUpwardsHaving","needle","foundTarget","callHandler","_doNotInformToggle","setState","handler","slice","hAddClassName","hRemoveClassName","debug","_droppables","_draggables","add","cleanStyle","draggable","opt","hoverClass","hoverclass","accept","onHover","onDrop","onDropOut","that","namedEventHandlers","move","droppable","copy","cloneNode","_findDraggable","originalParent","elementData","_update","_findData","elms","update","offsetLeft","offsetTop","coords","matches","InkValidator","elementsWithSameName","form","everything","FormValidator","_flagMap","ink-fv-required","ink-fv-email","ink-fv-url","ink-fv-number","ink-fv-phone_pt","ink-fv-phone_cv","ink-fv-phone_mz","ink-fv-phone_ao","ink-fv-date","ink-fv-confirm","ink-fv-custom","confirmElms","hasConfirm","_errorClassName","_errorValidationClassName","_errorTypeWarningClassName","_errorTypeErrorClassName","validate","_free","onError","customFlag","confirmGroup","getElementById","random","custom","fail","_validateElements","_showError","_clearError","_clearCache","reset","_getElements","formElms","curElm","totalElm","flag","flag2","oGroups","_makeConfirmGroups","errors","customErrors","inArray","disabled","_isValid","_isCustomValid","_validateConfirmGroups","curGroup","total","j","totalG","curFlag","tCustom","fieldType","nodeName","inputType","_trim","aFormRadios","totalRadio","checked","mail","url","isPTPhone","isCVPhone","isAOPhone","isMZPhone","dataset","validFormat","validValues","isDate","formElm","aFail","tFail","_showAnErrorOnElement","controlGroupElm","controlElm","errorClasses","_errorTypeClassName","innerHTML","aErrorLabel","control","aErrorLabel2","I18n","FormElement","validationFunctions","min_length","minSize","max_length","maxSize","exact_length","exactSize","email","fullCheck","ip","ipType","isIP","phone","phoneType","countryCode","credit_card","cardType","isCreditCard","alpha","supportSpaces","ascii","singleLineWhitespace","text","whitespace","punctuation","unicode","unicodePunctuation","latin","latin1","latin1Punctuation","alpha_numeric","numbers","alpha_dash","dash","underscore","digit","positive","negative","decimalPlaces","decimal","decimalSeparator","leftDigits","decimalSep","maxDigits","numeric","range","minValue","maxValue","multipleOf","color","isColor","fieldToCompare","otherField","getFormElements","otherFieldValue","getValue","_rules","validationMessages","en_US","formvalidator.required","formvalidator.min_length","formvalidator.max_length","formvalidator.exact_length","formvalidator.email","formvalidator.url","formvalidator.ip","formvalidator.phone","formvalidator.credit_card","formvalidator.date","formvalidator.alpha","formvalidator.text","formvalidator.latin","formvalidator.alpha_numeric","formvalidator.alpha_dash","formvalidator.digit","formvalidator.integer","formvalidator.decimal","formvalidator.numeric","formvalidator.range","formvalidator.color","formvalidator.matches","formvalidator.validation_function_not_found","pt_PT","label","rules","_errors","_value","_getLabel","textContent","_parseRules","rulesLength","rule","paramStartPos","substr","p","_addError","paramObj","field","i18nKey","getErrors","_formElements","doValidate","eventTrigger","neverSubmit","searchFor","beforeValidation","setRule","errorMessage","getKey","langObj","dictObj","append","getI18n","setI18n","i18n","appendI18n","setLanguage","language","getRules","_rootElement","_errorMessages","_markedErrorElements","getElements","formElements","formElement","_getOrCreateFormElementInstance","errorElement","errorElements","counter","controlGroupElement","controlElement","paragraph","errorArr","ImageQuery","retina","queries","onLoad","lastIndexOf","search","_filename","pop","sortMulti","reverse","_onLoad","_onResize","current","_findCurrentQuery","getQuerySrc","viewportWidth","last","query","devicePixelRatio","file","_","LazyLoad","item","source","destination","delay","image","scrollElement","touchEvents","onInsideViewport","onAfterAttributeChange","autoInit","_aData","_hasEvents","_activate","_getData","_onScrollThrottled","aElms","attr","hasAttribute","original","_onScroll","_removeEvents","inViewport","partial","margin","_elInViewport","_userCallback","removeAttribute","reload","upName","dimension","firstCharacter","match","maxName","Modal","opacitySupported","opacity","openModals","shadeClass","modalClass","triggerEvent","autoDisplay","markup","onShow","closeOnEscape","responsive","_onShadeClick","keyDown","_onKeyDown","resize","_markupMode","_modalDiv","_modalShadow","_contentContainer","setContentMarkup","triggerElements","_reposition","isPercentage","currentViewport","viewportHeight","originalStatus","_resizeContainer","_shadeElement","alertsInTheModal","alertsLength","keyCode","containerHeight","_modalHeader","_modalFooter","isOpen","compatMode","offsetHeight","_contentElement","_waitForFade","keyValue","htmlEl","observeOnce","fadeChecks","fadeChecker","getContentElement","contentMarkup","tempHeader","tempFooter","toAdd","concat","genAEl","index","aEl","wrapText","spanEl","totalItemCount","itemsPerPage","sideButtons","firstLabel","lastLabel","previousLabel","nextLabel","previousPageLabel","nextPageLabel","hashParameter","parentTag","childTag","wrapperClass","paginationClass","activeClass","disabledClass","hideClass","previousClass","previousPageClass","nextClass","nextPageClass","firstClass","lastClass","numberFormatter","autoWrap","_size","_calculateSize","_current","_itemLiEls","_generateMarkup","_updateItems","_observe","observeDelegated","count","liEls","isSimpleToggle","liEl","setClassName","_nextEl","pi","pf","_pageStart","_pageEnd","_page","_prevPageEl","hasPreviousPage","_nextPageEl","hasNextPage","_firstEl","isFirst","_lastEl","isLast","_prevEl","hasPrevious","hasNext","hasUlAlready","isChevron","isDotted","createLiEl","isPrev","isNext","isPrevPage","isNextPage","aElem","nr","sz","setSizeInItems","totalItems","pageNumber","isRelative","next","previous","getSize","ProgressBar","startValue","_elementBar","setValue","newValue","cancelAnimationFrame","SmoothScroller","speed","changeHash","scroll","scrollTop","a","endPos","interval","onDone","scrollTo","init","onClick","render","link","thisDocument","linkedDocument","activeLiSelector","activeLi","Events","SortableList","hasTouch","navigator","maxTouchPoints","msMaxTouchPoints","placeholderClass","draggedClass","draggingClass","dragSelector","handleSelector","moveSelector","swap","cancelMouseOut","down","_onDown","_onMove","up","_onUp","_isMoving","_down","_move","_up","stopMoving","_placeholder","_movePlaceholder","_addMovingClasses","touch","elementFromPoint","validateMove","droppedElement","_removeMovingClasses","target_position","placeholder_position","from_top","from_left","targetIndex","spyTargets","addSpied","spied","observeOnScroll","observingOnScroll","onScroll","onScrollForTarget","activeEl","findActiveElement","toDeactivate","menuLinkSelector","toActivate","findUpwardsByTag","closest","Infinity","closestIndex","bBox","Spy","Stacker","column","customBreakPoints","largeMax","largeMin","mediumMax","mediumMin","smallMax","smallMin","largeCols","mediumCols","smallCols","isOrdered","onRunCallback","onResizeCallback","onAPIReloadCallback","_aList","_curLayout","_runFirstTime","_getPageItemsToList","_canApplyLayoutChange","_applyLayoutChange","addItem","reloadItems","_removeDomItems","_setCurLayout","customBreakpoints","_getColumnsToShow","cols","curLayout","_aColumn","totalCols","aItems","aNewList","ii","countCol","Sticky","offsetBottom","topElement","stickyClass","inlineDimensions","inlinePosition","bottomElement","activateInLayouts","toString","_dims","scrollTarget","_isDisabledInLayout","_getDims","unstick","_unstick","bottomOfSticky","maxBottomOfSticky","_stickTo","where","_inlineDimensions","_getBottomOffset","bottomOfViewport","toBottomOfDocument","oldPosition","oldWidth","dimensionsInStatic","rect","Swipe","onMove","minDist","maxDist","minDuration","maxDuration","storeGesture","stopEvents","_supported","db","_isOn","_isMeOrParent","_pushGesture","_gesture","_time","changedTouches","_target","_t0","_p0","pageX","pageY","t1","gesture","p1","dr","dist","sqrt","time","overallMovement","overallTime","InkUrl","InkString","Json","maybeTurnIntoNumber","rNumber","cmp","b","numberishEnabledCmp","aValue","bValue","Table","sameSame","pageSize","caretUpClass","caretDownClass","createEndpointUrl","createEndpointURL","getDataFromEndPoint","getDataFromEndpoint","processJSONRows","rows","processJSONRow","processJSONField","processJSONHeaders","processJSONTotalRows","totalRows","getSortKey","allowResetSorting","visibleFields","tdClassNames","paginationOptions","_thead","tHead","createTHead","_headers","thClick","_originalFields","_sortableFields","_originalData","_data","_totalRows","_resetSortOrder","_addHeadersClasses","_setPagination","headerLabel","classNames","_onThClick","paginated","sortable","_invertSortOrder","_setSortOrderOfColumn","tbody","row","_paginate","sortAndReverse","isAscending","_sort","caretHtml","order","firstIndex","lastIndex","_registerFieldNames","names","_fieldIsVisible","userKey","keyFunction","columnIndex","columnName","sort","trA","trB","elementA","elementB","_createHeadersFromJson","headers","tr","insertRow","th","_createSingleHeaderFromJson","_createRowsFromJSON","trIndex","_createSingleRowFromJson","rowIndex","_createFieldFromJson","fieldData","processor","_elOrFieldData","processed","isString","isNumber","setEndpoint","currentPage","paginationEl","pageNo","sortOrder","_getSortOrder","_getDataViaAjax","_getUrl","urlCreator","parseUrl","sortField","endpointUri","success","JSONData","_onAjaxSuccess","contentType","sanitizeJSON","response","responseText","jsonResponse","_rowLength","Tabs","preventUrlChange","onBeforeChange","menuSelector","contentSelector","triggerEventsOnLoad","_menu","_initializeDom","_setFirstActive","contentTabs","activeMenuLink","_findLinkByHref","_changeTab","runCallbacks","activeTabs","_activeMenuTab","_activeSection","_activeMenuLink","_onTabClickedGeneric","doChangeTab","_onTabClicked","tabElm","_dehashify","changeTab","_hashify","links","disable","enable","activeTab","activeSection","TagField","enterKey","backspaceKey","isTruthy","buggySplit","splitFunction","nativeSplit","String","compliantExecNpcg","exec","separator","limit","output","flags","ignoreCase","multiline","extended","sticky","lastLastIndex","RegExp","separator2","lastLength","Array","tags","tagQuery","tagQueryAsync","allowRepeated","maxTags","outSeparator","autoSplit","_readInput","_viewElm","_input","_tagsFromMarkup","_tags","_onKeyUp","_onBlur","_refocus","tagname","tagName","map","option","_tagsToMarkup","tag","selected","_addTag","_removeTag","spc","createTextNode","filter","which","_onEnterKeyDown","_onBackspaceKeyDown","_removeConfirm","_unsetRemovingVisual","_setRemovingVisual","tagIndex","_removeRemovingVisualTimeout","canToggleAnAncestor","isAccordion","initialState","classNameOn","classNameOff","_targets","_accordionContainer","_constructing","_bindEvents","state","_onTriggerEvent","sel","isAncestorOfClickedElement","some","thisOne","has","_firstTime","_updateAccordion","otherToggle","shades","ancestorOfTargets","shadesLength","_group","Tooltip","EachTooltip","root","transitionDurationName","transitionPropertyName","transitionTimingFunctionName","bodies","spacing","forever","timeout","template","templatefield","fade","tooltips","tooltip","_destroy","_oppositeDirections","_onMouseMove","_delayTimeout","_makeTooltip","mousePosition","_getOpt","_createTooltipElement","_removeTooltip","_fadeInTooltipElement","_placeTooltipElement","_onTooltipMouseOver","_getFloatOpt","temp","outerHTML","_getIntOpt","fadeTime","mPos","_setPos","targetElementPos","tleft","ttop","centerh","centerv","tooltipDims","elementDims","maxX","maxY","_getWhereValueInsideViewport","arrow","tooltipLeft","tooltipTop","toBottom","toRight","toLeft","toTop","bbox","viewport","dataAttrVal","_camelCase","instanceOption","_getMousePosition","pageDims","_getPageXY","elmDims","scrollDim","_getScroll","cWidth","cHeight","dd","scrollLeft","TreeView","node","parentClass","openNodeClass","openClass","closedClass","iconTag","isParent","_getIcon","insertTop","_setNodeOpen","_getChild","beOpen","child","icon","toggle","DirectoryReader","entry","maxDepth","_read","_readDirectories","entries","running","_readEntries","currentEntry","dir","createReader","readEntries","isDirectory","clearArray","fullPath","shift","_stopActivityTimeout","readError","activity","checkActivity","clearInterval","readComplete","setInterval","arr","Queue","lists","items","getItems","parentId","purge","keepList","pid","priority","view","_searchByPid","UI","Upload","_fileButton","fileButton","_dropzone","dropzone","_setDropEvent","_setFileButton","dropzones","ondrop","_dropEventHandler","ondragleave","_onDragLeave","ondragend","_onDragEndEventHandler","ondragdrop","ondragenter","_onDragEnterHandler","ondragover","_onDragOverHandler","stopPropagation","returnValue","publish","btns","_fileChangeHandler","files","FormData","XMLHttpRequest","_addFilesToQueue","submit","_events","fileFormName","maxFilesize","INVALID_FILE_NAME","extraData","useChunks","chunkSize","minSizeToUseChunks","endpointChunk","endpointChunkCommit","foldersEnabled","directoryMaxDepth","_queueId","_queueRunning","_folders","_supportChunks","Blob","dataTransfer","_files","webkitGetAsEntry","folders","_addFolderToQueue","invalidFolders","getFiles","isFile","convertToFile","hasParent","getSubDirs","created","fileID","CHROME","directory","_processQueue","internalUpload","queueLen","canceled","_doRequest","_upload","xhr","forceAbort","showError","lengthComputable","loaded","abort","lastModifiedDate","Dom","OPERA","upload","onprogress","chunk_offset","chunk_upload_id","withCredentials","setRequestHeader","fd","blob","upload_path","parentID","rootPath","send","onload","invalidOffset","upload_id","chunk_expires","expires","onerror","onabort","abortAll","abortOne","subscribe","fn","events","args"],"mappings":"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","sourcesContent":["/**\n * Animate.css Utility\n *\n * This module is a wrapper around animate.css's CSS classes to produce animation.\n * It contains options to ease common tasks, like listen to the \"animationend\" event with all necessary prefixes, remove the necessary class names when the animation finishes, or configure the duration of your animation with the necessary browser prefix.\n *\n * @module Ink.UI.Animate_1\n * @version 1\n */\n\nInk.createModule('Ink.UI.Animate', 1, ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Css_1'], function (Common, InkEvent, Css) {\n 'use strict';\n\n var animationPrefix = (function (el) {\n return ('animationName' in el.style) ? 'animation' :\n ('webkitAnimationName' in el.style) ? 'webkitAnimation' : null;\n }(document.createElement('div')));\n\n var animationEndEventName = {\n animation: 'animationend',\n webkitAnimation: 'webkitAnimationEnd'\n }[animationPrefix];\n\n /**\n * @class Ink.UI.Animate_1\n * @constructor\n *\n * @param {Element} element Animated element\n * @param {Object} options Options object\n * @param {String} options.animation Animation name\n * @param {String|Number} [options.duration] Duration name (fast|medium|slow) or duration in milliseconds. Defaults to 'medium'.\n * @param {Boolean} [options.removeClass] Flag to remove the CSS class when finished animating. Defaults to false.\n * @param {Function} [options.onEnd] Callback for the animation end\n *\n * @sample Ink_UI_Animate_1.html\n *\n **/\n function Animate() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n Animate._name = 'Animate_1';\n\n Animate._optionDefinition = {\n trigger: ['Element', null],\n duration: ['String', 'slow'], // Actually a string with a duration name, or a number of ms\n animation: ['String'],\n removeClass: ['Boolean', true],\n onEnd: ['Function', function () {}]\n };\n\n Animate.prototype._init = function () {\n if (!isNaN(parseInt(this._options.duration, 10))) {\n this._options.duration = parseInt(this._options.duration, 10);\n }\n\n if (this._options.trigger) {\n InkEvent.observe(this._options.trigger, 'click', Ink.bind(function () {\n this.animate();\n }, this)); // later\n } else {\n this.animate();\n }\n };\n\n Animate.prototype.animate = function () {\n Animate.animate(this._element, this._options.animation, this._options);\n };\n\n Ink.extendObj(Animate, {\n /**\n * Browser prefix for the CSS animations.\n *\n * @property _animationPrefix\n * @private\n **/\n _animationPrefix: animationPrefix,\n\n /**\n * Boolean which says whether this browser has CSS3 animation support.\n *\n * @property animationSupported\n **/\n animationSupported: !!animationPrefix,\n\n /**\n * Prefixed 'animationend' event name.\n *\n * @property animationEndEventName\n **/\n animationEndEventName: animationEndEventName,\n\n /**\n * Animate an element using one of the animate.css classes\n *\n * **Note: This is a utility method inside the `Animate` class, which you can access through `Animate.animate()`. Do not mix these up.**\n *\n * @static\n * @method animate\n * @param {Element} element Animated element\n * @param {String} animation Animation name\n * @param {Object} [options] Options object, containing:\n * @param {Function} [options.onEnd=null] Callback for animation end.\n * @param {Boolean} [options.removeClass=false] Whether to remove the Css class when finished.\n * @param {String|Number} [options.duration=medium] Duration name (the fast|medium|slow strings) or, duration in milliseconds.\n *\n * @return {void}\n * @public\n *\n * @sample Ink_UI_Animate_1_animate.html\n **/\n animate: function (element, animation, options) {\n element = Common.elOrSelector(element);\n\n if (typeof options === 'number' || typeof options === 'string') {\n options = { duration: options };\n } else if (!options) {\n options = {};\n }\n\n if (typeof arguments[3] === 'function') {\n options.onEnd = arguments[3];\n }\n\n if (typeof options.duration !== 'number' && typeof options.duration !== 'string') {\n options.duration = 400;\n }\n\n if (!Animate.animationSupported) {\n if (options.onEnd) {\n setTimeout(function () {\n options.onEnd(null);\n }, 0);\n }\n return;\n }\n\n if (typeof options.duration === 'number') {\n element.style[animationPrefix + 'Duration'] = options.duration + 'ms';\n } else if (typeof options.duration === 'string') {\n Css.addClassName(element, options.duration);\n }\n\n Css.addClassName(element, ['animated', animation]);\n\n function onAnimationEnd(event) {\n if (event.target !== element) { return; }\n if (event.animationName !== animation) { return; }\n if (options.onEnd) { options.onEnd(event); }\n if (options.removeClass) {\n Css.removeClassName(element, animation);\n }\n if (typeof options.duration === 'string') {\n Css.removeClassName(element, options.duration);\n }\n element.removeEventListener(animationEndEventName, onAnimationEnd, false);\n }\n\n element.addEventListener(animationEndEventName, onAnimationEnd, false);\n }\n });\n\n Common.createUIComponent(Animate);\n\n return Animate;\n});\n","/**\n * Flexible Carousel\n * @module Ink.UI.Carousel_1\n * @version 1\n */\n\nInk.createModule('Ink.UI.Carousel', '1',\n ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Css_1', 'Ink.Dom.Element_1', 'Ink.UI.Pagination_1', 'Ink.Dom.Browser_1', 'Ink.Dom.Selector_1'],\n function(Common, InkEvent, Css, InkElement, Pagination, Browser/*, Selector*/) {\n 'use strict';\n\n /*\n * TODO:\n * keyboardSupport\n */\n\n function limitRange(n, min, max) {\n return Math.min(max, Math.max(min, n));\n }\n\n var requestAnimationFrame = window.requestAnimationFrame ||\n function (cb) { return setTimeout(cb, 1000 / 30); };\n\n /**\n * @class Ink.UI.Carousel_1\n * @constructor\n *\n * @param {String|Element} selector DOM element or element id\n * @param {Object} [options] Carousel Options\n * @param {Integer} [options.autoAdvance] Milliseconds to wait before auto-advancing pages. Set to 0 to disable auto-advance. Defaults to 0.\n * @param {String} [options.axis] Axis of the carousel. Set to 'y' for a vertical carousel. Defaults to 'x'.\n * @param {Number} [options.initialPage] Initial index page of the carousel. Defaults to 0.\n * @param {Boolean} [options.spaceAfterLastSlide=true] If there are not enough slides to fill the full width of the last page, leave white space. Defaults to `true`.\n * @param {Boolean} [options.swipe] Enable swipe support if available. Defaults to true.\n * @param {Mixed} [options.pagination] Either an ul element to add pagination markup to or an `Ink.UI.Pagination` instance to use.\n * @param {Function} [options.onChange] Callback to be called when the page changes.\n *\n * @sample Ink_UI_Carousel_1.html\n */\n function Carousel() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n Carousel._name = 'Carousel_1';\n\n Carousel._optionDefinition = {\n autoAdvance: ['Integer', 0],\n axis: ['String', 'x'],\n initialPage: ['Integer', 0],\n spaceAfterLastSlide: ['Boolean', true],\n keyboardSupport:['Boolean', false],\n pagination: ['String', null],\n onChange: ['Function', null],\n onInit: ['Function', function () {}],\n swipe: ['Boolean', true]\n // TODO exponential swipe\n // TODO specify break point for next page when moving finger\n };\n\n Carousel.prototype = {\n _init: function () {\n this._handlers = {\n paginationChange: Ink.bindMethod(this, '_onPaginationChange'),\n windowResize: InkEvent.throttle(Ink.bindMethod(this, 'refit'), 200)\n };\n\n InkEvent.observe(window, 'resize', this._handlers.windowResize);\n\n this._isY = (this._options.axis === 'y');\n\n var ulEl = Ink.s('ul.stage', this._element);\n ulEl.style.width = '100%';\n this._ulEl = ulEl;\n\n InkElement.removeTextNodeChildren(ulEl);\n\n if (this._options.pagination == null) {\n this._currentPage = this._options.initialPage;\n }\n\n this.refit(); // recalculate this._numPages\n\n if (this._isY) {\n // Override white-space: no-wrap which is only necessary to make sure horizontal stuff stays horizontal, but breaks stuff intended to be vertical.\n this._ulEl.style.whiteSpace = 'normal';\n }\n\n if (this._options.swipe) {\n InkEvent.observe(this._element, 'touchstart', Ink.bindMethod(this, '_onTouchStart'));\n InkEvent.observe(this._element, 'touchmove', Ink.bindMethod(this, '_onTouchMove'));\n InkEvent.observe(this._element, 'touchend', Ink.bindMethod(this, '_onTouchEnd'));\n }\n\n this._setUpPagination();\n this._setUpAutoAdvance();\n\n this._options.onInit.call(this, this);\n },\n\n /**\n * Repositions elements around.\n * Measure the carousel once again, adjusting the involved elements' sizes. This is called automatically when the window resizes, in order to cater for changes from responsive media queries, for instance.\n *\n * @method refit\n * @return {void}\n * @public\n */\n refit: function() {\n var _isY = this._isY;\n\n var size = function (elm, perpendicular) {\n if (!elm) { return 0; }\n\n if (!perpendicular) {\n return InkElement.outerDimensions(elm)[_isY ? 1 : 0];\n } else {\n return InkElement.outerDimensions(elm)[_isY ? 0 : 1];\n }\n };\n\n this._liEls = Ink.ss('li.slide', this._ulEl);\n var numSlides = this._liEls.length;\n\n var contRect = this._ulEl.getBoundingClientRect();\n this._ctnLength = _isY ? contRect.bottom - contRect.top : contRect.right - contRect.left;\n this._elLength = size(this._liEls[0]);\n this._slidesPerPage = Math.floor( this._ctnLength / this._elLength ) || 1;\n if (!isFinite(this._slidesPerPage)) { this._slidesPerPage = 1; }\n\n var numPages = Math.ceil( numSlides / this._slidesPerPage );\n var numPagesChanged = this._numPages !== numPages;\n this._numPages = numPages;\n this._deltaLength = this._slidesPerPage * this._elLength;\n \n this._IE7();\n\n if (this._pagination && numPagesChanged) {\n this._pagination.setSize(this._numPages);\n }\n this.setPage(limitRange(this.getPage(), 0, this._numPages - 1));\n },\n\n _setUpPagination: function () {\n if (this._options.pagination) {\n if (Common.isDOMElement(this._options.pagination) ||\n typeof this._options.pagination === 'string') {\n // if dom element or css selector string...\n this._pagination = new Pagination(this._options.pagination, {\n size: this._numPages,\n onChange: this._handlers.paginationChange\n });\n } else {\n // assumes instantiated pagination\n this._pagination = this._options.pagination;\n this._pagination.setOnChange(this._handlers.paginationChange);\n this._pagination.setSize(this._numPages);\n }\n this._pagination.setCurrent(this._options.initialPage || 0);\n } else {\n this._currentPage = this._options.initialPage || 0;\n }\n },\n\n _setUpAutoAdvance: function () {\n if (!this._options.autoAdvance) { return; }\n var self = this;\n\n setTimeout(function autoAdvance() {\n self.nextPage(true /* wrap */);\n setTimeout(autoAdvance, self._options.autoAdvance);\n }, this._options.autoAdvance);\n },\n\n /**\n * Refits elements for IE7 because it doesn't support inline-block.\n *\n * @method _IE7\n * @private\n */\n _IE7: function () {\n if (Browser.IE && '' + Browser.version.split('.')[0] === '7') {\n // var numPages = this._numPages;\n var slides = Ink.ss('li.slide', this._ulEl);\n var stl = function (prop, val) {slides[i].style[prop] = val; };\n for (var i = 0, len = slides.length; i < len; i++) {\n stl('position', 'absolute');\n stl(this._isY ? 'top' : 'left', (i * this._elLength) + 'px');\n }\n }\n },\n\n _onTouchStart: function (event) {\n if (event.touches.length > 1) { return; }\n\n this._swipeData = {\n x: InkEvent.pointerX(event),\n y: InkEvent.pointerY(event)\n };\n\n var ulRect = this._ulEl.getBoundingClientRect();\n\n this._swipeData.firstUlPos = ulRect[this._isY ? 'top' : 'left'];\n\n this._swipeData.inUlX = this._swipeData.x - ulRect.left;\n this._swipeData.inUlY = this._swipeData.y - ulRect.top;\n\n setTransitionProperty(this._ulEl, 'none');\n\n this._touchMoveIsFirstTouchMove = true;\n },\n\n _onTouchMove: function (event) {\n if (event.touches.length > 1) { return; /* multitouch event, not my problem. */ }\n\n var pointerX = InkEvent.pointerX(event);\n var pointerY = InkEvent.pointerY(event);\n\n var deltaY = this._swipeData.y - pointerY;\n var deltaX = this._swipeData.x - pointerX;\n\n if (this._touchMoveIsFirstTouchMove) {\n var aDeltaY = Math.abs(deltaY);\n var aDeltaX = Math.abs(deltaX);\n\n this._touchMoveIsFirstTouchMove = undefined;\n this._scrolling = this._isY ?\n aDeltaX > aDeltaY :\n aDeltaY > aDeltaX ;\n\n if (!this._scrolling) {\n this._onAnimationFrame();\n }\n }\n\n if (!this._scrolling && this._swipeData) {\n InkEvent.stopDefault(event);\n\n this._swipeData.pointerDelta = this._isY ? deltaY : deltaX;\n this._swipeData.pointerPos = this._isY ? pointerY : pointerX;\n }\n },\n\n _onAnimationFrame: function () {\n var swipeData = this._swipeData;\n\n if (!swipeData || this._scrolling || this._touchMoveIsFirstTouchMove) { return; }\n\n var elRect = this._element.getBoundingClientRect();\n\n var newPos;\n\n if (!this._isY) {\n newPos = swipeData.pointerPos - swipeData.inUlX - elRect.left;\n } else {\n newPos = swipeData.pointerPos - swipeData.inUlY - elRect.top;\n }\n\n this._ulEl.style[this._isY ? 'top' : 'left'] = newPos + 'px';\n\n requestAnimationFrame(Ink.bindMethod(this, '_onAnimationFrame'));\n },\n\n _onTouchEnd: function (event) {\n if (this._swipeData && this._swipeData.pointerPos && !this._scrolling && !this._touchMoveIsFirstTouchMove) {\n var snapToNext = 0.1; // swipe 10% of the way to change page\n\n var pointerDelta = this._swipeData.pointerDelta;\n\n var curPage = this.getPage();\n\n // How many pages were advanced? May be fractional.\n var progressInPages = pointerDelta / this._elLength / this._slidesPerPage;\n\n // Have we advanced enough to change page?\n if (Math.abs(progressInPages) > snapToNext) {\n curPage += Math[ pointerDelta < 0 ? 'floor' : 'ceil' ](progressInPages);\n }\n\n curPage = limitRange(curPage, 0, this._numPages - 1);\n\n // If something used to calculate progressInPages was zero, we get NaN here.\n if (!isNaN(curPage)) {\n this.setPage(curPage);\n }\n\n InkEvent.stopDefault(event);\n }\n\n setTransitionProperty(this._ulEl, null /* transition: left, top */);\n this._swipeData = null;\n this._touchMoveIsFirstTouchMove = undefined;\n this._scrolling = undefined;\n },\n\n _onPaginationChange: function(pgn) {\n this._setPage(pgn.getCurrent());\n },\n\n /**\n * Gets the current page index\n * @method getPage\n * @return {Number} The current page number\n * @public\n **/\n getPage: function () {\n if (this._pagination) {\n return this._pagination.getCurrent();\n } else {\n return this._currentPage || 0;\n }\n },\n\n /**\n * Gets the Ink Pagination element this carousel is using.\n * @method getPagination\n * @return {Pagination} The pagination instance, if any. Otherwise, `null`.\n * @public\n **/\n getPagination: function () {\n return this._pagination || null;\n },\n\n /**\n * Sets the current page index\n * @method setPage\n * @param {Number} page Index of the destination page.\n * @param {Boolean} [wrap=false] Flag to activate circular counting (for example, if you set the page to `5` and there are only 4 pages, you're actually going to the first page).\n * @return {void}\n * @public\n **/\n setPage: function (page, wrap) {\n if (wrap) {\n // Pages outside the range [0..this._numPages] are wrapped.\n page = page % this._numPages;\n if (page < 0) { page = this._numPages - page; }\n }\n page = limitRange(page, 0, this._numPages - 1);\n\n if (page === this._currentPage) {\n if (this._swipeData) {\n this._setPage(page); // Just advance the view.\n }\n return;\n }\n\n if (this._pagination) {\n this._pagination.setCurrent(page); // _setPage is called by pagination because it listens to its Change event.\n } else {\n this._setPage(page);\n }\n },\n\n _setPage: function (page) {\n var _lengthToGo = page * this._deltaLength;\n var isLastPage = page === (this._numPages - 1);\n\n if (!this._options.spaceAfterLastSlide && isLastPage && page > 0) { \n var _itemsInLastPage = this._liEls.length - (page * this._slidesPerPage);\n if(_itemsInLastPage < this._slidesPerPage) {\n _lengthToGo = ((page - 1) * this._deltaLength) + (_itemsInLastPage * this._elLength);\n }\n }\n\n this._ulEl.style[ this._isY ? 'top' : 'left'] =\n ['-', (_lengthToGo / this._ctnLength) * 100, '%'].join('');\n\n if (this._options.onChange) {\n this._options.onChange.call(this, page);\n }\n\n this._currentPage = page;\n },\n\n /**\n * Goes to the next page\n * @method nextPage\n * @param {Boolean} [wrap=false] Flag to loop from last page to first page.\n * @return {void}\n * @public\n **/\n nextPage: function (wrap) {\n this.setPage(this.getPage() + 1, wrap);\n },\n\n /**\n * Goes to the previous page\n * @method previousPage\n * @param {Boolean} [wrap=false] Flag to loop from first page to last page.\n * @return {void}\n * @public\n **/\n previousPage: function (wrap) { this.setPage(this.getPage() - 1, wrap); },\n\n /**\n * Returns how many slides fit into a page\n * @method getSlidesPerPage\n * @return {Number} The number of slides per page\n * @public\n */\n getSlidesPerPage: function() {\n return this._slidesPerPage;\n },\n\n /**\n * Get the amount of pages in the carousel.\n * @method getTotalPages\n * @return {Number} The number of pages\n * @public\n */\n getTotalPages: function() {\n return this._numPages;\n },\n\n /**\n * Get the stage element (your UL with the class \".stage\").\n * @method getStageElm\n * @public\n * @return {Element} Stage element\n **/\n getStageElm: function() {\n return this._ulEl;\n },\n\n /**\n * Get a list of your slides (elements with the \".slide\" class inside your stage)\n * @method getSlidesList\n * @return {Element[]} Array containing the slides.\n * @public\n */\n getSlidesList: function() {\n return this._liEls;\n },\n\n /**\n * Get the total number of slides\n * @method getTotalSlides\n * @return {Number} The number of slides\n * @public\n */\n getTotalSlides: function() {\n return this.getSlidesList().length;\n }\n };\n\n function setTransitionProperty(el, newTransition) {\n el.style.transitionProperty =\n el.style.oTransitionProperty =\n el.style.msTransitionProperty =\n el.style.mozTransitionProperty =\n el.style.webkitTransitionProperty = newTransition;\n }\n\n Common.createUIComponent(Carousel);\n\n return Carousel;\n\n});\n","/**\n * Closing utilities\n * @module Ink.UI.Close_1\n * @version 1\n */\nInk.createModule('Ink.UI.Close', '1', ['Ink.Dom.Event_1','Ink.Dom.Element_1'], function(InkEvent, InkElement) {\n 'use strict';\n\n /**\n * Subscribes clicks on the document.body.\n * Whenever an element with the classes \".ink-close\" or \".ink-dismiss\" is clicked, this module finds an ancestor \".ink-alert\" or \".ink-alert-block\" element and removes it from the DOM.\n * This module should be created only once per page.\n * \n * @class Ink.UI.Close\n * @constructor\n * @example\n * \n *\n * @sample Ink_UI_Close_1.html\n */\n function Close() {\n InkEvent.observe(document.body, 'click', function(ev) {\n var el = InkEvent.element(ev);\n\n el = InkElement.findUpwardsByClass(el, 'ink-close') ||\n InkElement.findUpwardsByClass(el, 'ink-dismiss');\n\n if (!el) {\n return; // ink-close or ink-dismiss class not found\n }\n\n var toRemove = InkElement.findUpwardsByClass(el, 'ink-alert') ||\n InkElement.findUpwardsByClass(el, 'ink-alert-block') ||\n el;\n\n if (toRemove) {\n InkEvent.stop(ev);\n InkElement.remove(toRemove);\n }\n });\n }\n\n Close._name = 'Close_1';\n\n return Close;\n});\n","/**\n * Auxiliar utilities for UI Modules\n * @module Ink.UI.Common_1\n * @version 1\n */\n \nInk.createModule('Ink.UI.Common', '1', ['Ink.Dom.Element_1', 'Ink.Net.Ajax_1','Ink.Dom.Css_1','Ink.Dom.Selector_1','Ink.Util.Url_1'], function(InkElement, Ajax,Css,Selector,Url) {\n\n 'use strict';\n\n var nothing = {} /* a marker, for reference comparison. */;\n\n var keys = Object.keys || function (obj) {\n var ret = [];\n for (var k in obj) if (obj.hasOwnProperty(k)) {\n ret.push(k);\n }\n return ret;\n };\n\n var es6WeakMapSupport = 'WeakMap' in window;\n var instances = es6WeakMapSupport ? new WeakMap() : null;\n // Old Registry\n var _reg = [];\n var domRegistry = {\n get: function get(el) {\n return es6WeakMapSupport ?\n instances.get(el) :\n _reg[el.getAttribute('__InkInstance')];\n },\n set: function set(el, thing) {\n if (es6WeakMapSupport) {\n instances.set(el, thing);\n } else {\n el.setAttribute('__InkInstance', _reg.push(thing) - 1);\n }\n }\n };\n\n /**\n * @namespace Ink.UI.Common_1\n */\n\n var Common = {\n\n /**\n * Supported Ink Layouts\n *\n * @property Layouts\n * @type Object\n * @readOnly\n */\n Layouts: {\n TINY: 'tiny',\n SMALL: 'small',\n MEDIUM: 'medium',\n LARGE: 'large',\n XLARGE: 'xlarge'\n },\n\n /**\n * Checks if an item is a valid DOM Element.\n *\n * @method isDOMElement\n * @static\n * @param {Mixed} o The object to be checked.\n * @return {Boolean} True if it's a valid DOM Element.\n * @example\n * var el = Ink.s('#element');\n * if( Ink.UI.Common.isDOMElement( el ) === true ){\n * // It is a DOM Element.\n * } else {\n * // It is NOT a DOM Element.\n * }\n */\n isDOMElement: InkElement.isDOMElement,\n\n /**\n * Checks if an item is a valid integer.\n *\n * @method isInteger\n * @static\n * @param {Mixed} n The value to be checked.\n * @return {Boolean} True if it's a valid integer.\n * @example\n * var value = 1;\n * if( Ink.UI.Common.isInteger( value ) === true ){\n * // It is an integer.\n * } else {\n * // It is NOT an integer.\n * }\n */\n isInteger: function(n) {\n return (typeof n === 'number' && n % 1 === 0);\n },\n\n /**\n * Gets a DOM Element. \n *\n * @method elOrSelector\n * @static\n * @param {Element|String} elOrSelector DOM Element or CSS Selector\n * @param {String} fieldName The name of the field. Commonly used for debugging.\n * @return {Element} Returns the Element passed or the first result of the CSS Selector. Otherwise it throws an exception.\n * @example\n * // In case there are several .myInput, it will retrieve the first found\n * var el = Ink.UI.Common.elOrSelector('.myInput','My Input');\n */\n elOrSelector: function(elOrSelector, fieldName) {\n if (!Common.isDOMElement(elOrSelector)) {\n var t = Selector.select(elOrSelector);\n if (t.length === 0) {\n Ink.warn(fieldName + ' must either be a DOM Element or a selector expression!\\nThe script element must also be after the DOM Element itself.');\n return null;\n }\n return t[0];\n }\n return elOrSelector;\n },\n\n /**\n * Like `elOrSelector` but returns an array of elements.\n *\n * @method elsOrSelector\n *\n * @static\n * @param {Element|Array|String} elsOrSelector DOM Element, array of DOM Elements, or CSS Selector\n * @param {String} [fieldName] The name of the field. Used for the error shown when no elements are found.\n * @param {Boolean} required If this is true, throw an error instead of returning an empty array.\n * @return {Array} The selected Elements, or the given Elements\n * @example\n * var elements = Ink.UI.Common.elsOrSelector('input.my-inputs', 'My Input');\n */\n elsOrSelector: function(elsOrSelector, fieldName, required) {\n var ret;\n if (typeof elsOrSelector === 'string') {\n ret = Selector.select(elsOrSelector);\n } else if (Common.isDOMElement(elsOrSelector)) {\n ret = [elsOrSelector];\n } else if (elsOrSelector && typeof elsOrSelector === 'object' && typeof elsOrSelector.length === 'number') {\n ret = elsOrSelector;\n }\n\n if (ret && ret.length) {\n return ret;\n } else {\n if (required) {\n throw new TypeError(fieldName + ' must either be a DOM Element, an Array of elements, or a selector expression!\\nThe script element must also be after the DOM Element itself.');\n } else {\n return [];\n }\n }\n },\n\n /**\n * Gets options an object and element's metadata.\n *\n * The element's data attributes take precedence. Values from the element's data-atrributes are coerced into the required type.\n *\n * @method options\n *\n * @param {Object} [fieldId] Name to be used in error reports.\n * @param {Object} defaults Object with the options' types and defaults.\n * @param {Object} overrides Options to override the defaults. Usually passed when instantiating an UI module.\n * @param {Element} [element] Element with data-attributes\n * @return {Object} An object containing all the option values.\n *\n * @example\n *\n * this._options = Ink.UI.Common.options('MyComponent', {\n * 'anobject': ['Object', null], // Defaults to null\n * 'target': ['Element', null],\n * 'stuff': ['Number', 0.1],\n * 'stuff2': ['Integer', 0],\n * 'doKickFlip': ['Boolean', false],\n * 'targets': ['Elements'], // Required option since no default was given\n * 'onClick': ['Function', null]\n * }, options || {}, elm)\n *\n * @example\n *\n * ### Note about booleans\n *\n * Here is how options are read from the markup\n * data-attributes, for several values`data-a-boolean`.\n *\n * Options considered true:\n *\n * - `data-a-boolean=\"true\"`\n * - (Every other value which is not on the list below.)\n * \n * Options considered false:\n *\n * - `data-a-boolean=\"false\"`\n * - `data-a-boolean=\"\"`\n * - `data-a-boolean`\n *\n * Options which go to default:\n *\n * - (no attribute). When `data-a-boolean` is ommitted, the\n * option is not considered true nor false, and as such\n * defaults to what is in the `defaults` argument.\n *\n **/\n options: function (fieldId, defaults, overrides, element) {\n // TODO Change Common.options's signature? the below looks better, more manageable\n // var options = Common.options({\n // element: this._element,\n // modName: constructor._name,\n // options: constructor._optionDefinition,\n // defaults: constructor._globalDefaults\n // });\n\n if (typeof fieldId !== 'string') {\n element = overrides;\n overrides = defaults;\n defaults = fieldId;\n fieldId = '';\n }\n overrides = overrides || {};\n var out = {};\n var dataAttrs = element ? InkElement.data(element) : {};\n var fromDataAttrs;\n var type;\n var lType;\n var defaultVal;\n\n var invalidStr = function (str) {\n if (fieldId) { str = fieldId + ': \"' + ('' + str).replace(/\"/, '\\\\\"') + '\"'; }\n return str;\n };\n\n var quote = function (str) {\n return '\"' + ('' + str).replace(/\"/, '\\\\\"') + '\"';\n };\n\n var invalidThrow = function (str) {\n throw new Error(invalidStr(str));\n };\n\n var invalid = function (str) {\n Ink.error(invalidStr(str) + '. Ignoring option.');\n };\n\n function optionValue(key) {\n type = defaults[key][0];\n lType = type.toLowerCase();\n defaultVal = defaults[key].length === 2 ? defaults[key][1] : nothing;\n\n if (!type) {\n invalidThrow('Ink.UI.Common.options: Always specify a type!');\n }\n if (!(lType in Common._coerce_funcs)) {\n invalidThrow('Ink.UI.Common.options: ' + defaults[key][0] + ' is not a valid type. Use one of ' + keys(Common._coerce_funcs).join(', '));\n\n }\n if (!defaults[key].length || defaults[key].length > 2) {\n invalidThrow('the \"defaults\" argument must be an object mapping option names to [typestring, optional] arrays.');\n }\n\n if (key in dataAttrs) {\n fromDataAttrs = Common._coerce_from_string(lType, dataAttrs[key], key, fieldId);\n // (above can return `nothing`)\n } else {\n fromDataAttrs = nothing;\n }\n\n if (fromDataAttrs !== nothing) {\n if (!Common._options_validate(fromDataAttrs, lType)) {\n invalid('(' + key + ' option) Invalid ' + lType + ' ' + quote(fromDataAttrs));\n return defaultVal;\n } else {\n return fromDataAttrs;\n }\n } else if (key in overrides) {\n return overrides[key];\n } else if (defaultVal !== nothing) {\n return defaultVal;\n } else {\n invalidThrow('Option ' + key + ' is required!');\n }\n }\n\n for (var key in defaults) {\n if (defaults.hasOwnProperty(key)) {\n out[key] = optionValue(key);\n }\n }\n\n return out;\n },\n\n _coerce_from_string: function (type, val, paramName, fieldId) {\n if (type in Common._coerce_funcs) {\n return Common._coerce_funcs[type](val, paramName, fieldId);\n } else {\n return val;\n }\n },\n\n _options_validate: function (val, type) {\n if (type in Common._options_validate_types) {\n return Common._options_validate_types[type].call(Common, val);\n } else {\n // 'object' options cannot be passed through data-attributes.\n // Json you say? Not any good to embed in HTML.\n return false;\n }\n },\n\n _coerce_funcs: (function () {\n var ret = {\n element: function (val) {\n return Common.elOrSelector(val, '');\n },\n elements: function (val) {\n return Common.elsOrSelector(val, '', false /*not required, so don't throw an exception now*/);\n },\n object: function (val) { return val; },\n number: function (val) { return parseFloat(val); },\n 'boolean': function (val) {\n return !(val === 'false' || val === '' || val === null);\n },\n string: function (val) { return val; },\n 'function': function (val, paramName, fieldId) {\n Ink.error(fieldId + ': You cannot specify the option \"' + paramName + '\" through data-attributes because it\\'s a function');\n return nothing;\n }\n };\n ret['float'] = ret.integer = ret.number;\n return ret;\n }()),\n\n _options_validate_types: (function () {\n var types = {\n string: function (val) {\n return typeof val === 'string';\n },\n number: function (val) {\n return typeof val === 'number' && !isNaN(val) && isFinite(val);\n },\n integer: function (val) {\n return val === Math.round(val);\n },\n element: function (val) {\n return Common.isDOMElement(val);\n },\n elements: function (val) {\n return val && typeof val === 'object' && typeof val.length === 'number' && val.length;\n },\n 'boolean': function (val) {\n return typeof val === 'boolean';\n },\n object: function () { return true; }\n };\n types['float'] = types.number;\n return types;\n }()),\n\n /**\n * Deep copy (clone) an object.\n * Note: The object cannot have referece loops.\n *\n * @method clone\n * @static\n * @deprecated\n * @param {Object} o The object to be cloned/copied.\n * @return {Object} Returns the result of the clone/copy.\n * @example\n * var originalObj = {\n * key1: 'value1',\n * key2: 'value2',\n * key3: 'value3'\n * };\n * var cloneObj = Ink.UI.Common.clone( originalObj );\n */\n clone: function(o) {\n try {\n return JSON.parse( JSON.stringify(o) );\n } catch (ex) {\n throw new Error('Given object cannot have loops!');\n }\n },\n\n\n /**\n * Gets an element's one-base index relative to its parent.\n *\n * Deprecated. Use Ink.Dom.Element.parentIndexOf instead.\n *\n * @method childIndex\n * @deprecated\n * @static\n * @param {Element} childEl Valid DOM Element.\n * @return {Number} Numerical position of an element relatively to its parent.\n * @example\n * \n *
        \n *
      • One
      • \n *
      • Two
      • \n *
      • Three
      • \n *
      • Four
      • \n *
      \n *\n * \n */\n childIndex: InkElement.parentIndexOf,\n\n /**\n * AJAX JSON request shortcut method\n * It provides a more convenient way to do an AJAX request and expect a JSON response.It also offers a callback option, as third parameter, for better async handling.\n *\n * @method ajaxJSON\n * @static\n * @async\n * @param {String} endpoint Valid URL to be used as target by the request.\n * @param {Object} params This field is used in the thrown Exception to identify the parameter.\n * @param {Function} cb Callback for the request.\n * @return {void}\n * @public\n * @example\n * // In case there are several .myInput, it will retrieve the first found\n * var el = Ink.UI.Common.elOrSelector('.myInput','My Input');\n */\n ajaxJSON: function(endpoint, params, cb) {\n new Ajax(\n endpoint,\n {\n evalJS: 'force',\n method: 'POST',\n parameters: params,\n\n onSuccess: function( r) {\n try {\n r = r.responseJSON;\n if (r.status !== 'ok') {\n throw 'server error: ' + r.message;\n }\n cb(null, r);\n } catch (ex) {\n cb(ex);\n }\n },\n\n onFailure: function() {\n cb('communication failure');\n }\n }\n );\n },\n\n\n /**\n * Gets the current Ink layout.\n *\n * @method currentLayout\n * @static\n * @return {String} A string representation of the current layout name.\n * @public\n * @example\n * var inkLayout = Ink.UI.Common.currentLayout();\n * if (inkLayout === 'small') {\n * // ...\n * }\n */\n currentLayout: function() {\n var i, f, k, v, el, detectorEl = Selector.select('#ink-layout-detector')[0];\n if (!detectorEl) {\n detectorEl = document.createElement('div');\n detectorEl.id = 'ink-layout-detector';\n for (k in Common.Layouts) {\n if (Common.Layouts.hasOwnProperty(k)) {\n v = Common.Layouts[k];\n el = document.createElement('div');\n el.className = 'show-' + v + ' hide-all';\n el.setAttribute('data-ink-layout', v);\n detectorEl.appendChild(el);\n }\n }\n document.body.appendChild(detectorEl);\n }\n\n for (i = 0, f = detectorEl.children.length; i < f; ++i) {\n el = detectorEl.children[i];\n if (Css.getStyle(el, 'display') === 'block') {\n return el.getAttribute('data-ink-layout');\n }\n }\n\n return 'large';\n },\n\n\n /**\n * Sets the location's hash (window.location.hash).\n *\n * @method hashSet\n * @static\n * @param {Object} o Object with the info to be placed in the location's hash.\n * @return {void}\n * @example\n * // It will set the location's hash like: #key1=value1&key2=value2&key3=value3\n * Ink.UI.Common.hashSet({\n * key1: 'value1',\n * key2: 'value2',\n * key3: 'value3'\n * });\n */\n hashSet: function(o) {\n if (typeof o !== 'object') { throw new TypeError('o should be an object!'); }\n var hashParams = Url.getAnchorString();\n hashParams = Ink.extendObj(hashParams, o);\n window.location.hash = Url.genQueryString('', hashParams).substring(1);\n },\n\n /**\n * Removes children nodes from a given object.\n * This method was initially created to help solve a problem in Internet Explorer(s) that occurred when trying to set the innerHTML of some specific elements like 'table'.\n *\n * @method cleanChildren\n * @static\n * @param {Element} parentEl Valid DOM Element\n * @return {void}\n * @public\n * @example\n * \n *
        \n *
      • One
      • \n *
      • Two
      • \n *
      • Three
      • \n *
      • Four
      • \n *
      \n *\n * \n *\n * \n *
        \n */\n cleanChildren: function(parentEl) {\n if( !Common.isDOMElement(parentEl) ){\n throw new Error('Please provide a valid DOMElement');\n }\n InkElement.setHTML(parentEl, '');\n },\n\n /**\n * Stores the id and/or classes of an element in an object.\n *\n * @method storeIdAndClasses\n * @static\n * @param {Element} fromEl Valid DOM Element to get the id and classes from.\n * @param {Object} inObj Object where the id and classes will be saved.\n * @return {void}\n * @public\n * @example\n *
        \n *\n * \n */\n storeIdAndClasses: function(fromEl, inObj) {\n if( !Common.isDOMElement(fromEl) ){\n throw 'Please provide a valid Element as first parameter';\n }\n\n var id = fromEl.id;\n if (id) {\n inObj._id = id;\n }\n\n var classes = fromEl.className;\n if (classes) {\n inObj._classes = classes;\n }\n },\n\n /**\n * Sets the id and className properties of an element based \n *\n * @method restoreIdAndClasses\n * @static\n * @param {Element} toEl Valid DOM Element to set the id and classes on.\n * @param {Object} inObj Object where the id and classes to be set are. This method uses the same format as the one given in `storeIdAndClasses`\n * @return {void}\n * @public\n * @example\n *
        \n *\n * \n *\n * \n *
        \n */\n restoreIdAndClasses: function(toEl, inObj) {\n\n if( !Common.isDOMElement(toEl) ){\n throw 'Please provide a valid Element as first parameter';\n }\n\n if (inObj._id && toEl.id !== inObj._id) {\n toEl.id = inObj._id;\n }\n\n if (inObj._classes && toEl.className.indexOf(inObj._classes) === -1) {\n if (toEl.className) { toEl.className += ' ' + inObj._classes; }\n else { toEl.className = inObj._classes; }\n }\n\n if (inObj._instanceId && !toEl.getAttribute('data-instance')) {\n toEl.setAttribute('data-instance', inObj._instanceId);\n }\n },\n\n _warnDoubleInstantiation: function (elm, newInstance) {\n var instances = Common.getInstance(elm);\n\n if (getName(newInstance) === '') { return; }\n if (!instances) { return; }\n\n var nameWithoutVersion = getName(newInstance);\n\n if (!nameWithoutVersion) { return; }\n\n for (var i = 0, len = instances.length; i < len; i++) {\n if (nameWithoutVersion === getName(instances[i])) {\n // Yes, I am using + to concatenate and , to split\n // arguments.\n //\n // Elements can't be concatenated with strings, but if\n // they are passed in an argument, modern debuggers will\n // pretty-print them and make it easy to find them in the\n // element inspector.\n //\n // On the other hand, if strings are passed as different\n // arguments, they get pretty printed. And the pretty\n // print of a string has quotes around it.\n //\n // If some day people find out that strings are not\n // just text and they start preserving contextual\n // information, then by all means change this to a\n // regular concatenation.\n //\n // But they won't. So don't change this.\n Ink.warn('Creating more than one ' + nameWithoutVersion + 'for the same element.',\n '(Was creating a ' + nameWithoutVersion + ' on:', elm, ').');\n return false;\n }\n }\n\n function getName(thing) {\n return ((thing.constructor && (thing.constructor._name)) ||\n thing._name ||\n '').replace(/_.*?$/, '');\n }\n\n return true;\n },\n\n /**\n * Saves an object (which should inherit BaseUIComponent) in the registry, associated with an element. You can retrieve it later by calling getInstance.\n *\n * This won't allow two instances of the same class to be created on a single element. It will fail and print a warning to the console if you try to do it. That is a common error when using Ink.\n *\n * @method registerInstance\n * @static\n * @param {Object} inst Object to be registered\n * @param {Element} [el=inst._element] Element to associate with `inst`. Defaults to `_element` property of `inst`.\n * @return {Boolean} `true` if we could create the instance, `false` otherwise.\n */\n registerInstance: function(inst, el) {\n if (!inst) { return; }\n\n if (!el) { el = inst._element; }\n\n if (!Common.isDOMElement(el)) { throw new TypeError('Ink.UI.Common.registerInstance: The element passed in is not a DOM element!'); }\n\n // [todo] this belongs in the BaseUIComponent's initialization\n if (Common._warnDoubleInstantiation(el, inst) === false) {\n return false;\n }\n\n var instances = domRegistry.get(el);\n\n if (!instances) {\n instances = [];\n domRegistry.set(el, instances);\n }\n\n instances.push(inst);\n\n return true;\n },\n\n /**\n * Unregisters (removes from the registry) a UI component instance from whatever element it's on.\n *\n * @method unregisterInstance\n * @static\n * @param {String} inst Instance to be unregistered.\n * @return {void}\n * @public\n */\n unregisterInstance: function(inst) {\n if (!inst || !inst._element) { return; }\n var instances = domRegistry.get(inst._element);\n for (var i = 0, len = instances.length; i < len; i++) {\n if (instances[i] === inst) {\n instances.splice(i, 1);\n }\n }\n },\n\n /**\n * Gets an UI component instance from an element.\n *\n * This function is already available in the UI components' classes themselves. You can call Modal.getInstance() and retrieve a modal.\n *\n * @method getInstance\n * @static\n * @param {String|Element} el Element from which we want the instances. A selector is okay.\n * @param {BaseUIComponent} [UIComponent] If you pass an Ink UI component class (Like Ink.UI.Modal or Ink.UI.Carousel), this won't return an array of all instances associated with the element. Instead it will return only the object which is an instance of that class.\n * @return {Object|Array} Returns an array containing all the instances in that element.\n * @public\n */\n getInstance: function(el, UIComponent) {\n var givenEl = el; // So we can warn it later.\n\n el = Common.elOrSelector(el);\n\n if (!Common.isDOMElement(el)) {\n Ink.warn('Ink.UI.Common: getInstance called on non-element (' + givenEl + ')');\n return [];\n }\n\n var instances = domRegistry.get(el);\n\n if (!instances) {\n instances = [];\n }\n\n if (typeof UIComponent !== 'function') {\n return instances;\n }\n\n for (var i = 0, len = instances.length; i < len; i++) {\n if (instances[i] instanceof UIComponent) {\n return instances[i];\n }\n }\n\n return null;\n },\n\n /**\n * Gets an instance based on a selector.\n *\n * @method getInstanceFromSelector\n * @static\n * @param {String} selector CSS selector to get the instances from. This function will only use the *first* element.\n * @return {Object|Array} Returns an array of the instances in the selected element.\n * @public\n */\n getInstanceFromSelector: function(selector) {\n return Common.getInstance(selector);\n },\n\n /**\n * Gets all the instance ids\n *\n * @method getInstanceIds\n * @static\n * @return {Array} Collection of instance ids\n */\n getInstanceIds: function() {\n if( _reg.length > 0 ) return _reg;\n var res = [];\n for (var id in instances) {\n if (instances.hasOwnProperty(id)) {\n res.push( id );\n }\n }\n return res;\n },\n\n /**\n * Gets all the instances\n *\n * @method getInstances\n * @static\n * @return {Array} Collection of existing instances.\n * @public\n */\n getInstances: function() {\n if( _reg.length > 0 ) return _reg;\n var res = [];\n for (var id in instances) {\n if (instances.hasOwnProperty(id)) {\n res.push( instances[id] );\n }\n }\n return res;\n },\n\n /**\n * Boilerplate method to destroy a component.\n * Components should copy this method as its destroy method and modify it.\n *\n * @method destroyComponent\n * @return {void}\n * @public\n * @static\n */\n destroyComponent: function() {\n Common.unregisterInstance(this);\n this._element.parentNode.removeChild(this._element);\n }\n };\n\n\n\n\n /**\n * Ink UI Base Class\n **/\n\n function warnStub() {\n /* jshint validthis: true */\n if (!this || this === window || typeof this.constructor !== 'function') { return; }\n Ink.warn('You called a method on an incorrectly instantiated ' + this.constructor._name + ' component. Check the warnings above to see what went wrong.');\n }\n\n function stub(prototype, obj) {\n for (var k in prototype) if (prototype.hasOwnProperty(k)) {\n if (k === 'constructor') { continue; }\n if (typeof obj[k] === 'function') {\n obj[k] = warnStub;\n }\n }\n }\n\n /**\n * Ink UI Base Class\n *\n * You don't use this class directly, or inherit from it directly.\n *\n * See createUIComponent() (in this module) for how to create a UI component and inherit from this. It's not plain old JS inheritance, for several reasons.\n *\n * @class Ink.UI.Common.BaseUIComponent\n * @constructor\n *\n * @param {Element|String} element Element to associate this UI component with. It's the element you can get later using `comp.getElement()`\n * @param {Object} [options] Options to pass to the component. You should see your specific UI component for this information.\n * @public\n **/\n function BaseUIComponent(element, options) {\n var constructor = this.constructor;\n var _name = constructor._name;\n\n if (!this || this === window) {\n throw new Error('Use \"new InkComponent()\" instead of \"InkComponent()\"');\n }\n\n if (this && !(this instanceof BaseUIComponent)) {\n throw new Error('You forgot to call Ink.UI.Common.createUIComponent() on this module!');\n }\n\n if (!element && !constructor._componentOptions.elementIsOptional) {\n Ink.error(new Error(_name + ': You need to pass an element or a selector as the first argument to \"new ' + _name + '()\"'));\n return;\n } else {\n this._element = Common.elsOrSelector(element,\n _name + ': An element with the selector \"' + element + '\" was not found!')[0];\n }\n\n if (!this._element && !constructor._componentOptions.elementIsOptional) {\n isValidInstance = false;\n Ink.error(new Error(element + ' does not match an element on the page. You need to pass a valid selector to \"new ' + _name + '\".'));\n }\n\n this._options = Common.options(_name, constructor._optionDefinition, options, this._element);\n\n var isValidInstance = BaseUIComponent._validateInstance(this) === true;\n\n if (isValidInstance && typeof this._init === 'function') {\n try {\n this._init.apply(this, arguments);\n } catch(e) {\n isValidInstance = false;\n Ink.error(e);\n }\n }\n\n if (!isValidInstance) {\n BaseUIComponent._stubInstance(this, constructor, _name);\n } else if (this._element) {\n Common.registerInstance(this);\n }\n }\n\n /**\n * Calls the `instance`'s _validate() method so it can validate itself.\n *\n * Returns false if the method exists, was called, but no Error was returned or thrown.\n *\n * @method _validateInstance\n * @private\n */\n BaseUIComponent._validateInstance = function (instance) {\n var err;\n\n if (typeof instance._validate !== 'function') { return true; }\n\n try {\n err = instance._validate();\n } catch (e) {\n err = e;\n }\n\n if (err instanceof Error) {\n instance._validationError = err;\n return false;\n }\n\n return true;\n };\n\n\n /**\n * Replaces every method in the instance with stub functions which just call Ink.warn().\n *\n * This avoids breaking the page when there are errors.\n *\n * @method _stubInstance\n * @param instance\n * @param constructor\n * @param name\n * @private\n */\n BaseUIComponent._stubInstance = function (instance, constructor, name) {\n stub(constructor.prototype, instance);\n stub(BaseUIComponent.prototype, instance);\n Ink.warn(name + ' was not correctly created. ' + (instance._validationError || ''));\n };\n\n // TODO BaseUIComponent.setGlobalOptions = function () {}\n // TODO BaseUIComponent.createMany = function (selector) {}\n BaseUIComponent.getInstance = function (elOrSelector) {\n elOrSelector = Common.elOrSelector(elOrSelector);\n return Common.getInstance(elOrSelector, this /* get instance by constructor */);\n };\n\n Ink.extendObj(BaseUIComponent.prototype, {\n /**\n * Get an UI component's option's value.\n *\n * @method getOption\n * @param {String} name The option's name.\n * @return {Mixed} The option value, or undefined if nothing is found.\n *\n * @example\n *\n * var myUIComponent = new Modal('#element', { trigger: '#trigger' }); // or anything else inheriting BaseUIComponent\n * myUIComponent.getOption('trigger'); // -> The trigger element (not the selector string, mind you)\n *\n **/\n getOption: function (name) {\n if (this.constructor && !(name in this.constructor._optionDefinition)) {\n Ink.error('\"' + name + '\" is not an option for ' + this.constructor._name);\n return undefined;\n }\n\n return this._options[name];\n },\n\n /**\n * Sets an option's value.\n *\n * @method getOption\n * @param {String} name Name of the option.\n * @param {Mixed} value New option value.\n * @return {void}\n * @public\n *\n * @example\n *\n * var myUIComponent = new Modal(...);\n * myUIComponent.setOption('trigger', '#some-element');\n **/\n setOption: function (name, value) {\n if (this.constructor && !(name in this.constructor._optionDefinition)) {\n Ink.error('\"' + name + ' is not an option for ' + this.constructor._name);\n return;\n }\n\n this._options[name] = value;\n },\n\n /**\n * Get the element associated with an UI component (IE the one you used in the constructor)\n *\n * @method getElement\n * @return {Element} The component's element.\n *\n * @example\n * var myUIComponent = new Modal('#element'); // or anything else inheriting BaseUIComponent\n * myUIComponent.getElement(); // -> The '#element' (not the selector string, mind you).\n *\n **/\n getElement: function () {\n return this._element;\n }\n });\n\n Common.BaseUIComponent = BaseUIComponent;\n\n /**\n * Take a constructor, and make it an Ink UI component.\n *\n * Makes it inherit BaseUIComponent, makes sure it has the basic properties Ink.UI.Common needs it to have, adds the necessary static methods, sets its options, etc.\n *\n * @method createUIComponent\n * @param {Function} theConstructor UI component constructor. It should have an _init function in its prototype, an _optionDefinition object, and a _name property indicating its name.\n * @param {Object} [options] Options hash, containing:\n * @param {Boolean} [options.elementIsOptional=false] Whether the element argument is optional (For example, when the component might work on existing markup or create its own).\n * @return {void}\n * @public\n **/\n Common.createUIComponent = function createUIComponent(theConstructor, options) {\n theConstructor._componentOptions = options || {};\n\n function assert(test, msg) {\n if (!test) {\n throw new Error('Ink.UI_1.createUIComponent: ' + msg);\n }\n }\n\n function assertProp(prop, propType, message) {\n var propVal = theConstructor[prop];\n // Check that the property was passed\n assert(typeof propVal !== 'undefined',\n theConstructor + ' doesn\\'t have a \"' + prop + '\" property. ' + message);\n // Check that its type is correct\n assert(propType && typeof propVal === propType,\n 'typeof ' + theConstructor + '.' + prop + ' is not \"' + propType + '\". ' + message);\n }\n\n assert(typeof theConstructor === 'function',\n 'constructor argument is not a function!');\n\n assertProp('_name', 'string', 'This property is used for error ' +\n 'messages. Set it to the full module path and version (Ink.My.Module_1).');\n assertProp('_optionDefinition', 'object', 'This property contains the ' +\n 'option names, types and defaults. See Ink.UI.Common.options() for reference.');\n\n // Extend the instance methods and props\n var _oldProto = theConstructor.prototype;\n\n if (typeof Object.create === 'function') {\n theConstructor.prototype = Object.create(BaseUIComponent.prototype);\n } else {\n theConstructor.prototype = (function hideF() {\n function F() {}\n F.prototype = BaseUIComponent.prototype;\n return new F();\n }());\n }\n\n Ink.extendObj(theConstructor.prototype, _oldProto);\n theConstructor.prototype.constructor = theConstructor;\n // Extend static methods\n Ink.extendObj(theConstructor, BaseUIComponent);\n };\n\n return Common;\n\n});\n","/**\n * Date selector\n * @module Ink.UI.DatePicker_1\n * @version 1\n */\n\nInk.createModule('Ink.UI.DatePicker', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1','Ink.Util.Date_1', 'Ink.Dom.Browser_1'], function(Common, Event, Css, InkElement, Selector, InkArray, InkDate ) {\n 'use strict';\n\n // Clamp a number into a min/max limit\n function clamp(n, min, max) {\n if (n > max) { n = max; }\n if (n < min) { n = min; }\n\n return n;\n }\n\n function dateishFromYMDString(YMD) {\n var split = YMD.split('-');\n return dateishFromYMD(+split[0], +split[1] - 1, +split[2]);\n }\n\n function dateishFromYMD(year, month, day) {\n return {_year: year, _month: month, _day: day};\n }\n\n function dateishFromDate(date) {\n return {_year: date.getFullYear(), _month: date.getMonth(), _day: date.getDate()};\n }\n\n /**\n * @class Ink.UI.DatePicker\n * @constructor\n * @version 1\n *\n * @param {String|Element} selector Datepicker element\n * @param {Object} [options] Options\n * @param {Boolean} [options.autoOpen] Flag to automatically open the datepicker.\n * @param {String} [options.cleanText] Text for the clean button. Defaults to 'Clear'.\n * @param {String} [options.closeText] Text for the close button. Defaults to 'Close'.\n * @param {String} [options.cssClass] CSS class to be applied on the datepicker\n * @param {String|Element} [options.pickerField] (if not using in an input[type=\"text\"]) Element which displays the DatePicker when clicked. Defaults to an \"open\" link.\n * @param {String} [options.dateRange] Enforce limits to year, month and day for the Date, ex: '1990-08-25:2020-11'\n * @param {Boolean} [options.displayInSelect] Flag to display the component in a select element.\n * @param {String|Element} [options.dayField] (if using options.displayInSelect) `select` field with days.\n * @param {String|Element} [options.monthField] (if using options.displayInSelect) `select` field with months.\n * @param {String|Element} [options.yearField] (if using options.displayInSelect) `select` field with years.\n * @param {String} [options.format] Date format string\n * @param {Object} [options.month] Hash of month names. Defaults to english month names. January is 1.\n * @param {String} [options.nextLinkText] Text for the previous button. Defaults to '«'.\n * @param {String} [options.ofText] Text to show between month and year. Defaults to ' of '.\n * @param {Boolean} [options.onFocus] If the datepicker should open when the target element is focused. Defaults to true.\n * @param {Function} [options.onMonthSelected] Callback to execute when the month is selected.\n * @param {Function} [options.onSetDate] Callback to execute when the date is set.\n * @param {Function} [options.onYearSelected] Callback to execute when the year is selected.\n * @param {String} [options.position] Position for the datepicker. Either 'right' or 'bottom'. Defaults to 'right'.\n * @param {String} [options.prevLinkText] Text for the previous button. Defaults to '«'.\n * @param {Boolean} [options.showClean] If the clean button should be visible. Defaults to true.\n * @param {Boolean} [options.showClose] If the close button should be visible. Defaults to true.\n * @param {Boolean} [options.shy] If the datepicker should hide automatically when the user clicks outside. Defaults to true.\n * @param {String} [options.startDate] Date to define initial month. Must be in yyyy-mm-dd format.\n * @param {Number} [options.startWeekDay] First day of the week. Sunday is zero. Defaults to 1 (Monday).\n * @param {Function} [options.validYearFn] Callback to execute when 'rendering' the month (in the month view)\n * @param {Function} [options.validMonthFn] Callback to execute when 'rendering' the month (in the month view)\n * @param {Function} [options.validDayFn] Callback to execute when 'rendering' the day (in the month view)\n * @param {Function} [options.nextValidDateFn] Function to calculate the next valid date, given the current. Useful when there's invalid dates or time frames.\n * @param {Function} [options.prevValidDateFn] Function to calculate the previous valid date, given the current. Useful when there's invalid dates or time frames.\n * @param {Object} [options.wDay] Hash of week day names. Sunday is 0. Defaults to { 0:'Sunday', 1:'Monday', etc...\n * @param {String} [options.yearRange] Enforce limits to year for the Date, ex: '1990:2020' (deprecated)\n *\n * @sample Ink_UI_DatePicker_1.html\n */\n function DatePicker() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n DatePicker._name = 'DatePicker_1';\n\n DatePicker._optionDefinition = {\n autoOpen: ['Boolean', false],\n cleanText: ['String', 'Clear'],\n closeText: ['String', 'Close'],\n pickerField: ['Element', null],\n containerElement:['Element', null],\n cssClass: ['String', 'ink-calendar bottom'],\n dateRange: ['String', null],\n \n // use this in a \n *\n * By applying this UI class to the above input, you get a tag field with the tags \"initial\" and \"value\". The class preserves the original input element. It remains hidden and is updated with new tag information dynamically, so regular HTML form logic still applies.\n *\n * Below \"input\" refers to the current value of the input tag (updated as the user enters text, of course), and \"output\" refers to the value which this class writes back to said input tag.\n *\n * @class Ink.UI.TagField\n * @version 1\n * @constructor\n * @param {String|Element} element Selector or DOM Input Element.\n * @param {Object} [options] Options object\n * @param {String|Array} [options.tags] Initial tags in the input\n * @param {Boolean} [options.allowRepeated] Flag to allow user to input several tags. Defaults to true.\n * @param {RegExp} [options.separator] Split the input by this RegExp. Defaults to /[,;(space)]+/g (spaces, commas and semicolons)\n * @param {String} [options.outSeparator] Use this string to separate each tag from the next in the output. Defaults to ','.\n * @param {Boolean} [options.autoSplit] Flag to activate tag creation when the user types a separator. Defaults to true.\n * @param {Integer} [options.maxTags] Maximum number of tags allowed. Set to -1 for no limit. Defaults to -1.\n * @example\n */\n function TagField() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n TagField._name = 'TagField_1';\n\n TagField._optionDefinition = {\n tags: ['String', []],\n tagQuery: ['Object', null],\n tagQueryAsync: ['Object', null],\n allowRepeated: ['Boolean', false],\n maxTags: ['Integer', -1],\n outSeparator: ['String', ','],\n separator: ['String', /[,; ]+/g],\n autoSplit: ['Boolean', true]\n };\n\n TagField.prototype = {\n /**\n * Init function called by the constructor\n * \n * @method _init\n * @private\n */\n _init: function() {\n var o = this._options;\n if (typeof o.separator === 'string') {\n o.separator = new RegExp(o.separator, 'g');\n }\n\n if (typeof o.tags === 'string') {\n // coerce to array using the separator\n o.tags = this._readInput(o.tags);\n }\n\n Css.addClassName(this._element, 'hide-all');\n\n this._viewElm = InkElement.create('div', {\n className: 'ink-tagfield',\n insertAfter: this._element\n });\n\n this._input = InkElement.create('input', {\n type: 'text',\n className: 'new-tag-input',\n insertBottom: this._viewElm\n });\n\n var tags = [].concat(o.tags, this._tagsFromMarkup(this._element));\n\n this._tags = [];\n\n InkArray.each(tags, Ink.bindMethod(this, '_addTag'));\n\n InkEvent.observe(this._input, 'keyup', Ink.bindEvent(this._onKeyUp, this));\n InkEvent.observe(this._input, 'change', Ink.bindEvent(this._onKeyUp, this));\n InkEvent.observe(this._input, 'keydown', Ink.bindEvent(this._onKeyDown, this));\n InkEvent.observe(this._input, 'blur', Ink.bindEvent(this._onBlur, this));\n InkEvent.observe(this._viewElm, 'click', Ink.bindEvent(this._refocus, this));\n },\n\n destroy: function () {\n InkElement.remove(this._viewElm);\n Css.removeClassName(this._element, 'hide-all');\n },\n\n _tagsFromMarkup: function (element) {\n var tagname = element.tagName.toLowerCase();\n if (tagname === 'input') {\n return this._readInput(element.value);\n } else if (tagname === 'select') {\n return InkArray.map(element.getElementsByTagName('option'), function (option) {\n return InkElement.textContent(option);\n });\n } else {\n throw new Error('Cannot read tags from a ' + tagname + ' tag. Unknown tag');\n }\n },\n\n _tagsToMarkup: function (tags, element) {\n var tagname = element.tagName.toLowerCase();\n if (tagname === 'input') {\n if (this._options.separator) {\n element.value = tags.join(this._options.outSeparator);\n }\n } else if (tagname === 'select') {\n element.innerHTML = '';\n InkArray.each(tags, function (tag) {\n var opt = InkElement.create('option', {selected: 'selected'});\n InkElement.setTextContent(opt, tag);\n element.appendChild(opt);\n });\n } else {\n throw new Error('TagField: Cannot read tags from a ' + tagname + ' tag. Unknown tag');\n }\n },\n\n _addTag: function (tag) {\n if (this._options.maxTags !== -1 &&\n this._tags.length >= this._options.maxTags) {\n return;\n }\n if ((!this._options.allowRepeated &&\n InkArray.inArray(tag, this._tags, tag)) || !tag) {\n return false;\n }\n var elm = InkElement.create('span', {\n className: 'ink-tag',\n setTextContent: tag + ' '\n });\n\n var remove = InkElement.create('span', {\n className: 'remove fa fa-times',\n insertBottom: elm\n });\n InkEvent.observe(remove, 'click', Ink.bindEvent(this._removeTag, this, null));\n\n var spc = document.createTextNode(' ');\n\n this._tags.push(tag);\n this._viewElm.insertBefore(elm, this._input);\n this._viewElm.insertBefore(spc, this._input);\n this._tagsToMarkup(this._tags, this._element);\n },\n\n _readInput: function (text) {\n if (this._options.separator) {\n return InkArray.filter(text.split(this._options.separator), isTruthy);\n } else {\n return [text];\n }\n },\n\n _onKeyUp: function () { // TODO control input box size\n if (!this._options.autoSplit) {\n return;\n }\n\n var split;\n if (!buggySplit) {\n split = this._input.value.split(this._options.separator);\n } else {\n split = splitFunction(this._input.value, this._options.separator);\n }\n\n if (split.length <= 1) {\n return;\n }\n var last = split[split.length - 1];\n split = split.splice(0, split.length - 1);\n split = InkArray.filter(split, isTruthy);\n \n InkArray.each(split, Ink.bind(this._addTag, this));\n this._input.value = last;\n },\n\n _onKeyDown: function (event) {\n if (event.which === enterKey) {\n return this._onEnterKeyDown(event);\n } else if (event.which === backspaceKey) {\n return this._onBackspaceKeyDown();\n } else if (this._removeConfirm) {\n // user pressed another key, cancel removal from a backspace key\n this._unsetRemovingVisual(this._tags.length - 1);\n }\n },\n\n /**\n * When the user presses backspace twice on the empty input, we delete the last tag on the field.\n * @method onBackspaceKeyDown\n * @return {void}\n * @private\n */\n _onBackspaceKeyDown: function () {\n if (this._input.value) { return; }\n\n if (this._removeConfirm) {\n this._unsetRemovingVisual(this._tags.length - 1);\n this._removeTag(this._tags.length - 1);\n this._removeConfirm = null;\n } else {\n this._setRemovingVisual(this._tags.length - 1);\n }\n },\n\n _onEnterKeyDown: function (event) {\n var tag = this._input.value;\n if (tag) {\n this._addTag(tag);\n this._input.value = '';\n }\n InkEvent.stopDefault(event);\n },\n\n _onBlur: function () {\n this._addTag(this._input.value);\n this._input.value = '';\n },\n\n /* For when the user presses backspace.\n * Set the style of the tag so that it seems like it's going to be removed\n * if they press backspace again. */\n _setRemovingVisual: function (tagIndex) {\n var elm = this._viewElm.children[tagIndex];\n if (!elm) { return; }\n\n Css.addClassName(elm, 'tag-deleting');\n\n this._removeRemovingVisualTimeout = setTimeout(Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex), 4000);\n InkEvent.observe(this._input, 'blur', Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex));\n this._removeConfirm = true;\n },\n _unsetRemovingVisual: function (tagIndex) {\n var elm = this._viewElm.children[tagIndex];\n if (elm) {\n Css.removeClassName(elm, 'tag-deleting');\n clearTimeout(this._removeRemovingVisualTimeout);\n }\n this._removeConfirm = null;\n },\n\n _removeTag: function (event) {\n var index;\n if (typeof event === 'object') { // click event on close button\n var elm = InkEvent.element(event).parentNode;\n index = InkElement.parentIndexOf(this._viewElm, elm);\n } else if (typeof event === 'number') { // manual removal\n index = event;\n }\n this._tags = InkArray.remove(this._tags, index, 1);\n InkElement.remove(this._viewElm.children[index]);\n this._tagsToMarkup(this._tags, this._element);\n },\n\n _refocus: function (event) {\n this._input.focus();\n InkEvent.stop(event);\n return false;\n }\n };\n\n Common.createUIComponent(TagField);\n\n return TagField;\n});\n","/**\n * Toggle the visibility of elements.\n * @module Ink.UI.Toggle_1\n * @version 1\n */\n\n Ink.createModule('Ink.UI.Toggle', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, InkEvent, Css, InkElement, Selector, InkArray ) {\n 'use strict';\n\n /**\n * *Important note: Do NOT use this as a dropdown! Use Ink.UI.Dropdown for that.*\n *\n * You need two elements to use Toggle: the `trigger` element, and the `target` element (or elements). The default behaviour is to toggle the `target`(s) when you click the `trigger`.\n *\n * The toggle has a state. It is either \"on\" or \"off\". It works by switching between the CSS classes in `classNameOn` and `classNameOff` according to the current state.\n *\n * When you initialize the Toggle, it will check if the targets are visible to figure out what the initial state is. You can force the toggle to consider itself turned \"on\" or \"off\" by setting the `initialState` option to `true` or `false`, respectively.\n *\n * You can get the current state of the Toggle by calling `getState`, or by checking if your `trigger` element has the \"active\" class.\n * The state can be changed through JavaScript. Just call `setState(true)`\n * to turn the Toggle on (or `setState(false)` to turn it off).\n *\n * @class Ink.UI.Toggle\n * @constructor\n * @version 1\n * @param {String|Element} selector Trigger element. By clicking this, the target (or targets) are triggered.\n * @param {Object} [options] Options object, containing:\n *\n * @param {String} options.target CSS Selector that specifies the elements that this component will toggle\n * @param {Boolean} [options.isAccordion] Set this to true to signal that this toggle is part of an accordion with other toggles. The toggles of an accordion must be common descendants of an element with the class \"accordion\". If they're not, Ink will warn you about this on the console.\n * @param {String} [options.classNameOn] CSS class to toggle when on. Defaults to 'show-all'.\n * @param {String} [options.classNameOff] CSS class to toggle when off. Defaults to 'hide-all'.\n * @param {String} [options.triggerEvent] Event that will trigger the toggling. Defaults to 'click'.\n * @param {Boolean} [options.closeOnClick] Flag to toggle the targe off when clicking outside the toggled content. Defaults to true.\n * @param {Boolean} [options.canToggleAnAncestor] Set to true if you want the toggle to target ancestors of itself. Defaults to false.\n * @param {String} [options.closeOnInsideClick] Toggle off when a child element matching this selector is clicked. Set to null to deactivate the check. Defaults to 'a[href]'.\n * @param {Boolean} [options.initialState] Flag to define initial state. false: off, true: on, null: markup. Defaults to null.\n * @param {Function} [options.onChangeState] Callback when the toggle state changes. Return `false` to cancel the event.\n *\n * @sample Ink_UI_Toggle_1_constructor.html\n */\n function Toggle(){\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n Toggle._name = 'Toggle_1';\n\n Toggle._optionDefinition = {\n target: ['Elements'],\n triggerEvent: ['String', 'click'],\n closeOnClick: ['Boolean', true],\n canToggleAnAncestor: ['Boolean', false],\n isAccordion: ['Boolean', false],\n initialState: ['Boolean', null], // May be true, false, or null to be what it is right now\n classNameOn: ['String', 'show-all'],\n classNameOff: ['String', 'hide-all'],\n closeOnInsideClick: ['String', 'a[href]'], // closes the toggle when a target is clicked and it is a link\n onChangeState: ['Function', null]\n };\n\n Toggle.prototype = {\n\n /**\n * Init function called by the constructor\n *\n * @method _init\n * @private\n */\n _init: function(){\n var i, len;\n\n this._targets = Common.elsOrSelector(this._options.target);\n\n // Boolean option handling\n this._options.closeOnClick = this._options.closeOnClick;\n // Actually a throolean\n if (this._options.initialState === null) {\n this._options.initialState = Css.hasClassName(this._targets[0], this._options.classNameOn);\n }\n\n if (this._options.classNameOn !== 'show-all' || this._options.classNameOff !== 'hide-all') {\n for (i = 0, len = this._targets.length; i < len; i++) {\n Css.removeClassName(this._targets[i], 'show-all');\n Css.removeClassName(this._targets[i], 'hide-all');\n }\n }\n\n if (this._options.isAccordion) {\n this._accordionContainer = InkElement.findUpwardsByClass(\n this._element, 'accordion');\n if (!this._accordionContainer) {\n Ink.warn('Ink.UI.Toggle_1: This toggle has the isToggle option set to `true`, but is not a descendant of an element with the class \"accordion\"! Because of this, it won\\'t be able to find other toggles in the same accordion and cooperate with them.');\n }\n }\n\n this._constructing = true;\n\n this._bindEvents();\n\n if (this._options.initialState !== null) {\n this.setState(this._options.initialState, true);\n } else {\n // Add initial classes matching the current \"display\" of the object.\n var state = Css.getStyle(this._targets[0], 'display') !== 'none';\n this.setState(state, true);\n }\n // Aditionally, remove any inline \"display\" style.\n for (i = 0, len = this._targets.length; i < len; i++) {\n if (this._targets[i].style.display) {\n this._targets[i].style.display = ''; // becomes default\n }\n }\n\n this._element.setAttribute('data-is-toggle-trigger', 'true');\n\n this._constructing = false;\n },\n\n /**\n * @method _bindEvents\n * @private\n */\n _bindEvents: function () {\n if ( this._options.triggerEvent ) {\n InkEvent.on(\n this._element,\n this._options.triggerEvent,\n Ink.bind(this._onTriggerEvent, this));\n }\n if( this._options.closeOnClick ){\n InkEvent.observe( document, 'click', Ink.bind(this._onOutsideClick, this));\n }\n if( this._options.closeOnInsideClick ) {\n var sel = this._options.closeOnInsideClick;\n if (sel.toString() === 'true') {\n sel = '*';\n }\n InkEvent.observeMulti(this._targets, 'click', Ink.bind(function (e) {\n if ( InkElement.findUpwardsBySelector(InkEvent.element(e), sel) ) {\n this.setState(false, true);\n }\n }, this));\n }\n },\n\n /**\n * Event handler. It's responsible for handling the `triggerEvent` as defined in the options.\n *\n * This will trigger the toggle.\n *\n * @method _onTriggerEvent\n * @param {Event} event\n * @private\n */\n _onTriggerEvent: function( event ){\n // When the togglee is a child of the toggler, we get the togglee's events here. We have to check that this event is for us.\n var target = InkEvent.element(event);\n\n var isAncestorOfClickedElement = InkArray.some(this._targets, function (thisOne) {\n return thisOne === target || InkElement.isAncestorOf(thisOne, target);\n });\n\n if (!this._options.canToggleAnAncestor && isAncestorOfClickedElement) {\n return;\n }\n\n var has = this.getState();\n this.setState(!has, true);\n if (!has && this._firstTime) {\n this._firstTime = false;\n }\n\n InkEvent.stopDefault(event);\n },\n\n /**\n * Be compatible with accordions\n *\n * @method _updateAccordion\n **/\n _updateAccordion: function () {\n if (!this._accordionContainer) { return; }\n if (this.getState() === false) { return; }\n\n var elms = Selector.select('[data-is-toggle-trigger]', this._accordionContainer);\n for (var i = 0; i < elms.length; i++) {\n var otherToggle = Toggle.getInstance(elms[i]);\n if (otherToggle && (otherToggle !== this) && otherToggle.getState() === true) {\n otherToggle.setState(false, true);\n }\n }\n },\n\n /**\n * Click handler. Will handle clicks outside the toggle component.\n *\n * @method _onOutsideClick\n * @param {Event} event\n * @private\n */\n _onOutsideClick: function( event ){\n var tgtEl = InkEvent.element(event);\n var shades;\n\n if (!InkElement.isAncestorOf(document.documentElement, tgtEl)) {\n // Because if the element was removed while the click event was\n // bubbling, we can't tell where it came from\n return;\n }\n\n if (InkElement.findUpwardsBySelector(tgtEl, '[data-is-toggle-trigger=\"true\"]')) { return; }\n\n var ancestorOfTargets = InkArray.some(this._targets, function (target) {\n return InkElement.isAncestorOf(target, tgtEl) || target === tgtEl;\n });\n\n if( (this._element === tgtEl) || InkElement.isAncestorOf(this._element, tgtEl) || ancestorOfTargets) {\n return;\n } else if( (shades = Ink.ss('.ink-shade')).length ) {\n var shadesLength = shades.length;\n\n for( var i = 0; i < shadesLength; i++ ){\n if( InkElement.isAncestorOf(shades[i],tgtEl) && InkElement.isAncestorOf(shades[i],this._element) ){\n return;\n }\n }\n }\n\n this.setState(false, true); // dismiss\n },\n\n /**\n * Sets the state of the toggle. (on/off)\n *\n * @method setState\n * @param {Boolean} on New state (on/off)\n * @param {Boolean} callHandler Whether to call the onChangeState handler.\n * @return {void}\n */\n setState: function (on, callHandler) {\n if (on === this.getState() && !this._constructing) { return; }\n\n var i, len;\n if (this._group && on) {\n for (i = 0, len = this._group.length; i < len; i++) {\n if (this._group[i].getState() === true) {\n this._group[i].setState(false, true);\n }\n }\n }\n\n if (callHandler && typeof this._options.onChangeState === 'function') {\n var ret = this._options.onChangeState(on);\n if (ret === false) { return false; } // Canceled by the event handler\n }\n for (i = 0, len = this._targets.length; i < len; i++) {\n Css.addRemoveClassName(this._targets[i], this._options.classNameOn, on);\n Css.addRemoveClassName(this._targets[i], this._options.classNameOff, !on);\n }\n Css.addRemoveClassName(this._element, 'active', on);\n\n if (this._accordionContainer) {\n this._updateAccordion();\n }\n },\n\n /**\n * Gets the state of the toggle. (on/off)\n *\n * @method getState\n *\n * @return {Boolean} whether the toggle is toggled on.\n */\n getState: function () {\n return Css.hasClassName(this._element, 'active');\n }\n };\n\n Common.createUIComponent(Toggle);\n\n return Toggle;\n});\n","/**\n * Content Tooltips\n * @module Ink.UI.Tooltip_1\n * @version 1\n */\nInk.createModule('Ink.UI.Tooltip', '1', ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1', 'Ink.Dom.Selector_1', 'Ink.Util.Array_1', 'Ink.Dom.Css_1', 'Ink.Dom.Browser_1'], function (Common, InkEvent, InkElement, Selector, InkArray, Css) {\n 'use strict';\n\n /**\n * Tooltips are useful as a means to display information about functionality while avoiding clutter.\n *\n * Tooltips show up when you hover elements which \"have\" tooltips.\n *\n * This class will \"give\" a tooltip to many elements, selected by its first argument (`target`). This is contrary to the other UI modules in Ink, which are created once per element.\n *\n * You can define options either through the second argument of the Tooltip constructor, or as data-attributes in each `target` element. Options set through data-attributes all start with \"data-tip\", and override options passed into the Tooltip constructor.\n *\n * @class Ink.UI.Tooltip\n * @constructor\n *\n * @param {Element|String} target Target element or selector of elements, to display the tooltips on.\n * @param {Object} [options] Options object\n * @param {String} [options.text] Text content for the tooltip.\n * @param {String} [options.html] HTML for the tooltip. Same as above, but won't escape HTML.\n * @param {String} [options.where] Positioning for the tooltip. Options are 'up', 'down', 'left', 'right', 'mousemove' (follows the cursor), and 'mousefix' (stays fixed). Defaults to 'up'.\n * \n * @param {String} [options.color] Color of the tooltip. Options are red, orange, blue, green and black. Default is white.\n * @param {Number} [options.fade] Number of seconds to fade in/out. Defaults to 0.3.\n * @param {Boolean} [options.forever] Flag to prevent the tooltip from being erased when the mouse hovers away from the target.\n * @param {Number} [options.timeout] Number of seconds the tooltip will stay open. Useful together with options.forever. Defaults to 0.\n * @param {Number} [options.delay] Time the tooltip waits until it is displayed. Useful to avoid getting the attention of the user unnecessarily\n * @param {Element|Selector} [options.template] Element or selector containing HTML to be cloned into the tooltips. Can be a hidden element, because CSS `display` is set to `block`.\n * @param {String} [options.templatefield] Selector within the template element to choose where the text is inserted into the tooltip. Useful when a wrapper DIV is required.\n * @param {Number} [options.left] Spacing from the target to the tooltip, when `where` is `mousemove` or `mousefix`. Defaults to 10.\n * @param {Number} [options.top] Spacing from the target to the tooltip, when `where` is `mousemove` or `mousefix`. Defaults to 10.\n * @param {Number} [options.spacing] Spacing between the tooltip and the target element, when `where` is not `mousemove` or `mousefix`. Defaults to 8.\n * \n * @sample Ink_UI_Tooltip_1.html\n */\n function Tooltip(element, options) {\n this._init(element, options || {});\n }\n\n function EachTooltip(root, elm) {\n this._init(root, elm);\n }\n\n var transitionDurationName,\n transitionPropertyName,\n transitionTimingFunctionName;\n (function () { // Feature detection\n var test = document.createElement('DIV');\n var names = ['transition', 'oTransition', 'msTransition', 'mozTransition',\n 'webkitTransition'];\n for (var i = 0; i < names.length; i++) {\n if (typeof test.style[names[i] + 'Duration'] !== 'undefined') {\n transitionDurationName = names[i] + 'Duration';\n transitionPropertyName = names[i] + 'Property';\n transitionTimingFunctionName = names[i] + 'TimingFunction';\n break;\n }\n }\n }());\n\n // Body or documentElement\n var bodies = document.getElementsByTagName('body');\n var body = bodies.length ? bodies[0] : document.documentElement;\n\n Tooltip.prototype = {\n _init: function(element, options) {\n var elements;\n\n this.options = Ink.extendObj({\n where: 'up',\n zIndex: 10000,\n left: 10,\n top: 10,\n spacing: 8,\n forever: 0,\n color: '',\n timeout: 0,\n delay: 0,\n template: null,\n templatefield: null,\n fade: 0.3,\n text: ''\n }, options || {});\n\n if (typeof element === 'string') {\n elements = Selector.select(element);\n } else if (typeof element === 'object') {\n elements = [element];\n } else {\n throw 'Element expected';\n }\n\n this.tooltips = [];\n\n for (var i = 0, len = elements.length; i < len; i++) {\n this.tooltips[i] = new EachTooltip(this, elements[i]);\n }\n },\n /**\n * Destroys the tooltips created by this instance\n *\n * @method destroy\n * @return {void}\n * @public\n */\n destroy: function () {\n InkArray.each(this.tooltips, function (tooltip) {\n tooltip._destroy();\n });\n this.tooltips = null;\n this.options = null;\n }\n };\n\n EachTooltip.prototype = {\n _oppositeDirections: {\n left: 'right',\n right: 'left',\n up: 'down',\n down: 'up'\n },\n _init: function(root, elm) {\n InkEvent.observe(elm, 'mouseover', Ink.bindEvent(this._onMouseOver, this));\n InkEvent.observe(elm, 'focus', Ink.bindEvent(this._onMouseOver, this));\n InkEvent.observe(elm, 'mouseout', Ink.bindEvent(this._onMouseOut, this));\n InkEvent.observe(elm, 'blur', Ink.bindEvent(this._onMouseOut, this));\n InkEvent.observe(elm, 'mousemove', Ink.bindEvent(this._onMouseMove, this));\n\n this.root = root;\n this.element = elm;\n this._delayTimeout = null;\n this.tooltip = null;\n\n Common.registerInstance(this, this.element);\n },\n _makeTooltip: function (mousePosition) {\n if (!this._getOpt('text') &&\n !this._getOpt('html') &&\n !InkElement.hasAttribute(this.element, 'title')) {\n return false;\n }\n\n var tooltip = this._createTooltipElement();\n\n if (this.tooltip) {\n this._removeTooltip();\n }\n\n this.tooltip = tooltip;\n\n this._fadeInTooltipElement(tooltip);\n this._placeTooltipElement(tooltip, mousePosition);\n\n InkEvent.observe(tooltip, 'mouseover', Ink.bindEvent(this._onTooltipMouseOver, this));\n\n var timeout = this._getFloatOpt('timeout');\n if (timeout) {\n setTimeout(Ink.bind(function () {\n if (this.tooltip === tooltip) {\n this._removeTooltip();\n }\n }, this), timeout * 1000);\n }\n },\n _createTooltipElement: function () {\n var template = this._getOpt('template'), // User template instead of our HTML\n templatefield = this._getOpt('templatefield'),\n \n tooltip, // The element we float\n field; // Element where we write our message. Child or same as the above\n\n if (template) { // The user told us of a template to use. We copy it.\n var temp = document.createElement('DIV');\n temp.innerHTML = Common.elOrSelector(template, 'options.template').outerHTML;\n tooltip = temp.firstChild;\n \n if (templatefield) {\n field = Selector.select(templatefield, tooltip);\n if (field) {\n field = field[0];\n } else {\n throw 'options.templatefield must be a valid selector within options.template';\n }\n } else {\n field = tooltip; // Assume same element if user did not specify a field\n }\n } else { // We create the default structure\n tooltip = document.createElement('DIV');\n Css.addClassName(tooltip, 'ink-tooltip');\n Css.addClassName(tooltip, this._getOpt('color'));\n\n field = document.createElement('DIV');\n Css.addClassName(field, 'content');\n\n tooltip.appendChild(field);\n }\n \n if (this._getOpt('html')) {\n field.innerHTML = this._getOpt('html');\n } else if (this._getOpt('text')) {\n InkElement.setTextContent(field, this._getOpt('text'));\n } else {\n InkElement.setTextContent(field, this.element.getAttribute('title'));\n }\n tooltip.style.display = 'block';\n tooltip.style.position = 'absolute';\n tooltip.style.zIndex = this._getIntOpt('zIndex');\n\n return tooltip;\n },\n _fadeInTooltipElement: function (tooltip) {\n var fadeTime = this._getFloatOpt('fade');\n if (transitionDurationName && fadeTime) {\n tooltip.style.opacity = '0';\n tooltip.style[transitionDurationName] = fadeTime + 's';\n tooltip.style[transitionPropertyName] = 'opacity';\n tooltip.style[transitionTimingFunctionName] = 'ease-in-out';\n setTimeout(function () {\n tooltip.style.opacity = '1';\n }, 0); // Wait a tick\n }\n },\n _placeTooltipElement: function (tooltip, mousePosition) {\n var where = this._getOpt('where');\n\n if (mousePosition === null && (where === 'mousemove' || where === 'mousefix')) {\n // When there are no mouse coords available (focus event)\n where = 'up';\n }\n\n if (where === 'mousemove' || where === 'mousefix') {\n var mPos = mousePosition;\n this._setPos(mPos[0], mPos[1]);\n body.appendChild(tooltip);\n } else if (where.match(/(up|down|left|right)/)) {\n body.appendChild(tooltip);\n var targetElementPos = InkElement.offset(this.element);\n var tleft = targetElementPos[0],\n ttop = targetElementPos[1];\n\n var centerh = (InkElement.elementWidth(this.element) / 2) - (InkElement.elementWidth(tooltip) / 2),\n centerv = (InkElement.elementHeight(this.element) / 2) - (InkElement.elementHeight(tooltip) / 2);\n var spacing = this._getIntOpt('spacing');\n\n var tooltipDims = InkElement.elementDimensions(tooltip);\n var elementDims = InkElement.elementDimensions(this.element);\n\n var maxX = InkElement.scrollWidth() + InkElement.viewportWidth();\n var maxY = InkElement.scrollHeight() + InkElement.viewportHeight();\n \n where = this._getWhereValueInsideViewport(where, {\n left: tleft - tooltipDims[0],\n right: tleft + tooltipDims[0],\n top: ttop + tooltipDims[1],\n bottom: ttop + tooltipDims[1]\n }, {\n right: maxX,\n bottom: maxY\n });\n \n if (where === 'up') {\n ttop -= tooltipDims[1];\n ttop -= spacing;\n tleft += centerh;\n } else if (where === 'down') {\n ttop += elementDims[1];\n ttop += spacing;\n tleft += centerh;\n } else if (where === 'left') {\n tleft -= tooltipDims[0];\n tleft -= spacing;\n ttop += centerv;\n } else if (where === 'right') {\n tleft += elementDims[0];\n tleft += spacing;\n ttop += centerv;\n }\n \n var arrow = null;\n if (where.match(/(up|down|left|right)/)) {\n arrow = document.createElement('SPAN');\n Css.addClassName(arrow, 'arrow');\n Css.addClassName(arrow, this._oppositeDirections[where]);\n tooltip.appendChild(arrow);\n }\n\n var tooltipLeft = tleft;\n var tooltipTop = ttop;\n\n var toBottom = (tooltipTop + tooltipDims[1]) - maxY;\n var toRight = (tooltipLeft + tooltipDims[0]) - maxX;\n var toLeft = 0 - tooltipLeft;\n var toTop = 0 - tooltipTop;\n\n if (toBottom > 0) {\n if (arrow) { arrow.style.top = (tooltipDims[1] / 2) + toBottom + 'px'; }\n tooltipTop -= toBottom;\n } else if (toTop > 0) {\n if (arrow) { arrow.style.top = (tooltipDims[1] / 2) - toTop + 'px'; }\n tooltipTop += toTop;\n } else if (toRight > 0) {\n if (arrow) { arrow.style.left = (tooltipDims[0] / 2) + toRight + 'px'; }\n tooltipLeft -= toRight;\n } else if (toLeft > 0) {\n if (arrow) { arrow.style.left = (tooltipDims[0] / 2) - toLeft + 'px'; }\n tooltipLeft += toLeft;\n }\n\n tooltip.style.left = tooltipLeft + 'px';\n tooltip.style.top = tooltipTop + 'px';\n }\n },\n\n /**\n * Get a value for \"where\" (left/right/up/down) which doesn't put the\n * tooltip off the screen\n *\n * @method _getWhereValueInsideViewport\n * @param where {String} \"where\" value which was given by the user and we might change\n * @param bbox {BoundingBox} A bounding box like what you get from getBoundingClientRect ({top, bottom, left, right}) with pixel positions from the top left corner of the viewport.\n * @param viewport {BoundingBox} Bounding box for the viewport. \"top\" and \"left\" are omitted because these coordinates are relative to the top-left corner of the viewport so they are zero.\n *\n * @TODO: we can't use getBoundingClientRect in this case because it returns {0,0,0,0} on our uncreated tooltip.\n */\n _getWhereValueInsideViewport: function (where, bbox, viewport) {\n if (where === 'left' && bbox.left < 0) {\n return 'right';\n } else if (where === 'right' && bbox.right > viewport.right) {\n return 'left';\n } else if (where === 'up' && bbox.top < 0) {\n return 'down';\n } else if (where === 'down' && bbox.bottom > viewport.bottom) {\n return 'up';\n }\n\n return where;\n },\n _removeTooltip: function() {\n var tooltip = this.tooltip;\n if (!tooltip) {return;}\n\n var remove = Ink.bind(InkElement.remove, {}, tooltip);\n\n if (this._getOpt('where') !== 'mousemove' && transitionDurationName) {\n tooltip.style.opacity = 0;\n // remove() will operate on correct tooltip, although this.tooltip === null then\n setTimeout(remove, this._getFloatOpt('fade') * 1000);\n } else {\n remove();\n }\n this.tooltip = null;\n },\n _getOpt: function (option) {\n var dataAttrVal = InkElement.data(this.element)[InkElement._camelCase('tip-' + option)];\n if (dataAttrVal /* either null or \"\" may signify the absense of this attribute*/) {\n return dataAttrVal;\n }\n var instanceOption = this.root.options[option];\n if (typeof instanceOption !== 'undefined') {\n return instanceOption;\n }\n },\n _getIntOpt: function (option) {\n return parseInt(this._getOpt(option), 10);\n },\n _getFloatOpt: function (option) {\n return parseFloat(this._getOpt(option), 10);\n },\n _destroy: function () {\n if (this.tooltip) {\n InkElement.remove(this.tooltip);\n }\n this.root = null; // Cyclic reference = memory leaks\n this.element = null;\n this.tooltip = null;\n },\n _onMouseOver: function(e) {\n // on IE < 10 you can't access the mouse event not even a tick after it fired\n var mousePosition;\n if (e.type !== 'mouseover') {\n // No mouse coords available\n mousePosition = null;\n } else {\n mousePosition = this._getMousePosition(e);\n }\n var delay = this._getFloatOpt('delay');\n if (delay) {\n this._delayTimeout = setTimeout(Ink.bind(function () {\n if (!this.tooltip) {\n this._makeTooltip(mousePosition);\n }\n this._delayTimeout = null;\n }, this), delay * 1000);\n } else {\n this._makeTooltip(mousePosition);\n }\n },\n _onMouseMove: function(e) {\n if (this._getOpt('where') === 'mousemove' && this.tooltip) {\n var mPos = this._getMousePosition(e);\n this._setPos(mPos[0], mPos[1]);\n }\n },\n _onMouseOut: function () {\n if (!this._getIntOpt('forever')) {\n this._removeTooltip();\n }\n if (this._delayTimeout) {\n clearTimeout(this._delayTimeout);\n this._delayTimeout = null;\n }\n },\n _onTooltipMouseOver: function () {\n if (this.tooltip) { // If tooltip is already being removed, this has no effect\n this._removeTooltip();\n }\n },\n _setPos: function(left, top) {\n left += this._getIntOpt('left');\n top += this._getIntOpt('top');\n var pageDims = this._getPageXY();\n if (this.tooltip) {\n var elmDims = [InkElement.elementWidth(this.tooltip), InkElement.elementHeight(this.tooltip)];\n var scrollDim = this._getScroll();\n\n if((elmDims[0] + left - scrollDim[0]) >= (pageDims[0] - 20)) {\n left = (left - elmDims[0] - this._getIntOpt('left') - 10);\n }\n if((elmDims[1] + top - scrollDim[1]) >= (pageDims[1] - 20)) {\n top = (top - elmDims[1] - this._getIntOpt('top') - 10);\n }\n\n this.tooltip.style.left = left + 'px';\n this.tooltip.style.top = top + 'px';\n }\n },\n _getPageXY: function() {\n var cWidth = 0;\n var cHeight = 0;\n if( typeof( window.innerWidth ) === 'number' ) {\n cWidth = window.innerWidth;\n cHeight = window.innerHeight;\n } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {\n cWidth = document.documentElement.clientWidth;\n cHeight = document.documentElement.clientHeight;\n } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {\n cWidth = document.body.clientWidth;\n cHeight = document.body.clientHeight;\n }\n return [parseInt(cWidth, 10), parseInt(cHeight, 10)];\n },\n _getScroll: function() {\n var dd = document.documentElement, db = document.body;\n if (dd && (dd.scrollLeft || dd.scrollTop)) {\n return [dd.scrollLeft, dd.scrollTop];\n } else if (db) {\n return [db.scrollLeft, db.scrollTop];\n } else {\n return [0, 0];\n }\n },\n _getMousePosition: function(e) {\n return [parseInt(InkEvent.pointerX(e), 10), parseInt(InkEvent.pointerY(e), 10)];\n }\n };\n\n return Tooltip;\n});\n","/**\n * Elements in a tree structure\n * @module Ink.UI.TreeView_1\n * @version 1\n */\nInk.createModule('Ink.UI.TreeView', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, Event, Css, Element, Selector, InkArray ) {\n 'use strict';\n\n\n /**\n * Shows elements in a tree structure which can be expanded and contracted.\n * A TreeView is built with \"node\"s and \"children\". \"node\"s are `li` tags, and \"children\" are `ul` tags.\n * You can build your TreeView out of a regular UL and LI element structure which you already use to display lists with several levels.\n * If you want a node to be open when the TreeView is built, just add the data-open=\"true\" attribute to it.\n * \n * @class Ink.UI.TreeView\n * @constructor\n * @version 1\n * @param {String|Element} selector Element or selector.\n * @param {String} [options] Options object, containing:\n * @param {String} [options.node] Selector for the nodes. Defaults to 'li'.\n * @param {String} [options.children] Selector for the children. Defaults to 'ul'.\n * @param {String} [options.parentClass] CSS classes to be added to parent nodes. Defaults to 'parent'.\n * @param {String} [options.openClass] CSS classes to be added to the icon when a parent is open. Defaults to 'fa fa-minus-circle'.\n * @param {String} [options.closedClass] CSS classes to be added to the icon when a parent is closed. Defaults to 'fa fa-plus-circle'.\n * @param {String} [options.hideClass] CSS Class to toggle visibility of the children. Defaults to 'hide-all'.\n * @param {String} [options.iconTag] The name of icon tag. The component tries to find a tag with that name as a direct child of the node. If it doesn't find it, it creates it. Defaults to 'i'.\n * @param {Boolean} [options.stopDefault] Flag to stops the default behavior of the click handler. Defaults to true.\n * @example\n * \n * \n * \n * @sample Ink_UI_TreeView_1.html\n */\n function TreeView() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n TreeView._name = 'TreeView_1';\n\n TreeView._optionDefinition = {\n 'node': ['String', 'li'],\n 'children': ['String','ul'],\n 'parentClass': ['String','parent'],\n 'openNodeClass': ['String', 'open'],\n 'openClass': ['String','fa fa-minus-circle'],\n 'closedClass': ['String','fa fa-plus-circle'],\n 'hideClass': ['String','hide-all'],\n 'iconTag': ['String', 'i'],\n 'stopDefault' : ['Boolean', true]\n };\n\n TreeView.prototype = {\n /**\n * Init function called by the constructor. Sets the necessary event handlers.\n * \n * @method _init\n * @private\n */\n _init: function(){\n this._handlers = {\n click: Ink.bindEvent(this._onClick,this)\n };\n\n Event.on(this._element, 'click', this._options.node, this._handlers.click);\n\n InkArray.each(Ink.ss(this._options.node, this._element), Ink.bind(function(item){\n if( this.isParent(item) ) {\n Css.addClassName(item, this._options.parentClass);\n\n var isOpen = this.isOpen(item);\n if( !this._getIcon(item) ){\n Element.create(this._options.iconTag, { insertTop: item });\n }\n\n this._setNodeOpen(item, isOpen);\n }\n },this));\n },\n\n _getIcon: function (node) {\n return Ink.s('> ' + this._options.iconTag, node);\n },\n\n /**\n * Checks if a node is open.\n *\n * @method isOpen\n * @param {Element} node The tree node to check\n * @return {Boolean} Whether the node is open.\n **/\n isOpen: function (node) {\n if (!this._getChild(node)) {\n throw new Error('not a node!');\n }\n\n return node.getAttribute('data-open') === 'true' ||\n Css.hasClassName(node, this._options.openNodeClass);\n },\n\n /**\n * Checks if a node is a parent.\n *\n * @method isParent\n * @param {Element} node Node to check\n * @return {Boolean} Whether `node` is a parent.\n **/\n isParent: function (node) {\n return Css.hasClassName(node, this._options.parentClass) ||\n this._getChild(node) != null;\n },\n\n _setNodeOpen: function (node, beOpen) {\n var child = this._getChild(node);\n if (child) {\n Css.setClassName(child, this._options.hideClass, !beOpen);\n var icon = this._getIcon(node);\n\n node.setAttribute('data-open', beOpen);\n\n /*\n * Don't refactor this to\n *\n * setClassName(el, className, status); setClassName(el, className, !status);\n *\n * because it won't work with multiple classes.\n *\n * Doing:\n * setClassName(el, 'fa fa-whatever', true);setClassName(el, 'fa fa-whatever-else', false);\n *\n * will remove 'fa' although it is a class we want.\n */\n\n var toAdd = beOpen ? this._options.openClass : this._options.closedClass;\n var toRemove = beOpen ? this._options.closedClass : this._options.openClass;\n Css.removeClassName(icon, toRemove);\n Css.addClassName(icon, toAdd);\n\n Css.setClassName(node, this._options.openNodeClass, beOpen);\n } else {\n Ink.error('Ink.UI.TreeView: node', node, 'is not a node!');\n }\n },\n\n /**\n * Opens one of the tree nodes\n *\n * Make sure you pass the node's Element\n * @method open\n * @param {Element} node The node you wish to open.\n * @return {void}\n **/\n open: function (node) {\n this._setNodeOpen(node, true);\n },\n\n /**\n * Closes one of the tree nodes\n *\n * Make sure you pass the node's Element\n * @method close\n * @param {Element} node The node you wish to close.\n * @return {void}\n **/\n close: function (node) {\n this._setNodeOpen(node, false);\n },\n\n /**\n * Toggles a node state\n *\n * @method toggle\n * @param {Element} node The node to toggle.\n * @return {void}\n **/\n toggle: function (node) {\n if (this.isOpen(node)) {\n this.close(node);\n } else {\n this.open(node);\n }\n },\n\n /**\n * @method _getChild\n **/\n _getChild: function (node) {\n return Selector.select(this._options.children, node)[0] || null;\n },\n\n /**\n * Handles the click event (as specified in the _init function).\n * \n * @method _onClick\n * @param {Event} ev DOM click event.\n * @return {void}\n * @private\n */\n _onClick: function(ev){\n /**\n * Summary:\n * If the clicked element is a \"node\" as defined in the options, will check if it has any \"child\".\n * If so, will toggle its state and stop the event's default behavior if the stopDefault option is true.\n **/\n\n if (!this.isParent(ev.currentTarget) ||\n Selector.matchesSelector(ev.target, this._options.node) ||\n Selector.matchesSelector(ev.target, this._options.children)) {\n return;\n }\n\n if (this._options.stopDefault){\n ev.preventDefault();\n }\n\n this.toggle(ev.currentTarget);\n }\n };\n\n Common.createUIComponent(TreeView);\n\n return TreeView;\n});\n","Ink.createModule('Ink.UI.Upload', '1', [\n 'Ink.Dom.Event_1',\n 'Ink.Dom.Element_1',\n 'Ink.Dom.Browser_1',\n 'Ink.UI.Common_1'\n], function(Event, Element, Browser, Common) {\n 'use strict';\n\n var DirectoryReader = function(options) {\n this.init(options);\n };\n\n DirectoryReader.prototype = {\n init: function(options) {\n this._options = Ink.extendObj({\n entry: undefined,\n maxDepth: 10\n }, options || {});\n\n try {\n this._read();\n } catch(e) {\n Ink.error(e);\n }\n },\n\n\n _read: function() {\n if(!this._options.entry) {\n Ink.error('You must specify the entry!');\n return;\n }\n\n try {\n this._readDirectories();\n } catch(e) {\n Ink.error(e);\n }\n },\n\n\n _readDirectories: function() {\n var entries = [],\n running = false,\n maxDepth = 0;\n\n /* TODO return as tree because much better well */\n var _readEntries = Ink.bind(function(currentEntry) {\n var dir = currentEntry.createReader();\n running = true;\n\n dir.readEntries(Ink.bind(function(res) {\n if(res.length > 0) {\n for(var i = 0, len = res.length; i=0; i--) {\n if(typeof(arr[i]) === 'undefined' || arr[i] === null || arr[i] === '') {\n arr.splice(i, 1);\n }\n }\n return arr;\n }\n };\n\n var Queue = {\n lists: [],\n items: [],\n\n\n /**\n * Create new queue list\n * @function create\n * @public\n * @param {String} list name\n * @param {Function} function to iterate on items\n * @return {Object} list id\n */\n create: function(name) {\n var id;\n name = String(name);\n this.lists.push({name: name});\n id = this.lists.length - 1;\n return id;\n },\n\n\n getItems: function(parentId) {\n if(!parentId) {\n return this.items;\n }\n var items = [];\n for(var i = 0, len = this.items.length; i=0; i--) {\n if(this.items[i] && id === this.items[i].parentId) {\n this.remove(this.items[i].parentId, this.items[i].pid);\n }\n }\n if(!keepList) {\n this.lists.splice(id, 1);\n }\n return true;\n } catch(e) {\n Ink.error('Purge: invalid id');\n return false;\n }\n },\n\n\n /**\n * add an item to a list\n * @function add\n * @public\n * @param {String} name\n * @param {Object} item\n * @return {Number} pid\n */\n add: function(parentId, item, priority) {\n if(!this.lists[parentId]) {\n return false;\n }\n if(typeof(item) !== 'object') {\n item = String(item);\n }\n\n var pid = parseInt(Math.round(Math.random() * 100000) + \"\" + Math.round(Math.random() * 100000), 10);\n priority = priority || 0;\n\n this.items.push({parentId: parentId, item: item, priority: priority || 0, pid: pid});\n return pid;\n },\n\n\n /**\n * View list\n * @function view\n * @public\n * @param {Number} list id\n * @param {Number} process id\n * @return {Object} item\n */\n view: function(parentId, pid) {\n var id = this._searchByPid(parentId, pid);\n if(id === false) {\n return false;\n }\n return this.items[id];\n },\n\n\n /**\n * Remove an item\n * @function remove\n * @public\n * @param {Object} item\n * @return {Object|Boolean} removed item or false if not found\n */\n remove: function(parentId, pid) {\n try {\n var id = this._searchByPid(parentId, pid);\n if(id === false) {\n return false;\n }\n this.items.splice(id, 1);\n return true;\n } catch(e) {\n Ink.error('Remove: invalid id');\n return false;\n }\n },\n\n _searchByPid: function(parentId, pid) {\n if(!parentId && typeof(parentId) === 'boolean' || !pid) {\n return false;\n }\n\n parentId = parseInt(parentId, 10);\n pid = parseInt(pid, 10);\n\n if(isNaN(parentId) || isNaN(pid)) {\n return false;\n }\n\n for(var i = 0, len = this.items.length; i this._options.minSizeToUseChunks;\n },\n\n\n _dropEventHandler: function(ev) {\n Event.stop(ev);\n\n this.publish('DropComplete', ev.dataTransfer);\n\n var data = ev.dataTransfer;\n\n if(!data || !data.files || !data.files.length) {\n return false;\n }\n\n this._files = data.files;\n this._files = Array.prototype.slice.call(this._files || [], 0);\n\n // check if webkitGetAsEntry exists on first item\n if(data.items && data.items[0] && data.items[0].webkitGetAsEntry) {\n if(!this._options.foldersEnabled) {\n return setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);\n }\n var entry, folders = [];\n for(var i = ev.dataTransfer.items.length-1; i>=0; i--) {\n entry = ev.dataTransfer.items[i].webkitGetAsEntry();\n if(entry && entry.isDirectory) {\n folders.push(entry);\n this._files[i].isDirectory = true;\n this._files.splice(i, 1);\n }\n }\n // starting callback hell\n this._addFolderToQueue(folders, Ink.bind(function() {\n setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);\n }, this));\n } else {\n setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);\n }\n\n return true;\n },\n\n\n _addFolderToQueue: function(folders, cb) {\n var files = [], invalidFolders = {};\n\n if(!folders || !folders.length) {\n cb();\n return files;\n }\n\n var getFiles = function(entries) {\n var files = [];\n for(var i = 0, len = entries.length; i this._options.maxFilesize) {\n this.publish('MaxSizeFailure', file, this._options.maxFilesize);\n continue;\n }\n\n fileID = parseInt(Math.round(Math.random() * 100000) + \"\" + Math.round(Math.random() * 100000), 10);\n o = { id: i, data: file, fileID: fileID, directory: file.isDirectory };\n Queue.add(this._queueId, o);\n\n this.publish('FileAddedToQueue', o);\n }\n this._processQueue(true);\n this._files = [];\n },\n\n\n _processQueue: function(internalUpload) {\n if(this._queueRunning) {\n return false;\n }\n\n this.running = 0;\n var max = 1, i = 0, items,\n queueLen = Queue.items.length;\n this._queueRunning = true;\n\n this.interval = setInterval(Ink.bind(function() {\n if(Queue.items.length === i && this.running === 0) {\n Queue.purge(this._queueId, true);\n this._queueRunning = false;\n clearInterval(this.interval);\n this.publish('QueueEnd', this._queueId, queueLen);\n }\n\n items = Queue.getItems(this._queueId);\n\n if(this.running < max && items[i]) {\n if(!items[i].canceled) {\n _doRequest.call(this, items[i].pid, items[i].item.data, items[i].item.fileID, items[i].item.directory, internalUpload);\n this.running++;\n i++;\n } else {\n var j = i;\n while(items[j] && items[j].canceled) {\n i++;\n j++;\n }\n }\n return true;\n }\n return false;\n }, this), 100);\n\n\n var _doRequest = function(pid, data, fileID, directory, internalUpload) {\n var o = {\n file: data,\n fileID: fileID,\n cb: Ink.bind(function() {\n this.running--;\n }, this)\n };\n if(internalUpload) {\n if(directory) {\n // do magic\n o.cb();\n } else {\n this._upload(o);\n }\n }\n };\n\n return true;\n },\n\n\n _upload: function(o) {\n var file = o.file,\n xhr = new XMLHttpRequest(),\n fileID = o.fileID;\n\n this.publish('BeforeUpload', file, this._options.extraData, fileID, xhr, this._supportChunks(file.size));\n\n var forceAbort = function(showError) {\n if(o.cb && typeof(o.cb === 'function')) {\n o.cb();\n }\n\n this.publish('OnProgress', {\n length: file.size,\n lengthComputable: true,\n loaded: file.size,\n total: file.size\n }, file, fileID);\n this.publish('EndUpload', file, fileID, (showError ? { error: true } : true));\n this.publish('InvalidFile', file, 'name');\n xhr.abort();\n };\n\n if(this._options.INVALID_FILE_NAME && this._options.INVALID_FILE_NAME instanceof RegExp) {\n if(this._options.INVALID_FILE_NAME.test(o.file.name)) {\n forceAbort.call(this);\n return;\n }\n }\n\n // If file was renamed, abort it\n // FU OPERA: Opera always return lastModified date as null\n if(!file.lastModifiedDate && !Ink.Dom.Browser.OPERA) {\n forceAbort.call(this, true);\n return;\n }\n\n xhr.upload.onprogress = Ink.bind(this.publish, this, 'OnProgress', file, fileID);\n\n var endpoint, method;\n if(this._supportChunks(file.size)) {\n if(file.size <= file.chunk_offset) {\n endpoint = this._options.endpointChunkCommit;\n method = 'POST';\n } else {\n endpoint = this._options.endpointChunk;\n if(file.chunk_upload_id) {\n endpoint += '?upload_id=' + file.chunk_upload_id;\n }\n if(file.chunk_offset) {\n endpoint += '&offset=' + file.chunk_offset;\n }\n method = 'PUT';\n }\n } else {\n endpoint = this._options.endpoint;\n method = 'POST';\n }\n\n xhr.open(method, endpoint, true);\n xhr.withCredentials = true;\n xhr.setRequestHeader(\"x-requested-with\", \"XMLHttpRequest\");\n if(this._supportChunks(file.size)) {\n xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n }\n\n var fd = new FormData(),\n blob;\n\n if(\"Blob\" in window && typeof Blob === 'function') {\n blob = new Blob([file], { type: file.type });\n if(this._supportChunks(file.size)) {\n file.chunk_offset = file.chunk_offset || 0;\n blob = blob.slice(file.chunk_offset, file.chunk_offset + this._options.chunkSize);\n } else {\n fd.append(this._options.fileFormName, blob, file.name);\n }\n } else {\n fd.append(this._options.fileFormName, file);\n }\n\n if(!this._supportChunks(file.size)) {\n for(var k in this._options.extraData) {\n if(this._options.extraData.hasOwnProperty(k)) {\n fd.append(k, this._options.extraData[k]);\n }\n }\n } else {\n fd.append('upload_id', file.chunk_upload_id);\n fd.append('path', file.upload_path);\n }\n\n if(!file.hasParent) {\n if(!this._supportChunks(file.size)) {\n xhr.send(fd);\n } else {\n if(file.size <= file.chunk_offset) {\n xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name);\n } else {\n xhr.send(blob);\n }\n }\n } else {\n this.publish('cbCreateFolder', file.parentID, file.fullPath, this._options.extraData, this._folders, file.rootPath, Ink.bind(function() {\n if(!this._supportChunks(file.size)) {\n xhr.send(fd);\n } else {\n if(file.size <= file.chunk_offset) {\n xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name);\n } else {\n xhr.send(blob);\n }\n }\n }, this));\n }\n\n\n xhr.onload = Ink.bindEvent(function() {\n /* jshint boss:true */\n if(this._supportChunks(file.size) && file.size > file.chunk_offset) {\n if(xhr.response) {\n var response = JSON.parse(xhr.response);\n\n // check expected offset\n var invalidOffset = file.chunk_offset && response.offset !== (file.chunk_offset + this._options.chunkSize) && file.size !== response.offset;\n if(invalidOffset) {\n if(o.cb) {\n o.cb();\n }\n this.publish('ErrorUpload', file, fileID);\n } else {\n file.chunk_upload_id = response.upload_id;\n file.chunk_offset = response.offset;\n file.chunk_expires = response.expires;\n this._upload(o);\n }\n } else {\n if(o.cb) {\n o.cb();\n }\n this.publish('ErrorUpload', file, fileID);\n }\n return (xhr = null);\n }\n\n if(o.cb) {\n o.cb();\n }\n\n if(xhr.responseText && xhr['status'] < 400) {\n this.publish('EndUpload', file, fileID, xhr.responseText);\n } else {\n this.publish('ErrorUpload', file, fileID);\n }\n return (xhr = null);\n }, this);\n\n\n xhr.onerror = Ink.bindEvent(function() {\n if(o.cb) {\n o.cb();\n }\n this.publish('ErrorUpload', file, fileID);\n }, this);\n\n xhr.onabort = Ink.bindEvent(function() {\n if(o.cb) {\n o.cb();\n }\n this.publish('AbortUpload', file, fileID, {\n abortAll: Ink.bind(this.abortAll, this),\n abortOne: Ink.bind(this.abortOne, this)\n });\n }, this);\n },\n\n\n abortAll: function() {\n if(!this._queueRunning) {\n return false;\n }\n clearInterval(this.interval);\n this._queueRunning = false;\n Queue.purge(this._queueId, true);\n return true;\n },\n\n abortOne: function(id, cb) {\n var items = Queue.getItems(0),\n o;\n for(var i = 0, len = items.length; i 1) { return; }\n\n this._swipeData = {\n x: InkEvent.pointerX(event),\n y: InkEvent.pointerY(event)\n };\n\n var ulRect = this._ulEl.getBoundingClientRect();\n\n this._swipeData.firstUlPos = ulRect[this._isY ? 'top' : 'left'];\n\n this._swipeData.inUlX = this._swipeData.x - ulRect.left;\n this._swipeData.inUlY = this._swipeData.y - ulRect.top;\n\n setTransitionProperty(this._ulEl, 'none');\n\n this._touchMoveIsFirstTouchMove = true;\n },\n\n _onTouchMove: function (event) {\n if (event.touches.length > 1) { return; /* multitouch event, not my problem. */ }\n\n var pointerX = InkEvent.pointerX(event);\n var pointerY = InkEvent.pointerY(event);\n\n var deltaY = this._swipeData.y - pointerY;\n var deltaX = this._swipeData.x - pointerX;\n\n if (this._touchMoveIsFirstTouchMove) {\n var aDeltaY = Math.abs(deltaY);\n var aDeltaX = Math.abs(deltaX);\n\n this._touchMoveIsFirstTouchMove = undefined;\n this._scrolling = this._isY ?\n aDeltaX > aDeltaY :\n aDeltaY > aDeltaX ;\n\n if (!this._scrolling) {\n this._onAnimationFrame();\n }\n }\n\n if (!this._scrolling && this._swipeData) {\n InkEvent.stopDefault(event);\n\n this._swipeData.pointerDelta = this._isY ? deltaY : deltaX;\n this._swipeData.pointerPos = this._isY ? pointerY : pointerX;\n }\n },\n\n _onAnimationFrame: function () {\n var swipeData = this._swipeData;\n\n if (!swipeData || this._scrolling || this._touchMoveIsFirstTouchMove) { return; }\n\n var elRect = this._element.getBoundingClientRect();\n\n var newPos;\n\n if (!this._isY) {\n newPos = swipeData.pointerPos - swipeData.inUlX - elRect.left;\n } else {\n newPos = swipeData.pointerPos - swipeData.inUlY - elRect.top;\n }\n\n this._ulEl.style[this._isY ? 'top' : 'left'] = newPos + 'px';\n\n requestAnimationFrame(Ink.bindMethod(this, '_onAnimationFrame'));\n },\n\n _onTouchEnd: function (event) {\n if (this._swipeData && this._swipeData.pointerPos && !this._scrolling && !this._touchMoveIsFirstTouchMove) {\n var snapToNext = 0.1; // swipe 10% of the way to change page\n\n var pointerDelta = this._swipeData.pointerDelta;\n\n var curPage = this.getPage();\n\n // How many pages were advanced? May be fractional.\n var progressInPages = pointerDelta / this._elLength / this._slidesPerPage;\n\n // Have we advanced enough to change page?\n if (Math.abs(progressInPages) > snapToNext) {\n curPage += Math[ pointerDelta < 0 ? 'floor' : 'ceil' ](progressInPages);\n }\n\n curPage = limitRange(curPage, 0, this._numPages - 1);\n\n // If something used to calculate progressInPages was zero, we get NaN here.\n if (!isNaN(curPage)) {\n this.setPage(curPage);\n }\n\n InkEvent.stopDefault(event);\n }\n\n setTransitionProperty(this._ulEl, null /* transition: left, top */);\n this._swipeData = null;\n this._touchMoveIsFirstTouchMove = undefined;\n this._scrolling = undefined;\n },\n\n _onPaginationChange: function(pgn) {\n this._setPage(pgn.getCurrent());\n },\n\n /**\n * Gets the current page index\n * @method getPage\n * @return {Number} The current page number\n * @public\n **/\n getPage: function () {\n if (this._pagination) {\n return this._pagination.getCurrent();\n } else {\n return this._currentPage || 0;\n }\n },\n\n /**\n * Gets the Ink Pagination element this carousel is using.\n * @method getPagination\n * @return {Pagination} The pagination instance, if any. Otherwise, `null`.\n * @public\n **/\n getPagination: function () {\n return this._pagination || null;\n },\n\n /**\n * Sets the current page index\n * @method setPage\n * @param {Number} page Index of the destination page.\n * @param {Boolean} [wrap=false] Flag to activate circular counting (for example, if you set the page to `5` and there are only 4 pages, you're actually going to the first page).\n * @return {void}\n * @public\n **/\n setPage: function (page, wrap) {\n if (wrap) {\n // Pages outside the range [0..this._numPages] are wrapped.\n page = page % this._numPages;\n if (page < 0) { page = this._numPages - page; }\n }\n page = limitRange(page, 0, this._numPages - 1);\n\n if (page === this._currentPage) {\n if (this._swipeData) {\n this._setPage(page); // Just advance the view.\n }\n return;\n }\n\n if (this._pagination) {\n this._pagination.setCurrent(page); // _setPage is called by pagination because it listens to its Change event.\n } else {\n this._setPage(page);\n }\n },\n\n _setPage: function (page) {\n var _lengthToGo = page * this._deltaLength;\n var isLastPage = page === (this._numPages - 1);\n\n if (!this._options.spaceAfterLastSlide && isLastPage && page > 0) { \n var _itemsInLastPage = this._liEls.length - (page * this._slidesPerPage);\n if(_itemsInLastPage < this._slidesPerPage) {\n _lengthToGo = ((page - 1) * this._deltaLength) + (_itemsInLastPage * this._elLength);\n }\n }\n\n this._ulEl.style[ this._isY ? 'top' : 'left'] =\n ['-', (_lengthToGo / this._ctnLength) * 100, '%'].join('');\n\n if (this._options.onChange) {\n this._options.onChange.call(this, page);\n }\n\n this._currentPage = page;\n },\n\n /**\n * Goes to the next page\n * @method nextPage\n * @param {Boolean} [wrap=false] Flag to loop from last page to first page.\n * @return {void}\n * @public\n **/\n nextPage: function (wrap) {\n this.setPage(this.getPage() + 1, wrap);\n },\n\n /**\n * Goes to the previous page\n * @method previousPage\n * @param {Boolean} [wrap=false] Flag to loop from first page to last page.\n * @return {void}\n * @public\n **/\n previousPage: function (wrap) { this.setPage(this.getPage() - 1, wrap); },\n\n /**\n * Returns how many slides fit into a page\n * @method getSlidesPerPage\n * @return {Number} The number of slides per page\n * @public\n */\n getSlidesPerPage: function() {\n return this._slidesPerPage;\n },\n\n /**\n * Get the amount of pages in the carousel.\n * @method getTotalPages\n * @return {Number} The number of pages\n * @public\n */\n getTotalPages: function() {\n return this._numPages;\n },\n\n /**\n * Get the stage element (your UL with the class \".stage\").\n * @method getStageElm\n * @public\n * @return {Element} Stage element\n **/\n getStageElm: function() {\n return this._ulEl;\n },\n\n /**\n * Get a list of your slides (elements with the \".slide\" class inside your stage)\n * @method getSlidesList\n * @return {Element[]} Array containing the slides.\n * @public\n */\n getSlidesList: function() {\n return this._liEls;\n },\n\n /**\n * Get the total number of slides\n * @method getTotalSlides\n * @return {Number} The number of slides\n * @public\n */\n getTotalSlides: function() {\n return this.getSlidesList().length;\n }\n };\n\n function setTransitionProperty(el, newTransition) {\n el.style.transitionProperty =\n el.style.oTransitionProperty =\n el.style.msTransitionProperty =\n el.style.mozTransitionProperty =\n el.style.webkitTransitionProperty = newTransition;\n }\n\n Common.createUIComponent(Carousel);\n\n return Carousel;\n\n});\n","/**\n * Closing utilities\n * @module Ink.UI.Close_1\n * @version 1\n */\nInk.createModule('Ink.UI.Close', '1', ['Ink.Dom.Event_1','Ink.Dom.Element_1'], function(InkEvent, InkElement) {\n 'use strict';\n\n /**\n * Subscribes clicks on the document.body.\n * Whenever an element with the classes \".ink-close\" or \".ink-dismiss\" is clicked, this module finds an ancestor \".ink-alert\" or \".ink-alert-block\" element and removes it from the DOM.\n * This module should be created only once per page.\n * \n * @class Ink.UI.Close\n * @constructor\n * @example\n * \n *\n * @sample Ink_UI_Close_1.html\n */\n function Close() {\n InkEvent.observe(document.body, 'click', function(ev) {\n var el = InkEvent.element(ev);\n\n el = InkElement.findUpwardsByClass(el, 'ink-close') ||\n InkElement.findUpwardsByClass(el, 'ink-dismiss');\n\n if (!el) {\n return; // ink-close or ink-dismiss class not found\n }\n\n var toRemove = InkElement.findUpwardsByClass(el, 'ink-alert') ||\n InkElement.findUpwardsByClass(el, 'ink-alert-block') ||\n el;\n\n if (toRemove) {\n InkEvent.stop(ev);\n InkElement.remove(toRemove);\n }\n });\n }\n\n Close._name = 'Close_1';\n\n return Close;\n});\n","/**\n * Auxiliar utilities for UI Modules\n * @module Ink.UI.Common_1\n * @version 1\n */\n \nInk.createModule('Ink.UI.Common', '1', ['Ink.Dom.Element_1', 'Ink.Net.Ajax_1','Ink.Dom.Css_1','Ink.Dom.Selector_1','Ink.Util.Url_1'], function(InkElement, Ajax,Css,Selector,Url) {\n\n 'use strict';\n\n var nothing = {} /* a marker, for reference comparison. */;\n\n var keys = Object.keys || function (obj) {\n var ret = [];\n for (var k in obj) if (obj.hasOwnProperty(k)) {\n ret.push(k);\n }\n return ret;\n };\n\n var es6WeakMapSupport = 'WeakMap' in window;\n var instances = es6WeakMapSupport ? new WeakMap() : null;\n // Old Registry\n var _reg = [];\n var domRegistry = {\n get: function get(el) {\n return es6WeakMapSupport ?\n instances.get(el) :\n _reg[el.getAttribute('__InkInstance')];\n },\n set: function set(el, thing) {\n if (es6WeakMapSupport) {\n instances.set(el, thing);\n } else {\n el.setAttribute('__InkInstance', _reg.push(thing) - 1);\n }\n }\n };\n\n /**\n * @namespace Ink.UI.Common_1\n */\n\n var Common = {\n\n /**\n * Supported Ink Layouts\n *\n * @property Layouts\n * @type Object\n * @readOnly\n */\n Layouts: {\n TINY: 'tiny',\n SMALL: 'small',\n MEDIUM: 'medium',\n LARGE: 'large',\n XLARGE: 'xlarge'\n },\n\n /**\n * Checks if an item is a valid DOM Element.\n *\n * @method isDOMElement\n * @static\n * @param {Mixed} o The object to be checked.\n * @return {Boolean} True if it's a valid DOM Element.\n * @example\n * var el = Ink.s('#element');\n * if( Ink.UI.Common.isDOMElement( el ) === true ){\n * // It is a DOM Element.\n * } else {\n * // It is NOT a DOM Element.\n * }\n */\n isDOMElement: InkElement.isDOMElement,\n\n /**\n * Checks if an item is a valid integer.\n *\n * @method isInteger\n * @static\n * @param {Mixed} n The value to be checked.\n * @return {Boolean} True if it's a valid integer.\n * @example\n * var value = 1;\n * if( Ink.UI.Common.isInteger( value ) === true ){\n * // It is an integer.\n * } else {\n * // It is NOT an integer.\n * }\n */\n isInteger: function(n) {\n return (typeof n === 'number' && n % 1 === 0);\n },\n\n /**\n * Gets a DOM Element. \n *\n * @method elOrSelector\n * @static\n * @param {Element|String} elOrSelector DOM Element or CSS Selector\n * @param {String} fieldName The name of the field. Commonly used for debugging.\n * @return {Element} Returns the Element passed or the first result of the CSS Selector. Otherwise it throws an exception.\n * @example\n * // In case there are several .myInput, it will retrieve the first found\n * var el = Ink.UI.Common.elOrSelector('.myInput','My Input');\n */\n elOrSelector: function(elOrSelector, fieldName) {\n if (!Common.isDOMElement(elOrSelector)) {\n var t = Selector.select(elOrSelector);\n if (t.length === 0) {\n Ink.warn(fieldName + ' must either be a DOM Element or a selector expression!\\nThe script element must also be after the DOM Element itself.');\n return null;\n }\n return t[0];\n }\n return elOrSelector;\n },\n\n /**\n * Like `elOrSelector` but returns an array of elements.\n *\n * @method elsOrSelector\n *\n * @static\n * @param {Element|Array|String} elsOrSelector DOM Element, array of DOM Elements, or CSS Selector\n * @param {String} [fieldName] The name of the field. Used for the error shown when no elements are found.\n * @param {Boolean} required If this is true, throw an error instead of returning an empty array.\n * @return {Array} The selected Elements, or the given Elements\n * @example\n * var elements = Ink.UI.Common.elsOrSelector('input.my-inputs', 'My Input');\n */\n elsOrSelector: function(elsOrSelector, fieldName, required) {\n var ret;\n if (typeof elsOrSelector === 'string') {\n ret = Selector.select(elsOrSelector);\n } else if (Common.isDOMElement(elsOrSelector)) {\n ret = [elsOrSelector];\n } else if (elsOrSelector && typeof elsOrSelector === 'object' && typeof elsOrSelector.length === 'number') {\n ret = elsOrSelector;\n }\n\n if (ret && ret.length) {\n return ret;\n } else {\n if (required) {\n throw new TypeError(fieldName + ' must either be a DOM Element, an Array of elements, or a selector expression!\\nThe script element must also be after the DOM Element itself.');\n } else {\n return [];\n }\n }\n },\n\n /**\n * Gets options an object and element's metadata.\n *\n * The element's data attributes take precedence. Values from the element's data-atrributes are coerced into the required type.\n *\n * @method options\n *\n * @param {Object} [fieldId] Name to be used in error reports.\n * @param {Object} defaults Object with the options' types and defaults.\n * @param {Object} overrides Options to override the defaults. Usually passed when instantiating an UI module.\n * @param {Element} [element] Element with data-attributes\n * @return {Object} An object containing all the option values.\n *\n * @example\n *\n * this._options = Ink.UI.Common.options('MyComponent', {\n * 'anobject': ['Object', null], // Defaults to null\n * 'target': ['Element', null],\n * 'stuff': ['Number', 0.1],\n * 'stuff2': ['Integer', 0],\n * 'doKickFlip': ['Boolean', false],\n * 'targets': ['Elements'], // Required option since no default was given\n * 'onClick': ['Function', null]\n * }, options || {}, elm)\n *\n * @example\n *\n * ### Note about booleans\n *\n * Here is how options are read from the markup\n * data-attributes, for several values`data-a-boolean`.\n *\n * Options considered true:\n *\n * - `data-a-boolean=\"true\"`\n * - (Every other value which is not on the list below.)\n * \n * Options considered false:\n *\n * - `data-a-boolean=\"false\"`\n * - `data-a-boolean=\"\"`\n * - `data-a-boolean`\n *\n * Options which go to default:\n *\n * - (no attribute). When `data-a-boolean` is ommitted, the\n * option is not considered true nor false, and as such\n * defaults to what is in the `defaults` argument.\n *\n **/\n options: function (fieldId, defaults, overrides, element) {\n // TODO Change Common.options's signature? the below looks better, more manageable\n // var options = Common.options({\n // element: this._element,\n // modName: constructor._name,\n // options: constructor._optionDefinition,\n // defaults: constructor._globalDefaults\n // });\n\n if (typeof fieldId !== 'string') {\n element = overrides;\n overrides = defaults;\n defaults = fieldId;\n fieldId = '';\n }\n overrides = overrides || {};\n var out = {};\n var dataAttrs = element ? InkElement.data(element) : {};\n var fromDataAttrs;\n var type;\n var lType;\n var defaultVal;\n\n var invalidStr = function (str) {\n if (fieldId) { str = fieldId + ': \"' + ('' + str).replace(/\"/, '\\\\\"') + '\"'; }\n return str;\n };\n\n var quote = function (str) {\n return '\"' + ('' + str).replace(/\"/, '\\\\\"') + '\"';\n };\n\n var invalidThrow = function (str) {\n throw new Error(invalidStr(str));\n };\n\n var invalid = function (str) {\n Ink.error(invalidStr(str) + '. Ignoring option.');\n };\n\n function optionValue(key) {\n type = defaults[key][0];\n lType = type.toLowerCase();\n defaultVal = defaults[key].length === 2 ? defaults[key][1] : nothing;\n\n if (!type) {\n invalidThrow('Ink.UI.Common.options: Always specify a type!');\n }\n if (!(lType in Common._coerce_funcs)) {\n invalidThrow('Ink.UI.Common.options: ' + defaults[key][0] + ' is not a valid type. Use one of ' + keys(Common._coerce_funcs).join(', '));\n\n }\n if (!defaults[key].length || defaults[key].length > 2) {\n invalidThrow('the \"defaults\" argument must be an object mapping option names to [typestring, optional] arrays.');\n }\n\n if (key in dataAttrs) {\n fromDataAttrs = Common._coerce_from_string(lType, dataAttrs[key], key, fieldId);\n // (above can return `nothing`)\n } else {\n fromDataAttrs = nothing;\n }\n\n if (fromDataAttrs !== nothing) {\n if (!Common._options_validate(fromDataAttrs, lType)) {\n invalid('(' + key + ' option) Invalid ' + lType + ' ' + quote(fromDataAttrs));\n return defaultVal;\n } else {\n return fromDataAttrs;\n }\n } else if (key in overrides) {\n return overrides[key];\n } else if (defaultVal !== nothing) {\n return defaultVal;\n } else {\n invalidThrow('Option ' + key + ' is required!');\n }\n }\n\n for (var key in defaults) {\n if (defaults.hasOwnProperty(key)) {\n out[key] = optionValue(key);\n }\n }\n\n return out;\n },\n\n _coerce_from_string: function (type, val, paramName, fieldId) {\n if (type in Common._coerce_funcs) {\n return Common._coerce_funcs[type](val, paramName, fieldId);\n } else {\n return val;\n }\n },\n\n _options_validate: function (val, type) {\n if (type in Common._options_validate_types) {\n return Common._options_validate_types[type].call(Common, val);\n } else {\n // 'object' options cannot be passed through data-attributes.\n // Json you say? Not any good to embed in HTML.\n return false;\n }\n },\n\n _coerce_funcs: (function () {\n var ret = {\n element: function (val) {\n return Common.elOrSelector(val, '');\n },\n elements: function (val) {\n return Common.elsOrSelector(val, '', false /*not required, so don't throw an exception now*/);\n },\n object: function (val) { return val; },\n number: function (val) { return parseFloat(val); },\n 'boolean': function (val) {\n return !(val === 'false' || val === '' || val === null);\n },\n string: function (val) { return val; },\n 'function': function (val, paramName, fieldId) {\n Ink.error(fieldId + ': You cannot specify the option \"' + paramName + '\" through data-attributes because it\\'s a function');\n return nothing;\n }\n };\n ret['float'] = ret.integer = ret.number;\n return ret;\n }()),\n\n _options_validate_types: (function () {\n var types = {\n string: function (val) {\n return typeof val === 'string';\n },\n number: function (val) {\n return typeof val === 'number' && !isNaN(val) && isFinite(val);\n },\n integer: function (val) {\n return val === Math.round(val);\n },\n element: function (val) {\n return Common.isDOMElement(val);\n },\n elements: function (val) {\n return val && typeof val === 'object' && typeof val.length === 'number' && val.length;\n },\n 'boolean': function (val) {\n return typeof val === 'boolean';\n },\n object: function () { return true; }\n };\n types['float'] = types.number;\n return types;\n }()),\n\n /**\n * Deep copy (clone) an object.\n * Note: The object cannot have referece loops.\n *\n * @method clone\n * @static\n * @deprecated\n * @param {Object} o The object to be cloned/copied.\n * @return {Object} Returns the result of the clone/copy.\n * @example\n * var originalObj = {\n * key1: 'value1',\n * key2: 'value2',\n * key3: 'value3'\n * };\n * var cloneObj = Ink.UI.Common.clone( originalObj );\n */\n clone: function(o) {\n try {\n return JSON.parse( JSON.stringify(o) );\n } catch (ex) {\n throw new Error('Given object cannot have loops!');\n }\n },\n\n\n /**\n * Gets an element's one-base index relative to its parent.\n *\n * Deprecated. Use Ink.Dom.Element.parentIndexOf instead.\n *\n * @method childIndex\n * @deprecated\n * @static\n * @param {Element} childEl Valid DOM Element.\n * @return {Number} Numerical position of an element relatively to its parent.\n * @example\n * \n *
          \n *
        • One
        • \n *
        • Two
        • \n *
        • Three
        • \n *
        • Four
        • \n *
        \n *\n * \n */\n childIndex: InkElement.parentIndexOf,\n\n /**\n * AJAX JSON request shortcut method\n * It provides a more convenient way to do an AJAX request and expect a JSON response.It also offers a callback option, as third parameter, for better async handling.\n *\n * @method ajaxJSON\n * @static\n * @async\n * @param {String} endpoint Valid URL to be used as target by the request.\n * @param {Object} params This field is used in the thrown Exception to identify the parameter.\n * @param {Function} cb Callback for the request.\n * @return {void}\n * @public\n * @example\n * // In case there are several .myInput, it will retrieve the first found\n * var el = Ink.UI.Common.elOrSelector('.myInput','My Input');\n */\n ajaxJSON: function(endpoint, params, cb) {\n new Ajax(\n endpoint,\n {\n evalJS: 'force',\n method: 'POST',\n parameters: params,\n\n onSuccess: function( r) {\n try {\n r = r.responseJSON;\n if (r.status !== 'ok') {\n throw 'server error: ' + r.message;\n }\n cb(null, r);\n } catch (ex) {\n cb(ex);\n }\n },\n\n onFailure: function() {\n cb('communication failure');\n }\n }\n );\n },\n\n\n /**\n * Gets the current Ink layout.\n *\n * @method currentLayout\n * @static\n * @return {String} A string representation of the current layout name.\n * @public\n * @example\n * var inkLayout = Ink.UI.Common.currentLayout();\n * if (inkLayout === 'small') {\n * // ...\n * }\n */\n currentLayout: function() {\n var i, f, k, v, el, detectorEl = Selector.select('#ink-layout-detector')[0];\n if (!detectorEl) {\n detectorEl = document.createElement('div');\n detectorEl.id = 'ink-layout-detector';\n for (k in Common.Layouts) {\n if (Common.Layouts.hasOwnProperty(k)) {\n v = Common.Layouts[k];\n el = document.createElement('div');\n el.className = 'show-' + v + ' hide-all';\n el.setAttribute('data-ink-layout', v);\n detectorEl.appendChild(el);\n }\n }\n document.body.appendChild(detectorEl);\n }\n\n for (i = 0, f = detectorEl.children.length; i < f; ++i) {\n el = detectorEl.children[i];\n if (Css.getStyle(el, 'display') === 'block') {\n return el.getAttribute('data-ink-layout');\n }\n }\n\n return 'large';\n },\n\n\n /**\n * Sets the location's hash (window.location.hash).\n *\n * @method hashSet\n * @static\n * @param {Object} o Object with the info to be placed in the location's hash.\n * @return {void}\n * @example\n * // It will set the location's hash like: #key1=value1&key2=value2&key3=value3\n * Ink.UI.Common.hashSet({\n * key1: 'value1',\n * key2: 'value2',\n * key3: 'value3'\n * });\n */\n hashSet: function(o) {\n if (typeof o !== 'object') { throw new TypeError('o should be an object!'); }\n var hashParams = Url.getAnchorString();\n hashParams = Ink.extendObj(hashParams, o);\n window.location.hash = Url.genQueryString('', hashParams).substring(1);\n },\n\n /**\n * Removes children nodes from a given object.\n * This method was initially created to help solve a problem in Internet Explorer(s) that occurred when trying to set the innerHTML of some specific elements like 'table'.\n *\n * @method cleanChildren\n * @static\n * @param {Element} parentEl Valid DOM Element\n * @return {void}\n * @public\n * @example\n * \n *
          \n *
        • One
        • \n *
        • Two
        • \n *
        • Three
        • \n *
        • Four
        • \n *
        \n *\n * \n *\n * \n *
          \n */\n cleanChildren: function(parentEl) {\n if( !Common.isDOMElement(parentEl) ){\n throw new Error('Please provide a valid DOMElement');\n }\n InkElement.setHTML(parentEl, '');\n },\n\n /**\n * Stores the id and/or classes of an element in an object.\n *\n * @method storeIdAndClasses\n * @static\n * @param {Element} fromEl Valid DOM Element to get the id and classes from.\n * @param {Object} inObj Object where the id and classes will be saved.\n * @return {void}\n * @public\n * @example\n *
          \n *\n * \n */\n storeIdAndClasses: function(fromEl, inObj) {\n if( !Common.isDOMElement(fromEl) ){\n throw 'Please provide a valid Element as first parameter';\n }\n\n var id = fromEl.id;\n if (id) {\n inObj._id = id;\n }\n\n var classes = fromEl.className;\n if (classes) {\n inObj._classes = classes;\n }\n },\n\n /**\n * Sets the id and className properties of an element based \n *\n * @method restoreIdAndClasses\n * @static\n * @param {Element} toEl Valid DOM Element to set the id and classes on.\n * @param {Object} inObj Object where the id and classes to be set are. This method uses the same format as the one given in `storeIdAndClasses`\n * @return {void}\n * @public\n * @example\n *
          \n *\n * \n *\n * \n *
          \n */\n restoreIdAndClasses: function(toEl, inObj) {\n\n if( !Common.isDOMElement(toEl) ){\n throw 'Please provide a valid Element as first parameter';\n }\n\n if (inObj._id && toEl.id !== inObj._id) {\n toEl.id = inObj._id;\n }\n\n if (inObj._classes && toEl.className.indexOf(inObj._classes) === -1) {\n if (toEl.className) { toEl.className += ' ' + inObj._classes; }\n else { toEl.className = inObj._classes; }\n }\n\n if (inObj._instanceId && !toEl.getAttribute('data-instance')) {\n toEl.setAttribute('data-instance', inObj._instanceId);\n }\n },\n\n _warnDoubleInstantiation: function (elm, newInstance) {\n var instances = Common.getInstance(elm);\n\n if (getName(newInstance) === '') { return; }\n if (!instances) { return; }\n\n var nameWithoutVersion = getName(newInstance);\n\n if (!nameWithoutVersion) { return; }\n\n for (var i = 0, len = instances.length; i < len; i++) {\n if (nameWithoutVersion === getName(instances[i])) {\n // Yes, I am using + to concatenate and , to split\n // arguments.\n //\n // Elements can't be concatenated with strings, but if\n // they are passed in an argument, modern debuggers will\n // pretty-print them and make it easy to find them in the\n // element inspector.\n //\n // On the other hand, if strings are passed as different\n // arguments, they get pretty printed. And the pretty\n // print of a string has quotes around it.\n //\n // If some day people find out that strings are not\n // just text and they start preserving contextual\n // information, then by all means change this to a\n // regular concatenation.\n //\n // But they won't. So don't change this.\n Ink.warn('Creating more than one ' + nameWithoutVersion + 'for the same element.',\n '(Was creating a ' + nameWithoutVersion + ' on:', elm, ').');\n return false;\n }\n }\n\n function getName(thing) {\n return ((thing.constructor && (thing.constructor._name)) ||\n thing._name ||\n '').replace(/_.*?$/, '');\n }\n\n return true;\n },\n\n /**\n * Saves an object (which should inherit BaseUIComponent) in the registry, associated with an element. You can retrieve it later by calling getInstance.\n *\n * This won't allow two instances of the same class to be created on a single element. It will fail and print a warning to the console if you try to do it. That is a common error when using Ink.\n *\n * @method registerInstance\n * @static\n * @param {Object} inst Object to be registered\n * @param {Element} [el=inst._element] Element to associate with `inst`. Defaults to `_element` property of `inst`.\n * @return {Boolean} `true` if we could create the instance, `false` otherwise.\n */\n registerInstance: function(inst, el) {\n if (!inst) { return; }\n\n if (!el) { el = inst._element; }\n\n if (!Common.isDOMElement(el)) { throw new TypeError('Ink.UI.Common.registerInstance: The element passed in is not a DOM element!'); }\n\n // [todo] this belongs in the BaseUIComponent's initialization\n if (Common._warnDoubleInstantiation(el, inst) === false) {\n return false;\n }\n\n var instances = domRegistry.get(el);\n\n if (!instances) {\n instances = [];\n domRegistry.set(el, instances);\n }\n\n instances.push(inst);\n\n return true;\n },\n\n /**\n * Unregisters (removes from the registry) a UI component instance from whatever element it's on.\n *\n * @method unregisterInstance\n * @static\n * @param {String} inst Instance to be unregistered.\n * @return {void}\n * @public\n */\n unregisterInstance: function(inst) {\n if (!inst || !inst._element) { return; }\n var instances = domRegistry.get(inst._element);\n for (var i = 0, len = instances.length; i < len; i++) {\n if (instances[i] === inst) {\n instances.splice(i, 1);\n }\n }\n },\n\n /**\n * Gets an UI component instance from an element.\n *\n * This function is already available in the UI components' classes themselves. You can call Modal.getInstance() and retrieve a modal.\n *\n * @method getInstance\n * @static\n * @param {String|Element} el Element from which we want the instances. A selector is okay.\n * @param {BaseUIComponent} [UIComponent] If you pass an Ink UI component class (Like Ink.UI.Modal or Ink.UI.Carousel), this won't return an array of all instances associated with the element. Instead it will return only the object which is an instance of that class.\n * @return {Object|Array} Returns an array containing all the instances in that element.\n * @public\n */\n getInstance: function(el, UIComponent) {\n var givenEl = el; // So we can warn it later.\n\n el = Common.elOrSelector(el);\n\n if (!Common.isDOMElement(el)) {\n Ink.warn('Ink.UI.Common: getInstance called on non-element (' + givenEl + ')');\n return [];\n }\n\n var instances = domRegistry.get(el);\n\n if (!instances) {\n instances = [];\n }\n\n if (typeof UIComponent !== 'function') {\n return instances;\n }\n\n for (var i = 0, len = instances.length; i < len; i++) {\n if (instances[i] instanceof UIComponent) {\n return instances[i];\n }\n }\n\n return null;\n },\n\n /**\n * Gets an instance based on a selector.\n *\n * @method getInstanceFromSelector\n * @static\n * @param {String} selector CSS selector to get the instances from. This function will only use the *first* element.\n * @return {Object|Array} Returns an array of the instances in the selected element.\n * @public\n */\n getInstanceFromSelector: function(selector) {\n return Common.getInstance(selector);\n },\n\n /**\n * Gets all the instance ids\n *\n * @method getInstanceIds\n * @static\n * @return {Array} Collection of instance ids\n */\n getInstanceIds: function() {\n if( _reg.length > 0 ) return _reg;\n var res = [];\n for (var id in instances) {\n if (instances.hasOwnProperty(id)) {\n res.push( id );\n }\n }\n return res;\n },\n\n /**\n * Gets all the instances\n *\n * @method getInstances\n * @static\n * @return {Array} Collection of existing instances.\n * @public\n */\n getInstances: function() {\n if( _reg.length > 0 ) return _reg;\n var res = [];\n for (var id in instances) {\n if (instances.hasOwnProperty(id)) {\n res.push( instances[id] );\n }\n }\n return res;\n },\n\n /**\n * Boilerplate method to destroy a component.\n * Components should copy this method as its destroy method and modify it.\n *\n * @method destroyComponent\n * @return {void}\n * @public\n * @static\n */\n destroyComponent: function() {\n Common.unregisterInstance(this);\n this._element.parentNode.removeChild(this._element);\n }\n };\n\n\n\n\n /**\n * Ink UI Base Class\n **/\n\n function warnStub() {\n /* jshint validthis: true */\n if (!this || this === window || typeof this.constructor !== 'function') { return; }\n Ink.warn('You called a method on an incorrectly instantiated ' + this.constructor._name + ' component. Check the warnings above to see what went wrong.');\n }\n\n function stub(prototype, obj) {\n for (var k in prototype) if (prototype.hasOwnProperty(k)) {\n if (k === 'constructor') { continue; }\n if (typeof obj[k] === 'function') {\n obj[k] = warnStub;\n }\n }\n }\n\n /**\n * Ink UI Base Class\n *\n * You don't use this class directly, or inherit from it directly.\n *\n * See createUIComponent() (in this module) for how to create a UI component and inherit from this. It's not plain old JS inheritance, for several reasons.\n *\n * @class Ink.UI.Common.BaseUIComponent\n * @constructor\n *\n * @param {Element|String} element Element to associate this UI component with. It's the element you can get later using `comp.getElement()`\n * @param {Object} [options] Options to pass to the component. You should see your specific UI component for this information.\n * @public\n **/\n function BaseUIComponent(element, options) {\n var constructor = this.constructor;\n var _name = constructor._name;\n\n if (!this || this === window) {\n throw new Error('Use \"new InkComponent()\" instead of \"InkComponent()\"');\n }\n\n if (this && !(this instanceof BaseUIComponent)) {\n throw new Error('You forgot to call Ink.UI.Common.createUIComponent() on this module!');\n }\n\n if (!element && !constructor._componentOptions.elementIsOptional) {\n Ink.error(new Error(_name + ': You need to pass an element or a selector as the first argument to \"new ' + _name + '()\"'));\n return;\n } else {\n this._element = Common.elsOrSelector(element,\n _name + ': An element with the selector \"' + element + '\" was not found!')[0];\n }\n\n if (!this._element && !constructor._componentOptions.elementIsOptional) {\n isValidInstance = false;\n Ink.error(new Error(element + ' does not match an element on the page. You need to pass a valid selector to \"new ' + _name + '\".'));\n }\n\n this._options = Common.options(_name, constructor._optionDefinition, options, this._element);\n\n var isValidInstance = BaseUIComponent._validateInstance(this) === true;\n\n if (isValidInstance && typeof this._init === 'function') {\n try {\n this._init.apply(this, arguments);\n } catch(e) {\n isValidInstance = false;\n Ink.error(e);\n }\n }\n\n if (!isValidInstance) {\n BaseUIComponent._stubInstance(this, constructor, _name);\n } else if (this._element) {\n Common.registerInstance(this);\n }\n }\n\n /**\n * Calls the `instance`'s _validate() method so it can validate itself.\n *\n * Returns false if the method exists, was called, but no Error was returned or thrown.\n *\n * @method _validateInstance\n * @private\n */\n BaseUIComponent._validateInstance = function (instance) {\n var err;\n\n if (typeof instance._validate !== 'function') { return true; }\n\n try {\n err = instance._validate();\n } catch (e) {\n err = e;\n }\n\n if (err instanceof Error) {\n instance._validationError = err;\n return false;\n }\n\n return true;\n };\n\n\n /**\n * Replaces every method in the instance with stub functions which just call Ink.warn().\n *\n * This avoids breaking the page when there are errors.\n *\n * @method _stubInstance\n * @param instance\n * @param constructor\n * @param name\n * @private\n */\n BaseUIComponent._stubInstance = function (instance, constructor, name) {\n stub(constructor.prototype, instance);\n stub(BaseUIComponent.prototype, instance);\n Ink.warn(name + ' was not correctly created. ' + (instance._validationError || ''));\n };\n\n // TODO BaseUIComponent.setGlobalOptions = function () {}\n // TODO BaseUIComponent.createMany = function (selector) {}\n BaseUIComponent.getInstance = function (elOrSelector) {\n elOrSelector = Common.elOrSelector(elOrSelector);\n return Common.getInstance(elOrSelector, this /* get instance by constructor */);\n };\n\n Ink.extendObj(BaseUIComponent.prototype, {\n /**\n * Get an UI component's option's value.\n *\n * @method getOption\n * @param {String} name The option's name.\n * @return {Mixed} The option value, or undefined if nothing is found.\n *\n * @example\n *\n * var myUIComponent = new Modal('#element', { trigger: '#trigger' }); // or anything else inheriting BaseUIComponent\n * myUIComponent.getOption('trigger'); // -> The trigger element (not the selector string, mind you)\n *\n **/\n getOption: function (name) {\n if (this.constructor && !(name in this.constructor._optionDefinition)) {\n Ink.error('\"' + name + '\" is not an option for ' + this.constructor._name);\n return undefined;\n }\n\n return this._options[name];\n },\n\n /**\n * Sets an option's value.\n *\n * @method getOption\n * @param {String} name Name of the option.\n * @param {Mixed} value New option value.\n * @return {void}\n * @public\n *\n * @example\n *\n * var myUIComponent = new Modal(...);\n * myUIComponent.setOption('trigger', '#some-element');\n **/\n setOption: function (name, value) {\n if (this.constructor && !(name in this.constructor._optionDefinition)) {\n Ink.error('\"' + name + ' is not an option for ' + this.constructor._name);\n return;\n }\n\n this._options[name] = value;\n },\n\n /**\n * Get the element associated with an UI component (IE the one you used in the constructor)\n *\n * @method getElement\n * @return {Element} The component's element.\n *\n * @example\n * var myUIComponent = new Modal('#element'); // or anything else inheriting BaseUIComponent\n * myUIComponent.getElement(); // -> The '#element' (not the selector string, mind you).\n *\n **/\n getElement: function () {\n return this._element;\n }\n });\n\n Common.BaseUIComponent = BaseUIComponent;\n\n /**\n * Take a constructor, and make it an Ink UI component.\n *\n * Makes it inherit BaseUIComponent, makes sure it has the basic properties Ink.UI.Common needs it to have, adds the necessary static methods, sets its options, etc.\n *\n * @method createUIComponent\n * @param {Function} theConstructor UI component constructor. It should have an _init function in its prototype, an _optionDefinition object, and a _name property indicating its name.\n * @param {Object} [options] Options hash, containing:\n * @param {Boolean} [options.elementIsOptional=false] Whether the element argument is optional (For example, when the component might work on existing markup or create its own).\n * @return {void}\n * @public\n **/\n Common.createUIComponent = function createUIComponent(theConstructor, options) {\n theConstructor._componentOptions = options || {};\n\n function assert(test, msg) {\n if (!test) {\n throw new Error('Ink.UI_1.createUIComponent: ' + msg);\n }\n }\n\n function assertProp(prop, propType, message) {\n var propVal = theConstructor[prop];\n // Check that the property was passed\n assert(typeof propVal !== 'undefined',\n theConstructor + ' doesn\\'t have a \"' + prop + '\" property. ' + message);\n // Check that its type is correct\n assert(propType && typeof propVal === propType,\n 'typeof ' + theConstructor + '.' + prop + ' is not \"' + propType + '\". ' + message);\n }\n\n assert(typeof theConstructor === 'function',\n 'constructor argument is not a function!');\n\n assertProp('_name', 'string', 'This property is used for error ' +\n 'messages. Set it to the full module path and version (Ink.My.Module_1).');\n assertProp('_optionDefinition', 'object', 'This property contains the ' +\n 'option names, types and defaults. See Ink.UI.Common.options() for reference.');\n\n // Extend the instance methods and props\n var _oldProto = theConstructor.prototype;\n\n if (typeof Object.create === 'function') {\n theConstructor.prototype = Object.create(BaseUIComponent.prototype);\n } else {\n theConstructor.prototype = (function hideF() {\n function F() {}\n F.prototype = BaseUIComponent.prototype;\n return new F();\n }());\n }\n\n Ink.extendObj(theConstructor.prototype, _oldProto);\n theConstructor.prototype.constructor = theConstructor;\n // Extend static methods\n Ink.extendObj(theConstructor, BaseUIComponent);\n };\n\n return Common;\n\n});\n","/**\n * Date selector\n * @module Ink.UI.DatePicker_1\n * @version 1\n */\n\nInk.createModule('Ink.UI.DatePicker', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1','Ink.Util.Date_1', 'Ink.Dom.Browser_1'], function(Common, Event, Css, InkElement, Selector, InkArray, InkDate ) {\n 'use strict';\n\n // Clamp a number into a min/max limit\n function clamp(n, min, max) {\n if (n > max) { n = max; }\n if (n < min) { n = min; }\n\n return n;\n }\n\n function dateishFromYMDString(YMD) {\n var split = YMD.split('-');\n return dateishFromYMD(+split[0], +split[1] - 1, +split[2]);\n }\n\n function dateishFromYMD(year, month, day) {\n return {_year: year, _month: month, _day: day};\n }\n\n function dateishFromDate(date) {\n return {_year: date.getFullYear(), _month: date.getMonth(), _day: date.getDate()};\n }\n\n /**\n * @class Ink.UI.DatePicker\n * @constructor\n * @version 1\n *\n * @param {String|Element} selector Datepicker element\n * @param {Object} [options] Options\n * @param {Boolean} [options.autoOpen] Flag to automatically open the datepicker.\n * @param {String} [options.cleanText] Text for the clean button. Defaults to 'Clear'.\n * @param {String} [options.closeText] Text for the close button. Defaults to 'Close'.\n * @param {String} [options.cssClass] CSS class to be applied on the datepicker\n * @param {String|Element} [options.pickerField] (if not using in an input[type=\"text\"]) Element which displays the DatePicker when clicked. Defaults to an \"open\" link.\n * @param {String} [options.dateRange] Enforce limits to year, month and day for the Date, ex: '1990-08-25:2020-11'\n * @param {Boolean} [options.displayInSelect] Flag to display the component in a select element.\n * @param {String|Element} [options.dayField] (if using options.displayInSelect) `select` field with days.\n * @param {String|Element} [options.monthField] (if using options.displayInSelect) `select` field with months.\n * @param {String|Element} [options.yearField] (if using options.displayInSelect) `select` field with years.\n * @param {String} [options.format] Date format string\n * @param {Object} [options.month] Hash of month names. Defaults to english month names. January is 1.\n * @param {String} [options.nextLinkText] Text for the previous button. Defaults to '«'.\n * @param {String} [options.ofText] Text to show between month and year. Defaults to ' of '.\n * @param {Boolean} [options.onFocus] If the datepicker should open when the target element is focused. Defaults to true.\n * @param {Function} [options.onMonthSelected] Callback to execute when the month is selected.\n * @param {Function} [options.onSetDate] Callback to execute when the date is set.\n * @param {Function} [options.onYearSelected] Callback to execute when the year is selected.\n * @param {String} [options.position] Position for the datepicker. Either 'right' or 'bottom'. Defaults to 'right'.\n * @param {String} [options.prevLinkText] Text for the previous button. Defaults to '«'.\n * @param {Boolean} [options.showClean] If the clean button should be visible. Defaults to true.\n * @param {Boolean} [options.showClose] If the close button should be visible. Defaults to true.\n * @param {Boolean} [options.shy] If the datepicker should hide automatically when the user clicks outside. Defaults to true.\n * @param {String} [options.startDate] Date to define initial month. Must be in yyyy-mm-dd format.\n * @param {Number} [options.startWeekDay] First day of the week. Sunday is zero. Defaults to 1 (Monday).\n * @param {Function} [options.validYearFn] Callback to execute when 'rendering' the month (in the month view)\n * @param {Function} [options.validMonthFn] Callback to execute when 'rendering' the month (in the month view)\n * @param {Function} [options.validDayFn] Callback to execute when 'rendering' the day (in the month view)\n * @param {Function} [options.nextValidDateFn] Function to calculate the next valid date, given the current. Useful when there's invalid dates or time frames.\n * @param {Function} [options.prevValidDateFn] Function to calculate the previous valid date, given the current. Useful when there's invalid dates or time frames.\n * @param {Object} [options.wDay] Hash of week day names. Sunday is 0. Defaults to { 0:'Sunday', 1:'Monday', etc...\n * @param {String} [options.yearRange] Enforce limits to year for the Date, ex: '1990:2020' (deprecated)\n *\n * @sample Ink_UI_DatePicker_1.html\n */\n function DatePicker() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n DatePicker._name = 'DatePicker_1';\n\n DatePicker._optionDefinition = {\n autoOpen: ['Boolean', false],\n cleanText: ['String', 'Clear'],\n closeText: ['String', 'Close'],\n pickerField: ['Element', null],\n containerElement:['Element', null],\n cssClass: ['String', 'ink-calendar bottom'],\n dateRange: ['String', null],\n \n // use this in a \n *\n * By applying this UI class to the above input, you get a tag field with the tags \"initial\" and \"value\". The class preserves the original input element. It remains hidden and is updated with new tag information dynamically, so regular HTML form logic still applies.\n *\n * Below \"input\" refers to the current value of the input tag (updated as the user enters text, of course), and \"output\" refers to the value which this class writes back to said input tag.\n *\n * @class Ink.UI.TagField\n * @version 1\n * @constructor\n * @param {String|Element} element Selector or DOM Input Element.\n * @param {Object} [options] Options object\n * @param {String|Array} [options.tags] Initial tags in the input\n * @param {Boolean} [options.allowRepeated] Flag to allow user to input several tags. Defaults to true.\n * @param {RegExp} [options.separator] Split the input by this RegExp. Defaults to /[,;(space)]+/g (spaces, commas and semicolons)\n * @param {String} [options.outSeparator] Use this string to separate each tag from the next in the output. Defaults to ','.\n * @param {Boolean} [options.autoSplit] Flag to activate tag creation when the user types a separator. Defaults to true.\n * @param {Integer} [options.maxTags] Maximum number of tags allowed. Set to -1 for no limit. Defaults to -1.\n * @example\n */\n function TagField() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n TagField._name = 'TagField_1';\n\n TagField._optionDefinition = {\n tags: ['String', []],\n tagQuery: ['Object', null],\n tagQueryAsync: ['Object', null],\n allowRepeated: ['Boolean', false],\n maxTags: ['Integer', -1],\n outSeparator: ['String', ','],\n separator: ['String', /[,; ]+/g],\n autoSplit: ['Boolean', true]\n };\n\n TagField.prototype = {\n /**\n * Init function called by the constructor\n * \n * @method _init\n * @private\n */\n _init: function() {\n var o = this._options;\n if (typeof o.separator === 'string') {\n o.separator = new RegExp(o.separator, 'g');\n }\n\n if (typeof o.tags === 'string') {\n // coerce to array using the separator\n o.tags = this._readInput(o.tags);\n }\n\n Css.addClassName(this._element, 'hide-all');\n\n this._viewElm = InkElement.create('div', {\n className: 'ink-tagfield',\n insertAfter: this._element\n });\n\n this._input = InkElement.create('input', {\n type: 'text',\n className: 'new-tag-input',\n insertBottom: this._viewElm\n });\n\n var tags = [].concat(o.tags, this._tagsFromMarkup(this._element));\n\n this._tags = [];\n\n InkArray.each(tags, Ink.bindMethod(this, '_addTag'));\n\n InkEvent.observe(this._input, 'keyup', Ink.bindEvent(this._onKeyUp, this));\n InkEvent.observe(this._input, 'change', Ink.bindEvent(this._onKeyUp, this));\n InkEvent.observe(this._input, 'keydown', Ink.bindEvent(this._onKeyDown, this));\n InkEvent.observe(this._input, 'blur', Ink.bindEvent(this._onBlur, this));\n InkEvent.observe(this._viewElm, 'click', Ink.bindEvent(this._refocus, this));\n },\n\n destroy: function () {\n InkElement.remove(this._viewElm);\n Css.removeClassName(this._element, 'hide-all');\n },\n\n _tagsFromMarkup: function (element) {\n var tagname = element.tagName.toLowerCase();\n if (tagname === 'input') {\n return this._readInput(element.value);\n } else if (tagname === 'select') {\n return InkArray.map(element.getElementsByTagName('option'), function (option) {\n return InkElement.textContent(option);\n });\n } else {\n throw new Error('Cannot read tags from a ' + tagname + ' tag. Unknown tag');\n }\n },\n\n _tagsToMarkup: function (tags, element) {\n var tagname = element.tagName.toLowerCase();\n if (tagname === 'input') {\n if (this._options.separator) {\n element.value = tags.join(this._options.outSeparator);\n }\n } else if (tagname === 'select') {\n element.innerHTML = '';\n InkArray.each(tags, function (tag) {\n var opt = InkElement.create('option', {selected: 'selected'});\n InkElement.setTextContent(opt, tag);\n element.appendChild(opt);\n });\n } else {\n throw new Error('TagField: Cannot read tags from a ' + tagname + ' tag. Unknown tag');\n }\n },\n\n _addTag: function (tag) {\n if (this._options.maxTags !== -1 &&\n this._tags.length >= this._options.maxTags) {\n return;\n }\n if ((!this._options.allowRepeated &&\n InkArray.inArray(tag, this._tags, tag)) || !tag) {\n return false;\n }\n var elm = InkElement.create('span', {\n className: 'ink-tag',\n setTextContent: tag + ' '\n });\n\n var remove = InkElement.create('span', {\n className: 'remove fa fa-times',\n insertBottom: elm\n });\n InkEvent.observe(remove, 'click', Ink.bindEvent(this._removeTag, this, null));\n\n var spc = document.createTextNode(' ');\n\n this._tags.push(tag);\n this._viewElm.insertBefore(elm, this._input);\n this._viewElm.insertBefore(spc, this._input);\n this._tagsToMarkup(this._tags, this._element);\n },\n\n _readInput: function (text) {\n if (this._options.separator) {\n return InkArray.filter(text.split(this._options.separator), isTruthy);\n } else {\n return [text];\n }\n },\n\n _onKeyUp: function () { // TODO control input box size\n if (!this._options.autoSplit) {\n return;\n }\n\n var split;\n if (!buggySplit) {\n split = this._input.value.split(this._options.separator);\n } else {\n split = splitFunction(this._input.value, this._options.separator);\n }\n\n if (split.length <= 1) {\n return;\n }\n var last = split[split.length - 1];\n split = split.splice(0, split.length - 1);\n split = InkArray.filter(split, isTruthy);\n \n InkArray.each(split, Ink.bind(this._addTag, this));\n this._input.value = last;\n },\n\n _onKeyDown: function (event) {\n if (event.which === enterKey) {\n return this._onEnterKeyDown(event);\n } else if (event.which === backspaceKey) {\n return this._onBackspaceKeyDown();\n } else if (this._removeConfirm) {\n // user pressed another key, cancel removal from a backspace key\n this._unsetRemovingVisual(this._tags.length - 1);\n }\n },\n\n /**\n * When the user presses backspace twice on the empty input, we delete the last tag on the field.\n * @method onBackspaceKeyDown\n * @return {void}\n * @private\n */\n _onBackspaceKeyDown: function () {\n if (this._input.value) { return; }\n\n if (this._removeConfirm) {\n this._unsetRemovingVisual(this._tags.length - 1);\n this._removeTag(this._tags.length - 1);\n this._removeConfirm = null;\n } else {\n this._setRemovingVisual(this._tags.length - 1);\n }\n },\n\n _onEnterKeyDown: function (event) {\n var tag = this._input.value;\n if (tag) {\n this._addTag(tag);\n this._input.value = '';\n }\n InkEvent.stopDefault(event);\n },\n\n _onBlur: function () {\n this._addTag(this._input.value);\n this._input.value = '';\n },\n\n /* For when the user presses backspace.\n * Set the style of the tag so that it seems like it's going to be removed\n * if they press backspace again. */\n _setRemovingVisual: function (tagIndex) {\n var elm = this._viewElm.children[tagIndex];\n if (!elm) { return; }\n\n Css.addClassName(elm, 'tag-deleting');\n\n this._removeRemovingVisualTimeout = setTimeout(Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex), 4000);\n InkEvent.observe(this._input, 'blur', Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex));\n this._removeConfirm = true;\n },\n _unsetRemovingVisual: function (tagIndex) {\n var elm = this._viewElm.children[tagIndex];\n if (elm) {\n Css.removeClassName(elm, 'tag-deleting');\n clearTimeout(this._removeRemovingVisualTimeout);\n }\n this._removeConfirm = null;\n },\n\n _removeTag: function (event) {\n var index;\n if (typeof event === 'object') { // click event on close button\n var elm = InkEvent.element(event).parentNode;\n index = InkElement.parentIndexOf(this._viewElm, elm);\n } else if (typeof event === 'number') { // manual removal\n index = event;\n }\n this._tags = InkArray.remove(this._tags, index, 1);\n InkElement.remove(this._viewElm.children[index]);\n this._tagsToMarkup(this._tags, this._element);\n },\n\n _refocus: function (event) {\n this._input.focus();\n InkEvent.stop(event);\n return false;\n }\n };\n\n Common.createUIComponent(TagField);\n\n return TagField;\n});\n","/**\n * Toggle the visibility of elements.\n * @module Ink.UI.Toggle_1\n * @version 1\n */\n\n Ink.createModule('Ink.UI.Toggle', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, InkEvent, Css, InkElement, Selector, InkArray ) {\n 'use strict';\n\n /**\n * *Important note: Do NOT use this as a dropdown! Use Ink.UI.Dropdown for that.*\n *\n * You need two elements to use Toggle: the `trigger` element, and the `target` element (or elements). The default behaviour is to toggle the `target`(s) when you click the `trigger`.\n *\n * The toggle has a state. It is either \"on\" or \"off\". It works by switching between the CSS classes in `classNameOn` and `classNameOff` according to the current state.\n *\n * When you initialize the Toggle, it will check if the targets are visible to figure out what the initial state is. You can force the toggle to consider itself turned \"on\" or \"off\" by setting the `initialState` option to `true` or `false`, respectively.\n *\n * You can get the current state of the Toggle by calling `getState`, or by checking if your `trigger` element has the \"active\" class.\n * The state can be changed through JavaScript. Just call `setState(true)`\n * to turn the Toggle on (or `setState(false)` to turn it off).\n *\n * @class Ink.UI.Toggle\n * @constructor\n * @version 1\n * @param {String|Element} selector Trigger element. By clicking this, the target (or targets) are triggered.\n * @param {Object} [options] Options object, containing:\n *\n * @param {String} options.target CSS Selector that specifies the elements that this component will toggle\n * @param {Boolean} [options.isAccordion] Set this to true to signal that this toggle is part of an accordion with other toggles. The toggles of an accordion must be common descendants of an element with the class \"accordion\". If they're not, Ink will warn you about this on the console.\n * @param {String} [options.classNameOn] CSS class to toggle when on. Defaults to 'show-all'.\n * @param {String} [options.classNameOff] CSS class to toggle when off. Defaults to 'hide-all'.\n * @param {String} [options.triggerEvent] Event that will trigger the toggling. Defaults to 'click'.\n * @param {Boolean} [options.closeOnClick] Flag to toggle the targe off when clicking outside the toggled content. Defaults to true.\n * @param {Boolean} [options.canToggleAnAncestor] Set to true if you want the toggle to target ancestors of itself. Defaults to false.\n * @param {String} [options.closeOnInsideClick] Toggle off when a child element matching this selector is clicked. Set to null to deactivate the check. Defaults to 'a[href]'.\n * @param {Boolean} [options.initialState] Flag to define initial state. false: off, true: on, null: markup. Defaults to null.\n * @param {Function} [options.onChangeState] Callback when the toggle state changes. Return `false` to cancel the event.\n *\n * @sample Ink_UI_Toggle_1_constructor.html\n */\n function Toggle(){\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n Toggle._name = 'Toggle_1';\n\n Toggle._optionDefinition = {\n target: ['Elements'],\n triggerEvent: ['String', 'click'],\n closeOnClick: ['Boolean', true],\n canToggleAnAncestor: ['Boolean', false],\n isAccordion: ['Boolean', false],\n initialState: ['Boolean', null], // May be true, false, or null to be what it is right now\n classNameOn: ['String', 'show-all'],\n classNameOff: ['String', 'hide-all'],\n closeOnInsideClick: ['String', 'a[href]'], // closes the toggle when a target is clicked and it is a link\n onChangeState: ['Function', null]\n };\n\n Toggle.prototype = {\n\n /**\n * Init function called by the constructor\n *\n * @method _init\n * @private\n */\n _init: function(){\n var i, len;\n\n this._targets = Common.elsOrSelector(this._options.target);\n\n // Boolean option handling\n this._options.closeOnClick = this._options.closeOnClick;\n // Actually a throolean\n if (this._options.initialState === null) {\n this._options.initialState = Css.hasClassName(this._targets[0], this._options.classNameOn);\n }\n\n if (this._options.classNameOn !== 'show-all' || this._options.classNameOff !== 'hide-all') {\n for (i = 0, len = this._targets.length; i < len; i++) {\n Css.removeClassName(this._targets[i], 'show-all');\n Css.removeClassName(this._targets[i], 'hide-all');\n }\n }\n\n if (this._options.isAccordion) {\n this._accordionContainer = InkElement.findUpwardsByClass(\n this._element, 'accordion');\n if (!this._accordionContainer) {\n Ink.warn('Ink.UI.Toggle_1: This toggle has the isToggle option set to `true`, but is not a descendant of an element with the class \"accordion\"! Because of this, it won\\'t be able to find other toggles in the same accordion and cooperate with them.');\n }\n }\n\n this._constructing = true;\n\n this._bindEvents();\n\n if (this._options.initialState !== null) {\n this.setState(this._options.initialState, true);\n } else {\n // Add initial classes matching the current \"display\" of the object.\n var state = Css.getStyle(this._targets[0], 'display') !== 'none';\n this.setState(state, true);\n }\n // Aditionally, remove any inline \"display\" style.\n for (i = 0, len = this._targets.length; i < len; i++) {\n if (this._targets[i].style.display) {\n this._targets[i].style.display = ''; // becomes default\n }\n }\n\n this._element.setAttribute('data-is-toggle-trigger', 'true');\n\n this._constructing = false;\n },\n\n /**\n * @method _bindEvents\n * @private\n */\n _bindEvents: function () {\n if ( this._options.triggerEvent ) {\n InkEvent.on(\n this._element,\n this._options.triggerEvent,\n Ink.bind(this._onTriggerEvent, this));\n }\n if( this._options.closeOnClick ){\n InkEvent.observe( document, 'click', Ink.bind(this._onOutsideClick, this));\n }\n if( this._options.closeOnInsideClick ) {\n var sel = this._options.closeOnInsideClick;\n if (sel.toString() === 'true') {\n sel = '*';\n }\n InkEvent.observeMulti(this._targets, 'click', Ink.bind(function (e) {\n if ( InkElement.findUpwardsBySelector(InkEvent.element(e), sel) ) {\n this.setState(false, true);\n }\n }, this));\n }\n },\n\n /**\n * Event handler. It's responsible for handling the `triggerEvent` as defined in the options.\n *\n * This will trigger the toggle.\n *\n * @method _onTriggerEvent\n * @param {Event} event\n * @private\n */\n _onTriggerEvent: function( event ){\n // When the togglee is a child of the toggler, we get the togglee's events here. We have to check that this event is for us.\n var target = InkEvent.element(event);\n\n var isAncestorOfClickedElement = InkArray.some(this._targets, function (thisOne) {\n return thisOne === target || InkElement.isAncestorOf(thisOne, target);\n });\n\n if (!this._options.canToggleAnAncestor && isAncestorOfClickedElement) {\n return;\n }\n\n var has = this.getState();\n this.setState(!has, true);\n if (!has && this._firstTime) {\n this._firstTime = false;\n }\n\n InkEvent.stopDefault(event);\n },\n\n /**\n * Be compatible with accordions\n *\n * @method _updateAccordion\n **/\n _updateAccordion: function () {\n if (!this._accordionContainer) { return; }\n if (this.getState() === false) { return; }\n\n var elms = Selector.select('[data-is-toggle-trigger]', this._accordionContainer);\n for (var i = 0; i < elms.length; i++) {\n var otherToggle = Toggle.getInstance(elms[i]);\n if (otherToggle && (otherToggle !== this) && otherToggle.getState() === true) {\n otherToggle.setState(false, true);\n }\n }\n },\n\n /**\n * Click handler. Will handle clicks outside the toggle component.\n *\n * @method _onOutsideClick\n * @param {Event} event\n * @private\n */\n _onOutsideClick: function( event ){\n var tgtEl = InkEvent.element(event);\n var shades;\n\n if (!InkElement.isAncestorOf(document.documentElement, tgtEl)) {\n // Because if the element was removed while the click event was\n // bubbling, we can't tell where it came from\n return;\n }\n\n if (InkElement.findUpwardsBySelector(tgtEl, '[data-is-toggle-trigger=\"true\"]')) { return; }\n\n var ancestorOfTargets = InkArray.some(this._targets, function (target) {\n return InkElement.isAncestorOf(target, tgtEl) || target === tgtEl;\n });\n\n if( (this._element === tgtEl) || InkElement.isAncestorOf(this._element, tgtEl) || ancestorOfTargets) {\n return;\n } else if( (shades = Ink.ss('.ink-shade')).length ) {\n var shadesLength = shades.length;\n\n for( var i = 0; i < shadesLength; i++ ){\n if( InkElement.isAncestorOf(shades[i],tgtEl) && InkElement.isAncestorOf(shades[i],this._element) ){\n return;\n }\n }\n }\n\n this.setState(false, true); // dismiss\n },\n\n /**\n * Sets the state of the toggle. (on/off)\n *\n * @method setState\n * @param {Boolean} on New state (on/off)\n * @param {Boolean} callHandler Whether to call the onChangeState handler.\n * @return {void}\n */\n setState: function (on, callHandler) {\n if (on === this.getState() && !this._constructing) { return; }\n\n var i, len;\n if (this._group && on) {\n for (i = 0, len = this._group.length; i < len; i++) {\n if (this._group[i].getState() === true) {\n this._group[i].setState(false, true);\n }\n }\n }\n\n if (callHandler && typeof this._options.onChangeState === 'function') {\n var ret = this._options.onChangeState(on);\n if (ret === false) { return false; } // Canceled by the event handler\n }\n for (i = 0, len = this._targets.length; i < len; i++) {\n Css.addRemoveClassName(this._targets[i], this._options.classNameOn, on);\n Css.addRemoveClassName(this._targets[i], this._options.classNameOff, !on);\n }\n Css.addRemoveClassName(this._element, 'active', on);\n\n if (this._accordionContainer) {\n this._updateAccordion();\n }\n },\n\n /**\n * Gets the state of the toggle. (on/off)\n *\n * @method getState\n *\n * @return {Boolean} whether the toggle is toggled on.\n */\n getState: function () {\n return Css.hasClassName(this._element, 'active');\n }\n };\n\n Common.createUIComponent(Toggle);\n\n return Toggle;\n});\n","/**\n * Content Tooltips\n * @module Ink.UI.Tooltip_1\n * @version 1\n */\nInk.createModule('Ink.UI.Tooltip', '1', ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1', 'Ink.Dom.Selector_1', 'Ink.Util.Array_1', 'Ink.Dom.Css_1', 'Ink.Dom.Browser_1'], function (Common, InkEvent, InkElement, Selector, InkArray, Css) {\n 'use strict';\n\n /**\n * Tooltips are useful as a means to display information about functionality while avoiding clutter.\n *\n * Tooltips show up when you hover elements which \"have\" tooltips.\n *\n * This class will \"give\" a tooltip to many elements, selected by its first argument (`target`). This is contrary to the other UI modules in Ink, which are created once per element.\n *\n * You can define options either through the second argument of the Tooltip constructor, or as data-attributes in each `target` element. Options set through data-attributes all start with \"data-tip\", and override options passed into the Tooltip constructor.\n *\n * @class Ink.UI.Tooltip\n * @constructor\n *\n * @param {Element|String} target Target element or selector of elements, to display the tooltips on.\n * @param {Object} [options] Options object\n * @param {String} [options.text] Text content for the tooltip.\n * @param {String} [options.html] HTML for the tooltip. Same as above, but won't escape HTML.\n * @param {String} [options.where] Positioning for the tooltip. Options are 'up', 'down', 'left', 'right', 'mousemove' (follows the cursor), and 'mousefix' (stays fixed). Defaults to 'up'.\n * \n * @param {String} [options.color] Color of the tooltip. Options are red, orange, blue, green and black. Default is white.\n * @param {Number} [options.fade] Number of seconds to fade in/out. Defaults to 0.3.\n * @param {Boolean} [options.forever] Flag to prevent the tooltip from being erased when the mouse hovers away from the target.\n * @param {Number} [options.timeout] Number of seconds the tooltip will stay open. Useful together with options.forever. Defaults to 0.\n * @param {Number} [options.delay] Time the tooltip waits until it is displayed. Useful to avoid getting the attention of the user unnecessarily\n * @param {Element|Selector} [options.template] Element or selector containing HTML to be cloned into the tooltips. Can be a hidden element, because CSS `display` is set to `block`.\n * @param {String} [options.templatefield] Selector within the template element to choose where the text is inserted into the tooltip. Useful when a wrapper DIV is required.\n * @param {Number} [options.left] Spacing from the target to the tooltip, when `where` is `mousemove` or `mousefix`. Defaults to 10.\n * @param {Number} [options.top] Spacing from the target to the tooltip, when `where` is `mousemove` or `mousefix`. Defaults to 10.\n * @param {Number} [options.spacing] Spacing between the tooltip and the target element, when `where` is not `mousemove` or `mousefix`. Defaults to 8.\n * \n * @sample Ink_UI_Tooltip_1.html\n */\n function Tooltip(element, options) {\n this._init(element, options || {});\n }\n\n function EachTooltip(root, elm) {\n this._init(root, elm);\n }\n\n var transitionDurationName,\n transitionPropertyName,\n transitionTimingFunctionName;\n (function () { // Feature detection\n var test = document.createElement('DIV');\n var names = ['transition', 'oTransition', 'msTransition', 'mozTransition',\n 'webkitTransition'];\n for (var i = 0; i < names.length; i++) {\n if (typeof test.style[names[i] + 'Duration'] !== 'undefined') {\n transitionDurationName = names[i] + 'Duration';\n transitionPropertyName = names[i] + 'Property';\n transitionTimingFunctionName = names[i] + 'TimingFunction';\n break;\n }\n }\n }());\n\n // Body or documentElement\n var bodies = document.getElementsByTagName('body');\n var body = bodies.length ? bodies[0] : document.documentElement;\n\n Tooltip.prototype = {\n _init: function(element, options) {\n var elements;\n\n this.options = Ink.extendObj({\n where: 'up',\n zIndex: 10000,\n left: 10,\n top: 10,\n spacing: 8,\n forever: 0,\n color: '',\n timeout: 0,\n delay: 0,\n template: null,\n templatefield: null,\n fade: 0.3,\n text: ''\n }, options || {});\n\n if (typeof element === 'string') {\n elements = Selector.select(element);\n } else if (typeof element === 'object') {\n elements = [element];\n } else {\n throw 'Element expected';\n }\n\n this.tooltips = [];\n\n for (var i = 0, len = elements.length; i < len; i++) {\n this.tooltips[i] = new EachTooltip(this, elements[i]);\n }\n },\n /**\n * Destroys the tooltips created by this instance\n *\n * @method destroy\n * @return {void}\n * @public\n */\n destroy: function () {\n InkArray.each(this.tooltips, function (tooltip) {\n tooltip._destroy();\n });\n this.tooltips = null;\n this.options = null;\n }\n };\n\n EachTooltip.prototype = {\n _oppositeDirections: {\n left: 'right',\n right: 'left',\n up: 'down',\n down: 'up'\n },\n _init: function(root, elm) {\n InkEvent.observe(elm, 'mouseover', Ink.bindEvent(this._onMouseOver, this));\n InkEvent.observe(elm, 'focus', Ink.bindEvent(this._onMouseOver, this));\n InkEvent.observe(elm, 'mouseout', Ink.bindEvent(this._onMouseOut, this));\n InkEvent.observe(elm, 'blur', Ink.bindEvent(this._onMouseOut, this));\n InkEvent.observe(elm, 'mousemove', Ink.bindEvent(this._onMouseMove, this));\n\n this.root = root;\n this.element = elm;\n this._delayTimeout = null;\n this.tooltip = null;\n\n Common.registerInstance(this, this.element);\n },\n _makeTooltip: function (mousePosition) {\n if (!this._getOpt('text') &&\n !this._getOpt('html') &&\n !InkElement.hasAttribute(this.element, 'title')) {\n return false;\n }\n\n var tooltip = this._createTooltipElement();\n\n if (this.tooltip) {\n this._removeTooltip();\n }\n\n this.tooltip = tooltip;\n\n this._fadeInTooltipElement(tooltip);\n this._placeTooltipElement(tooltip, mousePosition);\n\n InkEvent.observe(tooltip, 'mouseover', Ink.bindEvent(this._onTooltipMouseOver, this));\n\n var timeout = this._getFloatOpt('timeout');\n if (timeout) {\n setTimeout(Ink.bind(function () {\n if (this.tooltip === tooltip) {\n this._removeTooltip();\n }\n }, this), timeout * 1000);\n }\n },\n _createTooltipElement: function () {\n var template = this._getOpt('template'), // User template instead of our HTML\n templatefield = this._getOpt('templatefield'),\n \n tooltip, // The element we float\n field; // Element where we write our message. Child or same as the above\n\n if (template) { // The user told us of a template to use. We copy it.\n var temp = document.createElement('DIV');\n temp.innerHTML = Common.elOrSelector(template, 'options.template').outerHTML;\n tooltip = temp.firstChild;\n \n if (templatefield) {\n field = Selector.select(templatefield, tooltip);\n if (field) {\n field = field[0];\n } else {\n throw 'options.templatefield must be a valid selector within options.template';\n }\n } else {\n field = tooltip; // Assume same element if user did not specify a field\n }\n } else { // We create the default structure\n tooltip = document.createElement('DIV');\n Css.addClassName(tooltip, 'ink-tooltip');\n Css.addClassName(tooltip, this._getOpt('color'));\n\n field = document.createElement('DIV');\n Css.addClassName(field, 'content');\n\n tooltip.appendChild(field);\n }\n \n if (this._getOpt('html')) {\n field.innerHTML = this._getOpt('html');\n } else if (this._getOpt('text')) {\n InkElement.setTextContent(field, this._getOpt('text'));\n } else {\n InkElement.setTextContent(field, this.element.getAttribute('title'));\n }\n tooltip.style.display = 'block';\n tooltip.style.position = 'absolute';\n tooltip.style.zIndex = this._getIntOpt('zIndex');\n\n return tooltip;\n },\n _fadeInTooltipElement: function (tooltip) {\n var fadeTime = this._getFloatOpt('fade');\n if (transitionDurationName && fadeTime) {\n tooltip.style.opacity = '0';\n tooltip.style[transitionDurationName] = fadeTime + 's';\n tooltip.style[transitionPropertyName] = 'opacity';\n tooltip.style[transitionTimingFunctionName] = 'ease-in-out';\n setTimeout(function () {\n tooltip.style.opacity = '1';\n }, 0); // Wait a tick\n }\n },\n _placeTooltipElement: function (tooltip, mousePosition) {\n var where = this._getOpt('where');\n\n if (mousePosition === null && (where === 'mousemove' || where === 'mousefix')) {\n // When there are no mouse coords available (focus event)\n where = 'up';\n }\n\n if (where === 'mousemove' || where === 'mousefix') {\n var mPos = mousePosition;\n this._setPos(mPos[0], mPos[1]);\n body.appendChild(tooltip);\n } else if (where.match(/(up|down|left|right)/)) {\n body.appendChild(tooltip);\n var targetElementPos = InkElement.offset(this.element);\n var tleft = targetElementPos[0],\n ttop = targetElementPos[1];\n\n var centerh = (InkElement.elementWidth(this.element) / 2) - (InkElement.elementWidth(tooltip) / 2),\n centerv = (InkElement.elementHeight(this.element) / 2) - (InkElement.elementHeight(tooltip) / 2);\n var spacing = this._getIntOpt('spacing');\n\n var tooltipDims = InkElement.elementDimensions(tooltip);\n var elementDims = InkElement.elementDimensions(this.element);\n\n var maxX = InkElement.scrollWidth() + InkElement.viewportWidth();\n var maxY = InkElement.scrollHeight() + InkElement.viewportHeight();\n \n where = this._getWhereValueInsideViewport(where, {\n left: tleft - tooltipDims[0],\n right: tleft + tooltipDims[0],\n top: ttop + tooltipDims[1],\n bottom: ttop + tooltipDims[1]\n }, {\n right: maxX,\n bottom: maxY\n });\n \n if (where === 'up') {\n ttop -= tooltipDims[1];\n ttop -= spacing;\n tleft += centerh;\n } else if (where === 'down') {\n ttop += elementDims[1];\n ttop += spacing;\n tleft += centerh;\n } else if (where === 'left') {\n tleft -= tooltipDims[0];\n tleft -= spacing;\n ttop += centerv;\n } else if (where === 'right') {\n tleft += elementDims[0];\n tleft += spacing;\n ttop += centerv;\n }\n \n var arrow = null;\n if (where.match(/(up|down|left|right)/)) {\n arrow = document.createElement('SPAN');\n Css.addClassName(arrow, 'arrow');\n Css.addClassName(arrow, this._oppositeDirections[where]);\n tooltip.appendChild(arrow);\n }\n\n var tooltipLeft = tleft;\n var tooltipTop = ttop;\n\n var toBottom = (tooltipTop + tooltipDims[1]) - maxY;\n var toRight = (tooltipLeft + tooltipDims[0]) - maxX;\n var toLeft = 0 - tooltipLeft;\n var toTop = 0 - tooltipTop;\n\n if (toBottom > 0) {\n if (arrow) { arrow.style.top = (tooltipDims[1] / 2) + toBottom + 'px'; }\n tooltipTop -= toBottom;\n } else if (toTop > 0) {\n if (arrow) { arrow.style.top = (tooltipDims[1] / 2) - toTop + 'px'; }\n tooltipTop += toTop;\n } else if (toRight > 0) {\n if (arrow) { arrow.style.left = (tooltipDims[0] / 2) + toRight + 'px'; }\n tooltipLeft -= toRight;\n } else if (toLeft > 0) {\n if (arrow) { arrow.style.left = (tooltipDims[0] / 2) - toLeft + 'px'; }\n tooltipLeft += toLeft;\n }\n\n tooltip.style.left = tooltipLeft + 'px';\n tooltip.style.top = tooltipTop + 'px';\n }\n },\n\n /**\n * Get a value for \"where\" (left/right/up/down) which doesn't put the\n * tooltip off the screen\n *\n * @method _getWhereValueInsideViewport\n * @param where {String} \"where\" value which was given by the user and we might change\n * @param bbox {BoundingBox} A bounding box like what you get from getBoundingClientRect ({top, bottom, left, right}) with pixel positions from the top left corner of the viewport.\n * @param viewport {BoundingBox} Bounding box for the viewport. \"top\" and \"left\" are omitted because these coordinates are relative to the top-left corner of the viewport so they are zero.\n *\n * @TODO: we can't use getBoundingClientRect in this case because it returns {0,0,0,0} on our uncreated tooltip.\n */\n _getWhereValueInsideViewport: function (where, bbox, viewport) {\n if (where === 'left' && bbox.left < 0) {\n return 'right';\n } else if (where === 'right' && bbox.right > viewport.right) {\n return 'left';\n } else if (where === 'up' && bbox.top < 0) {\n return 'down';\n } else if (where === 'down' && bbox.bottom > viewport.bottom) {\n return 'up';\n }\n\n return where;\n },\n _removeTooltip: function() {\n var tooltip = this.tooltip;\n if (!tooltip) {return;}\n\n var remove = Ink.bind(InkElement.remove, {}, tooltip);\n\n if (this._getOpt('where') !== 'mousemove' && transitionDurationName) {\n tooltip.style.opacity = 0;\n // remove() will operate on correct tooltip, although this.tooltip === null then\n setTimeout(remove, this._getFloatOpt('fade') * 1000);\n } else {\n remove();\n }\n this.tooltip = null;\n },\n _getOpt: function (option) {\n var dataAttrVal = InkElement.data(this.element)[InkElement._camelCase('tip-' + option)];\n if (dataAttrVal /* either null or \"\" may signify the absense of this attribute*/) {\n return dataAttrVal;\n }\n var instanceOption = this.root.options[option];\n if (typeof instanceOption !== 'undefined') {\n return instanceOption;\n }\n },\n _getIntOpt: function (option) {\n return parseInt(this._getOpt(option), 10);\n },\n _getFloatOpt: function (option) {\n return parseFloat(this._getOpt(option), 10);\n },\n _destroy: function () {\n if (this.tooltip) {\n InkElement.remove(this.tooltip);\n }\n this.root = null; // Cyclic reference = memory leaks\n this.element = null;\n this.tooltip = null;\n },\n _onMouseOver: function(e) {\n // on IE < 10 you can't access the mouse event not even a tick after it fired\n var mousePosition;\n if (e.type !== 'mouseover') {\n // No mouse coords available\n mousePosition = null;\n } else {\n mousePosition = this._getMousePosition(e);\n }\n var delay = this._getFloatOpt('delay');\n if (delay) {\n this._delayTimeout = setTimeout(Ink.bind(function () {\n if (!this.tooltip) {\n this._makeTooltip(mousePosition);\n }\n this._delayTimeout = null;\n }, this), delay * 1000);\n } else {\n this._makeTooltip(mousePosition);\n }\n },\n _onMouseMove: function(e) {\n if (this._getOpt('where') === 'mousemove' && this.tooltip) {\n var mPos = this._getMousePosition(e);\n this._setPos(mPos[0], mPos[1]);\n }\n },\n _onMouseOut: function () {\n if (!this._getIntOpt('forever')) {\n this._removeTooltip();\n }\n if (this._delayTimeout) {\n clearTimeout(this._delayTimeout);\n this._delayTimeout = null;\n }\n },\n _onTooltipMouseOver: function () {\n if (this.tooltip) { // If tooltip is already being removed, this has no effect\n this._removeTooltip();\n }\n },\n _setPos: function(left, top) {\n left += this._getIntOpt('left');\n top += this._getIntOpt('top');\n var pageDims = this._getPageXY();\n if (this.tooltip) {\n var elmDims = [InkElement.elementWidth(this.tooltip), InkElement.elementHeight(this.tooltip)];\n var scrollDim = this._getScroll();\n\n if((elmDims[0] + left - scrollDim[0]) >= (pageDims[0] - 20)) {\n left = (left - elmDims[0] - this._getIntOpt('left') - 10);\n }\n if((elmDims[1] + top - scrollDim[1]) >= (pageDims[1] - 20)) {\n top = (top - elmDims[1] - this._getIntOpt('top') - 10);\n }\n\n this.tooltip.style.left = left + 'px';\n this.tooltip.style.top = top + 'px';\n }\n },\n _getPageXY: function() {\n var cWidth = 0;\n var cHeight = 0;\n if( typeof( window.innerWidth ) === 'number' ) {\n cWidth = window.innerWidth;\n cHeight = window.innerHeight;\n } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {\n cWidth = document.documentElement.clientWidth;\n cHeight = document.documentElement.clientHeight;\n } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {\n cWidth = document.body.clientWidth;\n cHeight = document.body.clientHeight;\n }\n return [parseInt(cWidth, 10), parseInt(cHeight, 10)];\n },\n _getScroll: function() {\n var dd = document.documentElement, db = document.body;\n if (dd && (dd.scrollLeft || dd.scrollTop)) {\n return [dd.scrollLeft, dd.scrollTop];\n } else if (db) {\n return [db.scrollLeft, db.scrollTop];\n } else {\n return [0, 0];\n }\n },\n _getMousePosition: function(e) {\n return [parseInt(InkEvent.pointerX(e), 10), parseInt(InkEvent.pointerY(e), 10)];\n }\n };\n\n return Tooltip;\n});\n","/**\n * Elements in a tree structure\n * @module Ink.UI.TreeView_1\n * @version 1\n */\nInk.createModule('Ink.UI.TreeView', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, Event, Css, Element, Selector, InkArray ) {\n 'use strict';\n\n\n /**\n * Shows elements in a tree structure which can be expanded and contracted.\n * A TreeView is built with \"node\"s and \"children\". \"node\"s are `li` tags, and \"children\" are `ul` tags.\n * You can build your TreeView out of a regular UL and LI element structure which you already use to display lists with several levels.\n * If you want a node to be open when the TreeView is built, just add the data-open=\"true\" attribute to it.\n * \n * @class Ink.UI.TreeView\n * @constructor\n * @version 1\n * @param {String|Element} selector Element or selector.\n * @param {String} [options] Options object, containing:\n * @param {String} [options.node] Selector for the nodes. Defaults to 'li'.\n * @param {String} [options.children] Selector for the children. Defaults to 'ul'.\n * @param {String} [options.parentClass] CSS classes to be added to parent nodes. Defaults to 'parent'.\n * @param {String} [options.openClass] CSS classes to be added to the icon when a parent is open. Defaults to 'fa fa-minus-circle'.\n * @param {String} [options.closedClass] CSS classes to be added to the icon when a parent is closed. Defaults to 'fa fa-plus-circle'.\n * @param {String} [options.hideClass] CSS Class to toggle visibility of the children. Defaults to 'hide-all'.\n * @param {String} [options.iconTag] The name of icon tag. The component tries to find a tag with that name as a direct child of the node. If it doesn't find it, it creates it. Defaults to 'i'.\n * @param {Boolean} [options.stopDefault] Flag to stops the default behavior of the click handler. Defaults to true.\n * @example\n * \n * \n * \n * @sample Ink_UI_TreeView_1.html\n */\n function TreeView() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n TreeView._name = 'TreeView_1';\n\n TreeView._optionDefinition = {\n 'node': ['String', 'li'],\n 'children': ['String','ul'],\n 'parentClass': ['String','parent'],\n 'openNodeClass': ['String', 'open'],\n 'openClass': ['String','fa fa-minus-circle'],\n 'closedClass': ['String','fa fa-plus-circle'],\n 'hideClass': ['String','hide-all'],\n 'iconTag': ['String', 'i'],\n 'stopDefault' : ['Boolean', true]\n };\n\n TreeView.prototype = {\n /**\n * Init function called by the constructor. Sets the necessary event handlers.\n * \n * @method _init\n * @private\n */\n _init: function(){\n this._handlers = {\n click: Ink.bindEvent(this._onClick,this)\n };\n\n Event.on(this._element, 'click', this._options.node, this._handlers.click);\n\n InkArray.each(Ink.ss(this._options.node, this._element), Ink.bind(function(item){\n if( this.isParent(item) ) {\n Css.addClassName(item, this._options.parentClass);\n\n var isOpen = this.isOpen(item);\n if( !this._getIcon(item) ){\n Element.create(this._options.iconTag, { insertTop: item });\n }\n\n this._setNodeOpen(item, isOpen);\n }\n },this));\n },\n\n _getIcon: function (node) {\n return Ink.s('> ' + this._options.iconTag, node);\n },\n\n /**\n * Checks if a node is open.\n *\n * @method isOpen\n * @param {Element} node The tree node to check\n * @return {Boolean} Whether the node is open.\n **/\n isOpen: function (node) {\n if (!this._getChild(node)) {\n throw new Error('not a node!');\n }\n\n return node.getAttribute('data-open') === 'true' ||\n Css.hasClassName(node, this._options.openNodeClass);\n },\n\n /**\n * Checks if a node is a parent.\n *\n * @method isParent\n * @param {Element} node Node to check\n * @return {Boolean} Whether `node` is a parent.\n **/\n isParent: function (node) {\n return Css.hasClassName(node, this._options.parentClass) ||\n this._getChild(node) != null;\n },\n\n _setNodeOpen: function (node, beOpen) {\n var child = this._getChild(node);\n if (child) {\n Css.setClassName(child, this._options.hideClass, !beOpen);\n var icon = this._getIcon(node);\n\n node.setAttribute('data-open', beOpen);\n\n /*\n * Don't refactor this to\n *\n * setClassName(el, className, status); setClassName(el, className, !status);\n *\n * because it won't work with multiple classes.\n *\n * Doing:\n * setClassName(el, 'fa fa-whatever', true);setClassName(el, 'fa fa-whatever-else', false);\n *\n * will remove 'fa' although it is a class we want.\n */\n\n var toAdd = beOpen ? this._options.openClass : this._options.closedClass;\n var toRemove = beOpen ? this._options.closedClass : this._options.openClass;\n Css.removeClassName(icon, toRemove);\n Css.addClassName(icon, toAdd);\n\n Css.setClassName(node, this._options.openNodeClass, beOpen);\n } else {\n Ink.error('Ink.UI.TreeView: node', node, 'is not a node!');\n }\n },\n\n /**\n * Opens one of the tree nodes\n *\n * Make sure you pass the node's Element\n * @method open\n * @param {Element} node The node you wish to open.\n * @return {void}\n **/\n open: function (node) {\n this._setNodeOpen(node, true);\n },\n\n /**\n * Closes one of the tree nodes\n *\n * Make sure you pass the node's Element\n * @method close\n * @param {Element} node The node you wish to close.\n * @return {void}\n **/\n close: function (node) {\n this._setNodeOpen(node, false);\n },\n\n /**\n * Toggles a node state\n *\n * @method toggle\n * @param {Element} node The node to toggle.\n * @return {void}\n **/\n toggle: function (node) {\n if (this.isOpen(node)) {\n this.close(node);\n } else {\n this.open(node);\n }\n },\n\n /**\n * @method _getChild\n **/\n _getChild: function (node) {\n return Selector.select(this._options.children, node)[0] || null;\n },\n\n /**\n * Handles the click event (as specified in the _init function).\n * \n * @method _onClick\n * @param {Event} ev DOM click event.\n * @return {void}\n * @private\n */\n _onClick: function(ev){\n /**\n * Summary:\n * If the clicked element is a \"node\" as defined in the options, will check if it has any \"child\".\n * If so, will toggle its state and stop the event's default behavior if the stopDefault option is true.\n **/\n\n if (!this.isParent(ev.currentTarget) ||\n Selector.matchesSelector(ev.target, this._options.node) ||\n Selector.matchesSelector(ev.target, this._options.children)) {\n return;\n }\n\n if (this._options.stopDefault){\n ev.preventDefault();\n }\n\n this.toggle(ev.currentTarget);\n }\n };\n\n Common.createUIComponent(TreeView);\n\n return TreeView;\n});\n","Ink.createModule('Ink.UI.Upload', '1', [\n 'Ink.Dom.Event_1',\n 'Ink.Dom.Element_1',\n 'Ink.Dom.Browser_1',\n 'Ink.UI.Common_1'\n], function(Event, Element, Browser, Common) {\n 'use strict';\n\n var DirectoryReader = function(options) {\n this.init(options);\n };\n\n DirectoryReader.prototype = {\n init: function(options) {\n this._options = Ink.extendObj({\n entry: undefined,\n maxDepth: 10\n }, options || {});\n\n try {\n this._read();\n } catch(e) {\n Ink.error(e);\n }\n },\n\n\n _read: function() {\n if(!this._options.entry) {\n Ink.error('You must specify the entry!');\n return;\n }\n\n try {\n this._readDirectories();\n } catch(e) {\n Ink.error(e);\n }\n },\n\n\n _readDirectories: function() {\n var entries = [],\n running = false,\n maxDepth = 0;\n\n /* TODO return as tree because much better well */\n var _readEntries = Ink.bind(function(currentEntry) {\n var dir = currentEntry.createReader();\n running = true;\n\n dir.readEntries(Ink.bind(function(res) {\n if(res.length > 0) {\n for(var i = 0, len = res.length; i=0; i--) {\n if(typeof(arr[i]) === 'undefined' || arr[i] === null || arr[i] === '') {\n arr.splice(i, 1);\n }\n }\n return arr;\n }\n };\n\n var Queue = {\n lists: [],\n items: [],\n\n\n /**\n * Create new queue list\n * @function create\n * @public\n * @param {String} list name\n * @param {Function} function to iterate on items\n * @return {Object} list id\n */\n create: function(name) {\n var id;\n name = String(name);\n this.lists.push({name: name});\n id = this.lists.length - 1;\n return id;\n },\n\n\n getItems: function(parentId) {\n if(!parentId) {\n return this.items;\n }\n var items = [];\n for(var i = 0, len = this.items.length; i=0; i--) {\n if(this.items[i] && id === this.items[i].parentId) {\n this.remove(this.items[i].parentId, this.items[i].pid);\n }\n }\n if(!keepList) {\n this.lists.splice(id, 1);\n }\n return true;\n } catch(e) {\n Ink.error('Purge: invalid id');\n return false;\n }\n },\n\n\n /**\n * add an item to a list\n * @function add\n * @public\n * @param {String} name\n * @param {Object} item\n * @return {Number} pid\n */\n add: function(parentId, item, priority) {\n if(!this.lists[parentId]) {\n return false;\n }\n if(typeof(item) !== 'object') {\n item = String(item);\n }\n\n var pid = parseInt(Math.round(Math.random() * 100000) + \"\" + Math.round(Math.random() * 100000), 10);\n priority = priority || 0;\n\n this.items.push({parentId: parentId, item: item, priority: priority || 0, pid: pid});\n return pid;\n },\n\n\n /**\n * View list\n * @function view\n * @public\n * @param {Number} list id\n * @param {Number} process id\n * @return {Object} item\n */\n view: function(parentId, pid) {\n var id = this._searchByPid(parentId, pid);\n if(id === false) {\n return false;\n }\n return this.items[id];\n },\n\n\n /**\n * Remove an item\n * @function remove\n * @public\n * @param {Object} item\n * @return {Object|Boolean} removed item or false if not found\n */\n remove: function(parentId, pid) {\n try {\n var id = this._searchByPid(parentId, pid);\n if(id === false) {\n return false;\n }\n this.items.splice(id, 1);\n return true;\n } catch(e) {\n Ink.error('Remove: invalid id');\n return false;\n }\n },\n\n _searchByPid: function(parentId, pid) {\n if(!parentId && typeof(parentId) === 'boolean' || !pid) {\n return false;\n }\n\n parentId = parseInt(parentId, 10);\n pid = parseInt(pid, 10);\n\n if(isNaN(parentId) || isNaN(pid)) {\n return false;\n }\n\n for(var i = 0, len = this.items.length; i this._options.minSizeToUseChunks;\n },\n\n\n _dropEventHandler: function(ev) {\n Event.stop(ev);\n\n this.publish('DropComplete', ev.dataTransfer);\n\n var data = ev.dataTransfer;\n\n if(!data || !data.files || !data.files.length) {\n return false;\n }\n\n this._files = data.files;\n this._files = Array.prototype.slice.call(this._files || [], 0);\n\n // check if webkitGetAsEntry exists on first item\n if(data.items && data.items[0] && data.items[0].webkitGetAsEntry) {\n if(!this._options.foldersEnabled) {\n return setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);\n }\n var entry, folders = [];\n for(var i = ev.dataTransfer.items.length-1; i>=0; i--) {\n entry = ev.dataTransfer.items[i].webkitGetAsEntry();\n if(entry && entry.isDirectory) {\n folders.push(entry);\n this._files[i].isDirectory = true;\n this._files.splice(i, 1);\n }\n }\n // starting callback hell\n this._addFolderToQueue(folders, Ink.bind(function() {\n setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);\n }, this));\n } else {\n setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);\n }\n\n return true;\n },\n\n\n _addFolderToQueue: function(folders, cb) {\n var files = [], invalidFolders = {};\n\n if(!folders || !folders.length) {\n cb();\n return files;\n }\n\n var getFiles = function(entries) {\n var files = [];\n for(var i = 0, len = entries.length; i this._options.maxFilesize) {\n this.publish('MaxSizeFailure', file, this._options.maxFilesize);\n continue;\n }\n\n fileID = parseInt(Math.round(Math.random() * 100000) + \"\" + Math.round(Math.random() * 100000), 10);\n o = { id: i, data: file, fileID: fileID, directory: file.isDirectory };\n Queue.add(this._queueId, o);\n\n this.publish('FileAddedToQueue', o);\n }\n this._processQueue(true);\n this._files = [];\n },\n\n\n _processQueue: function(internalUpload) {\n if(this._queueRunning) {\n return false;\n }\n\n this.running = 0;\n var max = 1, i = 0, items,\n queueLen = Queue.items.length;\n this._queueRunning = true;\n\n this.interval = setInterval(Ink.bind(function() {\n if(Queue.items.length === i && this.running === 0) {\n Queue.purge(this._queueId, true);\n this._queueRunning = false;\n clearInterval(this.interval);\n this.publish('QueueEnd', this._queueId, queueLen);\n }\n\n items = Queue.getItems(this._queueId);\n\n if(this.running < max && items[i]) {\n if(!items[i].canceled) {\n _doRequest.call(this, items[i].pid, items[i].item.data, items[i].item.fileID, items[i].item.directory, internalUpload);\n this.running++;\n i++;\n } else {\n var j = i;\n while(items[j] && items[j].canceled) {\n i++;\n j++;\n }\n }\n return true;\n }\n return false;\n }, this), 100);\n\n\n var _doRequest = function(pid, data, fileID, directory, internalUpload) {\n var o = {\n file: data,\n fileID: fileID,\n cb: Ink.bind(function() {\n this.running--;\n }, this)\n };\n if(internalUpload) {\n if(directory) {\n // do magic\n o.cb();\n } else {\n this._upload(o);\n }\n }\n };\n\n return true;\n },\n\n\n _upload: function(o) {\n var file = o.file,\n xhr = new XMLHttpRequest(),\n fileID = o.fileID;\n\n this.publish('BeforeUpload', file, this._options.extraData, fileID, xhr, this._supportChunks(file.size));\n\n var forceAbort = function(showError) {\n if(o.cb && typeof(o.cb === 'function')) {\n o.cb();\n }\n\n this.publish('OnProgress', {\n length: file.size,\n lengthComputable: true,\n loaded: file.size,\n total: file.size\n }, file, fileID);\n this.publish('EndUpload', file, fileID, (showError ? { error: true } : true));\n this.publish('InvalidFile', file, 'name');\n xhr.abort();\n };\n\n if(this._options.INVALID_FILE_NAME && this._options.INVALID_FILE_NAME instanceof RegExp) {\n if(this._options.INVALID_FILE_NAME.test(o.file.name)) {\n forceAbort.call(this);\n return;\n }\n }\n\n // If file was renamed, abort it\n // FU OPERA: Opera always return lastModified date as null\n if(!file.lastModifiedDate && !Ink.Dom.Browser.OPERA) {\n forceAbort.call(this, true);\n return;\n }\n\n xhr.upload.onprogress = Ink.bind(this.publish, this, 'OnProgress', file, fileID);\n\n var endpoint, method;\n if(this._supportChunks(file.size)) {\n if(file.size <= file.chunk_offset) {\n endpoint = this._options.endpointChunkCommit;\n method = 'POST';\n } else {\n endpoint = this._options.endpointChunk;\n if(file.chunk_upload_id) {\n endpoint += '?upload_id=' + file.chunk_upload_id;\n }\n if(file.chunk_offset) {\n endpoint += '&offset=' + file.chunk_offset;\n }\n method = 'PUT';\n }\n } else {\n endpoint = this._options.endpoint;\n method = 'POST';\n }\n\n xhr.open(method, endpoint, true);\n xhr.withCredentials = true;\n xhr.setRequestHeader(\"x-requested-with\", \"XMLHttpRequest\");\n if(this._supportChunks(file.size)) {\n xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n }\n\n var fd = new FormData(),\n blob;\n\n if(\"Blob\" in window && typeof Blob === 'function') {\n blob = new Blob([file], { type: file.type });\n if(this._supportChunks(file.size)) {\n file.chunk_offset = file.chunk_offset || 0;\n blob = blob.slice(file.chunk_offset, file.chunk_offset + this._options.chunkSize);\n } else {\n fd.append(this._options.fileFormName, blob, file.name);\n }\n } else {\n fd.append(this._options.fileFormName, file);\n }\n\n if(!this._supportChunks(file.size)) {\n for(var k in this._options.extraData) {\n if(this._options.extraData.hasOwnProperty(k)) {\n fd.append(k, this._options.extraData[k]);\n }\n }\n } else {\n fd.append('upload_id', file.chunk_upload_id);\n fd.append('path', file.upload_path);\n }\n\n if(!file.hasParent) {\n if(!this._supportChunks(file.size)) {\n xhr.send(fd);\n } else {\n if(file.size <= file.chunk_offset) {\n xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name);\n } else {\n xhr.send(blob);\n }\n }\n } else {\n this.publish('cbCreateFolder', file.parentID, file.fullPath, this._options.extraData, this._folders, file.rootPath, Ink.bind(function() {\n if(!this._supportChunks(file.size)) {\n xhr.send(fd);\n } else {\n if(file.size <= file.chunk_offset) {\n xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name);\n } else {\n xhr.send(blob);\n }\n }\n }, this));\n }\n\n\n xhr.onload = Ink.bindEvent(function() {\n /* jshint boss:true */\n if(this._supportChunks(file.size) && file.size > file.chunk_offset) {\n if(xhr.response) {\n var response = JSON.parse(xhr.response);\n\n // check expected offset\n var invalidOffset = file.chunk_offset && response.offset !== (file.chunk_offset + this._options.chunkSize) && file.size !== response.offset;\n if(invalidOffset) {\n if(o.cb) {\n o.cb();\n }\n this.publish('ErrorUpload', file, fileID);\n } else {\n file.chunk_upload_id = response.upload_id;\n file.chunk_offset = response.offset;\n file.chunk_expires = response.expires;\n this._upload(o);\n }\n } else {\n if(o.cb) {\n o.cb();\n }\n this.publish('ErrorUpload', file, fileID);\n }\n return (xhr = null);\n }\n\n if(o.cb) {\n o.cb();\n }\n\n if(xhr.responseText && xhr['status'] < 400) {\n this.publish('EndUpload', file, fileID, xhr.responseText);\n } else {\n this.publish('ErrorUpload', file, fileID);\n }\n return (xhr = null);\n }, this);\n\n\n xhr.onerror = Ink.bindEvent(function() {\n if(o.cb) {\n o.cb();\n }\n this.publish('ErrorUpload', file, fileID);\n }, this);\n\n xhr.onabort = Ink.bindEvent(function() {\n if(o.cb) {\n o.cb();\n }\n this.publish('AbortUpload', file, fileID, {\n abortAll: Ink.bind(this.abortAll, this),\n abortOne: Ink.bind(this.abortOne, this)\n });\n }, this);\n },\n\n\n abortAll: function() {\n if(!this._queueRunning) {\n return false;\n }\n clearInterval(this.interval);\n this._queueRunning = false;\n Queue.purge(this._queueId, true);\n return true;\n },\n\n abortOne: function(id, cb) {\n var items = Queue.getItems(0),\n o;\n for(var i = 0, len = items.length; i *'); if (parentIsControl) { this._wrapper = this._element.parentNode; From 13ef2dc89bb04e392b6ededc34ba0d8c02a2f17c Mon Sep 17 00:00:00 2001 From: Pedro Correia Date: Wed, 11 Feb 2015 12:43:01 +0000 Subject: [PATCH 5/5] Bumps version to 3.1.4 and updates dist files. --- bower.json | 2 +- dist/js/ink-all.js | 2 +- dist/js/ink-all.min.js | 2 +- dist/js/ink-all.min.js.map | 2 +- dist/js/ink.js | 2 +- dist/js/ink.min.js | 2 +- dist/js/ink.min.js.map | 2 +- package.json | 2 +- src/js/Ink/1/lib.js | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/bower.json b/bower.json index 93fdba974..329633ce9 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "Ink", - "version": "3.1.3", + "version": "3.1.4", "description": "An HTML5/CSS3 framework used at SAPO for fast and efficient website design and prototyping.", "keywords": [ "HTML", diff --git a/dist/js/ink-all.js b/dist/js/ink-all.js index 96b94f699..492e67187 100644 --- a/dist/js/ink-all.js +++ b/dist/js/ink-all.js @@ -47,7 +47,7 @@ /** * @property {String} VERSION **/ - VERSION: '3.1.2', + VERSION: '3.1.4', _checkPendingRequireModules: function() { var I, F, o, dep, mod, cb, pRMs = []; var toApply = []; diff --git a/dist/js/ink-all.min.js b/dist/js/ink-all.min.js index 37dcac23b..197be2007 100644 --- a/dist/js/ink-all.min.js +++ b/dist/js/ink-all.min.js @@ -1,4 +1,4 @@ -!function(a,b){"use strict";if(!("Ink"in a)){var c={},d={},e=[],f={},g=[],h={},i=Function.prototype.apply,j=function(a){if("object"!=typeof a)return!1;for(var b in a)if(a.hasOwnProperty(b))return!1;return!0};a.Ink={VERSION:"3.1.2",_checkPendingRequireModules:function(){var a,b,c,e,f,h,i=[],j=[];for(a=0,b=g.length;b>a;++a)if(c=g[a]){for(e in c.left)c.left.hasOwnProperty(e)&&(f=d[e],f&&(c.args[c.left[e]]=f,delete c.left[e],--c.remaining));if(c.remaining>0)i.push(c);else{if(h=c.cb,!h)continue;delete c.cb,j.push([h,c.args])}}g=i;for(var k=0;k0&&setTimeout(function(){Ink._checkPendingRequireModules()},0)},getPath:function(a,b){var d=a.split(/[._]/g),e,f,g,h;for(f=d.length;f>=0;f-=1)if(e=d.slice(0,f+1).join("."),c[e]){g=e;break}return g in c?(h=c[g],/\/$/.test(h)||(h+="/"),fg;++g)e[d[g]]=e[d[g]]||{},f=e,e=e[d[g]];return c?[f,d[g-1]]:e},getModule:function(a,b){var c=b?[a,"_",b].join(""):a;return d[c]},createModule:function(b,c,g,i){if("string"!=typeof b)throw new Error("module name must be a string!");if(!("number"==typeof c||"string"==typeof c&&c.length>0))throw new Error("version number missing!");var k=[b,"_",c].join("");h[k]=!0;var l=function(){if(!d[k]){delete f[k],delete f[b];var g=Array.prototype.slice.call(arguments),l=i.apply(a,g);e.push(k),"object"==typeof l?l._version=c:"function"==typeof l&&(l.prototype._version=c,l._version=c);var m=0===b.indexOf("Ink."),n;m&&(n=Ink.namespace(b,!0)),d[k]=l,delete h[k],m&&(n[0][n[1]+"_"+c]=l),d[b]=l,m&&j(n[0][n[1]])&&(n[0][n[1]]=l),this&&Ink._checkPendingRequireModules()}};this.requireModules(g,l)},requireModules:function(a,b){var c,e,h,i,j;if(e=a&&a.length,h={args:new Array(e),left:{},remaining:e,cb:b},"object"!=typeof a||void 0===a.length)throw new Error("Dependency list should be an array!");if("function"!=typeof b)throw new Error("Callback should be a function!");for(c=0;e>c;++c)Ink._moduleRenames[a[c]]?(Ink.warn(a[c]+" was renamed to "+Ink._moduleRenames[a[c]]),i=Ink._moduleRenames[a[c]]):i=a[c],i?(j=d[i],j?(h.args[c]=j,--h.remaining):(f[i]||Ink._loadLater(i),h.left[i]=c)):--h.remaining;h.remaining>0?g.push(h):b.apply(!0,h.args)},_moduleRenames:{"Ink.UI.Aux_1":"Ink.UI.Common_1"},getModulesLoadOrder:function(){return e.slice()},getModuleScripts:function(){var a=this.getModulesLoadOrder();return a.unshift("Ink_1"),a=a.map(function(a){return[""].join("")}),a.join("\n")},createExt:function(a,b,c,d){return Ink.createModule("Ink.Ext."+a,b,c,d)},bind:function(a,b){var c=Array.prototype.slice.call(arguments,2);return function(){var d=Array.prototype.slice.call(arguments),e=c.concat(d);return a.apply(b===!1?this:b,e)}},bindMethod:function(a,b){return Ink.bind.apply(Ink,[a[b],a].concat([].slice.call(arguments,2)))},bindEvent:function(b,c){var d=Array.prototype.slice.call(arguments,2);return function(e){var f=d.slice();return f.unshift(e||a.event),b.apply(c===!1?this:c,f)}},i:function(a){return"string"==typeof a?b.getElementById(a)||null:a},ss:function(a,c){if("undefined"==typeof Ink.Dom||"undefined"==typeof Ink.Dom.Selector)throw new Error("This method requires Ink.Dom.Selector");return Ink.Dom.Selector.select(a,c||b)},s:function(a,c){if("undefined"==typeof Ink.Dom||"undefined"==typeof Ink.Dom.Selector)throw new Error("This method requires Ink.Dom.Selector");return Ink.Dom.Selector.select(a,c||b)[0]||null},extendObj:function(a){for(var b=[].slice.call(arguments,1),c=0,d=b.length;d>c;c++)if(b[c])for(var e in b[c])Object.prototype.hasOwnProperty.call(b[c],e)&&(a[e]=b[c][e]);return a},log:function(){var b=a.console;b&&b.log&&i.call(b.log,b,arguments)},warn:function(){var b=a.console;b&&b.warn&&i.call(b.warn,b,arguments)},error:function(){var b=a.console;b&&b.error&&i.call(b.error,b,arguments)}}}}(window,document),Ink.createModule("Ink.Net.Ajax","1",[],function(){"use strict";var Ajax=function(a,b){this.init(a,b)};Ajax.globalOptions={parameters:{},requestHeaders:{}};var xMLHttpRequestWithCredentials="XMLHttpRequest"in window&&"withCredentials"in new XMLHttpRequest;return Ajax.prototype={init:function(a,b){if(!a)throw new Error("new Ink.Net.Ajax: Pass a url as the first argument!");var c=Ink.extendObj({asynchronous:!0,contentType:"application/x-www-form-urlencoded",cors:!1,validateCors:!1,debug:!1,delay:0,evalJS:!0,method:"POST",parameters:null,postBody:"",requestHeaders:null,sanitizeJSON:!1,signRequest:!1,timeout:0,useCredentials:!1,xhrProxy:"",onComplete:null,onCreate:null,onException:null,onFailure:null,onHeaders:null,onInit:null,onSuccess:null,onTimeout:null},Ajax.globalOptions);if(b&&"object"==typeof b){if(c=Ink.extendObj(c,b),"object"==typeof b.parameters)c.parameters=Ink.extendObj(Ink.extendObj({},Ajax.globalOptions.parameters),b.parameters);else if(null!==b.parameters){var d=this.paramsObjToStr(Ajax.globalOptions.parameters);d&&(c.parameters=b.parameters+"&"+d)}c.requestHeaders=Ink.extendObj({},Ajax.globalOptions.requestHeaders),c.requestHeaders=Ink.extendObj(c.requestHeaders,b.requestHeaders)}this.options=c,this.safeCall("onInit"),this.url=a;var e=this._locationFromURL(a);this.isHTTP=this._locationIsHTTP(e),this.isCrossDomain=this._locationIsCrossDomain(e,location),this.requestHasBody=c.method.search(/^get|head$/i)<0,this.options.validateCors===!0&&(this.options.cors=this.isCrossDomain),this.options.cors&&(this.isCrossDomain=!1),this.transport=this.getTransport(),this.request()},_locationFromURL:function(a){var b=document.createElementNS?document.createElementNS("http://www.w3.org/1999/xhtml","a"):document.createElement("a");return b.setAttribute("href",a),b},_locationIsHTTP:function(a){return a.href.match(/^https?:/i)?!0:!1},_locationIsCrossDomain:function(a,b){if(b=b||window.location,Ajax.prototype._locationIsHTTP(a)&&"widget:"!==b.protocol&&"object"!=typeof window.widget){var c=a.href.split("//"),d=b.href.split("//");if(1===c.length||1===d.length)return!1;var e=c[0],f=d[0],g=/:|\//,h=c[1].split(g)[0],i=d[1].split(g)[0];return e!==f||h!==i}return!1},getTransport:function(){if(!xMLHttpRequestWithCredentials&&this.options.cors&&"XDomainRequest"in window)return this.usingXDomainReq=!0,new XDomainRequest;if("undefined"!=typeof XMLHttpRequest)return new XMLHttpRequest;if("undefined"==typeof ActiveXObject)return null;try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(a){return new ActiveXObject("Microsoft.XMLHTTP")}},setHeaders:function(){if(this.transport)try{var a={Accept:"text/javascript,text/xml,application/xml,application/xhtml+xml,text/html,application/json;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1","Accept-Language":navigator.language,"X-Requested-With":"XMLHttpRequest","X-Ink-Version":"3"};if(this.options.cors&&(this.options.signRequest||delete a["X-Requested-With"],delete a["X-Ink-Version"]),this.options.requestHeaders&&"object"==typeof this.options.requestHeaders)for(var b in this.options.requestHeaders)this.options.requestHeaders.hasOwnProperty(b)&&(a[b]=this.options.requestHeaders[b]);this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005&&(a.Connection="close");for(var c in a)a.hasOwnProperty(c)&&this.transport.setRequestHeader(c,a[c])}catch(d){}},paramsObjToStr:function(a){var b,c,d,e,f=[];if("object"!=typeof a)return a;for(d in a)if(a.hasOwnProperty(d))if(e=a[d],"[object Array]"!==Object.prototype.toString.call(e)||isNaN(e.length))f=f.concat([encodeURIComponent(d),"=",encodeURIComponent(e),"&"]);else for(b=0,c=e.length;c>b;b++)f=f.concat([encodeURIComponent(d),"[]","=",encodeURIComponent(e[b]),"&"]);return f.length>0&&f.pop(),f.join("")},setParams:function(){var a=null,b=this.options.parameters;a="object"==typeof b?this.paramsObjToStr(b):""+b,a&&(this.url=this.url.indexOf("?")>-1?this.url.split("#")[0]+"&"+a:this.url.split("#")[0]+"?"+a)},getHeader:function(a){if(this.usingXDomainReq&&"Content-Type"===a)return this.transport.contentType;try{return this.transport.getResponseHeader(a)}catch(b){return null}},getAllHeaders:function(){try{return this.transport.getAllResponseHeaders()}catch(a){return null}},getResponse:function(){var a=this.transport,b={headerJSON:null,responseJSON:null,getHeader:this.getHeader,getAllHeaders:this.getAllHeaders,request:this,transport:a,timeTaken:new Date-this.startTime,requestedUrl:this.url};b.readyState=a.readyState;try{b.responseText=a.responseText}catch(c){}try{b.responseXML=a.responseXML}catch(c){}try{b.status=a.status}catch(c){b.status=0}try{b.statusText=a.statusText}catch(c){b.statusText=""}return b},abort:function(){if(this.transport){clearTimeout(this.delayTimeout),clearTimeout(this.stoTimeout);try{this.transport.abort()}catch(a){}this.finish()}},runStateChange:function(){var a=this.transport.readyState;if(3===a)this.isHTTP&&this.safeCall("onHeaders");else if(4===a||this.usingXDomainReq){if(this.options.asynchronous&&this.options.delay&&this.startTime+this.options.delay>(new Date).getTime())return void(this.delayTimeout=setTimeout(Ink.bind(this.runStateChange,this),this.options.delay+this.startTime-(new Date).getTime()));var b,c=this.transport.responseText,d=this.getResponse(),e=this.transport.status;this.isHTTP&&!this.options.asynchronous&&this.safeCall("onHeaders"),clearTimeout(this.stoTimeout),0===e?this.isHTTP?this.safeCall("onException",new Error("Ink.Net.Ajax: network error! (HTTP status 0)")):e=c?200:404:304===e&&(e=200);var f=this.usingXDomainReq||e>=200&&300>e,g=this.getHeader("Content-Type")||"";if(this.options.evalJS&&(g.indexOf("application/json")>=0||"force"===this.options.evalJS))try{b=this.evalJSON(c,this.sanitizeJSON),b&&(c=d.responseJSON=b)}catch(h){f&&this.safeCall("onException",h)}if(this.usingXDomainReq&&-1!==g.indexOf("xml")&&"DOMParser"in window){var i;switch(g){case"application/xml":case"application/xhtml+xml":case"image/svg+xml":i=g;break;default:i="text/xml"}var j=(new DOMParser).parseFromString(this.transport.responseText,i);this.transport.responseXML=j,d.responseXML=j}null!=this.transport.responseXML&&null==d.responseJSON&&""!==this.transport.responseXML.xml&&(c=this.transport.responseXML),(e||this.usingXDomainReq)&&(f?this.safeCall("onSuccess",d,c):this.safeCall("onFailure",d,c),this.safeCall("on"+e,d,c)),this.finish(d,c)}},finish:function(a,b){if(a&&this.safeCall("onComplete",a,b),clearTimeout(this.stoTimeout),this.transport){try{this.transport.onreadystatechange=null}catch(c){}"function"==typeof this.transport.destroy&&this.transport.destroy(),this.transport=null}},safeCall:function(a){var b=arguments[1]instanceof Error?arguments[1]:null;if("function"==typeof this.options[a])try{this.options[a].apply(this,[].slice.call(arguments,1))}catch(c){Ink.error("Ink.Net.Ajax: an error was raised while executing "+a+".",c)}else b&&Ink.error("Ink.Net.Ajax: "+b)},setRequestHeader:function(a,b){this.options.requestHeaders||(this.options.requestHeaders={}),this.options.requestHeaders[a]=b},request:function(){if(this.transport){var a=null;this.requestHasBody?(null!==this.options.postBody&&""!==this.options.postBody?(a=this.options.postBody,this.setParams()):null!==this.options.parameters&&""!==this.options.parameters&&(a=this.options.parameters),"object"!=typeof a||a.nodeType?"object"!=typeof a&&null!==a&&(a=""+a):a=this.paramsObjToStr(a),this.options.contentType&&this.setRequestHeader("Content-Type",this.options.contentType)):this.setParams();var b=this.url,c=this.options.method,d=this.isCrossDomain;d&&this.options.xhrProxy&&(this.setRequestHeader("X-Url",b),b=this.options.xhrProxy+encodeURIComponent(b),d=!1);try{this.transport.open(c,b,this.options.asynchronous)}catch(e){return this.safeCall("onException",e),this.finish(this.getResponse(),null)}this.setHeaders(),this.safeCall("onCreate"),this.options.timeout&&!isNaN(this.options.timeout)&&(this.stoTimeout=setTimeout(Ink.bind(function(){this.options.onTimeout&&(this.safeCall("onTimeout"),this.abort())},this),1e3*this.options.timeout)),this.options.useCredentials&&!this.usingXDomainReq&&(this.transport.withCredentials=!0),this.options.asynchronous&&!this.usingXDomainReq?this.transport.onreadystatechange=Ink.bind(this.runStateChange,this):this.usingXDomainReq&&(this.transport.onload=Ink.bind(this.runStateChange,this));try{if(d)return void Ink.error("Ink.Net.Ajax: You are attempting to request a URL which is cross-domain from this one. To do this, you *must* enable the `cors` option!");this.startTime=(new Date).getTime(),this.transport.send(a)}catch(e){return this.safeCall("onException",e),this.finish(this.getResponse(),null)}this.options.asynchronous||this.runStateChange()}},isJSON:function(a){return"string"==typeof a&&a?(a=a.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,""),/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/.test(a)):!1},evalJSON:function(strJSON,sanitize){if(strJSON&&(!sanitize||this.isJSON(strJSON)))try{return"undefined"!=typeof JSON&&"undefined"!=typeof JSON.parse?JSON.parse(strJSON):eval("("+strJSON+")")}catch(e){throw new Error("Ink.Net.Ajax: Bad JSON string. "+e)}return null}},Ajax.load=function(a,b){var c=Ajax.prototype._locationIsCrossDomain(window.location,Ajax.prototype._locationFromURL(a));return new Ajax(a,{method:"GET",cors:c,onSuccess:function(a){b(a.responseJSON||a.responseText,a)}})},Ajax.ping=function(a,b){var c=Ajax.prototype._locationIsCrossDomain(window.location,Ajax.prototype._locationFromURL(a));return new Ajax(a,{method:"HEAD",cors:c,onSuccess:function(a){"function"==typeof b&&b(a)}})},Ajax}),Ink.createModule("Ink.Net.JsonP","1",[],function(){"use strict";var a=function(a,b){this.init(a,b)};return a.prototype={init:function(a,b){if(this.options=Ink.extendObj({onSuccess:void 0,onFailure:void 0,failureObj:{},timeout:10,params:{},callbackParam:"jsoncallback",internalCallback:"_cb",randVar:!1},b||{}),this.randVar=this.options.randVar!==!1?this.options.randVar:parseInt(1e5*Math.random(),10),this.options.internalCallback+=this.randVar,this.uri=a,"function"==typeof this.options.onComplete&&(this.options.onSuccess=this.options.onComplete),"string"!=typeof this.uri)throw new Error("Ink.Net.JsonP: Please define an URI");if("function"!=typeof this.options.onSuccess)throw new Error("Ink.Net.JsonP: please define a callback function on option onSuccess!");Ink.Net.JsonP[this.options.internalCallback]=Ink.bind(function(){this.options.onSuccess(arguments[0]),this._cleanUp()},this),this.timeout=setTimeout(Ink.bind(function(){this.abort(),"function"==typeof this.options.onFailure&&this.options.onFailure(this.options.failureObj)},this),1e3*this.options.timeout),this._addScriptTag()},abort:function(){Ink.Net.JsonP[this.options.internalCallback]=Ink.bindMethod(this,"_cleanUp")},_addParamsToGet:function(a,b){var c=-1!==a.indexOf("?"),d,e,f,g=[a];for(e in b)b.hasOwnProperty(e)&&(c?d="&":(d="?",c=!0),f=b[e],"number"==typeof f||f||(f=""),g=g.concat([d,e,"=",encodeURIComponent(f)]));return g.join("")},_getScriptContainer:function(){return document.body||document.getElementsByTagName("body")[0]||document.getElementsByTagName("head")[0]||document.documentElement},_addScriptTag:function(){this.options.params[this.options.callbackParam]="Ink.Net.JsonP."+this.options.internalCallback,this.options.params.rnd_seed=this.randVar,this.uri=this._addParamsToGet(this.uri,this.options.params),this._scriptEl=document.createElement("script"),this._scriptEl.type="text/javascript",this._scriptEl.src=this.uri;var a=this._getScriptContainer();a.appendChild(this._scriptEl)},_cleanUp:function(){this.timeout&&window.clearTimeout(this.timeout),delete this.options.onSuccess,delete this.options.onFailure,delete Ink.Net.JsonP[this.options.internalCallback],this._removeScriptTag()},_removeScriptTag:function(){this._scriptEl&&(this._scriptEl.parentNode.removeChild(this._scriptEl),delete this._scriptEl)}},a}),Ink.createModule("Ink.Dom.Browser","1",[],function(){"use strict";var a={IE:!1,GECKO:!1,OPERA:!1,SAFARI:!1,KONQUEROR:!1,CHROME:!1,model:!1,version:!1,userAgent:!1,cssPrefix:!1,domPrefix:!1,init:function(){this.detectBrowser(),this.setDimensions(),this.setReferrer()},setDimensions:function(){var a=0,b=0;"number"==typeof window.innerWidth?(a=window.innerWidth,b=window.innerHeight):document.documentElement&&(document.documentElement.clientWidth||document.documentElement.clientHeight)?(a=document.documentElement.clientWidth,b=document.documentElement.clientHeight):document.body&&(document.body.clientWidth||document.body.clientHeight)&&(a=document.body.clientWidth,b=document.body.clientHeight),this.windowWidth=a,this.windowHeight=b},setReferrer:function(){this.referrer=document.referrer&&document.referrer.length?window.escape(document.referrer):!1},detectBrowser:function(){this._sniffUserAgent(navigator.userAgent)},_sniffUserAgent:function(a){if(this.userAgent=a,a=a.toLowerCase(),/applewebkit\//.test(a))if(this.cssPrefix="-webkit-",this.domPrefix="Webkit",/(chrome|crios)\//.test(a))this.CHROME=!0,this.model="chrome",this.version=a.replace(/(.*)chrome\/([^\s]+)(.*)/,"$2");else{this.SAFARI=!0,this.model="safari";var b=/version\/([^) ]+)/;this.version=b.test(a)?a.match(b)[1]:a.replace(/(.*)applewebkit\/([^\s]+)(.*)/,"$2")}else if(/opera/.test(a))this.OPERA=!0,this.model="opera",this.version=a.replace(/(.*)opera.([^\s$]+)(.*)/,"$2"),this.cssPrefix="-o-",this.domPrefix="O";else if(/konqueror/.test(a))this.KONQUEROR=!0,this.model="konqueror",this.version=a.replace(/(.*)konqueror\/([^;]+);(.*)/,"$2"),this.cssPrefix="-khtml-",this.domPrefix="Khtml";else if(/(msie|trident)/i.test(a))this.IE=!0,this.model="ie",this.version=/rv:((?:\d|\.)+)/.test(a)?a.match(/rv:((?:\d|\.)+)/)[1]:a.replace(/(.*)\smsie\s([^;]+);(.*)/,"$2"),this.cssPrefix="-ms-",this.domPrefix="ms";else if(/gecko/.test(a)){this.cssPrefix="-moz-",this.domPrefix="Moz",this.GECKO=!0;var c=/(camino|chimera|epiphany|minefield|firefox|firebird|phoenix|galeon|iceweasel|k\-meleon|seamonkey|netscape|songbird|sylera)/;if(c.test(a))this.model=a.match(c)[1],this.version=a.replace(new RegExp("(.*)"+this.model+"/([^;\\s$]+)(.*)"),"$2");else{this.model="mozilla";var d=/(.*)rv:([^)]+)(.*)/;d.test(a)&&(this.version=a.replace(d,"$2"))}}},debug:function(){var a="known browsers: (ie, gecko, opera, safari, konqueror) \n";a+=[this.IE,this.GECKO,this.OPERA,this.SAFARI,this.KONQUEROR]+"\n",a+="cssPrefix -> "+this.cssPrefix+"\n",a+="domPrefix -> "+this.domPrefix+"\n",a+="model -> "+this.model+"\n",a+="version -> "+this.version+"\n",a+="\n",a+="original UA -> "+this.userAgent,alert(a)}};return a.init(),a}),Ink.createModule("Ink.Dom.Css",1,[],function(){"use strict";var a="defaultView"in document&&"getComputedStyle"in document.defaultView?document.defaultView.getComputedStyle:window.getComputedStyle,b={addRemoveClassName:function(a,b,c){return c?this.addClassName(a,b):void this.removeClassName(a,b)},addClassName:function(a,c){if(a=Ink.i(a),!a||!c)return null;c=(""+c).split(/[, ]+/);for(var d=0,e=c.length;e>d;d++)c[d].replace(/^\s+|\s+$/g,"")&&("undefined"!=typeof a.classList?a.classList.add(c[d]):b.hasClassName(a,c[d])||(a.className+=(a.className?" ":"")+c[d]))},removeClassName:function(a,b){if(a=Ink.i(a),!a||!b)return null;b=(""+b).split(/[, ]+/);var c=0,d=b.length;if("undefined"!=typeof a.classList)for(;d>c;c++)a.classList.remove(b[c]);else{for(var e=a.className||"",f;d>c;c++)f=new RegExp("(^|\\s+)"+b[c]+"(\\s+|$)"),e=e.replace(f," ");a.className=e.replace(/^\s+/,"").replace(/\s+$/,"")}},setClassName:function(a,b,c){this.addRemoveClassName(a,b,c||!1)},hasClassName:function(a,b,c){if(a=Ink.i(a),!a||!b)return!1;b=(""+b).split(/[, ]+/);for(var d=0,e=b.length,f,g;e>d;d++){if("undefined"!=typeof a.classList)f=a.classList.contains(b[d]);else{var h=a.className;h===b[d]?f=!0:(g=new RegExp("(^|\\s)"+b[d]+"(\\s|$)"),f=g.test(h))}if(f&&!c)return!0;if(!f&&c)return!1}return c?!0:!1},blinkClass:function(a,c,d,e){a=Ink.i(a),b.addRemoveClassName(a,c,!e),setTimeout(function(){b.addRemoveClassName(a,c,e)},Number(d)||100)},toggleClassName:function(a,c,d){return a&&c?"undefined"!=typeof d?b.addRemoveClassName(a,c,d):void("undefined"==typeof a.classList||/[, ]/.test(c)?b.hasClassName(a,c)?b.removeClassName(a,c):b.addClassName(a,c):(a=Ink.i(a),null!==a&&a.classList.toggle(c))):!1},setOpacity:function(a,b){if(a=Ink.i(a),null!==a){var c=1;isNaN(Number(b))||(c=0>=b?0:1>=b?b:100>=b?b/100:1),"undefined"!=typeof a.style.opacity?a.style.opacity=c:a.style.filter="alpha(opacity:"+(100*c|0)+")"}},_camelCase:function(a){return a?a.replace(/-(\w)/g,function(a,b){return b.toUpperCase()}):a},getStyle:function(b,c){if(b=Ink.i(b),null!==b&&b.style){c="float"===c?"cssFloat":this._camelCase(c);var d=b.style[c];if(!a||d&&"auto"!==d)!d&&b.currentStyle&&(d=b.currentStyle[c],"auto"!==d||"width"!==c&&"height"!==c||(d=b["offset"+c.charAt(0).toUpperCase()+c.slice(1)]+"px"));else{var e=a(b,null);d=e?e[c]:null}if("opacity"===c)return d?parseFloat(d,10):1;if("borderTopWidth"===c||"borderBottomWidth"===c||"borderRightWidth"===c||"borderLeftWidth"===c){if("thin"===d)return"1px";if("medium"===d)return"3px";if("thick"===d)return"5px"}return"auto"===d?null:d}},setStyle:function(a,b){if(a=Ink.i(a),null!==a)if("string"==typeof b)a.style.cssText+="; "+b,-1!==b.indexOf("opacity")&&this.setOpacity(a,b.match(/opacity:\s*(\d?\.?\d*)/)[1]);else for(var c in b)b.hasOwnProperty(c)&&("opacity"===c?this.setOpacity(a,b[c]):"float"===c||"cssFloat"===c?"undefined"==typeof a.style.styleFloat?a.style.cssFloat=b[c]:a.style.styleFloat=b[c]:a.style[c]=b[c])},show:function(a,b){a=Ink.i(a),null!==a&&(a.style.display=b||"")},hide:function(a){a=Ink.i(a),null!==a&&(a.style.display="none")},showHide:function(a,b){a=Ink.i(a),a&&(a.style.display=b?"":"none")},toggle:function(a,b){a=Ink.i(a),null!==a&&("undefined"!=typeof b?b===!0?this.show(a):this.hide(a):"none"===this.getStyle(a,"display").toLowerCase()?this.show(a):this.hide(a))},_getRefTag:function(a){if(a.firstElementChild)return a.firstElementChild;for(var b=a.firstChild;b;b=b.nextSibling)if(1===b.nodeType)return b;return null},appendStyleTag:function(a,b,c){c=Ink.extendObj({type:"text/css",force:!1},c||{});var d=document.getElementsByTagName("style"),e=!1,f=!0,g,h;for(g=0,h=d.length;h>g;g++)e=d[g].innerHTML,e.indexOf(a)>=0&&(f=!1);if(f){var i=document.createElement("style"),j=document.getElementsByTagName("head")[0],k=!1,l="";i.type=c.type,l+=a+" {",l+=b,l+="} ","undefined"!=typeof i.styleSheet?i.styleSheet.cssText=l:i.appendChild(document.createTextNode(l)),c.force?j.appendChild(i):(k=this._getRefTag(j),k&&j.insertBefore(i,k))}},appendStylesheet:function(a,b){b=Ink.extendObj({media:"screen",type:"text/css",force:!1},b||{});var c,d=document.createElement("link"),e=document.getElementsByTagName("head")[0];d.media=b.media,d.type=b.type,d.href=a,d.rel="Stylesheet",b.force?e.appendChild(d):(c=this._getRefTag(e),c&&e.insertBefore(d,c))},_loadingCSSFiles:{},_loadedCSSFiles:{},appendStylesheetCb:function(a,b){if(!a)return b(a);if(this._loadedCSSFiles[a])return b(a);var c=this._loadingCSSFiles[a];if(c)return c.push(b);this._loadingCSSFiles[a]=[b];var d=document.createElement("link");d.type="text/css",d.rel="stylesheet",d.href=a;var e=document.getElementsByTagName("head")[0];e.appendChild(d);var f=document.createElement("img");f.onerror=Ink.bindEvent(function(a,b){var c=b;this._loadedCSSFiles[c]=!0;for(var d=this._loadingCSSFiles[c],e=0,f=d.length;f>e;++e)d[e](c);delete this._loadingCSSFiles[c]},this,a),f.src=a},decToHex:function(a){var b=function(a){return 1===a.length&&(a="0"+a),a=a.toUpperCase()};if("object"==typeof a){var c=b(parseInt(a.r,10).toString(16)),d=b(parseInt(a.g,10).toString(16)),e=b(parseInt(a.b,10).toString(16));return c+d+e}a+="";var f=a.match(/\((\d+),\s?(\d+),\s?(\d+)\)/);return null!==f?b(parseInt(f[1],10).toString(16))+b(parseInt(f[2],10).toString(16))+b(parseInt(f[3],10).toString(16)):b(parseInt(a,10).toString(16))},hexToDec:function(a){return 0===a.indexOf("#")&&(a=a.substr(1)),6===a.length?{r:parseInt(a.substr(0,2),16),g:parseInt(a.substr(2,2),16),b:parseInt(a.substr(4,2),16)}:3===a.length?{r:parseInt(a.charAt(0)+a.charAt(0),16),g:parseInt(a.charAt(1)+a.charAt(1),16),b:parseInt(a.charAt(2)+a.charAt(2),16)}:a.length<=2?parseInt(a,16):void 0},getPropertyFromStylesheet:function(a,b){var c=this.getRuleFromStylesheet(a);return c?c.style[b]:null},getPropertyFromStylesheet2:function(a,b){for(var c=this.getRulesFromStylesheet(a),d,e=0,f=c.length;f>e;e++)if(d=c[e].style[b],null!==d&&void 0!==d)return d;return null},getRuleFromStylesheet:function(a){var b,c,d,e,f,g=document.styleSheets;if(!g)return null;for(var h=0,i=document.styleSheets.length;i>h;++h){if(b=document.styleSheets[h],c=b.rules?b.rules:b.cssRules,!c)return null;for(d=0,e=c.length;e>d;++d)if(f=c[d],f.selectorText&&f.selectorText===a)return f}return null},getRulesFromStylesheet:function(a){var b=[],c,d,e,f,g,h=document.styleSheets;if(!h)return b;for(var i=0,j=document.styleSheets.length;j>i;++i){if(c=document.styleSheets[i],d=c.rules?c.rules:c.cssRules,!d)return null;for(e=0,f=d.length;f>e;++e)g=d[e],g.selectorText&&g.selectorText===a&&b.push(g)}return b},getPropertiesFromRule:function(a){var b=this.getRuleFromStylesheet(a),c={},d,e,f;b=b.style.cssText;var g=b.split(";"),h,i,j,k;for(e=0,f=g.length;f>e;++e)" "===g[e].charAt(0)&&(g[e]=g[e].substring(1)),h=g[e].split(":"),d=this._camelCase(h[0].toLowerCase()),i=h[1],i&&(i=i.substring(1),"padding"===d||"margin"===d||"borderWidth"===d?("borderWidth"===d?(j="border",k="Width"):(j=d,k=""),-1!==i.indexOf(" ")?(i=i.split(" "),c[j+"Top"+k]=i[0],c[j+"Bottom"+k]=i[0],c[j+"Left"+k]=i[1],c[j+"Right"+k]=i[1]):(c[j+"Top"+k]=i,c[j+"Bottom"+k]=i,c[j+"Left"+k]=i,c[j+"Right"+k]=i)):"borderRadius"===d?-1!==i.indexOf(" ")?(i=i.split(" "),c.borderTopLeftRadius=i[0],c.borderBottomRightRadius=i[0],c.borderTopRightRadius=i[1],c.borderBottomLeftRadius=i[1]):(c.borderTopLeftRadius=i,c.borderTopRightRadius=i,c.borderBottomLeftRadius=i,c.borderBottomRightRadius=i):c[d]=i);return c},changeFontSize:function(a,b,c,d,e){var f=this;Ink.requireModules(["Ink.Dom.Selector_1"],function(g){var h;if("string"!=typeof a?h="1st argument must be a CSS selector rule.":"number"!=typeof b?h="2nd argument must be a number.":void 0!==c&&"+"!==c&&"*"!==c?h='3rd argument must be one of "+", "*".':void 0!==d&&("number"!=typeof d||0>=d)?h="4th argument must be a positive number.":void 0!==e&&("number"!=typeof e||e>e)&&(h="5th argument must be a positive number greater than minValue."),h)throw new TypeError(h);var i,j,k=g.select(a);void 0===d&&(d=1),c="*"===c?function(a,b){return a*b}:function(a,b){return a+b};for(var l=0,m=k.length;m>l;++l)j=k[l],i=parseFloat(f.getStyle(j,"fontSize")),i=c(i,b),d>i||"number"==typeof e&&i>e||(j.style.fontSize=i+"px")})}};return b}),Ink.createModule("Ink.Dom.Element",1,[],function(){"use strict";function a(a){var b={};try{b=a.getBoundingClientRect()}catch(c){b={top:a.offsetTop,left:a.offsetLeft}}return b}var b="function"==typeof document.createRange&&"function"==typeof window.Range.prototype.createContextualFragment,c="Ink.Dom.Element tbody: "+Math.random(),d=function(){var a=document.createElement("div");return a.innerHTML="",0!==a.getElementsByTagName("tbody").length}(),e={isDOMElement:function(a){return null!==a&&"object"==typeof a&&"nodeType"in a&&1===a.nodeType},get:function(a){return"undefined"!=typeof a?"string"==typeof a?document.getElementById(a):a:null},create:function(a,b){var c=document.createElement(a);if(b)for(var d in b)b.hasOwnProperty(d)&&(d in e?e[d](c,b[d]):"className"===d||"class"===d?c.className=b.className||b["class"]:c.setAttribute(d,b[d]));return c},remove:function(a){a=Ink.i(a);var b;a&&(b=a.parentNode)&&b.removeChild(a)},scrollTo:function(a){if(a=e.get(a)){if(a.scrollIntoView)return a.scrollIntoView();var b={},c=0,d=0;do c+=a.offsetTop||0,d+=a.offsetLeft||0,a=a.offsetParent;while(a);b={x:d,y:c},window.scrollTo(b.x,b.y)}},offsetTop:function(a){return e.offset(a)[1]},offsetLeft:function(a){return e.offset(a)[0]},positionedOffset:function(a){var b=0,c=0;a=e.get(a);do if(b+=a.offsetTop||0,c+=a.offsetLeft||0,a=a.offsetParent){if("body"===a.tagName.toLowerCase())break;var d=a.style.position;if(!d&&a.currentStyle&&(d=a.currentStyle.position),(!d||"auto"===d)&&"undefined"!=typeof getComputedStyle){var f=getComputedStyle(a,null);d=f?f.position:null}if("relative"===d||"absolute"===d)break}while(a);return[c,b]},offset:function(b){b=Ink.i(b);var c=[0,0],d=b.ownerDocument,e=d.documentElement,f=a(b),g=d.body,h=e.clientTop||g.clientTop||0,i=e.clientLeft||g.clientLeft||0,j=d.pageYOffset||e.scrollTop||g.scrollTop,k=d.pageXOffset||e.scrollLeft||g.scrollLeft,l=f.top+j-h,m=f.left+k-i;return c=[m,l]},scroll:function(a){return a=a?Ink.i(a):document.body,[window.pageXOffset?window.pageXOffset:a.scrollLeft,window.pageYOffset?window.pageYOffset:a.scrollTop]},_getPropPx:function(a,b){var c,d,e=a.getPropertyValue?a.getPropertyValue(b):a[b];return e?(d=e.indexOf("px"),c=-1===d?0:parseFloat(e,10)):c=0,c},offset2:function(a){return e.offset(a)},hasAttribute:function(a,b){return a=Ink.i(a),a.hasAttribute?a.hasAttribute(b):!!a.getAttribute(b)},insertAfter:function(a,b){(b=e.get(b))&&(null!==b.nextSibling?b.parentNode.insertBefore(a,b.nextSibling):b.parentNode.appendChild(a))},insertBefore:function(a,b){(b=e.get(b))&&b.parentNode.insertBefore(a,b)},insertTop:function(a,b){(b=e.get(b))&&(b.firstChild?b.insertBefore(a,b.firstChild):b.appendChild(a))},insertBottom:function(a,b){b=Ink.i(b),b.appendChild(a)},textContent:function(a){a=Ink.i(a);var b,c,d,f;switch(a&&a.nodeType){case 9:return e.textContent(a.documentElement||a.body&&a.body.parentNode||a.body);case 1:if(b="textContent"in a?a.textContent:a.innerText,"undefined"!=typeof b)return b;case 11:if(b=a.textContent,"undefined"!=typeof b)return b;if(a.firstChild===a.lastChild)return e.textContent(a.firstChild);for(b=[],d=a.childNodes,c=0,f=d.length;f>c;++c)b.push(e.textContent(d[c]));return b.join("");case 3:case 4:return a.nodeValue}return""},setTextContent:function(a,b){switch(a=Ink.i(a),a&&a.nodeType){case 1:if("innerText"in a){a.innerText=b;break}case 11:if("textContent"in a){a.textContent=b;break}case 9:for(;a.firstChild;)a.removeChild(a.firstChild);if(""!==b){var c=a.ownerDocument||a;a.appendChild(c.createTextNode(b))}break;case 3:case 4:a.nodeValue=b}},isLink:function(a){var b=a&&1===a.nodeType&&(/^a|area$/i.test(a.tagName)||a.hasAttributeNS&&a.hasAttributeNS("http://www.w3.org/1999/xlink","href"));return!!b},isAncestorOf:function(a,b){if(!b||!a)return!1;if(b.compareDocumentPosition)return 0!==(16&a.compareDocumentPosition(b));for(;b=b.parentNode;)if(b===a)return!0;return!1},descendantOf:function(a,b){return a!==b&&e.isAncestorOf(a,b)},firstElementChild:function(a){if(!a)return null;if("firstElementChild"in a)return a.firstElementChild;for(var b=a.firstChild;b&&1!==b.nodeType;)b=b.nextSibling;return b},lastElementChild:function(a){if(!a)return null;if("lastElementChild"in a)return a.lastElementChild;for(var b=a.lastChild;b&&1!==b.nodeType;)b=b.previousSibling;return b},nextElementSibling:function(a){var b=null;if(!a)return b;if("nextElementSibling"in a)return a.nextElementSibling;for(b=a.nextSibling;b&&1!==b.nodeType;)b=b.nextSibling;return b},previousElementSibling:function(a){var b=null;if(!a)return b;if("previousElementSibling"in a)return a.previousElementSibling;for(b=a.previousSibling;b&&1!==b.nodeType;)b=b.previousSibling; +!function(a,b){"use strict";if(!("Ink"in a)){var c={},d={},e=[],f={},g=[],h={},i=Function.prototype.apply,j=function(a){if("object"!=typeof a)return!1;for(var b in a)if(a.hasOwnProperty(b))return!1;return!0};a.Ink={VERSION:"3.1.4",_checkPendingRequireModules:function(){var a,b,c,e,f,h,i=[],j=[];for(a=0,b=g.length;b>a;++a)if(c=g[a]){for(e in c.left)c.left.hasOwnProperty(e)&&(f=d[e],f&&(c.args[c.left[e]]=f,delete c.left[e],--c.remaining));if(c.remaining>0)i.push(c);else{if(h=c.cb,!h)continue;delete c.cb,j.push([h,c.args])}}g=i;for(var k=0;k0&&setTimeout(function(){Ink._checkPendingRequireModules()},0)},getPath:function(a,b){var d=a.split(/[._]/g),e,f,g,h;for(f=d.length;f>=0;f-=1)if(e=d.slice(0,f+1).join("."),c[e]){g=e;break}return g in c?(h=c[g],/\/$/.test(h)||(h+="/"),fg;++g)e[d[g]]=e[d[g]]||{},f=e,e=e[d[g]];return c?[f,d[g-1]]:e},getModule:function(a,b){var c=b?[a,"_",b].join(""):a;return d[c]},createModule:function(b,c,g,i){if("string"!=typeof b)throw new Error("module name must be a string!");if(!("number"==typeof c||"string"==typeof c&&c.length>0))throw new Error("version number missing!");var k=[b,"_",c].join("");h[k]=!0;var l=function(){if(!d[k]){delete f[k],delete f[b];var g=Array.prototype.slice.call(arguments),l=i.apply(a,g);e.push(k),"object"==typeof l?l._version=c:"function"==typeof l&&(l.prototype._version=c,l._version=c);var m=0===b.indexOf("Ink."),n;m&&(n=Ink.namespace(b,!0)),d[k]=l,delete h[k],m&&(n[0][n[1]+"_"+c]=l),d[b]=l,m&&j(n[0][n[1]])&&(n[0][n[1]]=l),this&&Ink._checkPendingRequireModules()}};this.requireModules(g,l)},requireModules:function(a,b){var c,e,h,i,j;if(e=a&&a.length,h={args:new Array(e),left:{},remaining:e,cb:b},"object"!=typeof a||void 0===a.length)throw new Error("Dependency list should be an array!");if("function"!=typeof b)throw new Error("Callback should be a function!");for(c=0;e>c;++c)Ink._moduleRenames[a[c]]?(Ink.warn(a[c]+" was renamed to "+Ink._moduleRenames[a[c]]),i=Ink._moduleRenames[a[c]]):i=a[c],i?(j=d[i],j?(h.args[c]=j,--h.remaining):(f[i]||Ink._loadLater(i),h.left[i]=c)):--h.remaining;h.remaining>0?g.push(h):b.apply(!0,h.args)},_moduleRenames:{"Ink.UI.Aux_1":"Ink.UI.Common_1"},getModulesLoadOrder:function(){return e.slice()},getModuleScripts:function(){var a=this.getModulesLoadOrder();return a.unshift("Ink_1"),a=a.map(function(a){return[""].join("")}),a.join("\n")},createExt:function(a,b,c,d){return Ink.createModule("Ink.Ext."+a,b,c,d)},bind:function(a,b){var c=Array.prototype.slice.call(arguments,2);return function(){var d=Array.prototype.slice.call(arguments),e=c.concat(d);return a.apply(b===!1?this:b,e)}},bindMethod:function(a,b){return Ink.bind.apply(Ink,[a[b],a].concat([].slice.call(arguments,2)))},bindEvent:function(b,c){var d=Array.prototype.slice.call(arguments,2);return function(e){var f=d.slice();return f.unshift(e||a.event),b.apply(c===!1?this:c,f)}},i:function(a){return"string"==typeof a?b.getElementById(a)||null:a},ss:function(a,c){if("undefined"==typeof Ink.Dom||"undefined"==typeof Ink.Dom.Selector)throw new Error("This method requires Ink.Dom.Selector");return Ink.Dom.Selector.select(a,c||b)},s:function(a,c){if("undefined"==typeof Ink.Dom||"undefined"==typeof Ink.Dom.Selector)throw new Error("This method requires Ink.Dom.Selector");return Ink.Dom.Selector.select(a,c||b)[0]||null},extendObj:function(a){for(var b=[].slice.call(arguments,1),c=0,d=b.length;d>c;c++)if(b[c])for(var e in b[c])Object.prototype.hasOwnProperty.call(b[c],e)&&(a[e]=b[c][e]);return a},log:function(){var b=a.console;b&&b.log&&i.call(b.log,b,arguments)},warn:function(){var b=a.console;b&&b.warn&&i.call(b.warn,b,arguments)},error:function(){var b=a.console;b&&b.error&&i.call(b.error,b,arguments)}}}}(window,document),Ink.createModule("Ink.Net.Ajax","1",[],function(){"use strict";var Ajax=function(a,b){this.init(a,b)};Ajax.globalOptions={parameters:{},requestHeaders:{}};var xMLHttpRequestWithCredentials="XMLHttpRequest"in window&&"withCredentials"in new XMLHttpRequest;return Ajax.prototype={init:function(a,b){if(!a)throw new Error("new Ink.Net.Ajax: Pass a url as the first argument!");var c=Ink.extendObj({asynchronous:!0,contentType:"application/x-www-form-urlencoded",cors:!1,validateCors:!1,debug:!1,delay:0,evalJS:!0,method:"POST",parameters:null,postBody:"",requestHeaders:null,sanitizeJSON:!1,signRequest:!1,timeout:0,useCredentials:!1,xhrProxy:"",onComplete:null,onCreate:null,onException:null,onFailure:null,onHeaders:null,onInit:null,onSuccess:null,onTimeout:null},Ajax.globalOptions);if(b&&"object"==typeof b){if(c=Ink.extendObj(c,b),"object"==typeof b.parameters)c.parameters=Ink.extendObj(Ink.extendObj({},Ajax.globalOptions.parameters),b.parameters);else if(null!==b.parameters){var d=this.paramsObjToStr(Ajax.globalOptions.parameters);d&&(c.parameters=b.parameters+"&"+d)}c.requestHeaders=Ink.extendObj({},Ajax.globalOptions.requestHeaders),c.requestHeaders=Ink.extendObj(c.requestHeaders,b.requestHeaders)}this.options=c,this.safeCall("onInit"),this.url=a;var e=this._locationFromURL(a);this.isHTTP=this._locationIsHTTP(e),this.isCrossDomain=this._locationIsCrossDomain(e,location),this.requestHasBody=c.method.search(/^get|head$/i)<0,this.options.validateCors===!0&&(this.options.cors=this.isCrossDomain),this.options.cors&&(this.isCrossDomain=!1),this.transport=this.getTransport(),this.request()},_locationFromURL:function(a){var b=document.createElementNS?document.createElementNS("http://www.w3.org/1999/xhtml","a"):document.createElement("a");return b.setAttribute("href",a),b},_locationIsHTTP:function(a){return a.href.match(/^https?:/i)?!0:!1},_locationIsCrossDomain:function(a,b){if(b=b||window.location,Ajax.prototype._locationIsHTTP(a)&&"widget:"!==b.protocol&&"object"!=typeof window.widget){var c=a.href.split("//"),d=b.href.split("//");if(1===c.length||1===d.length)return!1;var e=c[0],f=d[0],g=/:|\//,h=c[1].split(g)[0],i=d[1].split(g)[0];return e!==f||h!==i}return!1},getTransport:function(){if(!xMLHttpRequestWithCredentials&&this.options.cors&&"XDomainRequest"in window)return this.usingXDomainReq=!0,new XDomainRequest;if("undefined"!=typeof XMLHttpRequest)return new XMLHttpRequest;if("undefined"==typeof ActiveXObject)return null;try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(a){return new ActiveXObject("Microsoft.XMLHTTP")}},setHeaders:function(){if(this.transport)try{var a={Accept:"text/javascript,text/xml,application/xml,application/xhtml+xml,text/html,application/json;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1","Accept-Language":navigator.language,"X-Requested-With":"XMLHttpRequest","X-Ink-Version":"3"};if(this.options.cors&&(this.options.signRequest||delete a["X-Requested-With"],delete a["X-Ink-Version"]),this.options.requestHeaders&&"object"==typeof this.options.requestHeaders)for(var b in this.options.requestHeaders)this.options.requestHeaders.hasOwnProperty(b)&&(a[b]=this.options.requestHeaders[b]);this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005&&(a.Connection="close");for(var c in a)a.hasOwnProperty(c)&&this.transport.setRequestHeader(c,a[c])}catch(d){}},paramsObjToStr:function(a){var b,c,d,e,f=[];if("object"!=typeof a)return a;for(d in a)if(a.hasOwnProperty(d))if(e=a[d],"[object Array]"!==Object.prototype.toString.call(e)||isNaN(e.length))f=f.concat([encodeURIComponent(d),"=",encodeURIComponent(e),"&"]);else for(b=0,c=e.length;c>b;b++)f=f.concat([encodeURIComponent(d),"[]","=",encodeURIComponent(e[b]),"&"]);return f.length>0&&f.pop(),f.join("")},setParams:function(){var a=null,b=this.options.parameters;a="object"==typeof b?this.paramsObjToStr(b):""+b,a&&(this.url=this.url.indexOf("?")>-1?this.url.split("#")[0]+"&"+a:this.url.split("#")[0]+"?"+a)},getHeader:function(a){if(this.usingXDomainReq&&"Content-Type"===a)return this.transport.contentType;try{return this.transport.getResponseHeader(a)}catch(b){return null}},getAllHeaders:function(){try{return this.transport.getAllResponseHeaders()}catch(a){return null}},getResponse:function(){var a=this.transport,b={headerJSON:null,responseJSON:null,getHeader:this.getHeader,getAllHeaders:this.getAllHeaders,request:this,transport:a,timeTaken:new Date-this.startTime,requestedUrl:this.url};b.readyState=a.readyState;try{b.responseText=a.responseText}catch(c){}try{b.responseXML=a.responseXML}catch(c){}try{b.status=a.status}catch(c){b.status=0}try{b.statusText=a.statusText}catch(c){b.statusText=""}return b},abort:function(){if(this.transport){clearTimeout(this.delayTimeout),clearTimeout(this.stoTimeout);try{this.transport.abort()}catch(a){}this.finish()}},runStateChange:function(){var a=this.transport.readyState;if(3===a)this.isHTTP&&this.safeCall("onHeaders");else if(4===a||this.usingXDomainReq){if(this.options.asynchronous&&this.options.delay&&this.startTime+this.options.delay>(new Date).getTime())return void(this.delayTimeout=setTimeout(Ink.bind(this.runStateChange,this),this.options.delay+this.startTime-(new Date).getTime()));var b,c=this.transport.responseText,d=this.getResponse(),e=this.transport.status;this.isHTTP&&!this.options.asynchronous&&this.safeCall("onHeaders"),clearTimeout(this.stoTimeout),0===e?this.isHTTP?this.safeCall("onException",new Error("Ink.Net.Ajax: network error! (HTTP status 0)")):e=c?200:404:304===e&&(e=200);var f=this.usingXDomainReq||e>=200&&300>e,g=this.getHeader("Content-Type")||"";if(this.options.evalJS&&(g.indexOf("application/json")>=0||"force"===this.options.evalJS))try{b=this.evalJSON(c,this.sanitizeJSON),b&&(c=d.responseJSON=b)}catch(h){f&&this.safeCall("onException",h)}if(this.usingXDomainReq&&-1!==g.indexOf("xml")&&"DOMParser"in window){var i;switch(g){case"application/xml":case"application/xhtml+xml":case"image/svg+xml":i=g;break;default:i="text/xml"}var j=(new DOMParser).parseFromString(this.transport.responseText,i);this.transport.responseXML=j,d.responseXML=j}null!=this.transport.responseXML&&null==d.responseJSON&&""!==this.transport.responseXML.xml&&(c=this.transport.responseXML),(e||this.usingXDomainReq)&&(f?this.safeCall("onSuccess",d,c):this.safeCall("onFailure",d,c),this.safeCall("on"+e,d,c)),this.finish(d,c)}},finish:function(a,b){if(a&&this.safeCall("onComplete",a,b),clearTimeout(this.stoTimeout),this.transport){try{this.transport.onreadystatechange=null}catch(c){}"function"==typeof this.transport.destroy&&this.transport.destroy(),this.transport=null}},safeCall:function(a){var b=arguments[1]instanceof Error?arguments[1]:null;if("function"==typeof this.options[a])try{this.options[a].apply(this,[].slice.call(arguments,1))}catch(c){Ink.error("Ink.Net.Ajax: an error was raised while executing "+a+".",c)}else b&&Ink.error("Ink.Net.Ajax: "+b)},setRequestHeader:function(a,b){this.options.requestHeaders||(this.options.requestHeaders={}),this.options.requestHeaders[a]=b},request:function(){if(this.transport){var a=null;this.requestHasBody?(null!==this.options.postBody&&""!==this.options.postBody?(a=this.options.postBody,this.setParams()):null!==this.options.parameters&&""!==this.options.parameters&&(a=this.options.parameters),"object"!=typeof a||a.nodeType?"object"!=typeof a&&null!==a&&(a=""+a):a=this.paramsObjToStr(a),this.options.contentType&&this.setRequestHeader("Content-Type",this.options.contentType)):this.setParams();var b=this.url,c=this.options.method,d=this.isCrossDomain;d&&this.options.xhrProxy&&(this.setRequestHeader("X-Url",b),b=this.options.xhrProxy+encodeURIComponent(b),d=!1);try{this.transport.open(c,b,this.options.asynchronous)}catch(e){return this.safeCall("onException",e),this.finish(this.getResponse(),null)}this.setHeaders(),this.safeCall("onCreate"),this.options.timeout&&!isNaN(this.options.timeout)&&(this.stoTimeout=setTimeout(Ink.bind(function(){this.options.onTimeout&&(this.safeCall("onTimeout"),this.abort())},this),1e3*this.options.timeout)),this.options.useCredentials&&!this.usingXDomainReq&&(this.transport.withCredentials=!0),this.options.asynchronous&&!this.usingXDomainReq?this.transport.onreadystatechange=Ink.bind(this.runStateChange,this):this.usingXDomainReq&&(this.transport.onload=Ink.bind(this.runStateChange,this));try{if(d)return void Ink.error("Ink.Net.Ajax: You are attempting to request a URL which is cross-domain from this one. To do this, you *must* enable the `cors` option!");this.startTime=(new Date).getTime(),this.transport.send(a)}catch(e){return this.safeCall("onException",e),this.finish(this.getResponse(),null)}this.options.asynchronous||this.runStateChange()}},isJSON:function(a){return"string"==typeof a&&a?(a=a.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,""),/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/.test(a)):!1},evalJSON:function(strJSON,sanitize){if(strJSON&&(!sanitize||this.isJSON(strJSON)))try{return"undefined"!=typeof JSON&&"undefined"!=typeof JSON.parse?JSON.parse(strJSON):eval("("+strJSON+")")}catch(e){throw new Error("Ink.Net.Ajax: Bad JSON string. "+e)}return null}},Ajax.load=function(a,b){var c=Ajax.prototype._locationIsCrossDomain(window.location,Ajax.prototype._locationFromURL(a));return new Ajax(a,{method:"GET",cors:c,onSuccess:function(a){b(a.responseJSON||a.responseText,a)}})},Ajax.ping=function(a,b){var c=Ajax.prototype._locationIsCrossDomain(window.location,Ajax.prototype._locationFromURL(a));return new Ajax(a,{method:"HEAD",cors:c,onSuccess:function(a){"function"==typeof b&&b(a)}})},Ajax}),Ink.createModule("Ink.Net.JsonP","1",[],function(){"use strict";var a=function(a,b){this.init(a,b)};return a.prototype={init:function(a,b){if(this.options=Ink.extendObj({onSuccess:void 0,onFailure:void 0,failureObj:{},timeout:10,params:{},callbackParam:"jsoncallback",internalCallback:"_cb",randVar:!1},b||{}),this.randVar=this.options.randVar!==!1?this.options.randVar:parseInt(1e5*Math.random(),10),this.options.internalCallback+=this.randVar,this.uri=a,"function"==typeof this.options.onComplete&&(this.options.onSuccess=this.options.onComplete),"string"!=typeof this.uri)throw new Error("Ink.Net.JsonP: Please define an URI");if("function"!=typeof this.options.onSuccess)throw new Error("Ink.Net.JsonP: please define a callback function on option onSuccess!");Ink.Net.JsonP[this.options.internalCallback]=Ink.bind(function(){this.options.onSuccess(arguments[0]),this._cleanUp()},this),this.timeout=setTimeout(Ink.bind(function(){this.abort(),"function"==typeof this.options.onFailure&&this.options.onFailure(this.options.failureObj)},this),1e3*this.options.timeout),this._addScriptTag()},abort:function(){Ink.Net.JsonP[this.options.internalCallback]=Ink.bindMethod(this,"_cleanUp")},_addParamsToGet:function(a,b){var c=-1!==a.indexOf("?"),d,e,f,g=[a];for(e in b)b.hasOwnProperty(e)&&(c?d="&":(d="?",c=!0),f=b[e],"number"==typeof f||f||(f=""),g=g.concat([d,e,"=",encodeURIComponent(f)]));return g.join("")},_getScriptContainer:function(){return document.body||document.getElementsByTagName("body")[0]||document.getElementsByTagName("head")[0]||document.documentElement},_addScriptTag:function(){this.options.params[this.options.callbackParam]="Ink.Net.JsonP."+this.options.internalCallback,this.options.params.rnd_seed=this.randVar,this.uri=this._addParamsToGet(this.uri,this.options.params),this._scriptEl=document.createElement("script"),this._scriptEl.type="text/javascript",this._scriptEl.src=this.uri;var a=this._getScriptContainer();a.appendChild(this._scriptEl)},_cleanUp:function(){this.timeout&&window.clearTimeout(this.timeout),delete this.options.onSuccess,delete this.options.onFailure,delete Ink.Net.JsonP[this.options.internalCallback],this._removeScriptTag()},_removeScriptTag:function(){this._scriptEl&&(this._scriptEl.parentNode.removeChild(this._scriptEl),delete this._scriptEl)}},a}),Ink.createModule("Ink.Dom.Browser","1",[],function(){"use strict";var a={IE:!1,GECKO:!1,OPERA:!1,SAFARI:!1,KONQUEROR:!1,CHROME:!1,model:!1,version:!1,userAgent:!1,cssPrefix:!1,domPrefix:!1,init:function(){this.detectBrowser(),this.setDimensions(),this.setReferrer()},setDimensions:function(){var a=0,b=0;"number"==typeof window.innerWidth?(a=window.innerWidth,b=window.innerHeight):document.documentElement&&(document.documentElement.clientWidth||document.documentElement.clientHeight)?(a=document.documentElement.clientWidth,b=document.documentElement.clientHeight):document.body&&(document.body.clientWidth||document.body.clientHeight)&&(a=document.body.clientWidth,b=document.body.clientHeight),this.windowWidth=a,this.windowHeight=b},setReferrer:function(){this.referrer=document.referrer&&document.referrer.length?window.escape(document.referrer):!1},detectBrowser:function(){this._sniffUserAgent(navigator.userAgent)},_sniffUserAgent:function(a){if(this.userAgent=a,a=a.toLowerCase(),/applewebkit\//.test(a))if(this.cssPrefix="-webkit-",this.domPrefix="Webkit",/(chrome|crios)\//.test(a))this.CHROME=!0,this.model="chrome",this.version=a.replace(/(.*)chrome\/([^\s]+)(.*)/,"$2");else{this.SAFARI=!0,this.model="safari";var b=/version\/([^) ]+)/;this.version=b.test(a)?a.match(b)[1]:a.replace(/(.*)applewebkit\/([^\s]+)(.*)/,"$2")}else if(/opera/.test(a))this.OPERA=!0,this.model="opera",this.version=a.replace(/(.*)opera.([^\s$]+)(.*)/,"$2"),this.cssPrefix="-o-",this.domPrefix="O";else if(/konqueror/.test(a))this.KONQUEROR=!0,this.model="konqueror",this.version=a.replace(/(.*)konqueror\/([^;]+);(.*)/,"$2"),this.cssPrefix="-khtml-",this.domPrefix="Khtml";else if(/(msie|trident)/i.test(a))this.IE=!0,this.model="ie",this.version=/rv:((?:\d|\.)+)/.test(a)?a.match(/rv:((?:\d|\.)+)/)[1]:a.replace(/(.*)\smsie\s([^;]+);(.*)/,"$2"),this.cssPrefix="-ms-",this.domPrefix="ms";else if(/gecko/.test(a)){this.cssPrefix="-moz-",this.domPrefix="Moz",this.GECKO=!0;var c=/(camino|chimera|epiphany|minefield|firefox|firebird|phoenix|galeon|iceweasel|k\-meleon|seamonkey|netscape|songbird|sylera)/;if(c.test(a))this.model=a.match(c)[1],this.version=a.replace(new RegExp("(.*)"+this.model+"/([^;\\s$]+)(.*)"),"$2");else{this.model="mozilla";var d=/(.*)rv:([^)]+)(.*)/;d.test(a)&&(this.version=a.replace(d,"$2"))}}},debug:function(){var a="known browsers: (ie, gecko, opera, safari, konqueror) \n";a+=[this.IE,this.GECKO,this.OPERA,this.SAFARI,this.KONQUEROR]+"\n",a+="cssPrefix -> "+this.cssPrefix+"\n",a+="domPrefix -> "+this.domPrefix+"\n",a+="model -> "+this.model+"\n",a+="version -> "+this.version+"\n",a+="\n",a+="original UA -> "+this.userAgent,alert(a)}};return a.init(),a}),Ink.createModule("Ink.Dom.Css",1,[],function(){"use strict";var a="defaultView"in document&&"getComputedStyle"in document.defaultView?document.defaultView.getComputedStyle:window.getComputedStyle,b={addRemoveClassName:function(a,b,c){return c?this.addClassName(a,b):void this.removeClassName(a,b)},addClassName:function(a,c){if(a=Ink.i(a),!a||!c)return null;c=(""+c).split(/[, ]+/);for(var d=0,e=c.length;e>d;d++)c[d].replace(/^\s+|\s+$/g,"")&&("undefined"!=typeof a.classList?a.classList.add(c[d]):b.hasClassName(a,c[d])||(a.className+=(a.className?" ":"")+c[d]))},removeClassName:function(a,b){if(a=Ink.i(a),!a||!b)return null;b=(""+b).split(/[, ]+/);var c=0,d=b.length;if("undefined"!=typeof a.classList)for(;d>c;c++)a.classList.remove(b[c]);else{for(var e=a.className||"",f;d>c;c++)f=new RegExp("(^|\\s+)"+b[c]+"(\\s+|$)"),e=e.replace(f," ");a.className=e.replace(/^\s+/,"").replace(/\s+$/,"")}},setClassName:function(a,b,c){this.addRemoveClassName(a,b,c||!1)},hasClassName:function(a,b,c){if(a=Ink.i(a),!a||!b)return!1;b=(""+b).split(/[, ]+/);for(var d=0,e=b.length,f,g;e>d;d++){if("undefined"!=typeof a.classList)f=a.classList.contains(b[d]);else{var h=a.className;h===b[d]?f=!0:(g=new RegExp("(^|\\s)"+b[d]+"(\\s|$)"),f=g.test(h))}if(f&&!c)return!0;if(!f&&c)return!1}return c?!0:!1},blinkClass:function(a,c,d,e){a=Ink.i(a),b.addRemoveClassName(a,c,!e),setTimeout(function(){b.addRemoveClassName(a,c,e)},Number(d)||100)},toggleClassName:function(a,c,d){return a&&c?"undefined"!=typeof d?b.addRemoveClassName(a,c,d):void("undefined"==typeof a.classList||/[, ]/.test(c)?b.hasClassName(a,c)?b.removeClassName(a,c):b.addClassName(a,c):(a=Ink.i(a),null!==a&&a.classList.toggle(c))):!1},setOpacity:function(a,b){if(a=Ink.i(a),null!==a){var c=1;isNaN(Number(b))||(c=0>=b?0:1>=b?b:100>=b?b/100:1),"undefined"!=typeof a.style.opacity?a.style.opacity=c:a.style.filter="alpha(opacity:"+(100*c|0)+")"}},_camelCase:function(a){return a?a.replace(/-(\w)/g,function(a,b){return b.toUpperCase()}):a},getStyle:function(b,c){if(b=Ink.i(b),null!==b&&b.style){c="float"===c?"cssFloat":this._camelCase(c);var d=b.style[c];if(!a||d&&"auto"!==d)!d&&b.currentStyle&&(d=b.currentStyle[c],"auto"!==d||"width"!==c&&"height"!==c||(d=b["offset"+c.charAt(0).toUpperCase()+c.slice(1)]+"px"));else{var e=a(b,null);d=e?e[c]:null}if("opacity"===c)return d?parseFloat(d,10):1;if("borderTopWidth"===c||"borderBottomWidth"===c||"borderRightWidth"===c||"borderLeftWidth"===c){if("thin"===d)return"1px";if("medium"===d)return"3px";if("thick"===d)return"5px"}return"auto"===d?null:d}},setStyle:function(a,b){if(a=Ink.i(a),null!==a)if("string"==typeof b)a.style.cssText+="; "+b,-1!==b.indexOf("opacity")&&this.setOpacity(a,b.match(/opacity:\s*(\d?\.?\d*)/)[1]);else for(var c in b)b.hasOwnProperty(c)&&("opacity"===c?this.setOpacity(a,b[c]):"float"===c||"cssFloat"===c?"undefined"==typeof a.style.styleFloat?a.style.cssFloat=b[c]:a.style.styleFloat=b[c]:a.style[c]=b[c])},show:function(a,b){a=Ink.i(a),null!==a&&(a.style.display=b||"")},hide:function(a){a=Ink.i(a),null!==a&&(a.style.display="none")},showHide:function(a,b){a=Ink.i(a),a&&(a.style.display=b?"":"none")},toggle:function(a,b){a=Ink.i(a),null!==a&&("undefined"!=typeof b?b===!0?this.show(a):this.hide(a):"none"===this.getStyle(a,"display").toLowerCase()?this.show(a):this.hide(a))},_getRefTag:function(a){if(a.firstElementChild)return a.firstElementChild;for(var b=a.firstChild;b;b=b.nextSibling)if(1===b.nodeType)return b;return null},appendStyleTag:function(a,b,c){c=Ink.extendObj({type:"text/css",force:!1},c||{});var d=document.getElementsByTagName("style"),e=!1,f=!0,g,h;for(g=0,h=d.length;h>g;g++)e=d[g].innerHTML,e.indexOf(a)>=0&&(f=!1);if(f){var i=document.createElement("style"),j=document.getElementsByTagName("head")[0],k=!1,l="";i.type=c.type,l+=a+" {",l+=b,l+="} ","undefined"!=typeof i.styleSheet?i.styleSheet.cssText=l:i.appendChild(document.createTextNode(l)),c.force?j.appendChild(i):(k=this._getRefTag(j),k&&j.insertBefore(i,k))}},appendStylesheet:function(a,b){b=Ink.extendObj({media:"screen",type:"text/css",force:!1},b||{});var c,d=document.createElement("link"),e=document.getElementsByTagName("head")[0];d.media=b.media,d.type=b.type,d.href=a,d.rel="Stylesheet",b.force?e.appendChild(d):(c=this._getRefTag(e),c&&e.insertBefore(d,c))},_loadingCSSFiles:{},_loadedCSSFiles:{},appendStylesheetCb:function(a,b){if(!a)return b(a);if(this._loadedCSSFiles[a])return b(a);var c=this._loadingCSSFiles[a];if(c)return c.push(b);this._loadingCSSFiles[a]=[b];var d=document.createElement("link");d.type="text/css",d.rel="stylesheet",d.href=a;var e=document.getElementsByTagName("head")[0];e.appendChild(d);var f=document.createElement("img");f.onerror=Ink.bindEvent(function(a,b){var c=b;this._loadedCSSFiles[c]=!0;for(var d=this._loadingCSSFiles[c],e=0,f=d.length;f>e;++e)d[e](c);delete this._loadingCSSFiles[c]},this,a),f.src=a},decToHex:function(a){var b=function(a){return 1===a.length&&(a="0"+a),a=a.toUpperCase()};if("object"==typeof a){var c=b(parseInt(a.r,10).toString(16)),d=b(parseInt(a.g,10).toString(16)),e=b(parseInt(a.b,10).toString(16));return c+d+e}a+="";var f=a.match(/\((\d+),\s?(\d+),\s?(\d+)\)/);return null!==f?b(parseInt(f[1],10).toString(16))+b(parseInt(f[2],10).toString(16))+b(parseInt(f[3],10).toString(16)):b(parseInt(a,10).toString(16))},hexToDec:function(a){return 0===a.indexOf("#")&&(a=a.substr(1)),6===a.length?{r:parseInt(a.substr(0,2),16),g:parseInt(a.substr(2,2),16),b:parseInt(a.substr(4,2),16)}:3===a.length?{r:parseInt(a.charAt(0)+a.charAt(0),16),g:parseInt(a.charAt(1)+a.charAt(1),16),b:parseInt(a.charAt(2)+a.charAt(2),16)}:a.length<=2?parseInt(a,16):void 0},getPropertyFromStylesheet:function(a,b){var c=this.getRuleFromStylesheet(a);return c?c.style[b]:null},getPropertyFromStylesheet2:function(a,b){for(var c=this.getRulesFromStylesheet(a),d,e=0,f=c.length;f>e;e++)if(d=c[e].style[b],null!==d&&void 0!==d)return d;return null},getRuleFromStylesheet:function(a){var b,c,d,e,f,g=document.styleSheets;if(!g)return null;for(var h=0,i=document.styleSheets.length;i>h;++h){if(b=document.styleSheets[h],c=b.rules?b.rules:b.cssRules,!c)return null;for(d=0,e=c.length;e>d;++d)if(f=c[d],f.selectorText&&f.selectorText===a)return f}return null},getRulesFromStylesheet:function(a){var b=[],c,d,e,f,g,h=document.styleSheets;if(!h)return b;for(var i=0,j=document.styleSheets.length;j>i;++i){if(c=document.styleSheets[i],d=c.rules?c.rules:c.cssRules,!d)return null;for(e=0,f=d.length;f>e;++e)g=d[e],g.selectorText&&g.selectorText===a&&b.push(g)}return b},getPropertiesFromRule:function(a){var b=this.getRuleFromStylesheet(a),c={},d,e,f;b=b.style.cssText;var g=b.split(";"),h,i,j,k;for(e=0,f=g.length;f>e;++e)" "===g[e].charAt(0)&&(g[e]=g[e].substring(1)),h=g[e].split(":"),d=this._camelCase(h[0].toLowerCase()),i=h[1],i&&(i=i.substring(1),"padding"===d||"margin"===d||"borderWidth"===d?("borderWidth"===d?(j="border",k="Width"):(j=d,k=""),-1!==i.indexOf(" ")?(i=i.split(" "),c[j+"Top"+k]=i[0],c[j+"Bottom"+k]=i[0],c[j+"Left"+k]=i[1],c[j+"Right"+k]=i[1]):(c[j+"Top"+k]=i,c[j+"Bottom"+k]=i,c[j+"Left"+k]=i,c[j+"Right"+k]=i)):"borderRadius"===d?-1!==i.indexOf(" ")?(i=i.split(" "),c.borderTopLeftRadius=i[0],c.borderBottomRightRadius=i[0],c.borderTopRightRadius=i[1],c.borderBottomLeftRadius=i[1]):(c.borderTopLeftRadius=i,c.borderTopRightRadius=i,c.borderBottomLeftRadius=i,c.borderBottomRightRadius=i):c[d]=i);return c},changeFontSize:function(a,b,c,d,e){var f=this;Ink.requireModules(["Ink.Dom.Selector_1"],function(g){var h;if("string"!=typeof a?h="1st argument must be a CSS selector rule.":"number"!=typeof b?h="2nd argument must be a number.":void 0!==c&&"+"!==c&&"*"!==c?h='3rd argument must be one of "+", "*".':void 0!==d&&("number"!=typeof d||0>=d)?h="4th argument must be a positive number.":void 0!==e&&("number"!=typeof e||e>e)&&(h="5th argument must be a positive number greater than minValue."),h)throw new TypeError(h);var i,j,k=g.select(a);void 0===d&&(d=1),c="*"===c?function(a,b){return a*b}:function(a,b){return a+b};for(var l=0,m=k.length;m>l;++l)j=k[l],i=parseFloat(f.getStyle(j,"fontSize")),i=c(i,b),d>i||"number"==typeof e&&i>e||(j.style.fontSize=i+"px")})}};return b}),Ink.createModule("Ink.Dom.Element",1,[],function(){"use strict";function a(a){var b={};try{b=a.getBoundingClientRect()}catch(c){b={top:a.offsetTop,left:a.offsetLeft}}return b}var b="function"==typeof document.createRange&&"function"==typeof window.Range.prototype.createContextualFragment,c="Ink.Dom.Element tbody: "+Math.random(),d=function(){var a=document.createElement("div");return a.innerHTML="
          ",0!==a.getElementsByTagName("tbody").length}(),e={isDOMElement:function(a){return null!==a&&"object"==typeof a&&"nodeType"in a&&1===a.nodeType},get:function(a){return"undefined"!=typeof a?"string"==typeof a?document.getElementById(a):a:null},create:function(a,b){var c=document.createElement(a);if(b)for(var d in b)b.hasOwnProperty(d)&&(d in e?e[d](c,b[d]):"className"===d||"class"===d?c.className=b.className||b["class"]:c.setAttribute(d,b[d]));return c},remove:function(a){a=Ink.i(a);var b;a&&(b=a.parentNode)&&b.removeChild(a)},scrollTo:function(a){if(a=e.get(a)){if(a.scrollIntoView)return a.scrollIntoView();var b={},c=0,d=0;do c+=a.offsetTop||0,d+=a.offsetLeft||0,a=a.offsetParent;while(a);b={x:d,y:c},window.scrollTo(b.x,b.y)}},offsetTop:function(a){return e.offset(a)[1]},offsetLeft:function(a){return e.offset(a)[0]},positionedOffset:function(a){var b=0,c=0;a=e.get(a);do if(b+=a.offsetTop||0,c+=a.offsetLeft||0,a=a.offsetParent){if("body"===a.tagName.toLowerCase())break;var d=a.style.position;if(!d&&a.currentStyle&&(d=a.currentStyle.position),(!d||"auto"===d)&&"undefined"!=typeof getComputedStyle){var f=getComputedStyle(a,null);d=f?f.position:null}if("relative"===d||"absolute"===d)break}while(a);return[c,b]},offset:function(b){b=Ink.i(b);var c=[0,0],d=b.ownerDocument,e=d.documentElement,f=a(b),g=d.body,h=e.clientTop||g.clientTop||0,i=e.clientLeft||g.clientLeft||0,j=d.pageYOffset||e.scrollTop||g.scrollTop,k=d.pageXOffset||e.scrollLeft||g.scrollLeft,l=f.top+j-h,m=f.left+k-i;return c=[m,l]},scroll:function(a){return a=a?Ink.i(a):document.body,[window.pageXOffset?window.pageXOffset:a.scrollLeft,window.pageYOffset?window.pageYOffset:a.scrollTop]},_getPropPx:function(a,b){var c,d,e=a.getPropertyValue?a.getPropertyValue(b):a[b];return e?(d=e.indexOf("px"),c=-1===d?0:parseFloat(e,10)):c=0,c},offset2:function(a){return e.offset(a)},hasAttribute:function(a,b){return a=Ink.i(a),a.hasAttribute?a.hasAttribute(b):!!a.getAttribute(b)},insertAfter:function(a,b){(b=e.get(b))&&(null!==b.nextSibling?b.parentNode.insertBefore(a,b.nextSibling):b.parentNode.appendChild(a))},insertBefore:function(a,b){(b=e.get(b))&&b.parentNode.insertBefore(a,b)},insertTop:function(a,b){(b=e.get(b))&&(b.firstChild?b.insertBefore(a,b.firstChild):b.appendChild(a))},insertBottom:function(a,b){b=Ink.i(b),b.appendChild(a)},textContent:function(a){a=Ink.i(a);var b,c,d,f;switch(a&&a.nodeType){case 9:return e.textContent(a.documentElement||a.body&&a.body.parentNode||a.body);case 1:if(b="textContent"in a?a.textContent:a.innerText,"undefined"!=typeof b)return b;case 11:if(b=a.textContent,"undefined"!=typeof b)return b;if(a.firstChild===a.lastChild)return e.textContent(a.firstChild);for(b=[],d=a.childNodes,c=0,f=d.length;f>c;++c)b.push(e.textContent(d[c]));return b.join("");case 3:case 4:return a.nodeValue}return""},setTextContent:function(a,b){switch(a=Ink.i(a),a&&a.nodeType){case 1:if("innerText"in a){a.innerText=b;break}case 11:if("textContent"in a){a.textContent=b;break}case 9:for(;a.firstChild;)a.removeChild(a.firstChild);if(""!==b){var c=a.ownerDocument||a;a.appendChild(c.createTextNode(b))}break;case 3:case 4:a.nodeValue=b}},isLink:function(a){var b=a&&1===a.nodeType&&(/^a|area$/i.test(a.tagName)||a.hasAttributeNS&&a.hasAttributeNS("http://www.w3.org/1999/xlink","href"));return!!b},isAncestorOf:function(a,b){if(!b||!a)return!1;if(b.compareDocumentPosition)return 0!==(16&a.compareDocumentPosition(b));for(;b=b.parentNode;)if(b===a)return!0;return!1},descendantOf:function(a,b){return a!==b&&e.isAncestorOf(a,b)},firstElementChild:function(a){if(!a)return null;if("firstElementChild"in a)return a.firstElementChild;for(var b=a.firstChild;b&&1!==b.nodeType;)b=b.nextSibling;return b},lastElementChild:function(a){if(!a)return null;if("lastElementChild"in a)return a.lastElementChild;for(var b=a.lastChild;b&&1!==b.nodeType;)b=b.previousSibling;return b},nextElementSibling:function(a){var b=null;if(!a)return b;if("nextElementSibling"in a)return a.nextElementSibling;for(b=a.nextSibling;b&&1!==b.nodeType;)b=b.nextSibling;return b},previousElementSibling:function(a){var b=null;if(!a)return b;if("previousElementSibling"in a)return a.previousElementSibling;for(b=a.previousSibling;b&&1!==b.nodeType;)b=b.previousSibling; return b},elementWidth:function(a){return"string"==typeof a&&(a=document.getElementById(a)),a.offsetWidth},elementHeight:function(a){return"string"==typeof a&&(a=document.getElementById(a)),a.offsetHeight},elementLeft:function(a){return e.offsetLeft(a)},elementTop:function(a){return e.offsetTop(a)},elementDimensions:function(a){return a=Ink.i(a),[a.offsetWidth,a.offsetHeight]},outerDimensions:function(b){var c=a(b),d=Ink.getModule("Ink.Dom.Css_1"),e=Ink.bindMethod(d,"getStyle",b);return[c.right-c.left+parseFloat(e("marginLeft")||0)+parseFloat(e("marginRight")||0),c.bottom-c.top+parseFloat(e("marginTop")||0)+parseFloat(e("marginBottom")||0)]},inViewport:function(b,c){var d=a(Ink.i(b));return"boolean"==typeof c&&(c={partial:c,margin:0}),c=Ink.extendObj({partial:!1,margin:0},c||{}),c.partial?d.bottom+c.margin>0&&d.left-c.margin0:d.top+c.margin>0&&d.right-c.margin0},isHidden:function(a){var b=a.offsetWidth,c=a.offsetHeight,d="tr"===a.tagName.toLowerCase(),e=Ink.getModule("Ink.Dom.Css_1");return 0!==b||0!==c||d?0===b||0===c||d?"none"===e.getStyle(a,"display").toLowerCase():!1:!0},isVisible:function(a){return!this.isHidden(a)},clonePosition:function(a,b){var c=e.offset(b);return a.style.left=c[0]+"px",a.style.top=c[1]+"px",a},ellipsizeText:function(a){(a=Ink.i(a))&&(a.style.overflow="hidden",a.style.whiteSpace="nowrap",a.style.textOverflow="ellipsis")},findUpwardsHaving:function(a,b){for(;a&&1===a.nodeType;){if(b(a))return a;a=a.parentNode}return!1},findUpwardsByClass:function(a,b){var c=new RegExp("(^|\\s)"+b+"(\\s|$)"),d=function(a){var b=a.className;return b&&c.test(b)};return e.findUpwardsHaving(a,d)},findUpwardsByTag:function(a,b){b=b.toUpperCase();var c=function(a){return a.nodeName&&a.nodeName.toUpperCase()===b};return e.findUpwardsHaving(a,c)},findUpwardsById:function(a,b){var c=function(a){return a.id===b};return e.findUpwardsHaving(a,c)},findUpwardsBySelector:function(a,b){var c=Ink.getModule("Ink.Dom.Selector","1");if(!c)throw new Error("This method requires Ink.Dom.Selector");var d=function(a){return c.matchesSelector(a,b)};return e.findUpwardsHaving(a,d)},getChildrenText:function(a,b){var c,d,f,g=a.childNodes,h=g.length,i="";if(!a)return i;for(d=0;h>d;++d)c=g[d],c&&3===c.nodeType&&(f=e._trimString(String(c.data)),f.length>0?(i+=f,b&&a.removeChild(c)):a.removeChild(c));return i},_trimString:function(a){return String.prototype.trim?a.trim():a.replace(/^\s*/,"").replace(/\s*$/,"")},getSelectValues:function(a){for(var b=Ink.i(a),c=[],d=0;dd;++d)b=a[d],b instanceof Array?1===b.length&&b.push(b[0]):b=[b,b],c.push(b);return c},fillSelect:function(a,b,c,d){var f=Ink.i(a);if(f){f.innerHTML="";var g,h;c||(h=document.createElement("option"),h.setAttribute("value",""),f.appendChild(h)),b=e._normalizeData(b);for(var i=0,j=b.length;j>i;++i)g=b[i],h=document.createElement("option"),h.setAttribute("value",g[0]),g.length>2&&h.setAttribute("extra",g[2]),h.appendChild(document.createTextNode(g[1])),g[0]===d&&h.setAttribute("selected","selected"),f.appendChild(h)}},fillRadios:function(a,b,c,d,f,g){a=Ink.i(a);var h=document.createElement("span");e.insertAfter(h,a),c=e._normalizeData(c);var i,j;d||(j=document.createElement("input"),j.setAttribute("type","radio"),j.setAttribute("name",b),j.setAttribute("value",""),h.appendChild(j),g&&h.appendChild(document.createElement(g)));for(var k=0;kc;++c)if(a.children[c]===b)return c;return!1},nextSiblings:function(a){if(a=Ink.i(a),"object"==typeof a&&null!==a&&a.nodeType&&1===a.nodeType){for(var b=[],c=a.parentNode.children,d=e.parentIndexOf(a.parentNode,a),f=++d,g=c.length;g>f;f++)b.push(c[f]);return b}return[]},previousSiblings:function(a){if(a=Ink.i(a),"object"==typeof a&&null!==a&&a.nodeType&&1===a.nodeType){for(var b=[],c=a.parentNode.children,d=e.parentIndexOf(a.parentNode,a),f=0,g=d;g>f;f++)b.push(c[f]);return b}return[]},siblings:function(a){if(a=Ink.i(a),"object"==typeof a&&null!==a&&a.nodeType&&1===a.nodeType){for(var b=[],c=a.parentNode.children,d=0,e=c.length;e>d;d++)a!==c[d]&&b.push(c[d]);return b}return[]},childElementCount:function(a){return a=Ink.i(a),"childElementCount"in a?a.childElementCount:a?e.siblings(a).length+1:0},_wrapElements:{TABLE:function(a,b){return a.innerHTML=d?"
          "+b+"
          "+c+"
          ":""+b+"
          ",a.firstChild},TBODY:function(a,b){return a.innerHTML=""+b+"
          ",a.firstChild.getElementsByTagName("tbody")[0]},THEAD:function(a,b){return a.innerHTML=""+b+"
          ",a.firstChild.getElementsByTagName("thead")[0]},TFOOT:function(a,b){return a.innerHTML=""+b+"
          ",a.firstChild.getElementsByTagName("tfoot")[0]},TR:function(a,b){return a.innerHTML=""+b+"
          ",a.firstChild.firstChild.firstChild}},_getWrapper:function(a,b){var f=a.nodeName&&a.nodeName.toUpperCase(),g=document.createElement("div"),h=e._wrapElements[f];if(!h)return g.innerHTML=b,g;if(g=h(g,b),d&&"TABLE"===f)for(var i=g.getElementsByTagName("td"),j=0,k=i.length;k>j;j++)if(i[j].innerHTML===c){var l=i[j].parentNode.parentNode;l.parentNode.removeChild(l)}return g},appendHTML:function(a,b){if(a=Ink.i(a),null!==a)for(var c=e._getWrapper(a,b);c.firstChild;)a.appendChild(c.firstChild)},prependHTML:function(a,b){if(a=Ink.i(a),null!==a)for(var c=e._getWrapper(a,b);c.lastChild;)a.insertBefore(c.lastChild,a.firstChild)},setHTML:function(a,b){if(a=Ink.i(a),null!==a)try{a.innerHTML=b}catch(c){for(;a.firstChild;)a.removeChild(a.firstChild);e.appendHTML(a,b)}},wrap:function(a,b){a=Ink.i(a),b=Ink.i(b);var c=a.nextSibling,d=a.parentNode;return b.appendChild(a),null!==c?d.insertBefore(b,c):d.appendChild(b),b},unwrap:function(a,b){a=Ink.i(a);var c;c="string"==typeof b?e.findUpwardsBySelector(a,b):"object"==typeof b&&b.tagName?e.findUpwardsHaving(a,function(a){return a===b}):a.parentNode,c&&c.parentNode&&e.insertBefore(a,c)},replace:function(a,b){a=Ink.i(a),null!==a&&a.parentNode.replaceChild(b,a)},removeTextNodeChildren:function(a){if(a=Ink.i(a),null!==a){var b,c,d=a;for(a=a.firstChild;a;)c=3===a.nodeType,b=a,a=a.nextSibling,c&&d.removeChild(b)}},htmlToFragment:b?function(a){var b;return"string"!=typeof a?document.createDocumentFragment():(b=document.createRange(),b.selectNode(document.body),b.createContextualFragment(a))}:function(a){var b=document.createDocumentFragment(),c,d;if("string"!=typeof a)return b;for(c=document.createElement("div"),c.innerHTML=a;d=c.firstChild;)b.appendChild(d);return b},_camelCase:function(a){return a?a.replace(/-(\w)/g,function(a,b){return b.toUpperCase()}):a},data:function(a){var b;if("object"!=typeof a&&"string"!=typeof a)throw"[Ink.Dom.Element.data] :: Invalid selector defined";if("object"==typeof a)b=a;else{var c=Ink.getModule("Ink.Dom.Selector",1);if(!c)throw"[Ink.Dom.Element.data] :: this method requires Ink.Dom.Selector - v1";if(b=c.select(a),b.length<=0)throw"[Ink.Dom.Element.data] :: Can't find any element with the specified selector";b=b[0]}var d={},f=b.attributes||[],g,h,i;if(f)for(var j=0,k=f.length;k>j;++j)g=f[j],h=g.name,i=g.value,h&&0===h.indexOf("data-")&&(d[e._camelCase(h.replace("data-",""))]=i);return d},moveCursorTo:function(a,b){if(a=Ink.i(a),null!==a)if(a.setSelectionRange)a.setSelectionRange(b,b);else{var c=a.createTextRange();c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",b),c.select()}},pageWidth:function(){var a;a=window.innerWidth&&window.scrollMaxX?window.innerWidth+window.scrollMaxX:document.body.scrollWidth>document.body.offsetWidth?document.body.scrollWidth:document.body.offsetWidth;var b;return window.self.innerWidth?b=document.documentElement.clientWidth?document.documentElement.clientWidth:window.self.innerWidth:document.documentElement&&document.documentElement.clientWidth?b=document.documentElement.clientWidth:document.body&&(b=document.body.clientWidth),b>a?a:b},pageHeight:function(){var a;a=window.innerHeight&&window.scrollMaxY?window.innerHeight+window.scrollMaxY:document.body.scrollHeight>document.body.offsetHeight?document.body.scrollHeight:document.body.offsetHeight;var b;return window.self.innerHeight?b=window.self.innerHeight:document.documentElement&&document.documentElement.clientHeight?b=document.documentElement.clientHeight:document.body&&(b=document.body.clientHeight),b>a?b:a},viewportWidth:function(){return"undefined"!=typeof window.innerWidth?window.innerWidth:document.documentElement&&"undefined"!=typeof document.documentElement.offsetWidth?document.documentElement.offsetWidth:void 0},viewportHeight:function(){return"undefined"!=typeof window.innerHeight?window.innerHeight:document.documentElement&&"undefined"!=typeof document.documentElement.offsetHeight?document.documentElement.offsetHeight:void 0},scrollWidth:function(){return"undefined"!=typeof window.self.pageXOffset?window.self.pageXOffset:"undefined"!=typeof document.documentElement&&"undefined"!=typeof document.documentElement.scrollLeft?document.documentElement.scrollLeft:document.body.scrollLeft},scrollHeight:function(){return"undefined"!=typeof window.self.pageYOffset?window.self.pageYOffset:"undefined"!=typeof document.documentElement&&"undefined"!=typeof document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop}};return e}),Ink.createModule("Ink.Dom.Event",1,[],function(){var a=function(a,b,c){return c()}("bean",this,function(a,b){a=a||"bean",b=b||this;var c=window,d=b[a],e=/[^\.]*(?=\..*)\.|.*/,f=/\..*/,g="addEventListener",h="removeEventListener",i=document||{},j=i.documentElement||{},k=j[g],l=k?g:"attachEvent",m={},n=Array.prototype.slice,o=function(a,b){return a.split(b||" ")},p=function(a){return"string"==typeof a},q=function(a){return"function"==typeof a},r="click dblclick mouseup mousedown contextmenu mousewheel mousemultiwheel DOMMouseScroll mouseover mouseout mousemove selectstart selectend keydown keypress keyup orientationchange focus blur change reset select submit load unload beforeunload resize move DOMContentLoaded readystatechange message error abort scroll ",s="show input invalid touchstart touchmove touchend touchcancel gesturestart gesturechange gestureend textinputreadystatechange pageshow pagehide popstate hashchange offline online afterprint beforeprint dragstart dragenter dragover dragleave drag drop dragend loadstart progress suspend emptied stalled loadmetadata loadeddata canplay canplaythrough playing waiting seeking seeked ended durationchange timeupdate play pause ratechange volumechange cuechange checking noupdate downloading cached updateready obsolete ",t=function(a,b,c){for(c=0;cg;g++)if(m[g].reg.test(e)){n[e]=k=m[g].fix;break}for(j=k(a,this,e),g=j.length;g--;)!((i=j[g])in this)&&i in a&&(this[i]=a[i])}}};return p.prototype.preventDefault=function(){this.originalEvent.preventDefault?this.originalEvent.preventDefault():this.originalEvent.returnValue=!1},p.prototype.stopPropagation=function(){this.originalEvent.stopPropagation?this.originalEvent.stopPropagation():this.originalEvent.cancelBubble=!0},p.prototype.stop=function(){this.preventDefault(),this.stopPropagation(),this.stopped=!0},p.prototype.stopImmediatePropagation=function(){this.originalEvent.stopImmediatePropagation&&this.originalEvent.stopImmediatePropagation(),this.isImmediatePropagationStopped=function(){return!0}},p.prototype.isImmediatePropagationStopped=function(){return this.originalEvent.isImmediatePropagationStopped&&this.originalEvent.isImmediatePropagationStopped()},p.prototype.clone=function(a){var b=new p(this,this.element,this.isNative);return b.currentTarget=a,b},p}(),w=function(a,b){return k||b||a!==i&&a!==c?a:j},x=function(){var a=function(a,b,c,d){var e=function(c,e){return b.apply(a,d?n.call(e,c?0:1).concat(d):e)},f=function(c,d){return b.__beanDel?b.__beanDel.ft(c.target,a):d},g=c?function(a){var b=f(a,this);return c.apply(b,arguments)?(a&&(a.currentTarget=b),e(a,arguments)):void 0}:function(a){return b.__beanDel&&(a=a.clone(f(a))),e(a,arguments)};return g.__beanDel=b.__beanDel,g},b=function(b,c,d,e,f,g,h){var i=u[c],j;"unload"==c&&(d=D(E,b,c,d,e)),i&&(i.condition&&(d=a(b,d,i.condition,g)),c=i.base||c),this.isNative=j=t[c]&&!!b[l],this.customType=!k&&!j&&c,this.element=b,this.type=c,this.original=e,this.namespaces=f,this.eventType=k||j?c:"propertychange",this.target=w(b,j),this[l]=!!this.target[l],this.root=h,this.handler=a(b,d,null,g)};return b.prototype.inNamespaces=function(a){var b,c,d=0;if(!a)return!0;if(!this.namespaces)return!1;for(b=a.length;b--;)for(c=this.namespaces.length;c--;)a[b]==this.namespaces[c]&&d++;return a.length===d},b.prototype.matches=function(a,b,c){return!(this.element!==a||b&&this.original!==b||c&&this.handler!==c)},b}(),y=function(){var a={},b=function(c,d,e,f,g,h){var i=g?"r":"$";if(d&&"*"!=d){var j=0,k,l=a[i+d],m="*"==c;if(!l)return;for(k=l.length;k>j;j++)if((m||l[j].matches(c,e,f))&&!h(l[j],l,j,d))return}else for(var n in a)n.charAt(0)==i&&b(c,n.substr(1),e,f,g,h)},c=function(b,c,d,e){var f,g=a[(e?"r":"$")+c];if(g)for(f=g.length;f--;)if(!g[f].root&&g[f].matches(b,d,null))return!0;return!1},d=function(a,c,d,e){var f=[];return b(a,c,d,null,e,function(a){return f.push(a)}),f},e=function(b){var c=!b.root&&!this.has(b.element,b.type,null,!1),d=(b.root?"r":"$")+b.type;return(a[d]||(a[d]=[])).push(b),c},f=function(c){b(c.element,c.type,null,c.handler,c.root,function(b,c,d){return c.splice(d,1),b.removed=!0,0===c.length&&delete a[(b.root?"r":"$")+b.type],!1})},g=function(){var b,c=[];for(b in a)"$"==b.charAt(0)&&(c=c.concat(a[b]));return c};return{has:c,get:d,put:e,del:f,entries:g}}(),z,A=function(a){z=arguments.length?a:i.querySelectorAll?function(a,b){return b.querySelectorAll(a)}:function(){throw new Error("Bean: No selector engine installed")}},B=function(a,b){if(k||!b||!a||a.propertyName=="_on"+b){var c=y.get(this,b||a.type,null,!1),d=c.length,e=0;for(a=new v(a,this,!0),b&&(a.type=b);d>e&&!a.isImmediatePropagationStopped();e++)c[e].removed||c[e].handler.call(this,a)}},C=k?function(a,b,c){a[c?g:h](b,B,!1)}:function(a,b,c,d){var e;c?(y.put(e=new x(a,d||b,function(b){B.call(a,b,d)},B,null,null,!0)),d&&null==a["_on"+d]&&(a["_on"+d]=0),e.target.attachEvent("on"+e.eventType,e.handler)):(e=y.get(a,d||b,B,!0)[0],e&&(e.target.detachEvent("on"+e.eventType,e.handler),y.del(e)))},D=function(a,b,c,d,e){return function(){d.apply(this,arguments),a(b,c,e)}},E=function(a,b,c,d){var e=b&&b.replace(f,""),g=y.get(a,e,null,!1),h={},i,j;for(i=0,j=g.length;j>i;i++)c&&g[i].original!==c||!g[i].inNamespaces(d)||(y.del(g[i]),!h[g[i].eventType]&&g[i][l]&&(h[g[i].eventType]={t:g[i].eventType,c:g[i].type}));for(i in h)h.hasOwnProperty(i)&&(y.has(a,h[i].t,null,!1)||C(a,h[i].t,!1,h[i].c))},F=function(a,b){var c=function(b,c){for(var d,e=p(a)?z(a,c):a;b&&b!==c;b=b.parentNode)for(d=e.length;d--;)if(e[d]===b)return b},d=function(a){var d=c(a.target,this);d&&b.apply(d,arguments)};return d.__beanDel={ft:c,selector:a},d},G=k?function(a,b,d){var e=i.createEvent(a?"HTMLEvents":"UIEvents");e[a?"initEvent":"initUIEvent"](b,!0,!0,c,1),d.dispatchEvent(e)}:function(a,b,c){c=w(c,a),a?c.fireEvent("on"+b,i.createEventObject()):c["_on"+b]++},H=function(a,b,c){var d=p(b),g,h,i,j;if(d&&b.indexOf(" ")>0){for(b=o(b),j=b.length;j--;)H(a,b[j],c);return a}if(h=d&&b.replace(f,""),h&&u[h]&&(h=u[h].base),!b||d)(i=d&&b.replace(e,""))&&(i=o(i,".")),E(a,h,c,i);else if(q(b))E(a,null,b);else for(g in b)b.hasOwnProperty(g)&&H(a,g,b[g]);return a},I=function(a,b,c,d){var g,h,i,j,k,p,r;{if(void 0!==c||"object"!=typeof b){for(q(c)?(k=n.call(arguments,3),d=g=c):(g=d,k=n.call(arguments,4),d=F(c,g,z)),i=o(b),this===m&&(d=D(H,a,b,d,g)),j=i.length;j--;)r=y.put(p=new x(a,i[j].replace(f,""),d,g,o(i[j].replace(e,""),"."),k,!1)),p[l]&&r&&C(a,p.eventType,!0,p.customType);return a}for(h in b)b.hasOwnProperty(h)&&I.call(this,a,h,b[h])}},J=function(a,b,c,d){return I.apply(null,p(c)?[a,c,b,d].concat(arguments.length>3?n.call(arguments,5):[]):n.call(arguments))},K=function(){return I.apply(m,arguments)},L=function(a,b,c){var d=o(b),g,h,i,j,k;for(g=d.length;g--;)if(b=d[g].replace(f,""),(j=d[g].replace(e,""))&&(j=o(j,".")),j||c||!a[l])for(k=y.get(a,b,null,!1),c=[!1].concat(c),h=0,i=k.length;i>h;h++)k[h].inNamespaces(j)&&k[h].handler.apply(a,c);else G(t[b],b,a);return a},M=function(a,b,c){for(var d=y.get(b,c,null,!1),e=d.length,f=0,g,h;e>f;f++)d[f].original&&(g=[a,d[f].type],(h=d[f].handler.__beanDel)&&g.push(h.selector),g.push(d[f].original),I.apply(null,g));return a},N={on:I,add:J,one:K,off:H,remove:H,clone:M,fire:L,Event:v,setSelectorEngine:A,noConflict:function(){return b[a]=d,this}};if(c.attachEvent){var O=function(){var a,b=y.entries();for(a in b)b[a].type&&"unload"!==b[a].type&&H(b[a].element,b[a].type);c.detachEvent("onunload",O),c.CollectGarbage&&c.CollectGarbage()};c.attachEvent("onunload",O)}return A(Ink.ss),N}),b={KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_SPACE:32,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,KEY_HOME:36,KEY_END:35,KEY_PAGEUP:33,KEY_PAGEDOWN:34,KEY_INSERT:45,throttle:function(a,b){function c(){var f=+new Date,g=f-d;if(g>=b)return d=f,a.apply(this,[].slice.call(arguments));var h=this,i=[].slice.call(arguments);e&&clearTimeout(e),e=setTimeout(function(){return e=null,c.apply(h,i)},b-g)}b=b||0;var d=0,e;return c},element:function(a){var b=a.delegationTarget||a.target||"mouseout"===a.type&&a.fromElement||"mouseleave"===a.type&&a.fromElement||"mouseover"===a.type&&a.toElement||"mouseenter"===a.type&&a.toElement||a.srcElement||null;return!b||3!==b.nodeType&&4!==b.nodeType?b:b.parentNode},relatedTarget:function(a){var b=a.relatedTarget||"mouseout"===a.type&&a.toElement||"mouseleave"===a.type&&a.toElement||"mouseover"===a.type&&a.fromElement||"mouseenter"===a.type&&a.fromElement||null;return!b||3!==b.nodeType&&4!==b.nodeType?b:b.parentNode},findElement:function(a,b,c){for(var d=this.element(a);;){if(d.nodeName.toLowerCase()===b.toLowerCase())return d;if(d=d.parentNode,!d)return c?!1:document;if(!d.parentNode)return c?!1:document}},observe:function(a,b,c,d){return a=Ink.i(a),a?(a.addEventListener?a.addEventListener(b,c,!!d):a.attachEvent("on"+b,c=Ink.bind(c,a)),c):void 0},observeOnce:function(a,c,d,e){var f=function(){return b.stopObserving(a,c,g),d.apply(this,arguments)},g=b.observe(a,c,f,e);return g},observeMulti:function(a,b,c,d){if("string"==typeof a?a=Ink.ss(a):a&&1===a.nodeType&&(a=[a]),!a[0])return!1;for(var e=0,f=a.length;f>e;e++)this.observe(a[e],b,c,d);return c},observeDelegated:function(a,c,d,e){return b.observe(a,c,function(c){var f=b.element(c);if(f&&f!==a)for(var g=f;g!==a&&g!==document&&g;){if(Ink.Dom.Selector_1.matchesSelector(g,d))return c.delegationTarget=g,e(c);g=g.parentNode}})},stopObserving:function(a,b,c,d){a=Ink.i(a),a&&(a.removeEventListener?a.removeEventListener(b,c,!!d):a.detachEvent("on"+b,c))},stop:function(a){null!==a.cancelBubble&&(a.cancelBubble=!0),a.stopPropagation&&a.stopPropagation(),a.preventDefault&&a.preventDefault(),window.attachEvent&&(a.returnValue=!1),null!==a.cancel&&(a.cancel=!0)},stopPropagation:function(a){null!==a.cancelBubble&&(a.cancelBubble=!0),a.stopPropagation&&a.stopPropagation()},stopDefault:function(a){a.preventDefault&&a.preventDefault(),window.attachEvent&&(a.returnValue=!1),null!==a.cancel&&(a.cancel=!0)},pointer:function(a){return{x:this.pointerX(a),y:this.pointerY(a)}},pointerX:function(a){return a.touches&&a.touches[0]&&a.touches[0].clientX||a.pageX||a.clientX+(document.documentElement.scrollLeft||document.body.scrollLeft)},pointerY:function(a){return a.touches&&a.touches[0]&&a.touches[0].clientY||a.pageY||a.clientY+(document.documentElement.scrollTop||document.body.scrollTop)},isLeftClick:function(a){if(window.addEventListener){if(0===a.button)return!0;if("touchend"===a.type&&null===a.button)return!0}else if(1===a.button)return!0;return!1},isRightClick:function(a){return 2===a.button},isMiddleClick:function(a){return window.addEventListener?1===a.button:4===a.button;return!1},getCharFromKeyboardEvent:function(a,b){var c=a.keyCode,d=String.fromCharCode(c),e=a.shiftKey;if(c>=65&&90>=c)return"boolean"==typeof b&&(e=b),e?d:d.toLowerCase();if(c>=96&&105>=c)return String.fromCharCode(48+(c-96));switch(c){case 109:case 189:return"-";case 107:case 187:return"+"}return d},debug:function(){}};return Ink.extendObj(b,a)}),Ink.createModule("Ink.Dom.FormSerialize",1,["Ink.Util.Array_1","Ink.Dom.Element_1","Ink.Dom.Selector_1"],function(a,b,c){"use strict";function d(c){return null!=c&&!b.isDOMElement(c)&&(a.isArray(c)||"string"!=typeof c&&"number"==typeof c.length)}function e(a){return d(a)?a:[a]}var f={serialize:function(b,c){c=c||{};var d={},e={},g=this.asPairs(b,{elements:!0,emptyArray:e,outputUnchecked:c.outputUnchecked});return null==g?g:(a.forEach(g,function(a){var b=a[0].replace(/\[\]$/,""),c=a[1],g=a[2];c===e?d[b]=[]:f._resultsInArray(g)||/\[\]$/.test(a[0])?(d[b]=d[b]||[],d[b].push(c)):d[b]=c}),d)},asPairs:function(b,d){function e(a,b,c){h.push(d.elements?[a,b,c]:[a,b])}function g(b){var f=b.nodeName.toLowerCase(),g=(b.type+"").toLowerCase();if("select"===f&&b.multiple){var h=!1;a.forEach(c.select("option:checked",b),function(a){e(b.name,a.value,b),h=!0}),!h&&"emptyArray"in d&&e(b.name,d.emptyArray,b)}else"input"!==f||"checkbox"!==g&&"radio"!==g||!d.outputUnchecked?e(b.name,b.value,b):e(b.name,null,b)}var h=[];if(d=d||{},b=Ink.i(b)){for(var i=a.filter(b.elements,function(a){return f._isSerialized(a,d)}),j=0,k=i.length;k>j;j++)g(i[j]);return h}return null},fillIn:function(a,b){if(!(a=Ink.i(a)))return null;var c;if("object"!=typeof b||d(b)){if(!d(b))return null;c=b}else c=f._objToPairs(b);return f._fillInPairs(a,c)},_objToPairs:function(a){var b=[],c;for(var d in a)if(a.hasOwnProperty(d)){c=e(a[d]);for(var f=0,g=c.length;g>f;f++)b.push([d,c[f]]);0===g&&b.push([d,[]])}return b},_fillInPairs:function(b,c){c=a.groupBy(c,{key:function(a){return a[0].replace(/\[\]$/,"")}}),c=a.map(c,function(b){var c=a.reduce(b,function(a,b){return[null,a[1].concat([b[1]])]},[null,[]])[1];return[b[0][0],c]});for(var d,g,h,i=0,j=c.length;j>i;i++){if(d=c[i][0],d in b)g=b[d];else{if(!(d+"[]"in b))continue;g=b[d+"[]"],d+="[]"}g=e(g),h=c[i][1],f._fillInOne(d,g,h)}},_fillInOne:function(a,c,d){var e=c[0],g=e.nodeName.toLowerCase(),h=e.getAttribute("type");h=h&&h.toLowerCase();var i="select"===g&&b.hasAttribute(e,"multiple");if("checkbox"===h||"radio"===h)f._fillInBoolean(c,d,"checked");else if(i)f._fillInBoolean(c[0].options,d,"selected");else{c.length!==d.length&&Ink.warn("Form had "+c.length+' inputs named "'+a+'", but received '+d.length+" values.");for(var j=0,k=Math.min(c.length,d.length);k>j;j+=1)c[j].value=d[j]}},_fillInBoolean:function(b,c,d){a.forEach(b,function(b){var e=a.inArray(b.value,c);b[d]=e})},_resultsInArray:function(a){var c=a.getAttribute("type"),d=a.nodeName.toLowerCase();return"checkbox"===c||"select"===d&&b.hasAttribute(a,"multiple")},_isSerialized:function(a,c){if(c=c||{},!b.isDOMElement(a))return!1;if(!b.hasAttribute(a,"name"))return!1;var d=a.nodeName.toLowerCase();return d&&"fieldset"!==d?"checkbox"===a.type||"radio"===a.type?c.outputUnchecked?!0:!!a.checked:!0:!1}};return f}),Ink.createModule("Ink.Dom.Loaded",1,[],function(){"use strict";var a={_contexts:[],run:function(a,b){b||(b=a,a=window);for(var c,d=0,e=this._contexts.length;e>d;d++)if(this._contexts[d][0]===a){c=this._contexts[d][1];break}c||(c={cbQueue:[],win:a,doc:a.document,root:a.document.documentElement,done:!1,top:!0},c.handlers={checkState:Ink.bindEvent(this._checkState,this,c),poll:Ink.bind(this._poll,this,c)},this._contexts.push([a,c]));var f=c.doc.addEventListener;c.add=f?"addEventListener":"attachEvent",c.rem=f?"removeEventListener":"detachEvent",c.pre=f?"":"on",c.det=f?"DOMContentLoaded":"onreadystatechange",c.wet=c.pre+"load";var g=c.handlers.checkState,h=/complete|loaded/.test(c.doc.readyState)&&"about:blank"!==c.win.location.toString();if(h)setTimeout(Ink.bind(function(){b.call(c.win,"lazy")},this),0);else{c.cbQueue.push(b),c.doc[c.add](c.det,g),c.win[c.add](c.wet,g);var i=1;try{i=c.win.frameElement}catch(j){}if(!f&&c.root&&c.root.doScroll){try{c.top=!i}catch(j){}c.top&&this._poll(c)}}},_checkState:function(a,b){if(a&&("readystatechange"!==a.type||/complete|loaded/.test(b.doc.readyState))){var c="load"===a.type?b.win:b.doc;c[b.rem](b.pre+a.type,b.handlers.checkState,!1),this._ready(b)}},_poll:function(a){try{a.root.doScroll("left")}catch(b){return setTimeout(a.handlers.poll,50)}this._ready(a)},_ready:function(a){if(!a.done){a.done=!0;for(var b=0;bw.cacheLength&&delete a[b.shift()],a[c]=d}}function c(a){return a[L]=!0,a}function d(a){var b=E.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b=null}}function e(a,b,c,d){var e,f,g,h,i,l,m,n,o,p;if((b?b.ownerDocument||b:M)!==E&&D(b),b=b||E,c=c||[],!a||"string"!=typeof a)return c;if(1!==(h=b.nodeType)&&9!==h)return[];if(G&&!d){if(e=pb.exec(a))if(g=e[1]){if(9===h){if(f=b.getElementById(g),!f||!f.parentNode)return c;if(f.id===g)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(g))&&K(b,f)&&f.id===g)return c.push(f),c}else{if(e[2])return $.apply(c,b.getElementsByTagName(a)),c;if((g=e[3])&&N.getElementsByClassName&&b.getElementsByClassName)return $.apply(c,b.getElementsByClassName(g)),c}if(N.qsa&&!H.test(a)){if(m=!0,n=L,o=b,p=9===h&&a,1===h&&"object"!==b.nodeName.toLowerCase()){for(l=j(a),(m=b.getAttribute("id"))?n=m.replace(sb,"\\$&"):b.setAttribute("id",n),n="[id='"+n+"'] ",i=l.length;i--;)l[i]=n+k(l[i]);o=nb.test(a)&&b.parentNode||b,p=l.join(",")}if(p)try{return $.apply(c,o.querySelectorAll(p)),c}catch(q){}finally{m||b.removeAttribute("id")}}}return s(a.replace(hb,"$1"),b,c,d)}function f(a,b){var c=b&&a,d=c&&(~b.sourceIndex||W)-(~a.sourceIndex||W);if(d)return d;if(c)for(;c=c.nextSibling;)if(c===b)return-1;return a?1:-1}function g(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function h(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function i(a){return c(function(b){return b=+b,c(function(c,d){for(var e,f=a([],c.length,b),g=f.length;g--;)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function j(a,b){var c,d,f,g,h,i,j,k=R[a+" "];if(k)return b?0:k.slice(0);for(h=a,i=[],j=w.preFilter;h;){(!c||(d=ib.exec(h)))&&(d&&(h=h.slice(d[0].length)||h),i.push(f=[])),c=!1,(d=jb.exec(h))&&(c=d.shift(),f.push({value:c,type:d[0].replace(hb," ")}),h=h.slice(c.length));for(g in w.filter)!(d=mb[g].exec(h))||j[g]&&!(d=j[g](d))||(c=d.shift(),f.push({value:c,type:g,matches:d}),h=h.slice(c.length));if(!c)break}return b?h.length:h?e.error(a):R(a,i).slice(0)}function k(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function l(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=P++;return b.first?function(b,c,f){for(;b=b[d];)if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=O+" "+f;if(g){for(;b=b[d];)if((1===b.nodeType||e)&&a(b,c,g))return!0}else for(;b=b[d];)if(1===b.nodeType||e)if(j=b[L]||(b[L]={}),(i=j[d])&&i[0]===k){if((h=i[1])===!0||h===v)return h===!0}else if(i=j[d]=[k],i[1]=a(b,c,g)||v,i[1]===!0)return!0}}function m(a){return a.length>1?function(b,c,d){for(var e=a.length;e--;)if(!a[e](b,c,d))return!1;return!0}:a[0]}function n(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function o(a,b,d,e,f,g){return e&&!e[L]&&(e=o(e)),f&&!f[L]&&(f=o(f,g)),c(function(c,g,h,i){var j,k,l,m=[],o=[],p=g.length,q=c||r(b||"*",h.nodeType?[h]:h,[]),s=!a||!c&&b?q:n(q,m,a,h,i),t=d?f||(c?a:p||e)?[]:g:s;if(d&&d(s,t,h,i),e)for(j=n(t,o),e(j,[],h,i),k=j.length;k--;)(l=j[k])&&(t[o[k]]=!(s[o[k]]=l));if(c){if(f||a){if(f){for(j=[],k=t.length;k--;)(l=t[k])&&j.push(s[k]=l);f(null,t=[],j,i)}for(k=t.length;k--;)(l=t[k])&&(j=f?ab.call(c,l):m[k])>-1&&(c[j]=!(g[j]=l))}}else t=n(t===g?t.splice(p,t.length):t),f?f(null,g,t,i):$.apply(g,t)})}function p(a){for(var b,c,d,e=a.length,f=w.relative[a[0].type],g=f||w.relative[" "],h=f?1:0,i=l(function(a){return a===b},g,!0),j=l(function(a){return ab.call(b,a)>-1},g,!0),n=[function(a,c,d){return!f&&(d||c!==A)||((b=c).nodeType?i(a,c,d):j(a,c,d))}];e>h;h++)if(c=w.relative[a[h].type])n=[l(m(n),c)];else{if(c=w.filter[a[h].type].apply(null,a[h].matches),c[L]){for(d=++h;e>d&&!w.relative[a[d].type];d++);return o(h>1&&m(n),h>1&&k(a.slice(0,h-1)).replace(hb,"$1"),c,d>h&&p(a.slice(h,d)),e>d&&p(a=a.slice(d)),e>d&&k(a)) }n.push(c)}return m(n)}function q(a,b){var d=0,f=b.length>0,g=a.length>0,h=function(c,h,i,j,k){var l,m,o,p=[],q=0,r="0",s=c&&[],t=null!=k,u=A,x=c||g&&w.find.TAG("*",k&&h.parentNode||h),y=O+=null==u?1:Math.random()||.1;for(t&&(A=h!==E&&h,v=d);null!=(l=x[r]);r++){if(g&&l){for(m=0;o=a[m++];)if(o(l,h,i)){j.push(l);break}t&&(O=y,v=++d)}f&&((l=!o&&l)&&q--,c&&s.push(l))}if(q+=r,f&&r!==q){for(m=0;o=b[m++];)o(s,p,h,i);if(c){if(q>0)for(;r--;)s[r]||p[r]||(p[r]=Y.call(j));p=n(p)}$.apply(j,p),t&&!c&&p.length>0&&q+b.length>1&&e.uniqueSort(j)}return t&&(O=y,A=u),s};return f?c(h):h}function r(a,b,c){for(var d=0,f=b.length;f>d;d++)e(a,b[d],c);return c}function s(a,b,c,d){var e,f,g,h,i,l=j(a);if(!d&&1===l.length){if(f=l[0]=l[0].slice(0),f.length>2&&"ID"===(g=f[0]).type&&9===b.nodeType&&G&&w.relative[f[1].type]){if(b=(w.find.ID(g.matches[0].replace(ub,vb),b)||[])[0],!b)return c;a=a.slice(f.shift().value.length)}for(e=mb.needsContext.test(a)?0:f.length;e--&&(g=f[e],!w.relative[h=g.type]);)if((i=w.find[h])&&(d=i(g.matches[0].replace(ub,vb),nb.test(f[0].type)&&b.parentNode||b))){if(f.splice(e,1),a=d.length&&k(f),!a)return $.apply(c,d),c;break}}return z(a,l)(d,b,!G,c,nb.test(a)),c}function t(){}var u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L="sizzle"+-new Date,M=window.document,N={},O=0,P=0,Q=b(),R=b(),S=b(),T=!1,U=function(){return 0},V="undefined",W=1<<31,X=[],Y=X.pop,Z=X.push,$=X.push,_=X.slice,ab=X.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},bb="[\\x20\\t\\r\\n\\f]",cb="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",db=cb.replace("w","w#"),eb="([*^$|!~]?=)",fb="\\["+bb+"*("+cb+")"+bb+"*(?:"+eb+bb+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+db+")|)|)"+bb+"*\\]",gb=":("+cb+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+fb.replace(3,8)+")*)|.*)\\)|)",hb=new RegExp("^"+bb+"+|((?:^|[^\\\\])(?:\\\\.)*)"+bb+"+$","g"),ib=new RegExp("^"+bb+"*,"+bb+"*"),jb=new RegExp("^"+bb+"*([\\x20\\t\\r\\n\\f>+~])"+bb+"*"),kb=new RegExp(gb),lb=new RegExp("^"+db+"$"),mb={ID:new RegExp("^#("+cb+")"),CLASS:new RegExp("^\\.("+cb+")"),NAME:new RegExp("^\\[name=['\"]?("+cb+")['\"]?\\]"),TAG:new RegExp("^("+cb.replace("w","w*")+")"),ATTR:new RegExp("^"+fb),PSEUDO:new RegExp("^"+gb),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+bb+"*(even|odd|(([+-]|)(\\d*)n|)"+bb+"*(?:([+-]|)"+bb+"*(\\d+)|))"+bb+"*\\)|)","i"),needsContext:new RegExp("^"+bb+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+bb+"*((?:-\\d)?\\d*)"+bb+"*\\)|)(?=[^-]|$)","i")},nb=/[\x20\t\r\n\f]*[+~]/,ob=/^[^{]+\{\s*\[native code/,pb=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,qb=/^(?:input|select|textarea|button)$/i,rb=/^h\d$/i,sb=/'|\\/g,tb=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,ub=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,vb=function(a,b){var c="0x"+b-65536;return c!==c?b:0>c?String.fromCharCode(c+65536):String.fromCharCode(c>>10|55296,1023&c|56320)};try{$.apply(X=_.call(M.childNodes),M.childNodes),X[M.childNodes.length].nodeType}catch(wb){$={apply:X.length?function(a,b){Z.apply(a,_.call(b))}:function(a,b){for(var c=a.length,d=0;a[c++]=b[d++];);a.length=c-1}}}y=e.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},D=e.setDocument=function(b){var c=b?b.ownerDocument||b:M;return c!==E&&9===c.nodeType&&c.documentElement?(E=c,F=c.documentElement,G=!y(c),N.getElementsByTagName=d(function(a){return a.appendChild(c.createComment("")),!a.getElementsByTagName("*").length}),N.attributes=d(function(a){a.innerHTML="";var b=typeof a.lastChild.getAttribute("multiple");return"boolean"!==b&&"string"!==b}),N.getElementsByClassName=d(function(a){return a.innerHTML="",a.getElementsByClassName&&a.getElementsByClassName("e").length?(a.lastChild.className="e",2===a.getElementsByClassName("e").length):!1}),N.getByName=d(function(a){a.id=L+0,a.appendChild(E.createElement("a")).setAttribute("name",L),a.appendChild(E.createElement("i")).setAttribute("name",L),F.appendChild(a);var b=c.getElementsByName&&c.getElementsByName(L).length===2+c.getElementsByName(L+0).length;return F.removeChild(a),b}),N.sortDetached=d(function(a){return a.compareDocumentPosition&&1&a.compareDocumentPosition(E.createElement("div"))}),w.attrHandle=d(function(a){return a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!==V&&"#"===a.firstChild.getAttribute("href")})?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},N.getByName?(w.find.ID=function(a,b){if(typeof b.getElementById!==V&&G){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},w.filter.ID=function(a){var b=a.replace(ub,vb);return function(a){return a.getAttribute("id")===b}}):(w.find.ID=function(a,b){if(typeof b.getElementById!==V&&G){var c=b.getElementById(a);return c?c.id===a||typeof c.getAttributeNode!==V&&c.getAttributeNode("id").value===a?[c]:void 0:[]}},w.filter.ID=function(a){var b=a.replace(ub,vb);return function(a){var c=typeof a.getAttributeNode!==V&&a.getAttributeNode("id");return c&&c.value===b}}),w.find.TAG=N.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==V?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){for(;c=f[e++];)1===c.nodeType&&d.push(c);return d}return f},w.find.NAME=N.getByName&&function(a,b){return typeof b.getElementsByName!==V?b.getElementsByName(name):void 0},w.find.CLASS=N.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==V&&G?b.getElementsByClassName(a):void 0},I=[],H=[":focus"],(N.qsa=a(c.querySelectorAll))&&(d(function(a){a.innerHTML="",a.querySelectorAll("[selected]").length||H.push("\\["+bb+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||H.push(":checked")}),d(function(a){a.innerHTML="",a.querySelectorAll("[i^='']").length&&H.push("[*^$]="+bb+"*(?:\"\"|'')"),a.querySelectorAll(":enabled").length||H.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),H.push(",.*:")})),(N.matchesSelector=a(J=F.matchesSelector||F.mozMatchesSelector||F.webkitMatchesSelector||F.oMatchesSelector||F.msMatchesSelector))&&d(function(a){N.disconnectedMatch=J.call(a,"div"),J.call(a,"[s!='']:x"),I.push("!=",gb)}),H=new RegExp(H.join("|")),I=I.length&&new RegExp(I.join("|")),K=a(F.contains)||F.compareDocumentPosition?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},U=F.compareDocumentPosition?function(a,b){if(a===b)return T=!0,0;var d=b.compareDocumentPosition&&a.compareDocumentPosition&&a.compareDocumentPosition(b);return d?1&d||B&&b.compareDocumentPosition(a)===d?a===c||K(M,a)?-1:b===c||K(M,b)?1:C?ab.call(C,a)-ab.call(C,b):0:4&d?-1:1:a.compareDocumentPosition?-1:1}:function(a,b){var d,e=0,g=a.parentNode,h=b.parentNode,i=[a],j=[b];if(a===b)return T=!0,0;if(!g||!h)return a===c?-1:b===c?1:g?-1:h?1:0;if(g===h)return f(a,b);for(d=a;d=d.parentNode;)i.unshift(d);for(d=b;d=d.parentNode;)j.unshift(d);for(;i[e]===j[e];)e++;return e?f(i[e],j[e]):i[e]===M?-1:j[e]===M?1:0},E):E},e.matches=function(a,b){return e(a,null,null,b)},e.matchesSelector=function(a,b){if((a.ownerDocument||a)!==E&&D(a),b=b.replace(tb,"='$1']"),N.matchesSelector&&G&&(!I||!I.test(b))&&!H.test(b))try{var c=J.call(a,b);if(c||N.disconnectedMatch||a.document&&11!==a.document.nodeType)return c}catch(d){}return e(b,E,null,[a]).length>0},e.contains=function(a,b){return(a.ownerDocument||a)!==E&&D(a),K(a,b)},e.attr=function(a,b){var c;return(a.ownerDocument||a)!==E&&D(a),G&&(b=b.toLowerCase()),(c=w.attrHandle[b])?c(a):!G||N.attributes?a.getAttribute(b):((c=a.getAttributeNode(b))||a.getAttribute(b))&&a[b]===!0?b:c&&c.specified?c.value:null},e.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},e.uniqueSort=function(a){var b,c=[],d=0,e=0;if(T=!N.detectDuplicates,B=!N.sortDetached,C=!N.sortStable&&a.slice(0),a.sort(U),T){for(;b=a[e++];)b===a[e]&&(d=c.push(e));for(;d--;)a.splice(c[d],1)}return a},x=e.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(1===e||9===e||11===e){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=x(a)}else if(3===e||4===e)return a.nodeValue}else for(;b=a[d];d++)c+=x(b);return c},w=e.selectors={cacheLength:50,createPseudo:c,match:mb,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ub,vb),a[3]=(a[4]||a[5]||"").replace(ub,vb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||e.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&e.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return mb.CHILD.test(a[0])?null:(a[4]?a[2]=a[4]:c&&kb.test(c)&&(b=j(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){return"*"===a?function(){return!0}:(a=a.replace(ub,vb).toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=Q[a+" "];return b||(b=new RegExp("(^|"+bb+")"+a+"("+bb+"|$)"))&&Q(a,function(a){return b.test(a.className||typeof a.getAttribute!==V&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var f=e.attr(d,a);return null==f?"!="===b:b?(f+="","="===b?f===c:"!="===b?f!==c:"^="===b?c&&0===f.indexOf(c):"*="===b?c&&f.indexOf(c)>-1:"$="===b?c&&f.slice(-c.length)===c:"~="===b?(" "+f+" ").indexOf(c)>-1:"|="===b?f===c||f.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){for(;p;){for(l=b;l=l[p];)if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){for(k=q[L]||(q[L]={}),j=k[a]||[],n=j[0]===O&&j[1],m=j[0]===O&&j[2],l=n&&q.childNodes[n];l=++n&&l&&l[p]||(m=n=0)||o.pop();)if(1===l.nodeType&&++m&&l===b){k[a]=[O,n,m];break}}else if(s&&(j=(b[L]||(b[L]={}))[a])&&j[0]===O)m=j[1];else for(;(l=++n&&l&&l[p]||(m=n=0)||o.pop())&&((h?l.nodeName.toLowerCase()!==r:1!==l.nodeType)||!++m||(s&&((l[L]||(l[L]={}))[a]=[O,m]),l!==b)););return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var d,f=w.pseudos[a]||w.setFilters[a.toLowerCase()]||e.error("unsupported pseudo: "+a);return f[L]?f(b):f.length>1?(d=[a,a,"",b],w.setFilters.hasOwnProperty(a.toLowerCase())?c(function(a,c){for(var d,e=f(a,b),g=e.length;g--;)d=ab.call(a,e[g]),a[d]=!(c[d]=e[g])}):function(a){return f(a,0,d)}):f}},pseudos:{not:c(function(a){var b=[],d=[],e=z(a.replace(hb,"$1"));return e[L]?c(function(a,b,c,d){for(var f,g=e(a,null,d,[]),h=a.length;h--;)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,c,f){return b[0]=a,e(b,null,f,d),!d.pop()}}),has:c(function(a){return function(b){return e(a,b).length>0}}),contains:c(function(a){return function(b){return(b.textContent||b.innerText||x(b)).indexOf(a)>-1}}),lang:c(function(a){return lb.test(a||"")||e.error("unsupported lang: "+a),a=a.replace(ub,vb).toLowerCase(),function(b){var c;do if(c=G?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(a){var b=window.location&&window.location.hash;return b&&b.slice(1)===a.id},root:function(a){return a===F},focus:function(a){return a===E.activeElement&&(!E.hasFocus||E.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeName>"@"||3===a.nodeType||4===a.nodeType)return!1;return!0},parent:function(a){return!w.pseudos.empty(a)},header:function(a){return rb.test(a.nodeName)},input:function(a){return qb.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||b.toLowerCase()===a.type)},first:i(function(){return[0]}),last:i(function(a,b){return[b-1]}),eq:i(function(a,b,c){return[0>c?c+b:c]}),even:i(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:i(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:i(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:i(function(a,b,c){for(var d=0>c?c+b:c;++dc;c++)b("position","absolute"),b(this._isY?"top":"left",c*this._elLength+"px")},_onTouchStart:function(a){if(!(a.touches.length>1)){this._swipeData={x:b.pointerX(a),y:b.pointerY(a)};var c=this._ulEl.getBoundingClientRect();this._swipeData.firstUlPos=c[this._isY?"top":"left"],this._swipeData.inUlX=this._swipeData.x-c.left,this._swipeData.inUlY=this._swipeData.y-c.top,i(this._ulEl,"none"),this._touchMoveIsFirstTouchMove=!0}},_onTouchMove:function(a){if(!(a.touches.length>1)){var c=b.pointerX(a),d=b.pointerY(a),e=this._swipeData.y-d,f=this._swipeData.x-c;if(this._touchMoveIsFirstTouchMove){var g=Math.abs(e),h=Math.abs(f);this._touchMoveIsFirstTouchMove=void 0,this._scrolling=this._isY?h>g:g>h,this._scrolling||this._onAnimationFrame()}!this._scrolling&&this._swipeData&&(b.stopDefault(a),this._swipeData.pointerDelta=this._isY?e:f,this._swipeData.pointerPos=this._isY?d:c)}},_onAnimationFrame:function(){var a=this._swipeData;if(a&&!this._scrolling&&!this._touchMoveIsFirstTouchMove){var b=this._element.getBoundingClientRect(),c;c=this._isY?a.pointerPos-a.inUlY-b.top:a.pointerPos-a.inUlX-b.left,this._ulEl.style[this._isY?"top":"left"]=c+"px",j(Ink.bindMethod(this,"_onAnimationFrame"))}},_onTouchEnd:function(a){if(this._swipeData&&this._swipeData.pointerPos&&!this._scrolling&&!this._touchMoveIsFirstTouchMove){var c=.1,d=this._swipeData.pointerDelta,e=this.getPage(),f=d/this._elLength/this._slidesPerPage;Math.abs(f)>c&&(e+=Math[0>d?"floor":"ceil"](f)),e=g(e,0,this._numPages-1),isNaN(e)||this.setPage(e),b.stopDefault(a)}i(this._ulEl,null),this._swipeData=null,this._touchMoveIsFirstTouchMove=void 0,this._scrolling=void 0},_onPaginationChange:function(a){this._setPage(a.getCurrent())},getPage:function(){return this._pagination?this._pagination.getCurrent():this._currentPage||0},getPagination:function(){return this._pagination||null},setPage:function(a,b){return b&&(a%=this._numPages,0>a&&(a=this._numPages-a)),a=g(a,0,this._numPages-1),a===this._currentPage?void(this._swipeData&&this._setPage(a)):void(this._pagination?this._pagination.setCurrent(a):this._setPage(a))},_setPage:function(a){var b=a*this._deltaLength,c=a===this._numPages-1;if(!this._options.spaceAfterLastSlide&&c&&a>0){var d=this._liEls.length-a*this._slidesPerPage;d2)&&r('the "defaults" argument must be an object mapping option names to [typestring, optional] arrays.'),k=a in h?o._coerce_from_string(m,h[a],a,b):i,k!==i?o._options_validate(k,m)?k:(s("("+a+" option) Invalid "+m+" "+q(k)),n):a in d?d[a]:n!==i?n:void r("Option "+a+" is required!")}"string"!=typeof b&&(e=d,d=c,c=b,b=""),d=d||{};var g={},h=e?a.data(e):{},k,l,m,n,p=function(a){return b&&(a=b+': "'+(""+a).replace(/"/,'\\"')+'"'),a},q=function(a){return'"'+(""+a).replace(/"/,'\\"')+'"'},r=function(a){throw new Error(p(a))},s=function(a){Ink.error(p(a)+". Ignoring option.")};for(var t in c)c.hasOwnProperty(t)&&(g[t]=f(t));return g},_coerce_from_string:function(a,b,c,d){return a in o._coerce_funcs?o._coerce_funcs[a](b,c,d):b},_options_validate:function(a,b){return b in o._options_validate_types?o._options_validate_types[b].call(o,a):!1},_coerce_funcs:function(){var a={element:function(a){return o.elOrSelector(a,"")},elements:function(a){return o.elsOrSelector(a,"",!1)},object:function(a){return a},number:function(a){return parseFloat(a)},"boolean":function(a){return!("false"===a||""===a||null===a)},string:function(a){return a},"function":function(a,b,c){return Ink.error(c+': You cannot specify the option "'+b+"\" through data-attributes because it's a function"),i}};return a["float"]=a.integer=a.number,a}(),_options_validate_types:function(){var a={string:function(a){return"string"==typeof a},number:function(a){return"number"==typeof a&&!isNaN(a)&&isFinite(a)},integer:function(a){return a===Math.round(a)},element:function(a){return o.isDOMElement(a)},elements:function(a){return a&&"object"==typeof a&&"number"==typeof a.length&&a.length},"boolean":function(a){return"boolean"==typeof a},object:function(){return!0}};return a["float"]=a.number,a}(),clone:function(a){try{return JSON.parse(JSON.stringify(a))}catch(b){throw new Error("Given object cannot have loops!")}},childIndex:a.parentIndexOf,ajaxJSON:function(a,c,d){new b(a,{evalJS:"force",method:"POST",parameters:c,onSuccess:function(a){try{if(a=a.responseJSON,"ok"!==a.status)throw"server error: "+a.message;d(null,a)}catch(b){d(b)}},onFailure:function(){d("communication failure")}})},currentLayout:function(){var a,b,e,f,g,h=d.select("#ink-layout-detector")[0];if(!h){h=document.createElement("div"),h.id="ink-layout-detector";for(e in o.Layouts)o.Layouts.hasOwnProperty(e)&&(f=o.Layouts[e],g=document.createElement("div"),g.className="show-"+f+" hide-all",g.setAttribute("data-ink-layout",f),h.appendChild(g));document.body.appendChild(h)}for(a=0,b=h.children.length;b>a;++a)if(g=h.children[a],"block"===c.getStyle(g,"display"))return g.getAttribute("data-ink-layout");return"large"},hashSet:function(a){if("object"!=typeof a)throw new TypeError("o should be an object!");var b=e.getAnchorString();b=Ink.extendObj(b,a),window.location.hash=e.genQueryString("",b).substring(1)},cleanChildren:function(b){if(!o.isDOMElement(b))throw new Error("Please provide a valid DOMElement");a.setHTML(b,"")},storeIdAndClasses:function(a,b){if(!o.isDOMElement(a))throw"Please provide a valid Element as first parameter";var c=a.id;c&&(b._id=c);var d=a.className;d&&(b._classes=d)},restoreIdAndClasses:function(a,b){if(!o.isDOMElement(a))throw"Please provide a valid Element as first parameter";b._id&&a.id!==b._id&&(a.id=b._id),b._classes&&-1===a.className.indexOf(b._classes)&&(a.className?a.className+=" "+b._classes:a.className=b._classes),b._instanceId&&!a.getAttribute("data-instance")&&a.setAttribute("data-instance",b._instanceId)},_warnDoubleInstantiation:function(a,b){function c(a){return(a.constructor&&a.constructor._name||a._name||"").replace(/_.*?$/,"")}var d=o.getInstance(a);if(""!==c(b)&&d){var e=c(b);if(e){for(var f=0,g=d.length;g>f;f++)if(e===c(d[f]))return Ink.warn("Creating more than one "+e+"for the same element.","(Was creating a "+e+" on:",a,")."),!1;return!0}}},registerInstance:function(a,b){if(a){if(b||(b=a._element),!o.isDOMElement(b))throw new TypeError("Ink.UI.Common.registerInstance: The element passed in is not a DOM element!");if(o._warnDoubleInstantiation(b,a)===!1)return!1;var c=n.get(b);return c||(c=[],n.set(b,c)),c.push(a),!0}},unregisterInstance:function(a){if(a&&a._element)for(var b=n.get(a._element),c=0,d=b.length;d>c;c++)b[c]===a&&b.splice(c,1)},getInstance:function(a,b){var c=a;if(a=o.elOrSelector(a),!o.isDOMElement(a))return Ink.warn("Ink.UI.Common: getInstance called on non-element ("+c+")"),[];var d=n.get(a);if(d||(d=[]),"function"!=typeof b)return d;for(var e=0,f=d.length;f>e;e++)if(d[e]instanceof b)return d[e];return null},getInstanceFromSelector:function(a){return o.getInstance(a)},getInstanceIds:function(){if(m.length>0)return m;var a=[];for(var b in l)l.hasOwnProperty(b)&&a.push(b);return a},getInstances:function(){if(m.length>0)return m;var a=[];for(var b in l)l.hasOwnProperty(b)&&a.push(l[b]);return a},destroyComponent:function(){o.unregisterInstance(this),this._element.parentNode.removeChild(this._element)}};return h._validateInstance=function(a){var b;if("function"!=typeof a._validate)return!0;try{b=a._validate()}catch(c){b=c}return b instanceof Error?(a._validationError=b,!1):!0},h._stubInstance=function(a,b,c){g(b.prototype,a),g(h.prototype,a),Ink.warn(c+" was not correctly created. "+(a._validationError||""))},h.getInstance=function(a){return a=o.elOrSelector(a),o.getInstance(a,this)},Ink.extendObj(h.prototype,{getOption:function(a){return!this.constructor||a in this.constructor._optionDefinition?this._options[a]:void Ink.error('"'+a+'" is not an option for '+this.constructor._name)},setOption:function(a,b){return!this.constructor||a in this.constructor._optionDefinition?void(this._options[a]=b):void Ink.error('"'+a+" is not an option for "+this.constructor._name)},getElement:function(){return this._element}}),o.BaseUIComponent=h,o.createUIComponent=function r(a,b){function c(a,b){if(!a)throw new Error("Ink.UI_1.createUIComponent: "+b)}function d(b,d,e){var f=a[b];c("undefined"!=typeof f,a+" doesn't have a \""+b+'" property. '+e),c(d&&typeof f===d,"typeof "+a+"."+b+' is not "'+d+'". '+e)}a._componentOptions=b||{},c("function"==typeof a,"constructor argument is not a function!"),d("_name","string","This property is used for error messages. Set it to the full module path and version (Ink.My.Module_1)."),d("_optionDefinition","object","This property contains the option names, types and defaults. See Ink.UI.Common.options() for reference.");var e=a.prototype;a.prototype="function"==typeof Object.create?Object.create(h.prototype):function f(){function a(){}return a.prototype=h.prototype,new a}(),Ink.extendObj(a.prototype,e),a.prototype.constructor=a,Ink.extendObj(a,h)},o}),Ink.createModule("Ink.UI.DatePicker","1",["Ink.UI.Common_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Element_1","Ink.Dom.Selector_1","Ink.Util.Array_1","Ink.Util.Date_1","Ink.Dom.Browser_1"],function(a,b,c,d,e,f,g){"use strict";function h(a,b,c){return a>c&&(a=c),b>a&&(a=b),a}function i(a){var b=a.split("-");return j(+b[0],+b[1]-1,+b[2])}function j(a,b,c){return{_year:a,_month:b,_day:c}}function k(a){return{_year:a.getFullYear(),_month:a.getMonth(),_day:a.getDate()}}function l(){a.BaseUIComponent.apply(this,arguments)}return l._name="DatePicker_1",l._optionDefinition={autoOpen:["Boolean",!1],cleanText:["String","Clear"],closeText:["String","Close"],pickerField:["Element",null],containerElement:["Element",null],cssClass:["String","ink-calendar bottom"],dateRange:["String",null],displayInSelect:["Boolean",!1],dayField:["Element",null],monthField:["Element",null],yearField:["Element",null],format:["String","yyyy-mm-dd"],nextLinkText:["String","»"],ofText:["String"," of "],onFocus:["Boolean",!0],onMonthSelected:["Function",null],onSetDate:["Function",null],onYearSelected:["Function",null],position:["String","right"],prevLinkText:["String","«"],showClean:["Boolean",!0],showClose:["Boolean",!0],shy:["Boolean",!0],startDate:["String",null],startWeekDay:["Number",1],validDayFn:["Function",null],validMonthFn:["Function",null],validYearFn:["Function",null],nextValidDateFn:["Function",null],prevValidDateFn:["Function",null],yearRange:["String",null],month:["Object",{1:"January",2:"February",3:"March",4:"April",5:"May",6:"June",7:"July",8:"August",9:"September",10:"October",11:"November",12:"December"}],wDay:["Object",{0:"Sunday",1:"Monday",2:"Tuesday",3:"Wednesday",4:"Thursday",5:"Friday",6:"Saturday"}]},l.prototype={_init:function(){this._options.format=this._dateParsers[this._options.format]||this._options.format,this._hoverPicker=!1,this._picker=this._options.pickerField||null,this._setMinMax(this._options.dateRange||this._options.yearRange),this.setDate(this._options.startDate?this._options.startDate:this._element&&this._element.value?this._element.value:new Date),(this._options.startWeekDay<0||this._options.startWeekDay>6)&&(Ink.warn('Ink.UI.DatePicker_1: option "startWeekDay" must be between 0 (sunday) and 6 (saturday)'),this._options.startWeekDay=h(this._options.startWeekDay,0,6)),Ink.extendObj(this._options,this._lang||{}),this._render(),this._listenToContainerObjectEvents() },_validate:function(){if(this._options.displayInSelect&&!(this._options.dayField&&this._options.monthField&&this._options.yearField))throw new Error("Ink.UI.DatePicker: displayInSelect option enabled.Please specify dayField, monthField and yearField selectors.")},_render:function(){this._containerObject=document.createElement("div"),this._containerObject.className=this._options.cssClass+" ink-datepicker-calendar hide-all",this._renderSuperTopBar();var b=document.createElement("div");b.className="ink-calendar-top",this._monthDescContainer=document.createElement("div"),this._monthDescContainer.className="ink-calendar-month_desc",this._monthPrev=document.createElement("div"),this._monthPrev.className="ink-calendar-prev",this._monthPrev.appendChild(d.create("a",{href:"#prev",className:"change_month_prev",setHTML:this._options.prevLinkText})),this._monthNext=document.createElement("div"),this._monthNext.className="ink-calendar-next",this._monthNext.appendChild(d.create("a",{href:"#next",className:"change_month_next",setHTML:this._options.nextLinkText})),b.appendChild(this._monthPrev),b.appendChild(this._monthDescContainer),b.appendChild(this._monthNext),this._monthContainer=document.createElement("div"),this._monthContainer.className="ink-calendar-month",this._containerObject.appendChild(b),this._containerObject.appendChild(this._monthContainer),this._monthSelector=this._renderMonthSelector(),this._containerObject.appendChild(this._monthSelector),this._yearSelector=document.createElement("ul"),this._yearSelector.className="ink-calendar-year-selector",this._containerObject.appendChild(this._yearSelector),(!this._options.onFocus||this._options.displayInSelect)&&(this._picker=this._options.pickerField?a.elOrSelector(this._options.pickerField,"pickerField"):d.create("a",{href:"#open_cal",setHTML:"open",insertBottom:this._element.parentNode,className:"ink-datepicker-picker-field"})),this._appendDatePickerToDom(),this._renderMonth(),this._monthChanger=d.create("a",{href:"#monthchanger",className:"ink-calendar-link-month",setTextContent:this._options.month[this._month+1]}),this._ofText=d.create("span",{className:"ink-calendar-of-text",setHTML:this._options.ofText}),this._yearChanger=d.create("a",{href:"#yearchanger",className:"ink-calendar-link-year",setTextContent:this._year}),this._monthDescContainer.appendChild(this._monthChanger),this._monthDescContainer.appendChild(this._ofText),this._monthDescContainer.appendChild(this._yearChanger),this._options.inline?this.show():this._addOpenCloseEvents(),this._addDateChangeHandlersToInputs()},_addDateChangeHandlersToInputs:function(){var a=this._element;this._options.displayInSelect&&(a=[this._options.dayField,this._options.monthField,this._options.yearField]),b.observeMulti(a,"change",Ink.bindEvent(function(){this._updateDate(),this._showDefaultView(),this.setDate(),this._inline||this._hoverPicker||this._hide(!0)},this))},show:function(){this._updateDate(),this._renderMonth(),c.removeClassName(this._containerObject,"hide-all")},_addOpenCloseEvents:function(){var a=this._picker||this._element;b.observe(a,"click",Ink.bindEvent(function(a){b.stop(a),this.show()},this)),this._options.autoOpen&&this.show(),this._options.displayInSelect||b.observe(a,"blur",Ink.bindEvent(function(){this._hoverPicker||this._hide(!0)},this)),this._options.shy&&b.observe(document,"click",Ink.bindEvent(function(a){for(var c=b.element(a),e=[this._options.dayField,this._options.monthField,this._options.yearField,this._picker,this._element],f=0,g=e.length;g>f;f++)if(e[f]&&d.descendantOf(e[f],c))return;this._hide(!0)},this))},_renderMonthSelector:function(){var a=document.createElement("ul");a.className="ink-calendar-month-selector";for(var b=document.createElement("ul"),c=1;12>=c;c++)b.appendChild(this._renderMonthButton(c)),c%4===0&&(a.appendChild(b),b=document.createElement("ul"));return a},_renderMonthButton:function(a){var b=document.createElement("li");return b.appendChild(d.create("a",{"data-cal-month":a,setTextContent:this._options.month[a].substring(0,3)})),b},_appendDatePickerToDom:function(){if(this._options.containerElement){var b=a.elOrSelector(this._options.containerElement);b.appendChild(this._containerObject)}var c=e.matchesSelector(this._element.parentNode,".ink-form .control-group .control, .ink-form .control-group .control > *");c?(this._wrapper=this._element.parentNode,this._wrapperIsControl=!0):(this._wrapper=d.create("div",{className:"ink-datepicker-wrapper"}),d.wrap(this._element,this._wrapper)),d.insertAfter(this._containerObject,this._element)},_renderSuperTopBar:function(){this._options.showClose&&this._options.showClean&&(this._superTopBar=document.createElement("div"),this._superTopBar.className="ink-calendar-top-options",this._options.showClean&&this._superTopBar.appendChild(d.create("a",{className:"clean",setHTML:this._options.cleanText})),this._options.showClose&&this._superTopBar.appendChild(d.create("a",{className:"close",setHTML:this._options.closeText})),this._containerObject.appendChild(this._superTopBar))},_listenToContainerObjectEvents:function(){b.observe(this._containerObject,"mouseover",Ink.bindEvent(function(a){b.stop(a),this._hoverPicker=!0},this)),b.observe(this._containerObject,"mouseout",Ink.bindEvent(function(a){b.stop(a),this._hoverPicker=!1},this)),b.observe(this._containerObject,"click",Ink.bindEvent(this._onClick,this))},_onClick:function(a){var d=b.element(a);return c.hasClassName(d,"ink-calendar-off")?(b.stopDefault(a),null):(b.stop(a),this._onRelativeChangerClick(d),this._onAbsoluteChangerClick(d),c.hasClassName(d,"ink-calendar-link-month")?this._showMonthSelector():c.hasClassName(d,"ink-calendar-link-year")?this._showYearSelector():c.hasClassName(d,"clean")?this._clean():c.hasClassName(d,"close")&&this._hide(!1),void this._updateDescription())},_onRelativeChangerClick:function(a){var b={change_year_next:1,change_year_prev:-1},c={change_month_next:1,change_month_prev:-1};a.className in c?this._updateCal(c[a.className]):a.className in b&&this._showYearSelector(b[a.className])},_onAbsoluteChangerClick:function(a){var b=d.data(a);Number(b.calDay)?(this.setDate(new Date(this._year,this._month,b.calDay)),this._hide()):Number(b.calMonth)?(this._month=Number(b.calMonth)-1,this._showDefaultView(),this._updateCal()):Number(b.calYear)&&this._changeYear(Number(b.calYear))},_changeYear:function(a){a=+a,isNaN(a)||(this._year=a,"function"==typeof this._options.onYearSelected&&this._options.onYearSelected(this,{year:this._year}),this._showMonthSelector())},_clean:function(){this._options.displayInSelect?(this._options.yearField.selectedIndex=0,this._options.monthField.selectedIndex=0,this._options.dayField.selectedIndex=0):this._element.value=""},_hide:function(a){a=void 0===a?!0:a,(a===!1||a&&this._options.shy)&&c.addClassName(this._containerObject,"hide-all")},_setMinMax:function(a){function b(){c._min=d,c._max=e}var c=this,d={_year:-Number.MAX_VALUE,_month:0,_day:1},e={_year:Number.MAX_VALUE,_month:11,_day:31};if(!a)return b();var g=a.split(":"),j=/^(\d{4})((\-)(\d{1,2})((\-)(\d{1,2}))?)?$/;f.each([{name:"_min",date:g[0],noLim:d},{name:"_max",date:g[1],noLim:e}],Ink.bind(function(a){var b=a.noLim;if("NOW"===a.date.toUpperCase()){var c=new Date;b=k(c)}else"EVER"===a.date.toUpperCase()?b=a.noLim:j.test(a.date)&&(b=i(a.date),b._month=h(b._month,0,11),b._day=h(b._day,1,this._daysInMonth(b._year,b._month+1)));this[a.name]=b},this));var l=-1!==this._dateCmp(this._max,this._min);l||b()},_fitDateToRange:function(a){return this._isValidDate(a)||(a=k(new Date)),-1===this._dateCmp(a,this._min)?Ink.extendObj({},this._min):1===this._dateCmp(a,this._max)?Ink.extendObj({},this._max):Ink.extendObj({},a)},_dateWithinRange:function(a){return arguments.length||(a=this),!this._dateAboveMax(a)&&!this._dateBelowMin(a)},_dateAboveMax:function(a){return 1===this._dateCmp(a,this._max)},_dateBelowMin:function(a){return-1===this._dateCmp(a,this._min)},_dateCmp:function(a,b){return this._dateCmpUntil(a,b,"_day")},_dateCmpUntil:function(a,b,c){var d=["_year","_month","_day"],e=-1;do{if(e++,a[d[e]]>b[d[e]])return 1;if(a[d[e]]this._min._year){var f=d.create("li");f.appendChild(d.create("a",{href:"#year_prev",className:"change_year_prev",setHTML:this._options.prevLinkText})),e.appendChild(f)}else e.appendChild(d.create("li",{setHTML:" "}));for(var g=1;11>g;g++)g%4===0&&(e=d.create("ul"),this._yearSelector.appendChild(e)),c=b+g-1,e.appendChild(this._getYearButton(c));if(cthis._max._year||b+9=1&&+a._month+1<=12&&+a._day>=1&&+a._day<=this._daysInMonth(a._year,a._month+1)},_isDate:function(a,b){try{if("undefined"==typeof a)return!1;var c=g.set(a,b);if(c&&this._isValidDate(k(c)))return!0}catch(d){}return!1},_acceptableDay:function(a){return this._acceptableDateComponent(a,"validDayFn")},_acceptableMonth:function(a){return this._acceptableDateComponent(a,"validMonthFn")},_acceptableYear:function(a){return this._acceptableDateComponent(a,"validYearFn")},_acceptableDateComponent:function(a,b){return this._options[b]?this._callUserCallbackBool(this._options[b],a):this._dateWithinRange(a)},_writeDateInFormat:function(){return g.get(this._options.format,this.getDate())},setDate:function(a){if(a&&"function"==typeof a.getDate&&(a=[a.getFullYear(),a.getMonth()+1,a.getDate()].join("-")),/\d{4}-\d{1,2}-\d{1,2}/.test(a)){var b=a.split("-");this._year=+b[0],this._month=+b[1]-1,this._day=+b[2]}this._setDate()},getDate:function(){if(!this._day)throw"Ink.UI.DatePicker: Still picking a date. Cannot getDate now!";return new Date(this._year,this._month,this._day)},_setDate:function(a){if(a){var b=d.data(a);this._day=+b.calDay||this._day}var c=this._fitDateToRange(this);this._year=c._year,this._month=c._month,this._day=c._day,this._options.displayInSelect?(this._options.dayField.value=this._day,this._options.monthField.value=this._month+1,this._options.yearField.value=this._year):this._element.value=this._writeDateInFormat(),this._options.onSetDate&&this._options.onSetDate(this,{date:this.getDate()})},_updateCal:function(a){"function"==typeof this._options.onMonthSelected&&this._options.onMonthSelected(this,{year:this._year,month:this._month}),a&&null===this._updateMonth(a)||this._renderMonth()},_daysInMonth:function(a,b){var c={2:a%400===0||a%4===0&&a%100!==0?29:28,4:30,6:30,9:30,11:30};return c[b]||31},_updateMonth:function(a){var b;return a>0?b=this._getNextMonth():0>a&&(b=this._getPrevMonth()),b?(this._year=b._year,this._month=b._month,void(this._day=b._day)):null},_getNextMonth:function(a){return this._tryLeap(a,"Month","next",function(a){return a._month+=1,a._month>11&&(a._month=0,a._year+=1),a})},_getPrevMonth:function(a){return this._tryLeap(a,"Month","prev",function(a){return a._month-=1,a._month<0&&(a._month=11,a._year-=1),a})},_getPrevYear:function(a){return this._tryLeap(a,"Year","prev",function(a){return a._year-=1,a})},_getNextYear:function(a){return this._tryLeap(a,"Year","next",function(a){return a._year+=1,a})},_tryLeap:function(a,b,c,d){a=a||{_year:this._year,_month:this._month,_day:this._day};var e="prev"===c?"_min":"_max",f=this[e];if(0===this._dateCmpUntil(a,f,b))return null;var g=this._options[c+"ValidDateFn"];if(g)return this._callUserCallbackDate(g,a);a=d(a);var h=this._daysInMonth(a._year,a._month+1);return a._day>h&&(a._day=h),a=this._fitDateToRange(a),this["_acceptable"+b](a)?a:null},_getNextDecade:function(a){a=a||{_year:this._year,_month:this._month,_day:this._day};var b=this._getCurrentDecade(a);return b+10>this._max._year?null:b+10},_getPrevDecade:function(a){a=a||{_year:this._year,_month:this._month,_day:this._day};var b=this._getCurrentDecade(a);return b-10e&&(e+=7),e},_getDayButtons:function(a,b){var c=this._daysInMonth(a,b+1),e=document.createDocumentFragment(),f=d.create("ul");e.appendChild(f);for(var g=this._getFirstDayIndex(a,b),h=0;g>h;h++)f.appendChild(d.create("li",{className:"ink-calendar-empty",setHTML:" "}));for(var i=1;c>=i;i++)(i-1+g)%7===0&&(f=d.create("ul"),e.appendChild(f)),f.appendChild(this._getDayButton(a,b,i));return e},_getDayButton:function(a,b,c){var e={},f=j(a,b,c);this._acceptableDay(f)?(e["data-cal-day"]=c,this._day&&0===this._dateCmp(f,this)&&(e.className="ink-calendar-on")):e.className="ink-calendar-off",e.setTextContent=c;var g=d.create("li");return g.appendChild(d.create("a",e)),g},_getMonthCalendarHeader:function(a){for(var b=d.create("ul",{className:"ink-calendar-header"}),c,e=0;7>e;e++)c=(a+e)%7,b.appendChild(d.create("li",{setTextContent:this._options.wDay[c].substring(0,1)}));return b},_addMonthClassNames:function(a){f.forEach((a||this._monthSelector).getElementsByTagName("a"),Ink.bindMethod(this,"_addMonthButtonClassNames"))},_addMonthButtonClassNames:function(a){var b=d.data(a);if(!b.calMonth)throw"not a calendar month button!";var e=+b.calMonth-1;if(e===this._month)c.addClassName(a,"ink-calendar-on"),c.removeClassName(a,"ink-calendar-off");else{c.removeClassName(a,"ink-calendar-on");var f=!this._acceptableMonth({_year:this._year,_month:e});c.addRemoveClassName(a,"ink-calendar-off",f)}},lang:function(a){this._lang=a},showMonth:function(){this._renderMonth()},isMonthRendered:function(){var a=e.select(".ink-calendar-header",this._containerObject)[0];return"none"!==c.getStyle(a.parentNode,"display")&&"none"!==c.getStyle(a.parentNode.parentNode,"display")},destroy:function(){d.unwrap(this._element),d.remove(this._wrapper),d.remove(this._containerObject),a.unregisterInstance.call(this)}},a.createUIComponent(l),l}),Ink.createModule("Ink.UI.Draggable","1",["Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Css_1","Ink.Dom.Browser_1","Ink.Dom.Selector_1","Ink.UI.Common_1"],function(a,b,c,d,e,f){"use strict";function g(a,b,c){return a=Math.min(a,c),a=Math.max(a,b)}function h(){f.BaseUIComponent.apply(this,arguments)}var i=0,j=1;return h._name="Draggable_1",h._optionDefinition={constraint:["String",!1],constraintElm:["Element",!1],top:["Number",!1],right:["Number",!1],bottom:["Number",!1],left:["Number",!1],handle:["Element",!1],revert:["Boolean",!1],cursor:["String","move"],zIndex:["Number",9999],fps:["Number",0],droppableProxy:["Element",!1],mouseAnchor:["String",void 0],dragClass:["String","drag"],skipChildren:["Boolean",!0],onStart:["Function",!1],onEnd:["Function",!1],onDrag:["Function",!1],onChange:["Function",!1]},h.prototype={_init:function(){var a=this._options;this.constraintElm=a.constraintElm&&f.elOrSelector(a.constraintElm),this.handle=!1,this.elmStartPosition=!1,this.active=!1,this.dragged=!1,this.prevCoords=!1,this.placeholder=!1,this.position=!1,this.zindex=!1,this.firstDrag=!0,a.fps&&(this.deltaMs=1e3/a.fps,this.lastRunAt=0),this.handlers={},this.handlers.start=Ink.bindEvent(this._onStart,this),this.handlers.dragFacade=Ink.bindEvent(this._onDragFacade,this),this.handlers.drag=Ink.bindEvent(this._onDrag,this),this.handlers.end=Ink.bindEvent(this._onEnd,this),this.handlers.selectStart=function(a){return b.stop(a),!1},this.handle=this._options.handle?f.elOrSelector(this._options.handle):this._element,this.handle.style.cursor=a.cursor,b.observe(this.handle,"touchstart",this.handlers.start),b.observe(this.handle,"mousedown",this.handlers.start),d.IE&&b.observe(this._element,"selectstart",this.handlers.selectStart)},destroy:function(){b.stopObserving(this.handle,"touchstart",this.handlers.start),b.stopObserving(this.handle,"mousedown",this.handlers.start),d.IE&&b.stopObserving(this._element,"selectstart",this.handlers.selectStart)},_getCoords:function(b){var c=[a.scrollWidth(),a.scrollHeight()];return{x:(b.touches?b.touches[0].clientX:b.clientX)+c[i],y:(b.touches?b.touches[0].clientY:b.clientY)+c[j]}},_cloneStyle:function(b,d){d.className=b.className,d.style.borderWidth="0",d.style.padding="0",d.style.position="absolute",d.style.width=a.elementWidth(b)+"px",d.style.height=a.elementHeight(b)+"px",d.style.left=a.elementLeft(b)+"px",d.style.top=a.elementTop(b)+"px",d.style.cssFloat=c.getStyle(b,"float"),d.style.display=c.getStyle(b,"display")},_onStart:function(d){if(!this.active&&b.isLeftClick(d)||"undefined"==typeof d.button){var e=b.element(d);if(this._options.skipChildren&&e!==this.handle)return;b.stop(d),c.addClassName(this._element,this._options.dragClass),this.elmStartPosition=[a.elementLeft(this._element),a.elementTop(this._element)];var f=[parseInt(c.getStyle(this._element,"left"),10),parseInt(c.getStyle(this._element,"top"),10)],g=a.elementDimensions(this._element);this.originalPosition=[f[i]?f[i]:null,f[j]?f[j]:null],this.delta=this._getCoords(d),this.active=!0,this.position=c.getStyle(this._element,"position"),this.zindex=c.getStyle(this._element,"zIndex");var h=document.createElement("div");if(h.style.position=this.position,h.style.width=g[i]+"px",h.style.height=g[j]+"px",h.style.marginTop=c.getStyle(this._element,"margin-top"),h.style.marginBottom=c.getStyle(this._element,"margin-bottom"),h.style.marginLeft=c.getStyle(this._element,"margin-left"),h.style.marginRight=c.getStyle(this._element,"margin-right"),h.style.borderWidth="0",h.style.padding="0",h.style.cssFloat=c.getStyle(this._element,"float"),h.style.display=c.getStyle(this._element,"display"),h.style.visibility="hidden",this.delta2=[this.delta.x-this.elmStartPosition[i],this.delta.y-this.elmStartPosition[j]],this._options.mouseAnchor){var k=this._options.mouseAnchor.split(" "),l=[g[i],g[j]];"left"===k[0]?l[i]=0:"center"===k[0]&&(l[i]=parseInt(l[i]/2,10)),"top"===k[1]?l[j]=0:"center"===k[1]&&(l[j]=parseInt(l[j]/2,10)),this.applyDelta=[this.delta2[i]-l[i],this.delta2[j]-l[j]]}var m=this._options.fps?"dragFacade":"drag";if(this.placeholder=h,this._options.onStart&&this._options.onStart(this._element,d),this._options.droppableProxy){this.proxy=document.createElement("div"),g=[window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight];var n=this.proxy.style;n.width=g[i]+"px",n.height=g[j]+"px",n.position="fixed",n.left="0",n.top="0",n.zIndex=this._options.zIndex+1,n.backgroundColor="#FF0000",c.setOpacity(this.proxy,0);for(var o=document.body.firstChild;o&&1!==o.nodeType;)o=o.nextSibling;document.body.insertBefore(this.proxy,o),b.observe(this.proxy,"mousemove",this.handlers[m]),b.observe(this.proxy,"touchmove",this.handlers[m])}else b.observe(document,"mousemove",this.handlers[m]);return this._element.style.position="absolute",this._element.style.zIndex=this._options.zIndex,this._element.parentNode.insertBefore(this.placeholder,this._element),this._onDrag(d),b.observe(document,"mouseup",this.handlers.end),b.observe(document,"touchend",this.handlers.end),!1}},_onDragFacade:function(a){var b=+new Date;(!this.lastRunAt||b>this.lastRunAt+this.deltaMs)&&(this.lastRunAt=b,this._onDrag(a))},_onDrag:function(c){if(this.active){b.stop(c),this.dragged=!0;var d=this._getCoords(c),e=d.x,f=d.y,h=this._options,k=!1,l=!1;if(this.prevCoords&&e!==this.prevCoords.x||f!==this.prevCoords.y){h.onDrag&&h.onDrag(this._element,c),this.prevCoords=d,k=this.elmStartPosition[i]+e-this.delta.x,l=this.elmStartPosition[j]+f-this.delta.y;var m=a.elementDimensions(this._element);if(this.constraintElm){var n=a.offset(this.constraintElm),o=a.elementDimensions(this.constraintElm),p=n[j]+(h.top||0),q=n[j]+o[j]-(h.bottom||0),r=n[i]+(h.left||0),s=n[i]+o[i]-(h.right||0);l=g(l,p,q-m[j]),k=g(k,r,s-m[i])}else if(h.constraint){var t=h.right===!1?a.pageWidth()-m[i]:h.right,u=h.left===!1?0:h.left,v=h.top===!1?0:h.top,w=h.bottom===!1?a.pageHeight()-m[j]:h.bottom;("horizontal"===h.constraint||"both"===h.constraint)&&(k=g(k,u,t)),("vertical"===h.constraint||"both"===h.constraint)&&(l=g(l,v,w))}var x=Ink.getModule("Ink.UI.Droppable_1");if(this.firstDrag&&(x&&x.updateAll(),this.firstDrag=!1),k&&(this._element.style.left=k+"px"),l&&(this._element.style.top=l+"px"),x){var y=this._options.mouseAnchor?{x:e-this.applyDelta[i],y:f-this.applyDelta[j]}:d;x.action(y,"drag",c,this._element)}h.onChange&&h.onChange(this)}}},_onEnd:function(d){if(b.stopObserving(document,"mousemove",this.handlers.drag),b.stopObserving(document,"touchmove",this.handlers.drag),this._options.fps&&this._onDrag(d),c.removeClassName(this._element,this._options.dragClass),this.active&&this.dragged){this._options.droppableProxy&&document.body.removeChild(this.proxy),this.pt&&(a.remove(this.pt),this.pt=void 0),this.placeholder&&a.remove(this.placeholder),this._options.revert&&(this._element.style.position=this.position,this._element.style.zIndex=null!==this.zindex?this.zindex:"auto",this._element.style.left=this.originalPosition[i]?this.originalPosition[i]+"px":"",this._element.style.top=this.originalPosition[j]?this.originalPosition[j]+"px":""),this._options.onEnd&&this._options.onEnd(this._element,d);var e=Ink.getModule("Ink.UI.Droppable_1");e&&e.action(this._getCoords(d),"drop",d,this._element),this.position=!1,this.zindex=!1,this.firstDrag=!0}this.active=!1,this.dragged=!1}},f.createUIComponent(h),h}),Ink.createModule("Ink.UI.Drawer","1",["Ink.UI.Common_1","Ink.Dom.Loaded_1","Ink.Dom.Selector_1","Ink.Dom.Element_1","Ink.Dom.Event_1","Ink.Dom.Css_1"],function(a,b,c,d,e,f){"use strict";function g(a){if(document.addEventListener){m&&h();var b=!1;m=function(c){return"mousedown"===c.type||"mouseup"===c.type?void(b="mousedown"===c.type):void(b||a(c.target))},document.addEventListener("focus",m,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("mouseup",m,!0)}}function h(){document.addEventListener&&m&&(document.removeEventListener("focus",m,!0),document.removeEventListener("mousedown",m,!0),document.removeEventListener("mouseup",m,!0),m=null)}function i(a){for(var b=Ink.ss("[tabindex]",a),c=null,d=null,e=0;ef)&&(c=f,d=b[e])}if(d)return d.focus(),!0;var g=Ink.s(l,a);return g?(g.focus(),!0):!1}function j(a){return'Ink.UI.Drawer_1: Could not find the "'+a+'" element on this page. Please make sure it exists.'}function k(b,c){a.isDOMElement(b)||(c=b),a.BaseUIComponent.apply(this,[document.body,c])}var l=['[tabindex]:not([tabindex="-1"])',"input","select","textarea","button","object","a[href]","area"].join(","),m=null,n=function(a){var b={WebkitTransitionProperty:"webkitTransitionEnd",transitionProperty:"transitionend"};for(var c in b)if(b.hasOwnProperty(c)&&void 0!==a.style[c])return{styleProp:c,eventName:b[c]};return!1}(document.createElement("div"));return k.transitionSupport=n,k._name="Drawer_1",k._optionDefinition={parentSelector:["String",".ink-drawer"],leftDrawer:["String",".left-drawer"],leftTrigger:["String",".left-drawer-trigger"],rightDrawer:["String",".right-drawer"],rightTrigger:["String",".right-drawer-trigger"],contentDrawer:["String",".content-drawer"],mode:["String","push"],sides:["String","both"]},k.prototype={_init:function(){function a(a){a.drawer&&a.triggers.length?b=!0:c=j(a.drawer?a.drawerOption:a.triggerOption)}if(this._contentDrawers=Ink.ss(this._options.contentDrawer),this._leftDrawer=Ink.s(this._options.leftDrawer),this._leftTriggers=Ink.ss(this._options.leftTrigger),this._rightDrawer=Ink.s(this._options.rightDrawer),this._rightTriggers=Ink.ss(this._options.rightTrigger),f.addClassName(document.body,"ink-drawer"),0===this._contentDrawers.length)throw new Error('Ink.UI.Drawer_1: Could not find any "'+this._options.contentDrawer+'" elements on this page. Please make sure you have at least one.');switch(this._options.sides){case"both":this._triggers=this._options.leftTrigger+", "+this._options.rightTrigger+", "+this._options.contentDrawer;break;case"left":this._triggers=this._options.leftTrigger+", "+this._options.contentDrawer;break;case"right":this._triggers=this._options.rightTrigger+", "+this._options.contentDrawer}var b=!1,c=null;("left"===this._options.sides||"both"===this._options.sides)&&a({name:"left",drawer:this._leftDrawer,drawerOption:this._options.leftDrawer,triggers:this._leftTriggers,triggerOption:this._options.leftTrigger}),("right"===this._options.sides||"both"===this._options.sides)&&a({name:"right",drawer:this._rightDrawer,drawerOption:this._options.rightDrawer,triggers:this._rightTriggers,triggerOption:this._options.rightTrigger}),b||Ink.warn(c),this._isOpen=!1,this._direction=void 0,this._handlers={click:Ink.bindEvent(this._onClick,this),afterTransition:Ink.bindEvent(this._afterTransition,this)},this._addEvents()},_onClick:function(a){var b=d.findUpwardsBySelector(a.currentTarget,this._options.leftTrigger)?"left":d.findUpwardsBySelector(a.currentTarget,this._options.rightTrigger)?"right":null;if(b)return void this._onTriggerClicked(a,b);if(this._isOpen){var c=d.findUpwardsBySelector(a.currentTarget,this._options.contentDrawer),e=d.isLink(a.target);(c||e)&&this.close(),c&&a.preventDefault()}},_onTriggerClicked:function(a,b){this._isOpen?this.close():this.open(b),a.preventDefault()},_afterTransition:function(){this._isOpen||f.removeClassName(this._getRecentDrawer(),"show")},_addEvents:function(){e.on(document.body,"click",this._triggers+', a[href*="#"]',this._handlers.click)},_getRecentDrawer:function(){return"left"===this._direction?this._leftDrawer:"right"===this._direction?this._rightDrawer:null},open:function(a){this._isOpen=!0,this._direction=a;var b=this._getRecentDrawer();f.addClassName(b,"show"),setTimeout(Ink.bind(function(){f.addClassName(document.body,[this._options.mode,a])},this),0),n&&this._transitionWillOccur(b)&&e.one(b,n.eventName,function(){f.removeClassName(b,"show");var a=+b.offsetWidth;f.addClassName(b,"show")});var c=document.activeElement,j=i(b);g(Ink.bind(function(a){var e=d.isAncestorOf(b,a);e||(this.close(),h(),j&&c&&c.focus())},this))},_transitionWillOccur:function(a){return!(!n||!f.getStyle(a,n.styleProp))},close:function(){if(this._isOpen!==!1){var a=this._getRecentDrawer();if(a){h(),this._isOpen=!1;var b=null;n&&(b=this._transitionWillOccur(this._getRecentDrawer())),f.removeClassName(document.body,[this._options.mode,this._direction]),b?e.one(document.body,n.eventName,this._handlers.afterTransition):this._handlers.afterTransition()}}}},a.createUIComponent(k),k}),Ink.createModule("Ink.UI.Dropdown","1",["Ink.UI.Common_1","Ink.UI.Toggle_1","Ink.Dom.Event_1","Ink.Dom.Element_1"],function(a,b,c,d){"use strict";function e(){a.BaseUIComponent.apply(this,arguments)}return e._name="Dropdown_1",e._optionDefinition={target:["Element"],hoverOpen:["Number",null],dismissOnInsideClick:["Boolean",!1],dismissOnOutsideClick:["Boolean",!0],dismissAfter:["Number",null],onInsideClick:["Function",null],onOutsideClick:["Function",null],onOpen:["Function",null],onDismiss:["Function",null]},e.prototype={_init:function(){this._toggle=new b(this._element,{target:this._options.target,closeOnInsideClick:null,closeOnClick:!1,onChangeState:Ink.bind(function(a){return this._openOrDismiss(a,!0,!0)},this)}),c.observeMulti([this._options.target,this._element],"mouseout",Ink.bindMethod(this,"_onMouseOut")),c.observeMulti([this._options.target,this._element],"mouseover",Ink.bindMethod(this,"_onMouseOver")),c.observe(this._options.target,"click",Ink.bindMethod(this,"_onInsideClick")),c.observe(document,"click",Ink.bindMethod(this,"_onOutsideClick"))},_onMouseOver:function(){"number"==typeof this._options.hoverOpen&&this._toggle.getState()===!1&&(clearTimeout(this._openTimeout),this._openTimeout=setTimeout(Ink.bindMethod(this,"open",!0),1e3*this._options.hoverOpen)),"number"==typeof this._options.dismissAfter&&clearTimeout(this._dismissTimeout)},_onMouseOut:function(){"number"==typeof this._options.dismissAfter&&this._toggle.getState()===!0&&(clearTimeout(this._dismissTimeout),this._dismissTimeout=setTimeout(Ink.bindMethod(this,"dismiss",!0),1e3*this._options.dismissAfter)),"number"==typeof this._options.hoverOpen&&clearTimeout(this._openTimeout)},_onInsideClick:function(a){var b=this._handlerCall("onInsideClick",c.element(a));b!==!1&&this._options.dismissOnInsideClick&&this.dismiss(!0)},_onOutsideClick:function(a){var b=c.element(a),e=d.findUpwardsHaving(b,Ink.bind(function(a){return a===this._element},this)),f=d.findUpwardsHaving(b,Ink.bind(function(a){return a===this._options.target},this));if(!e&&!f){var g=this._handlerCall("onOutsideClick",b);if(g===!1)return;this._options.dismissOnOutsideClick&&this.dismiss(!0)}},dismiss:function(a){this._openOrDismiss(!1,a,arguments[1])},open:function(a){this._openOrDismiss(!0,a,arguments[1])},_openOrDismiss:function(a,b,c){if(!this._toggle||this._toggle.getState()!==a){if(b&&this._handlerCall(a?"onOpen":"onDismiss")===!1)return!1; diff --git a/dist/js/ink-all.min.js.map b/dist/js/ink-all.min.js.map index 593af92c4..5e2aa1a23 100644 --- a/dist/js/ink-all.min.js.map +++ b/dist/js/ink-all.min.js.map @@ -1 +1 @@ -{"version":3,"file":"ink-all.min.js","sources":["../../src/js/Ink/1/lib.js","../../src/js/Ink/Net/Ajax/1/lib.js","../../src/js/Ink/Net/JsonP/1/lib.js","../../src/js/Ink/Dom/Browser/1/lib.js","../../src/js/Ink/Dom/Css/1/lib.js","../../src/js/Ink/Dom/Element/1/lib.js","../../src/js/Ink/Dom/Event/1/lib.js","../../src/js/Ink/Dom/FormSerialize/1/lib.js","../../src/js/Ink/Dom/Loaded/1/lib.js","../../src/js/Ink/Dom/Selector/1/lib.js","../../src/js/Ink/UI/Animate/1/lib.js","../../src/js/Ink/UI/Carousel/1/lib.js","../../src/js/Ink/UI/Close/1/lib.js","../../src/js/Ink/UI/Common/1/lib.js","../../src/js/Ink/UI/DatePicker/1/lib.js","../../src/js/Ink/UI/Draggable/1/lib.js","../../src/js/Ink/UI/Drawer/1/lib.js","../../src/js/Ink/UI/Dropdown/1/lib.js","../../src/js/Ink/UI/Droppable/1/lib.js","../../src/js/Ink/UI/FormValidator/1/lib.js","../../src/js/Ink/UI/FormValidator/2/lib.js","../../src/js/Ink/UI/ImageQuery/1/lib.js","../../src/js/Ink/UI/LazyLoad/1/lib.js","../../src/js/Ink/UI/Modal/1/lib.js","../../src/js/Ink/UI/Pagination/1/lib.js","../../src/js/Ink/UI/ProgressBar/1/lib.js","../../src/js/Ink/UI/SmoothScroller/1/lib.js","../../src/js/Ink/UI/SortableList/1/lib.js","../../src/js/Ink/UI/Spy/1/lib.js","../../src/js/Ink/UI/Stacker/1/lib.js","../../src/js/Ink/UI/Sticky/1/lib.js","../../src/js/Ink/UI/Swipe/1/lib.js","../../src/js/Ink/UI/Table/1/lib.js","../../src/js/Ink/UI/Tabs/1/lib.js","../../src/js/Ink/UI/TagField/1/lib.js","../../src/js/Ink/UI/Toggle/1/lib.js","../../src/js/Ink/UI/Tooltip/1/lib.js","../../src/js/Ink/UI/TreeView/1/lib.js","../../src/js/Ink/UI/Upload/1/lib.js","../../src/js/Ink/Util/Array/1/lib.js","../../src/js/Ink/Util/BinPack/1/lib.js","../../src/js/Ink/Util/Cookie/1/lib.js","../../src/js/Ink/Util/Date/1/lib.js","../../src/js/Ink/Util/Dumper/1/lib.js","../../src/js/Ink/Util/I18n/1/lib.js","../../src/js/Ink/Util/Json/1/lib.js","../../src/js/Ink/Util/String/1/lib.js","../../src/js/Ink/Util/Url/1/lib.js","../../src/js/Ink/Util/Validator/1/lib.js"],"names":["window","document","paths","modules","modulesLoadOrder","modulesRequested","pendingRMs","modulesWaitingForDeps","apply","Function","prototype","isEmptyObject","o","k","hasOwnProperty","Ink","VERSION","_checkPendingRequireModules","I","F","dep","mod","cb","pRMs","toApply","length","left","args","remaining","push","i","setTimeout","getPath","key","noLib","split","curKey","root","path","slice","join","test","setPath","rootURI","replace","loadScript","uri","contentType","indexOf","givenUri","this","Error","scriptEl","createElement","setAttribute","onerror","error","head","getElementsByTagName","appendChild","_loadLater","namespace","ns","returnParentAndKey","levels","nsobj","parent","f","getModule","version","createModule","deps","modFn","modAll","Array","call","arguments","moduleContent","_version","isInkModule","t","requireModules","cbFn","undefined","_moduleRenames","warn","Ink.UI.Aux_1","getModulesLoadOrder","getModuleScripts","mlo","unshift","map","m","getModuleURL","createExt","moduleName","dependencies","bind","fn","context","innerArgs","finalArgs","concat","bindMethod","object","methodName","bindEvent","event","id","getElementById","ss","selector","from","Dom","Selector","select","s","extendObj","destination","sources","len","property","Object","log","console","Ajax","url","options","init","globalOptions","parameters","requestHeaders","xMLHttpRequestWithCredentials","XMLHttpRequest","userOptions","asynchronous","cors","validateCors","debug","delay","evalJS","method","postBody","sanitizeJSON","signRequest","timeout","useCredentials","xhrProxy","onComplete","onCreate","onException","onFailure","onHeaders","onInit","onSuccess","onTimeout","globalParameters","paramsObjToStr","safeCall","urlLocation","_locationFromURL","isHTTP","_locationIsHTTP","isCrossDomain","_locationIsCrossDomain","location","requestHasBody","search","transport","getTransport","request","createElementNS","href","match","protocol","widget","split1","split2","protocol1","protocol2","colonOrSlash","host1","host2","usingXDomainReq","XDomainRequest","ActiveXObject","e","setHeaders","headers","Accept","Accept-Language","navigator","language","X-Requested-With","X-Ink-Version","headerReqName","overrideMimeType","userAgent","Connection","headerName","setRequestHeader","optParams","p","a","params","toString","isNaN","encodeURIComponent","pop","setParams","getHeader","name","getResponseHeader","getAllHeaders","getAllResponseHeaders","getResponse","r","headerJSON","responseJSON","timeTaken","Date","startTime","requestedUrl","readyState","responseText","responseXML","status","statusText","abort","clearTimeout","delayTimeout","stoTimeout","ex","finish","runStateChange","rs","getTime","responseContent","response","curStatus","isSuccess","headerContentType","evalJSON","mimeType","xmlDoc","DOMParser","parseFromString","xml","onreadystatechange","destroy","handlerName","value","nodeType","crossDomain","open","withCredentials","onload","send","isJSON","str","strJSON","sanitize","JSON","parse","eval","load","callback","ping","JsonP","failureObj","callbackParam","internalCallback","randVar","parseInt","Math","random","Net","_cleanUp","_addScriptTag","_addParamsToGet","hasQuestionMark","sep","pKey","pValue","parts","_getScriptContainer","body","documentElement","rnd_seed","_scriptEl","type","src","scriptCtn","_removeScriptTag","parentNode","removeChild","Browser","IE","GECKO","OPERA","SAFARI","KONQUEROR","CHROME","model","cssPrefix","domPrefix","detectBrowser","setDimensions","setReferrer","myWidth","myHeight","innerWidth","innerHeight","clientWidth","clientHeight","windowWidth","windowHeight","referrer","escape","_sniffUserAgent","sAgent","toLowerCase","rVersion","re","RegExp","reVersion","alert","getCs","defaultView","getComputedStyle","Css","addRemoveClassName","elm","className","addRemState","addClassName","removeClassName","classList","add","hasClassName","remove","elmClassName","setClassName","all","has","contains","blinkClass","element","negate","Number","toggleClassName","forceAdd","toggle","setOpacity","val","style","opacity","filter","_camelCase","_","$1","toUpperCase","getStyle","currentStyle","charAt","css","parseFloat","setStyle","cssText","prop","styleFloat","cssFloat","show","forceDisplayProperty","display","hide","showHide","forceShow","_getRefTag","firstElementChild","child","firstChild","nextSibling","appendStyleTag","force","styles","oldStyle","l","innerHTML","defStyle","refTag","styleStr","styleSheet","createTextNode","insertBefore","appendStylesheet","media","rel","_loadingCSSFiles","_loadedCSSFiles","appendStylesheetCb","cbs","linkEl","headEl","imgEl","_url","callbacks","decToHex","dec","normalizeTo2","rDec","gDec","g","bDec","b","rgb","hexToDec","hex","substr","getPropertyFromStylesheet","rule","getRuleFromStylesheet","getPropertyFromStylesheet2","rules","getRulesFromStylesheet","x","sheet","ri","rf","styleSheets","si","sf","cssRules","selectorText","res","getPropertiesFromRule","props","steps","pre","pos","substring","borderTopLeftRadius","borderBottomRightRadius","borderTopRightRadius","borderBottomLeftRadius","changeFontSize","delta","op","minVal","maxVal","that","TypeError","el","els","fontSize","rect","elem","dimensions","getBoundingClientRect","top","offsetTop","offsetLeft","createContextualFragmentSupport","createRange","Range","createContextualFragment","deleteThisTbodyToken","browserCreatesTbodies","div","InkElement","isDOMElement","get","create","tag","properties","parEl","scrollTo","scrollIntoView","elmOffset","elmTop","elmLeft","offsetParent","y","offset","positionedOffset","valueTop","valueLeft","tagName","position","doc","ownerDocument","docElem","box","clientTop","clientLeft","scrollTop","pageYOffset","scrollLeft","pageXOffset","scroll","_getPropPx","cs","n","c","getPropertyValue","offset2","hasAttribute","attr","getAttribute","insertAfter","newElm","targetElm","insertTop","insertBottom","textContent","node","text","innerText","lastChild","childNodes","nodeValue","setTextContent","isLink","hasAttributeNS","isAncestorOf","ancestor","compareDocumentPosition","descendantOf","descendant","lastElementChild","previousSibling","nextElementSibling","sibling","previousElementSibling","elementWidth","offsetWidth","elementHeight","offsetHeight","elementLeft","elementTop","elementDimensions","outerDimensions","bbox","right","bottom","inViewport","dims","partial","margin","viewportWidth","viewportHeight","isHidden","w","h","isVisible","clonePosition","cloneTo","cloneFrom","ellipsizeText","overflow","whiteSpace","textOverflow","findUpwardsHaving","boolTest","findUpwardsByClass","tst","cls","findUpwardsByTag","nodeName","findUpwardsById","findUpwardsBySelector","sel","matchesSelector","getChildrenText","removeIt","j","part","nodes","jLen","_trimString","String","data","trim","getSelectValues","selectEl","values","_normalizeData","d","data2","fillSelect","container","skipEmpty","defaultValue","containerEl","optionEl","fillRadios","insertAfterEl","splitEl","inputEl","checked","fillChecks","parentIndexOf","parentEl","childEl","children","nextSiblings","elements","siblings","index","previousSiblings","childElementCount","_wrapElements","TABLE","html","TBODY","THEAD","TFOOT","TR","_getWrapper","wrapper","wrapFunc","tds","tbody","appendHTML","prependHTML","setHTML","wrap","target","nextNode","unwrap","wrapperSelector","replacement","replaceChild","removeTextNodeChildren","prevEl","toRemove","htmlToFragment","range","createDocumentFragment","selectNode","fragment","tempElement","current","InkDomSelector","dataset","attrs","attributes","curAttr","curAttrName","curAttrValue","total","moveCursorTo","setSelectionRange","createTextRange","collapse","moveEnd","moveStart","pageWidth","xScroll","scrollMaxX","scrollWidth","self","pageHeight","yScroll","scrollMaxY","scrollHeight","bean","definition","win","old","namespaceRegex","nameRegex","addEvent","removeEvent","W3C_MODEL","eventSupport","ONE","str2arr","isString","isFunction","standardNativeEvents","w3cNativeEvents","nativeEvents","hash","events","customEvents","isAncestor","check","related","relatedTarget","prefix","mouseenter","base","condition","mouseleave","mousewheel","Event","commonProps","mouseProps","mouseWheelProps","keyProps","textProps","touchProps","messageProps","stateProps","overOutRegex","typeFixers","reg","fix","newEvent","keyCode","which","rightClick","button","pageX","pageY","clientX","clientY","typeFixerMap","isNative","parentWindow","originalEvent","isBean","srcElement","fixer","preventDefault","returnValue","stopPropagation","cancelBubble","stop","stopped","stopImmediatePropagation","isImmediatePropagationStopped","clone","currentTarget","ne","targetElement","RegEntry","wrappedHandler","eargs","findTarget","eventElement","__beanDel","ft","handler","original","namespaces","customType","once","removeListener","eventType","inNamespaces","checkNamespaces","matches","checkElement","checkOriginal","checkHandler","registry","forAll","pfx","list","entries","entry","put","del","splice","removed","selectorEngine","setSelectorEngine","querySelectorAll","rootListener","propertyName","listeners","listener","custom","attachEvent","detachEvent","rm","originalFn","orgType","handlers","delegate","array","fireListener","evt","createEvent","dispatchEvent","fireEvent","createEventObject","off","typeSpec","isTypeStr","on","types","first","delfn","one","fire","names","beanDel","noConflict","cleanup","CollectGarbage","InkEvent","KEY_BACKSPACE","KEY_TAB","KEY_RETURN","KEY_ESC","KEY_SPACE","KEY_LEFT","KEY_UP","KEY_RIGHT","KEY_DOWN","KEY_DELETE","KEY_HOME","KEY_END","KEY_PAGEUP","KEY_PAGEDOWN","KEY_INSERT","throttle","func","wait","throttled","now","timeDiff","lastCall","ev","delegationTarget","fromElement","toElement","findElement","elmTagName","observe","eventName","callBack","useCapture","addEventListener","observeOnce","onceBack","stopObserving","observeMulti","observeDelegated","cursor","Selector_1","removeEventListener","cancel","stopDefault","pointer","pointerX","pointerY","touches","isLeftClick","isRightClick","isMiddleClick","getCharFromKeyboardEvent","changeCasing","fromCharCode","shiftOn","shiftKey","InkArray","isArrayIsh","obj","isArray","toArray","FormSerialize","serialize","form","out","emptyArrayToken","pairs","asPairs","emptyArray","outputUnchecked","forEach","pair","_resultsInArray","emit","serializeEl","elNodeName","elType","multiple","didEmit","thisOption","inputs","_isSerialized","fillIn","map2","_objToPairs","_fillInPairs","groupBy","reduce","_fillInOne","firstOne","firstNodeName","firstType","isSelectMulti","_fillInBoolean","min","checkAttr","input","isChecked","inArray","Loaded","_contexts","run","cbQueue","done","checkState","_checkState","poll","_poll","ael","rem","det","wet","csf","alreadyLoaded","frameElement","doScroll","where","_ready","rnative","createCache","cache","keys","Expr","cacheLength","shift","markFunction","expando","assert","Sizzle","results","seed","groups","nid","newContext","newSelector","preferredDoc","setDocument","documentIsHTML","rquickExpr","exec","support","getElementsByClassName","qsa","rbuggyQSA","tokenize","rescape","toSelector","rsibling","qsaError","removeAttribute","rtrim","siblingCheck","cur","diff","sourceIndex","MAX_NEGATIVE","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","parseOnly","matched","tokens","soFar","preFilters","cached","tokenCache","preFilter","rcomma","rcombinators","matchExpr","addCombinator","matcher","combinator","dir","checkNonElements","doneName","outerCache","dirkey","dirruns","cachedruns","elementMatcher","matchers","condense","unmatched","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","elems","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","relative","implicitRelative","matchContext","matchAnyContext","outermostContext","matcherFromGroupMatchers","elementMatchers","setMatchers","matcherCachedRuns","bySet","byElement","superMatcher","expandContext","setMatched","matchedCount","outermost","contextBackup","find","dirrunsUnique","uniqueSort","contexts","token","runescape","funescape","compile","setFilters","getText","isXML","recompare","sortInput","rbuggyMatches","classCache","compilerCache","hasDuplicate","sortOrder","strundefined","arr","push_native","whitespace","characterEncoding","identifier","operators","pseudos","rpseudo","ridentifier","ID","CLASS","NAME","TAG","ATTR","PSEUDO","CHILD","needsContext","rinputs","rheader","rattributeQuotes","escaped","high","createComment","getByName","pass","getElementsByName","sortDetached","div1","attrHandle","attrId","getAttributeNode","tmp","mozMatchesSelector","webkitMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","adown","bup","compare","aup","ap","bp","expr","ret","specified","msg","duplicates","detectDuplicates","sortStable","sort","selectors","createPseudo",">"," ","+","~","excess","unquoted","pattern","operator","result","what","last","simple","forward","ofType","nodeIndex","start","useCache","pseudo","idx","not","lang","elemLang","focus","activeElement","hasFocus","tabIndex","enabled","disabled","selected","selectedIndex","empty","header","eq","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","group","filters","Common","Animate","BaseUIComponent","animationPrefix","animationEndEventName","animation","webkitAnimation","_name","_optionDefinition","trigger","duration","removeClass","onEnd","_init","_options","animate","_element","_animationPrefix","animationSupported","onAnimationEnd","animationName","elOrSelector","createUIComponent","Pagination","limitRange","max","Carousel","setTransitionProperty","newTransition","transitionProperty","oTransitionProperty","msTransitionProperty","mozTransitionProperty","webkitTransitionProperty","requestAnimationFrame","autoAdvance","axis","initialPage","spaceAfterLastSlide","keyboardSupport","pagination","onChange","swipe","_handlers","paginationChange","windowResize","_isY","ulEl","width","_ulEl","_currentPage","refit","_setUpPagination","_setUpAutoAdvance","size","perpendicular","_liEls","numSlides","contRect","_ctnLength","_elLength","_slidesPerPage","floor","isFinite","numPages","ceil","numPagesChanged","_numPages","_deltaLength","_IE7","_pagination","setSize","setPage","getPage","setOnChange","setCurrent","nextPage","slides","stl","_onTouchStart","_swipeData","ulRect","firstUlPos","inUlX","inUlY","_touchMoveIsFirstTouchMove","_onTouchMove","deltaY","deltaX","aDeltaY","abs","aDeltaX","_scrolling","_onAnimationFrame","pointerDelta","pointerPos","swipeData","elRect","newPos","_onTouchEnd","snapToNext","curPage","progressInPages","_onPaginationChange","pgn","_setPage","getCurrent","getPagination","page","_lengthToGo","isLastPage","_itemsInLastPage","previousPage","getSlidesPerPage","getTotalPages","getStageElm","getSlidesList","getTotalSlides","Close","Url","warnStub","constructor","stub","_componentOptions","elementIsOptional","elsOrSelector","isValidInstance","_validateInstance","registerInstance","_stubInstance","nothing","es6WeakMapSupport","instances","WeakMap","_reg","domRegistry","set","thing","Layouts","TINY","SMALL","MEDIUM","LARGE","XLARGE","isInteger","fieldName","required","fieldId","defaults","overrides","optionValue","lType","defaultVal","invalidThrow","_coerce_funcs","fromDataAttrs","dataAttrs","_coerce_from_string","_options_validate","invalid","quote","invalidStr","paramName","_options_validate_types","number","boolean","string","function","integer","round","stringify","childIndex","ajaxJSON","endpoint","message","currentLayout","v","detectorEl","hashSet","hashParams","getAnchorString","genQueryString","cleanChildren","storeIdAndClasses","fromEl","inObj","_id","classes","_classes","restoreIdAndClasses","toEl","_instanceId","_warnDoubleInstantiation","newInstance","getName","getInstance","nameWithoutVersion","inst","unregisterInstance","UIComponent","givenEl","getInstanceFromSelector","getInstanceIds","getInstances","destroyComponent","instance","err","_validate","_validationError","getOption","setOption","getElement","theConstructor","assertProp","propType","propVal","_oldProto","hideF","InkDate","clamp","dateishFromYMDString","YMD","dateishFromYMD","year","month","day","_year","_month","_day","dateishFromDate","date","getFullYear","getMonth","getDate","DatePicker","autoOpen","cleanText","closeText","pickerField","containerElement","cssClass","dateRange","displayInSelect","dayField","monthField","yearField","format","nextLinkText","ofText","onFocus","onMonthSelected","onSetDate","onYearSelected","prevLinkText","showClean","showClose","shy","startDate","startWeekDay","validDayFn","validMonthFn","validYearFn","nextValidDateFn","prevValidDateFn","yearRange",1,2,3,4,5,6,7,8,9,10,11,12,"wDay","_dateParsers","_hoverPicker","_picker","_setMinMax","setDate","_lang","_render","_listenToContainerObjectEvents","_containerObject","_renderSuperTopBar","calendarTop","_monthDescContainer","_monthPrev","_monthNext","_monthContainer","_monthSelector","_renderMonthSelector","_yearSelector","_appendDatePickerToDom","_renderMonth","_monthChanger","_ofText","_yearChanger","inline","_addOpenCloseEvents","_addDateChangeHandlersToInputs","fields","_updateDate","_showDefaultView","_inline","_hide","opener","cannotBe","ulSelector","mon","_renderMonthButton","liMonth","data-cal-month","appendTarget","parentIsControl","_wrapper","_wrapperIsControl","_superTopBar","_onClick","_onRelativeChangerClick","_onAbsoluteChangerClick","_showMonthSelector","_showYearSelector","_clean","_updateDescription","changeYear","change_year_next","change_year_prev","changeMonth","change_month_next","change_month_prev","_updateCal","elemData","calDay","calMonth","calYear","_changeYear","blur","noLimits","_min","noMinLimit","_max","noMaxLimit","MAX_VALUE","dates","rDate","each","noLim","lim","_daysInMonth","valid","_dateCmp","_fitDateToRange","_isValidDate","_dateWithinRange","_dateAboveMax","_dateBelowMin","oth","_dateCmpUntil","depth","_getPrevMonth","_getNextMonth","dataParsed","_parseDate","_setDate","inc","_incrementViewingYear","firstYear","thisYear","yearUl","prevYearLi","_getYearButton","nextYearLi","_acceptableYear","li","data-cal-year","_addMonthClassNames","dateStr","yearRegExp","validOneOrTwo","_isDate","_acceptableDay","_acceptableDateComponent","_acceptableMonth","userCb","_callUserCallbackBool","_writeDateInFormat","dateString","auxDate","objClicked","dt","_updateMonth","_y","_m","exceptions","incValue","_tryLeap","_getPrevYear","_getNextYear","atomName","directionName","advancer","maxOrMin","boundary","leapUserCb","_callUserCallbackDate","daysInThisMonth","_getNextDecade","decade","_getCurrentDecade","_getPrevDecade","_callUserCallbackBase","yyyy-mm-dd","yyyy/mm/dd","yy-mm-dd","yy/mm/dd","dd-mm-yyyy","dd/mm/yyyy","dd-mm-yy","dd/mm/yy","mm/dd/yyyy","mm-dd-yyyy","_getMonthCalendarHeader","_getDayButtons","_getFirstDayIndex","wDayFirst","getDay","daysInMonth","ul","firstDayIndex","_getDayButton","dayButton","_addMonthButtonClassNames","btn","toDisable","showMonth","isMonthRendered","between","Draggable","constraint","constraintElm","handle","revert","zIndex","fps","droppableProxy","mouseAnchor","dragClass","skipChildren","onStart","onDrag","elmStartPosition","active","dragged","prevCoords","placeholder","zindex","firstDrag","deltaMs","lastRunAt","_onStart","dragFacade","_onDragFacade","drag","_onDrag","end","_onEnd","selectStart","_getCoords","ps","_cloneStyle","dst","borderWidth","padding","height","tgtEl","originalPosition","marginTop","marginBottom","marginLeft","marginRight","visibility","delta2","ad","applyDelta","dragHandlerName","proxy","fs","backgroundColor","firstEl","mouseCoords","mPosX","mPosY","newX","newY","draggableSize","constTop","constBottom","constLeft","constRight","Droppable","updateAll","mouseCoords2","action","pt","Element","pageWideFocusListener","onlyWrapper","_removePageWideFocusListener","mouseIsDown","focusFirstFocusableElementInside","withTabIndex","lowestTabIndex","lowestTabIndexElm","ind","firstFocusable","sFocusableElms","elNotFound","Drawer","transitionSupport","transitions","WebkitTransitionProperty","styleProp","parentSelector","leftDrawer","leftTrigger","rightDrawer","rightTrigger","contentDrawer","mode","sides","validateSide","side","drawer","triggers","atLeastOneSide","errorMsg","drawerOption","triggerOption","_contentDrawers","_leftDrawer","_leftTriggers","_rightDrawer","_rightTriggers","_triggers","_isOpen","_direction","click","afterTransition","_afterTransition","_addEvents","clickedTrigger","_onTriggerClicked","clickedInContent","clickedInLink","close","_getRecentDrawer","direction","drawerEl","_transitionWillOccur","uselessValue","lastFocused","didFocus","insideDrawer","transitioning","Toggle","Dropdown","hoverOpen","dismissOnInsideClick","dismissOnOutsideClick","dismissAfter","onInsideClick","onOutsideClick","onOpen","onDismiss","_toggle","closeOnInsideClick","closeOnClick","onChangeState","newState","_openOrDismiss","_onMouseOver","getState","_openTimeout","_dismissTimeout","_onMouseOut","_onInsideClick","_handlerCall","dismiss","_onOutsideClick","foundElem","needle","foundTarget","callHandler","_doNotInformToggle","setState","hAddClassName","hRemoveClassName","_droppables","_draggables","cleanStyle","draggable","opt","hoverClass","hoverclass","accept","onHover","onDrop","onDropOut","namedEventHandlers","move","droppable","copy","cloneNode","_findDraggable","originalParent","elementData","_update","_findData","elms","update","coords","InkValidator","elementsWithSameName","everything","FormValidator","_flagMap","ink-fv-required","ink-fv-email","ink-fv-url","ink-fv-number","ink-fv-phone_pt","ink-fv-phone_cv","ink-fv-phone_mz","ink-fv-phone_ao","ink-fv-date","ink-fv-confirm","ink-fv-custom","confirmElms","hasConfirm","_errorClassName","_errorValidationClassName","_errorTypeWarningClassName","_errorTypeErrorClassName","validate","_free","onError","customFlag","confirmGroup","fail","_validateElements","_showError","_clearError","_clearCache","_getElements","formElms","curElm","totalElm","flag","flag2","oGroups","_makeConfirmGroups","errors","customErrors","_isValid","_isCustomValid","_validateConfirmGroups","curGroup","totalG","curFlag","tCustom","fieldType","inputType","_trim","aFormRadios","totalRadio","mail","isPTPhone","isCVPhone","isAOPhone","isMZPhone","validFormat","validValues","isDate","formElm","aFail","tFail","_showAnErrorOnElement","controlGroupElm","controlElm","errorClasses","_errorTypeClassName","aErrorLabel","control","aErrorLabel2","I18n","FormElement","validationFunctions","min_length","minSize","max_length","maxSize","exact_length","exactSize","email","fullCheck","ip","ipType","isIP","phone","phoneType","countryCode","credit_card","cardType","isCreditCard","alpha","supportSpaces","ascii","singleLineWhitespace","punctuation","unicode","unicodePunctuation","latin","latin1","latin1Punctuation","alpha_numeric","numbers","alpha_dash","dash","underscore","digit","positive","negative","decimalPlaces","decimal","decimalSeparator","leftDigits","decimalSep","maxDigits","numeric","minValue","maxValue","multipleOf","color","isColor","fieldToCompare","otherField","getFormElements","otherFieldValue","getValue","_rules","validationMessages","en_US","formvalidator.required","formvalidator.min_length","formvalidator.max_length","formvalidator.exact_length","formvalidator.email","formvalidator.url","formvalidator.ip","formvalidator.phone","formvalidator.credit_card","formvalidator.date","formvalidator.alpha","formvalidator.text","formvalidator.latin","formvalidator.alpha_numeric","formvalidator.alpha_dash","formvalidator.digit","formvalidator.integer","formvalidator.decimal","formvalidator.numeric","formvalidator.range","formvalidator.color","formvalidator.matches","formvalidator.validation_function_not_found","pt_PT","label","_errors","_value","_getLabel","_parseRules","rulesLength","paramStartPos","_addError","paramObj","field","i18nKey","getErrors","_formElements","doValidate","eventTrigger","neverSubmit","searchFor","beforeValidation","setRule","errorMessage","getKey","langObj","dictObj","append","getI18n","setI18n","i18n","appendI18n","setLanguage","getRules","_rootElement","_errorMessages","_markedErrorElements","getElements","formElements","formElement","_getOrCreateFormElementInstance","errorElement","errorElements","counter","controlGroupElement","controlElement","paragraph","errorArr","ImageQuery","retina","queries","onLoad","lastIndexOf","_filename","sortMulti","reverse","_onLoad","_onResize","_findCurrentQuery","getQuerySrc","query","devicePixelRatio","LazyLoad","item","source","scrollElement","touchEvents","onInsideViewport","onAfterAttributeChange","autoInit","_aData","_hasEvents","_activate","_getData","_onScrollThrottled","aElms","_onScroll","_removeEvents","_elInViewport","_userCallback","reload","upName","dimension","firstCharacter","maxName","Modal","opacitySupported","openModals","shadeClass","modalClass","triggerEvent","autoDisplay","markup","onShow","closeOnEscape","responsive","_onShadeClick","keyDown","_onKeyDown","resize","_markupMode","_modalDiv","_modalShadow","_contentContainer","setContentMarkup","triggerElements","_reposition","isPercentage","currentViewport","originalStatus","_resizeContainer","_shadeElement","alertsInTheModal","alertsLength","containerHeight","_modalHeader","_modalFooter","isOpen","compatMode","_contentElement","_waitForFade","keyValue","htmlEl","fadeChecks","fadeChecker","getContentElement","contentMarkup","tempHeader","tempFooter","toAdd","genAEl","aEl","wrapText","spanEl","totalItemCount","itemsPerPage","sideButtons","firstLabel","lastLabel","previousLabel","nextLabel","previousPageLabel","nextPageLabel","hashParameter","parentTag","childTag","wrapperClass","paginationClass","activeClass","disabledClass","hideClass","previousClass","previousPageClass","nextClass","nextPageClass","firstClass","lastClass","numberFormatter","autoWrap","_size","_calculateSize","_current","_itemLiEls","_generateMarkup","_updateItems","_observe","count","liEls","isSimpleToggle","liEl","_nextEl","pi","pf","_pageStart","_pageEnd","_page","_prevPageEl","hasPreviousPage","_nextPageEl","hasNextPage","_firstEl","isFirst","_lastEl","isLast","_prevEl","hasPrevious","hasNext","hasUlAlready","isChevron","isDotted","createLiEl","isPrev","isNext","isPrevPage","isNextPage","aElem","nr","sz","setSizeInItems","totalItems","pageNumber","isRelative","next","previous","getSize","ProgressBar","startValue","_elementBar","setValue","newValue","cancelAnimationFrame","SmoothScroller","speed","changeHash","endPos","interval","onDone","onClick","render","link","thisDocument","linkedDocument","activeLiSelector","activeLi","Events","SortableList","hasTouch","maxTouchPoints","msMaxTouchPoints","placeholderClass","draggedClass","draggingClass","dragSelector","handleSelector","moveSelector","swap","cancelMouseOut","down","_onDown","_onMove","up","_onUp","_isMoving","_down","_move","_up","stopMoving","_placeholder","_movePlaceholder","_addMovingClasses","touch","elementFromPoint","validateMove","droppedElement","_removeMovingClasses","target_position","placeholder_position","from_top","from_left","targetIndex","spyTargets","addSpied","spied","observeOnScroll","observingOnScroll","onScroll","onScrollForTarget","activeEl","findActiveElement","toDeactivate","menuLinkSelector","toActivate","closest","Infinity","closestIndex","bBox","Spy","Stacker","column","customBreakPoints","largeMax","largeMin","mediumMax","mediumMin","smallMax","smallMin","largeCols","mediumCols","smallCols","isOrdered","onRunCallback","onResizeCallback","onAPIReloadCallback","_aList","_curLayout","_runFirstTime","_getPageItemsToList","_canApplyLayoutChange","_applyLayoutChange","addItem","reloadItems","_removeDomItems","_setCurLayout","customBreakpoints","_getColumnsToShow","cols","curLayout","_aColumn","totalCols","aItems","aNewList","ii","countCol","Sticky","offsetBottom","topElement","stickyClass","inlineDimensions","inlinePosition","bottomElement","activateInLayouts","_dims","scrollTarget","_isDisabledInLayout","_getDims","unstick","_unstick","bottomOfSticky","maxBottomOfSticky","_stickTo","_inlineDimensions","_getBottomOffset","bottomOfViewport","toBottomOfDocument","oldPosition","oldWidth","dimensionsInStatic","Swipe","onMove","minDist","maxDist","minDuration","maxDuration","storeGesture","stopEvents","_supported","db","_isOn","_isMeOrParent","_pushGesture","_gesture","_time","changedTouches","_target","_t0","_p0","t1","gesture","p1","dr","dist","sqrt","time","overallMovement","overallTime","InkUrl","InkString","Json","maybeTurnIntoNumber","rNumber","cmp","numberishEnabledCmp","aValue","bValue","Table","sameSame","pageSize","caretUpClass","caretDownClass","createEndpointUrl","createEndpointURL","getDataFromEndPoint","getDataFromEndpoint","processJSONRows","rows","processJSONRow","processJSONField","processJSONHeaders","processJSONTotalRows","totalRows","getSortKey","allowResetSorting","visibleFields","tdClassNames","paginationOptions","_thead","tHead","createTHead","_headers","thClick","_originalFields","_sortableFields","_originalData","_data","_totalRows","_resetSortOrder","_addHeadersClasses","_setPagination","headerLabel","classNames","_onThClick","paginated","sortable","_invertSortOrder","_setSortOrderOfColumn","row","_paginate","sortAndReverse","isAscending","_sort","caretHtml","order","firstIndex","lastIndex","_registerFieldNames","_fieldIsVisible","userKey","keyFunction","columnIndex","columnName","trA","trB","elementA","elementB","_createHeadersFromJson","tr","insertRow","th","_createSingleHeaderFromJson","_createRowsFromJSON","trIndex","_createSingleRowFromJson","rowIndex","_createFieldFromJson","fieldData","processor","_elOrFieldData","processed","isNumber","setEndpoint","currentPage","paginationEl","pageNo","_getSortOrder","_getDataViaAjax","_getUrl","urlCreator","parseUrl","sortField","endpointUri","success","JSONData","_onAjaxSuccess","jsonResponse","_rowLength","Tabs","preventUrlChange","onBeforeChange","menuSelector","contentSelector","triggerEventsOnLoad","_menu","_initializeDom","_setFirstActive","contentTabs","activeMenuLink","_findLinkByHref","_changeTab","runCallbacks","activeTabs","_activeMenuTab","_activeSection","_activeMenuLink","_onTabClickedGeneric","doChangeTab","_onTabClicked","tabElm","_dehashify","changeTab","_hashify","links","disable","enable","activeTab","activeSection","TagField","enterKey","backspaceKey","isTruthy","buggySplit","splitFunction","nativeSplit","compliantExecNpcg","separator","limit","output","flags","ignoreCase","multiline","extended","sticky","lastLastIndex","separator2","lastLength","tags","tagQuery","tagQueryAsync","allowRepeated","maxTags","outSeparator","autoSplit","_readInput","_viewElm","_input","_tagsFromMarkup","_tags","_onKeyUp","_onBlur","_refocus","tagname","option","_tagsToMarkup","_addTag","_removeTag","spc","_onEnterKeyDown","_onBackspaceKeyDown","_removeConfirm","_unsetRemovingVisual","_setRemovingVisual","tagIndex","_removeRemovingVisualTimeout","canToggleAnAncestor","isAccordion","initialState","classNameOn","classNameOff","_targets","_accordionContainer","_constructing","_bindEvents","state","_onTriggerEvent","isAncestorOfClickedElement","some","thisOne","_firstTime","_updateAccordion","otherToggle","shades","ancestorOfTargets","shadesLength","_group","Tooltip","EachTooltip","transitionDurationName","transitionPropertyName","transitionTimingFunctionName","bodies","spacing","forever","template","templatefield","fade","tooltips","tooltip","_destroy","_oppositeDirections","_onMouseMove","_delayTimeout","_makeTooltip","mousePosition","_getOpt","_createTooltipElement","_removeTooltip","_fadeInTooltipElement","_placeTooltipElement","_onTooltipMouseOver","_getFloatOpt","outerHTML","_getIntOpt","fadeTime","mPos","_setPos","targetElementPos","tleft","ttop","centerh","centerv","tooltipDims","elementDims","maxX","maxY","_getWhereValueInsideViewport","arrow","tooltipLeft","tooltipTop","toBottom","toRight","toLeft","toTop","viewport","dataAttrVal","instanceOption","_getMousePosition","pageDims","_getPageXY","elmDims","scrollDim","_getScroll","cWidth","cHeight","dd","TreeView","parentClass","openNodeClass","openClass","closedClass","iconTag","isParent","_getIcon","_setNodeOpen","_getChild","beOpen","icon","DirectoryReader","maxDepth","_read","_readDirectories","running","_readEntries","currentEntry","createReader","readEntries","isDirectory","clearArray","fullPath","_stopActivityTimeout","readError","activity","checkActivity","clearInterval","readComplete","setInterval","Queue","lists","items","getItems","parentId","purge","keepList","pid","priority","view","_searchByPid","UI","Upload","_fileButton","fileButton","_dropzone","dropzone","_setDropEvent","_setFileButton","dropzones","ondrop","_dropEventHandler","ondragleave","_onDragLeave","ondragend","_onDragEndEventHandler","ondragdrop","ondragenter","_onDragEnterHandler","ondragover","_onDragOverHandler","publish","btns","_fileChangeHandler","files","FormData","_addFilesToQueue","_events","fileFormName","maxFilesize","INVALID_FILE_NAME","extraData","useChunks","chunkSize","minSizeToUseChunks","endpointChunk","endpointChunkCommit","foldersEnabled","directoryMaxDepth","_queueId","_queueRunning","_folders","_supportChunks","Blob","dataTransfer","_files","webkitGetAsEntry","folders","_addFolderToQueue","invalidFolders","getFiles","isFile","convertToFile","hasParent","getSubDirs","created","fileID","directory","_processQueue","internalUpload","queueLen","canceled","_doRequest","_upload","xhr","forceAbort","showError","lengthComputable","loaded","lastModifiedDate","upload","onprogress","chunk_offset","chunk_upload_id","fd","blob","upload_path","parentID","rootPath","invalidOffset","upload_id","chunk_expires","expires","onabort","abortAll","abortOne","subscribe","arrayProto","testedObject","outKey","latestGroup","initial","aKeys","shuffle","tmp1","rnd","mapFn","filtered","intersect","arr1","arr2","shared","J","convert","unique","newArr","step","insert","rLen","iLen","Packer","fit","blocks","block","findNode","splitNode","used","GrowingPacker","growNode","canGrowDown","canGrowRight","shouldGrowRight","shouldGrowDown","growRight","growDown","sorts","area","msort","maxside","criteria","BinPack","binPack","bl","packer","sorter","dims2","fitted","unfitted","filled","Cookie","cookie","_Cookie","aCookie","aItem","decodeURIComponent","domain","secure","sName","sExpires","sPath","sDomain","sSecure","oDate","sDate","valueOf","nDate","expiresString","toGMTString","hostname","cookieName","expiresDate","_months","_iMonth","janeiro","jan","fevereiro","fev","março","mar","abril","abr","maio","mai","junho","jun","julho","jul","agosto","ago","setembro","outubro","novembro","nov","dezembro","dez","_wDays","_d","_iWeek","week","segunda","seg","terça","ter","quarta","qua","quinta","qui","sexta","sex","sábado","sáb","domingo","dom","nDays","_date","iFormat","escapeChar","jsDate","jsFirstDay","jsThisDay","jsHour","jsDay","suffixes","suffix","UTC","jsYearStart","days","jsMonth","getYear","jsYear","getHours","jsMinute","getMinutes","jsSecond","getSeconds","getTimezoneOffset","jsMinZone","jsMinutes","jsDayName","jsMonthName","str_date","mList","objIndex","dayY","dayW","hour","hourD","sec","msec","ampm","diffM","diffH","pattr","_haveDatetime","_haveYear","_haveYDay","_haveDay","_haveMonth","_haveMonthDay","_haveOnlyDay","_haveWDay","_haveWeek","_haveWeekWDay","_haveOnlyWDay","_validDate","_noDate","_haveHour12","_haveHour24","_haveHour","_haveMin","_haveSec","_haveMSec","_haveMoreM","_haveMoreS","_haveDiffM","_haveDiffH","dList","gmt","aux","Dumper","_tab","_formatParam","param","formated","_outputFormat","_getTabs","numberOfTabs","tabs","_i","indent","_typeof","printDump","write","returnDump","alertDump","windowDump","dumperwindow","pattrText","funcOrVal","dict","testMode","_dicts","_dict","_testMode","_gLang","newTestMode","gLang","langGlobal","_gDict","pars","isObj","$2","$3","ntext","strSin","strPlur","ordinal","num","lastDig","ordDict","byLastDigit","alias","_gDicts","appendGlobal","twoDigits","function_call","cx","dateToISOString","toISOString","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","toFixed","InkJson","_nativeJSON","_convertToUnicode","_escape","theString","\b","\t","\n","\f","\r","\"","\\","charCodeAt","_toUnicode","unicodeString","inInt","theUnicode","_stringifyValue","toJSON","arrayString","objectString","convertToUnicode","reviver","walk","holder","SyntaxError","InkUtilString","_chars","_entities","_accentedChars","_accentedRemovedChars","_htmlUnsafeChars","<","&","'","ucFirst","firstWordOnly","replacer","stripTags","allowed","aAllowed","aNewAllowed","cleanedTag","strAllowed","reAllowed","aFoundTags","htmlEntitiesEncode","htmlEntitiesDecode","$0","utf8Encode","utfstring","shortString","words","resultstr","truncateString","utf8Decode","c2","c3","removeAccentedChars","newString","substrCount","haystack","htmlEscapeUnsafe","chars","normalizeWhitespace","toUnicode","unescape","es","hexNum","escapeText","txt","whiteList","txt2","C","escapedCharRegex","unescapeText","strcmp","str1","str2","packetize","maxLen","_keyStr","getUrl","getQueryString","aParams","queryStr","aQueryStr","pairVar","getAnchor","anchor","anchorStr","aAnchorStr","aURL","scheme","host","re1","re2","re3","regPort","tmpHost1","port","tmpHost2","tmpUserPass","user","urlObj","frag","currentScriptElement","aScripts","curScript","Validator","_countryCodes","_internacionalPT","_indicativosPT",21,22,231,232,233,234,235,236,238,239,241,242,243,244,245,249,251,252,253,254,255,256,258,259,261,262,263,265,266,268,269,271,272,273,274,275,276,277,278,279,281,282,283,284,285,286,289,291,292,295,296,91,93,96,92,707,760,800,808,30,"_internacionalCV","_indicativosCV",95,97,98,99,"_internacionalAO","_indicativosAO","_internacionalMZ","_indicativosMZ",82,84,"_internacionalTL","_indicativosTL","_characterGroups","asciiAlpha","latin1Alpha","unicodeAlpha","space","nicknamePunctuation","newline","asciiPunctuation","createRegExp","checkCharacterGroups","numb","thousandSep","returnNumber","maxExcl","minExcl","_isLeapYear","parser","emailValido","full","reHTTP","reUrl","aInd","strInd","re351","reSpecialChars","reInt","reValid","isPortuguesePhone","re238","re244","re258","isTLPhone","re670","isPhone","codPostal","cp1","cp2","returnBothResults","cPostalSep","cPostal4","cPostal3","parserCPostal","cPostal","yearIndex","monthIndex","dayIndex","dateParser","keyword","hexa","rgba","hsl","hsla","_creditCardSpecs","default","luhn","american express","diners club","discover","jcb","maestro","mastercard","visa","_luhn","checksum","dbl","creditCardType","ccLength"],"mappings":"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","sourcesContent":["/**\n * Ink Core.\n * @module Ink_1\n * This module provides the necessary methods to create and load the modules using Ink.\n */\n\n;(function(window, document) {\n\n 'use strict';\n\n // skip redefinition of Ink core\n if ('Ink' in window) { return; }\n\n\n // internal data\n\n /*\n * NOTE:\n * invoke Ink.setPath('Ink', '/Ink/'); before requiring local modules\n */\n var paths = {};\n var modules = {};\n var modulesLoadOrder = [];\n var modulesRequested = {};\n var pendingRMs = [];\n var modulesWaitingForDeps = {};\n\n var apply = Function.prototype.apply;\n\n // auxiliary fns\n var isEmptyObject = function(o) {\n /*jshint unused:false */\n if (typeof o !== 'object') { return false; }\n for (var k in o) {\n if (o.hasOwnProperty(k)) {\n return false;\n }\n }\n return true;\n };\n\n /**\n * @namespace Ink_1\n */\n\n window.Ink = {\n /**\n * @property {String} VERSION\n **/\n VERSION: '3.1.2',\n _checkPendingRequireModules: function() {\n var I, F, o, dep, mod, cb, pRMs = [];\n var toApply = [];\n for (I = 0, F = pendingRMs.length; I < F; ++I) {\n o = pendingRMs[I];\n\n if (!o) { continue; }\n\n for (dep in o.left) {\n if (o.left.hasOwnProperty(dep)) {\n mod = modules[dep];\n if (mod) {\n o.args[o.left[dep] ] = mod;\n delete o.left[dep];\n --o.remaining;\n }\n }\n }\n\n if (o.remaining > 0) {\n pRMs.push(o);\n } else {\n cb = o.cb;\n if (!cb) { continue; }\n delete o.cb; // to make sure I won't call this more than once!\n toApply.push([cb, o.args]);\n }\n }\n\n pendingRMs = pRMs;\n\n for (var i = 0; i < toApply.length; i++) {\n toApply[i][0].apply(false, toApply[i][1]);\n }\n\n if (pendingRMs.length > 0) {\n setTimeout( function() { Ink._checkPendingRequireModules(); }, 0 );\n }\n },\n\n /**\n * Get the full path of a module.\n * This method looks up the paths given in setPath (and ultimately the default Ink's path).\n *\n * @method getPath\n * @param {String} key Name of the module you want to get the path\n * @param {Boolean} [noLib] Flag to skip appending 'lib.js' to the returned path.\n *\n * @return {String} The URI to the module, according to what you added in setPath for the given `key`.\n */\n getPath: function(key, noLib) {\n var split = key.split(/[._]/g);\n var curKey;\n var i;\n var root;\n var path;\n\n // Look for Ink.Dom.Element.1, Ink.Dom.Element, Ink.Dom, Ink in this order.\n for (i = split.length; i >= 0; i -= 1) {\n curKey = split.slice(0, i + 1).join('.'); // See comment in setPath\n if (paths[curKey]) {\n root = curKey;\n break;\n }\n }\n\n if (root in paths) {\n path = paths[root];\n } else {\n return null;\n }\n\n if (!/\\/$/.test(path)) {\n path += '/';\n }\n if (i < split.length) {\n // Add the rest of the path. For example, if we found\n // paths['Ink.Dom'] to be 'http://example.com/Ink/Dom/',\n // we now add '/Element/' to get the full path.\n path += split.slice(i + 1).join('/') + '/';\n }\n if (!noLib) {\n path += 'lib.js';\n }\n return path;\n },\n\n /**\n * Sets the URL path for a namespace.\n * Use this to customize where requireModules and createModule will load dependencies from.\n * This can be useful to set your own CDN for dynamic module loading or simply to change your module folder structure\n *\n * @method setPath\n *\n * @param {String} key Module or namespace\n * @param {String} rootURI Base URL path and schema to be appended to the module or namespace\n * @return {void}\n *\n * @example\n * Ink.setPath('Ink', 'http://my-cdn/Ink/');\n * Ink.setPath('Lol', 'http://my-cdn/Lol/');\n *\n * // Loads from http://my-cdn/Ink/Dom/Whatever/lib.js\n * Ink.requireModules(['Ink.Dom.Whatever'], function () { ... });\n * // Loads from http://my-cdn/Lol/Whatever/lib.js\n * Ink.requireModules(['Lol.Whatever'], function () { ... });\n */\n setPath: function(key, rootURI) {\n // Replacing version separator with dot because the difference\n // between a submodule and a version doesn't matter here.\n // It would also overcomplicate the implementation of getPath\n paths[key.replace(/_/, '.')] = rootURI;\n },\n\n /**\n * Loads a script URL.\n * This creates a `script` tag in the `head` of the document.\n * Reports errors by listening to 'error' and 'readystatechange' events.\n *\n * @method loadScript\n * @param {String} uri Can be an external URL or a module name\n * @param {String} [contentType]='text/javascript' The `type` attribute of the new script tag.\n * @return {Element} The newly created script element.\n */\n loadScript: function(uri, contentType) {\n /*jshint evil:true */\n\n if (uri.indexOf('/') === -1) {\n var givenUri = uri; // For the error message\n uri = this.getPath(uri);\n if (uri === null) {\n throw new Error('Could not load script \"' + givenUri + '\". ' +\n 'Path not found in the registry. Did you misspell ' +\n 'the name, or forgot to call setPath()?');\n }\n }\n\n var scriptEl = document.createElement('script');\n scriptEl.setAttribute('type', contentType || 'text/javascript');\n scriptEl.setAttribute('src', uri);\n\n if ('onerror' in scriptEl) {\n scriptEl.onerror = function () {\n Ink.error(['Failed to load script from ', uri, '.'].join(''));\n };\n }\n\n var head = document.head ||\n document.getElementsByTagName('head')[0];\n\n if (head) {\n return head.appendChild(scriptEl);\n }\n },\n\n _loadLater: function (dep) {\n setTimeout(function () {\n if (modules[dep] || modulesRequested[dep] ||\n modulesWaitingForDeps[dep]) {\n return;\n }\n modulesRequested[dep] = true;\n Ink.loadScript(dep);\n }, 0);\n },\n\n /**\n * Defines a module namespace.\n *\n * @method namespace\n * @param {String} ns Namespace to define.\n * @param {Boolean} [returnParentAndKey] Flag to change the return value to an array containing the namespace parent and the namespace key\n * @return {Object|Array} Returns the created namespace object\n */\n namespace: function(ns, returnParentAndKey) {\n if (!ns || !ns.length) { return null; }\n\n var levels = ns.split('.');\n var nsobj = window;\n var parent;\n\n for (var i = 0, f = levels.length; i < f; ++i) {\n nsobj[ levels[i] ] = nsobj[ levels[i] ] || {};\n parent = nsobj;\n nsobj = nsobj[ levels[i] ];\n }\n\n if (returnParentAndKey) {\n return [\n parent,\n levels[i-1]\n ];\n }\n\n return nsobj;\n },\n\n /**\n * Loads a module.\n * A synchronous method to get the module from the internal registry.\n * It assumes the module is defined and loaded already!\n *\n * @method getModule\n * @param {String} mod Module name\n * @param {Number} [version] Version number of the module\n * @return {Object|Function} Module object or function, depending how the module is defined\n */\n getModule: function(mod, version) {\n var key = version ? [mod, '_', version].join('') : mod;\n return modules[key];\n },\n\n /**\n * Creates a new module.\n * Use this to wrap your code and benefit from the module loading used throughout the Ink library\n *\n * @method createModule\n * @param {String} mod Module name, separated by dots. Like Ink.Dom.Selector, Ink.UI.Modal\n * @param {Number} version Version number\n * @param {Array} deps Array of module names which are dependencies of the module being created. The order in which they are passed here will define the order they will be passed to the callback function.\n * @param {Function} modFn The callback function to be executed when all the dependencies are resolved. The dependencies are passed as arguments, in the same order they were declared. The function itself should return the module.\n * @return {void}\n * @sample Ink_1_createModule.html\n *\n */\n createModule: function(mod, version, deps, modFn) { // define\n if (typeof mod !== 'string') {\n throw new Error('module name must be a string!');\n }\n\n // validate version correctness\n if (!(typeof version === 'number' || (typeof version === 'string' && version.length > 0))) {\n throw new Error('version number missing!');\n }\n\n var modAll = [mod, '_', version].join('');\n\n modulesWaitingForDeps[modAll] = true;\n\n var cb = function() {\n //console.log(['createModule(', mod, ', ', version, ', [', deps.join(', '), '], ', !!modFn, ')'].join(''));\n\n // make sure module in not loaded twice\n if (modules[modAll]) {\n //console.warn(['Ink.createModule ', modAll, ': module has been defined already.'].join(''));\n return;\n }\n\n\n // delete related pending tasks\n delete modulesRequested[modAll];\n delete modulesRequested[mod];\n\n\n // run module's supplied factory\n var args = Array.prototype.slice.call(arguments);\n var moduleContent = modFn.apply(window, args);\n modulesLoadOrder.push(modAll);\n // console.log('** loaded module ' + modAll + '**');\n\n\n // set version\n if (typeof moduleContent === 'object') { // Dom.Css Dom.Event\n moduleContent._version = version;\n }\n else if (typeof moduleContent === 'function') {\n moduleContent.prototype._version = version; // if constructor\n moduleContent._version = version; // if regular function\n }\n\n\n // add to global namespace...\n var isInkModule = mod.indexOf('Ink.') === 0;\n var t;\n if (isInkModule) {\n t = Ink.namespace(mod, true); // for mod 'Ink.Dom.Css', t[0] gets 'Ink.Dom' object and t[1] 'Css'\n }\n\n\n // versioned\n modules[ modAll ] = moduleContent; // in modules\n delete modulesWaitingForDeps[ modAll ];\n\n if (isInkModule) {\n t[0][ t[1] + '_' + version ] = moduleContent; // in namespace\n }\n\n\n // unversioned\n modules[ mod ] = moduleContent; // in modules\n\n if (isInkModule) {\n if (isEmptyObject( t[0][ t[1] ] )) {\n t[0][ t[1] ] = moduleContent; // in namespace\n }\n // else {\n // console.warn(['Ink.createModule ', modAll, ': module has been defined already with a different version!'].join(''));\n // }\n }\n\n\n if (this) { // there may be pending requires expecting this module, check...\n Ink._checkPendingRequireModules();\n }\n };\n\n this.requireModules(deps, cb);\n },\n\n /**\n * Requires modules asynchronously\n * Use this to get modules, even if they're not loaded yet\n *\n * @method requireModules\n * @param {Array} deps Array of module names. The order in which they are passed here will define the order they will be passed to the callback function.\n * @param {Function} cbFn The callback function to be executed when all the dependencies are resolved. The dependencies are passed as arguments, in the same order they were declared.\n * @return {void}\n * @sample Ink_1_requireModules.html\n */\n requireModules: function(deps, cbFn) { // require\n //console.log(['requireModules([', deps.join(', '), '], ', !!cbFn, ')'].join(''));\n var i, f, o, dep, mod;\n f = deps && deps.length;\n o = {\n args: new Array(f),\n left: {},\n remaining: f,\n cb: cbFn\n };\n\n if (!(typeof deps === 'object' && deps.length !== undefined)) {\n throw new Error('Dependency list should be an array!');\n }\n if (typeof cbFn !== 'function') {\n throw new Error('Callback should be a function!');\n }\n\n for (i = 0; i < f; ++i) {\n if (Ink._moduleRenames[deps[i]]) {\n Ink.warn(deps[i] + ' was renamed to ' + Ink._moduleRenames[deps[i]]);\n dep = Ink._moduleRenames[deps[i]];\n } else {\n dep = deps[i];\n }\n\n // Because trailing commas in oldIE bring us undefined values here\n if (!dep) {\n --o.remaining;\n continue;\n }\n\n mod = modules[dep];\n if (mod) {\n o.args[i] = mod;\n --o.remaining;\n continue;\n }\n else if (!modulesRequested[dep]) {\n Ink._loadLater(dep);\n }\n o.left[dep] = i;\n }\n\n if (o.remaining > 0) {\n pendingRMs.push(o);\n }\n else {\n cbFn.apply(true, o.args);\n }\n },\n\n _moduleRenames: {\n 'Ink.UI.Aux_1': 'Ink.UI.Common_1'\n },\n\n /**\n * Lists loaded module names.\n * The list is ordered by loaded time (oldest module comes first)\n *\n * @method getModulesLoadOrder\n * @return {Array} returns the order in which modules were resolved and correctly loaded\n */\n getModulesLoadOrder: function() {\n return modulesLoadOrder.slice();\n },\n\n /**\n * Builds the markup needed to load the modules.\n * This method builds the script tags needed to load the currently used modules\n *\n * @method getModuleScripts\n * @uses getModulesLoadOrder\n * @return {String} The script markup\n */\n getModuleScripts: function() {\n var mlo = this.getModulesLoadOrder();\n mlo.unshift('Ink_1');\n mlo = mlo.map(function(m) {\n return [''].join('');\n });\n\n return mlo.join('\\n');\n },\n\n /**\n * Creates an Ink.Ext module\n *\n * Does exactly the same as createModule but creates the module in the Ink.Ext namespace\n *\n * @method createExt\n * @uses createModule\n * @param {String} moduleName Extension name\n * @param {String} version Extension version\n * @param {Array} dependencies Extension dependencies\n * @param {Function} modFn Function returning the extension\n * @return {void}\n * @sample Ink_1_createExt.html\n */\n createExt: function (moduleName, version, dependencies, modFn) {\n return Ink.createModule('Ink.Ext.' + moduleName, version, dependencies, modFn);\n },\n\n /**\n * Function.prototype.bind alternative/fallback.\n * Creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called.\n *\n * @method bind\n * @param {Function} fn The function\n * @param {Object} context The value to be passed as the this parameter to the target function when the bound function is called. If used as false, it preserves the original context and just binds the arguments.\n * @param {Mixed} [more...] Additional arguments will be sent to the original function as prefix arguments.\n * @return {Function} A copy of `fn` bound to the given `context`. Calling this function causes a call to `fn` with the new `context` and any `more` arguments.\n * @sample Ink_1_bind.html\n */\n bind: function(fn, context) {\n var args = Array.prototype.slice.call(arguments, 2);\n return function() {\n var innerArgs = Array.prototype.slice.call(arguments);\n var finalArgs = args.concat(innerArgs);\n return fn.apply(context === false ? this : context, finalArgs);\n };\n },\n\n /**\n * Function.prototype.bind alternative for class methods\n * See Ink.bind. The difference between `bindMethod` and `bind` is that `bindMethod` fetches a method from an object. It can be useful, for instance, to bind a function which is a property of an object returned by another function.\n *\n * @method bindMethod\n * @uses bind\n * @param {Object} object The object that contains the method to bind\n * @param {String} methodName The name of the method that will be bound\n * @param {Mixed} [more...] Additional arguments will be sent to the new method as prefix arguments.\n * @return {Function} See Ink.bind.\n * @sample Ink_1_bindMethod.html\n */\n bindMethod: function (object, methodName) {\n return Ink.bind.apply(Ink,\n [object[methodName], object].concat([].slice.call(arguments, 2)));\n },\n\n /**\n * Function.prototype.bind alternative for event handlers.\n * Same as bind but keeps first argument of the call the original event.\n * Set `context` to `false` to preserve the original context of the function and just bind the arguments.\n *\n * @method bindEvent\n * @param {Function} fn The function\n * @param {Object} context The value to be passed as the this parameter to the target\n * @param {Mixed} [more...] Additional arguments will be sent to the original function as prefix arguments\n * @return {Function} A function which will always call `fn` with the given event (or window.event, in IE) as the first argument.\n * @sample Ink_1_bindEvent.html\n */\n bindEvent: function(fn, context) {\n var args = Array.prototype.slice.call(arguments, 2);\n return function(event) {\n var finalArgs = args.slice();\n finalArgs.unshift(event || window.event);\n return fn.apply(context === false ? this : context, finalArgs);\n };\n },\n\n /**\n * Shorter alias to document.getElementById.\n * Just calls `document.getElementById(id)`, unless `id` happens to be an element.\n * If `id` is an element, `Ink.i` just returns it.\n *\n * You can use this in situations where you want to accept an element id, but a raw element is also okay.\n *\n * @method i\n * @param {String} id Element ID\n * @return {DOMElement|null} The element returned by `document.getElementById(id)` if `id` was a string, and `id` otherwise.\n * @sample Ink_1_i.html\n */\n i: function(id) {\n if(typeof(id) === 'string') {\n return document.getElementById(id) || null;\n }\n return id;\n },\n\n /**\n * Alias for Ink.Dom.Selector\n *\n * Using sizzle-specific selectors is NOT encouraged!\n *\n * @method ss\n * @uses Ink.Dom.Selector.select\n * @param {String} selector CSS3 selector string\n * @param {DOMElement} [from=document] Context element. If set to a DOM element, the `selector` will only look for descendants of this DOM Element.\n * @return {Array} array of DOMElements\n * @sample Ink_1_ss.html\n */\n ss: function(selector, from)\n {\n if(typeof(Ink.Dom) === 'undefined' || typeof(Ink.Dom.Selector) === 'undefined') {\n throw new Error('This method requires Ink.Dom.Selector');\n }\n return Ink.Dom.Selector.select(selector, (from || document));\n },\n\n /**\n * Selects elements like `Ink.ss`, but only returns the first element found.\n *\n * Using sizzle-specific selectors is NOT encouraged!\n *\n * @method s\n * @uses Ink.Dom.Selector.select\n * @param {String} selector CSS3 selector string\n * @param {DOMElement} [from=document] Context element. If set to a DOM element, the `selector` will only look for descendants of this DOM Element.\n * @return {DOMElement} The first element found which matches the `selector`, or `null` if nothing is found.\n * @sample Ink_1_s.html\n */\n s: function(selector, from)\n {\n if(typeof(Ink.Dom) === 'undefined' || typeof(Ink.Dom.Selector) === 'undefined') {\n throw new Error('This method requires Ink.Dom.Selector');\n }\n return Ink.Dom.Selector.select(selector, (from || document))[0] || null;\n },\n\n /**\n * Extends an object with another\n * Copy all of the properties in one or more source objects over to the destination object, and return the destination object. It's in-order, so the last source will override properties of the same name in previous arguments.\n *\n * @method extendObj\n * @param {Object} destination The object that will receive the new/updated properties\n * @param {Object} source The object whose properties will be copied over to the destination object\n * @param {Object} [more...] Additional source objects. The last source will override properties of the same name in the previous defined sources\n * @return {Object} destination object, enriched with defaults from the sources\n * @sample Ink_1_extendObj.html\n */\n extendObj: function(destination/*, source... */) {\n var sources = [].slice.call(arguments, 1);\n\n for (var i = 0, len = sources.length; i < len; i++) {\n if (!sources[i]) { continue; }\n for (var property in sources[i]) {\n if(Object.prototype.hasOwnProperty.call(sources[i], property)) {\n destination[property] = sources[i][property];\n }\n }\n }\n\n return destination;\n },\n\n /**\n * Calls native console.log if available.\n *\n * @method log\n * @param {Mixed} [more...] Arguments to be evaluated\n * @return {void}\n * @sample Ink_1_log.html\n **/\n log: function () {\n // IE does not have console.log.apply in IE10 emulated mode\n var console = window.console;\n if (console && console.log) {\n apply.call(console.log, console, arguments);\n }\n },\n\n /**\n * Calls native console.warn if available.\n *\n * @method warn\n * @param {Mixed} [more...] Arguments to be evaluated\n * @return {void}\n * @sample Ink_1_warn.html\n **/\n warn: function () {\n // IE does not have console.log.apply in IE10 emulated mode\n var console = window.console;\n if (console && console.warn) {\n apply.call(console.warn, console, arguments);\n }\n },\n\n /**\n * Calls native console.error if available.\n *\n * @method error\n * @param {Mixed} [more...] Arguments to be evaluated\n * @return {void}\n * @sample Ink_1_error.html\n **/\n error: function () {\n // IE does not have console.log.apply in IE10 emulated mode\n var console = window.console;\n if (console && console.error) {\n apply.call(console.error, console, arguments);\n }\n }\n };\n\n\n // TODO for debug - to detect pending stuff\n /*\n var failCount = {}; // fail count per module name\n var maxFails = 3; // times\n var checkDelta = 0.5; //seconds\n\n var tmpTmr = setInterval(function() {\n var mk = Object.keys(modulesRequested);\n var l = mk.length;\n\n if (l > 0) {\n // console.log('** waiting for modules: ' + mk.join(', ') + ' **');\n\n for (var i = 0, f = mk.length, k, v; i < f; ++i) {\n k = mk[i];\n v = failCount[k];\n failCount[k] = (v === undefined) ? 1 : ++v;\n\n if (v >= maxFails) {\n console.error('** Loading of module ' + k + ' failed! **');\n delete modulesRequested[k];\n }\n }\n }\n else {\n // console.log('** Module loads complete. **');\n clearInterval(tmpTmr);\n }\n }, checkDelta*1000);\n */\n}(window, document));\n","/**\n * Cross Browser Ajax requests\n * @module Ink.Net.Ajax_1\n * @version 1\n */\n\nInk.createModule('Ink.Net.Ajax', '1', [], function() {\n 'use strict';\n\n /**\n * Creates a new XMLHttpRequest object\n *\n * @class Ink.Net.Ajax\n * @constructor\n *\n * @param {String} url Request URL\n * @param {Object} [options] Request options, containing:\n * @param {Boolean} [options.asynchronous=true] If false, the request synchronous.\n * @param {String} [options.contentType] Content-type header to be sent. Defaults to 'application/x-www-form-urlencoded'\n * @param {Boolean} [options.cors] Flag to activate CORS. Set this to true if you're doing a cross-origin request\n * @param {Boolean} [options.validateCors] If this is set to `true`, perform a CORS request automatically based on the URL being cross-domain or not.\n * @param {Number} [options.delay] Artificial delay. If the request is completed faster than this delay, wait the remaining time before executing the callbacks\n * @param {Boolean|String} [options.evalJS=true] If the request Content-type header is application/json, evaluates the response and populates responseJSON. Use 'force' if you want to force the response evaluation, no matter what Content-type it's using.\n * @param {String} [options.method='POST'] HTTP request method. POST by default.\n * @param {Object|String} [options.parameters] Request parameters to be sent with the request\n * @param {String} [options.postBody] POST request body. If not specified, it's filled with the contents from parameters\n * @param {Object} [options.requestHeaders] Key-value pairs for additional request headers\n * @param {Boolean} [options.sanitizeJSON] Flag to sanitize the content of responseText before evaluation\n * @xparam {Boolean} [options.signRequest=false] Send a \"X-Requested-With: XMLHttpRequest\" header in the request.\n * @param {Number} [options.timeout] Request timeout in seconds\n * @param {String} [options.xhrProxy] URI for proxy service hosted on the same server as the web app, that can fetch documents from other domains. The service must pipe all input and output untouched (some input sanitization is allowed, like clearing cookies). e.g., requesting http://example.org/doc can become /proxy/http%3A%2F%2Fexample.org%2Fdoc The proxy service will be used for cross-domain requests, if set, else a network error is returned as exception.\n * @param {Function} [options.onComplete] Callback executed after the request is completed, regardless of what happened during the request.\n * @param {Function} [options.onCreate] Callback executed after object initialization but before the request is made\n * @param {Function} [options.onException] Callback executed if an exception occurs. Receives the exception as a parameter.\n * @param {Function} [options.onFailure] Callback executed if the request fails (requests with status codes different from 2xx)\n * @param {Function} [options.onHeaders] Callback executed when headers of the response arrive.\n * @param {Function} [options.onInit] Callback executed before any initialization\n * @param {Function} [options.onSuccess] Callback executed if the request is successful (requests with 2xx status codes)\n * @param {Function} [options.onTimeout] Callback executed if the request times out\n *\n * @sample Ink_Net_Ajax_1.html \n */\n var Ajax = function(url, options){\n this.init(url, options);\n };\n\n /**\n * Options for all requests. These can then be overriden for individual ones.\n */\n Ajax.globalOptions = {\n parameters: {},\n requestHeaders: {}\n };\n\n\n // IE10 does not need XDomainRequest\n var xMLHttpRequestWithCredentials = 'XMLHttpRequest' in window && 'withCredentials' in (new XMLHttpRequest());\n\n\n\n Ajax.prototype = {\n\n init: function(url, userOptions) {\n if (!url) {\n throw new Error(\"new Ink.Net.Ajax: Pass a url as the first argument!\");\n }\n var options = Ink.extendObj({\n asynchronous: true,\n contentType: 'application/x-www-form-urlencoded',\n cors: false,\n validateCors: false,\n debug: false,\n delay: 0,\n evalJS: true,\n method: 'POST',\n parameters: null,\n postBody: '',\n requestHeaders: null,\n sanitizeJSON: false,\n signRequest: false,\n timeout: 0,\n useCredentials: false,\n xhrProxy: '',\n onComplete: null,\n onCreate: null,\n onException: null,\n onFailure: null,\n onHeaders: null,\n onInit: null,\n onSuccess: null,\n onTimeout: null\n }, Ajax.globalOptions);\n\n if (userOptions && typeof userOptions === 'object') {\n options = Ink.extendObj(options, userOptions);\n\n\n if (typeof userOptions.parameters === 'object') {\n options.parameters = Ink.extendObj(Ink.extendObj({}, Ajax.globalOptions.parameters), userOptions.parameters);\n } else if (userOptions.parameters !== null) {\n var globalParameters = this.paramsObjToStr(Ajax.globalOptions.parameters);\n if (globalParameters) {\n options.parameters = userOptions.parameters + '&' + globalParameters;\n }\n }\n\n options.requestHeaders = Ink.extendObj({}, Ajax.globalOptions.requestHeaders);\n options.requestHeaders = Ink.extendObj(options.requestHeaders, userOptions.requestHeaders);\n }\n\n this.options = options;\n\n this.safeCall('onInit');\n\n this.url = url;\n\n var urlLocation = this._locationFromURL(url);\n this.isHTTP = this._locationIsHTTP(urlLocation);\n this.isCrossDomain = this._locationIsCrossDomain(urlLocation, location);\n\n this.requestHasBody = options.method.search(/^get|head$/i) < 0;\n\n if (this.options.validateCors === true) {\n this.options.cors = this.isCrossDomain;\n }\n\n if(this.options.cors) {\n this.isCrossDomain = false;\n }\n\n this.transport = this.getTransport();\n\n this.request();\n },\n\n /**\n * Returns a location object from an URL\n *\n * @method _locationFromUrl\n * @param {String} url Input url\n * @return {Location} An `` element with `href` set to the given URL.\n * @private\n **/\n _locationFromURL: function (url) {\n var urlLocation = document.createElementNS ?\n document.createElementNS('http://www.w3.org/1999/xhtml', 'a') :\n document.createElement('a');\n urlLocation.setAttribute('href', url);\n return urlLocation;\n },\n\n /**\n * Checks whether a location is HTTP or HTTPS\n *\n * @method locationIsHttp\n * @param {Location} urlLocation Location object or `` element representing the current location.\n * @return {Boolean} `true` if the location is HTTP or HTTPS, `false` otherwise.\n * @private\n */\n _locationIsHTTP: function (urlLocation) {\n return urlLocation.href.match(/^https?:/i) ? true : false;\n },\n\n /**\n * Checks whether a location is cross-domain from ours.\n *\n * @method _locationIsCrossDomain\n * @param {Location} urlLocation A Location object or an `` elemnt.\n * @param {Location} [location=window.location] A location representing this one. This argument only exists for testing. Don't use it.\n * @return {Boolean} `true` if the locations are in different domains (in which case we need to perform a cross-domain request)\n * @private\n */\n _locationIsCrossDomain: function (urlLocation, location) {\n // TODO because of oldIE compatibility, we can only use .href (the full URL), and none of the other useful properties one can find in Location elements. So we should just pass pure strings around. Not only here.\n location = location || window.location;\n if (!Ajax.prototype._locationIsHTTP(urlLocation) || location.protocol === 'widget:' || typeof window.widget === 'object') {\n return false;\n } else {\n var split1 = urlLocation.href.split('//');\n var split2 = location.href.split('//');\n\n if (split1.length === 1 || split2.length === 1) {\n // This occurs when there's no protocol string in either URL\n // Only happens in IE7 because setting the \"href\" of a link doesn't make that link show you the full URL when the URI is relative to this host.\n // So we have our answer.\n // If there's no protocol string\n // We know for sure that our `urlLocation` is relative\n // In which case, they are in the same domain.\n return false;\n }\n\n var protocol1 = split1[0];\n var protocol2 = split2[0];\n\n var colonOrSlash = /:|\\//; // Finds colons or slashes, which are the end of hostnames (without ports)\n\n var host1 = split1[1].split(colonOrSlash)[0];\n var host2 = split2[1].split(colonOrSlash)[0];\n\n return protocol1 !== protocol2 ||\n host1 !== host2;\n }\n },\n\n /**\n * Creates the appropriate XMLHttpRequest object, depending on our browser and whether we're trying to perform a cross-domain request.\n *\n * @method getTransport\n * @return {Object} XMLHttpRequest object\n * @private\n */\n getTransport: function()\n {\n /*global XDomainRequest:false, ActiveXObject:false */\n if (!xMLHttpRequestWithCredentials && this.options.cors && 'XDomainRequest' in window) {\n this.usingXDomainReq = true;\n return new XDomainRequest();\n }\n else if (typeof XMLHttpRequest !== 'undefined') {\n return new XMLHttpRequest();\n }\n else if (typeof ActiveXObject !== 'undefined') {\n try {\n return new ActiveXObject('Msxml2.XMLHTTP');\n } catch (e) {\n return new ActiveXObject('Microsoft.XMLHTTP');\n }\n } else {\n return null;\n }\n },\n\n /**\n * Set the necessary headers for an ajax request.\n *\n * @method setHeaders\n * @return {void}\n */\n setHeaders: function()\n {\n if (this.transport) {\n try {\n var headers = {\n \"Accept\": \"text/javascript,text/xml,application/xml,application/xhtml+xml,text/html,application/json;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1\",\n \"Accept-Language\": navigator.language,\n \"X-Requested-With\": \"XMLHttpRequest\",\n \"X-Ink-Version\": \"3\"\n };\n if (this.options.cors) {\n if (!this.options.signRequest) {\n delete headers['X-Requested-With'];\n }\n delete headers['X-Ink-Version'];\n }\n\n if (this.options.requestHeaders && typeof this.options.requestHeaders === 'object') {\n for(var headerReqName in this.options.requestHeaders) {\n if (this.options.requestHeaders.hasOwnProperty(headerReqName)) {\n headers[headerReqName] = this.options.requestHeaders[headerReqName];\n }\n }\n }\n\n if (this.transport.overrideMimeType && (navigator.userAgent.match(/Gecko\\/(\\d{4})/) || [0,2005])[1] < 2005) {\n headers.Connection = 'close';\n }\n\n for (var headerName in headers) {\n if(headers.hasOwnProperty(headerName)) {\n this.transport.setRequestHeader(headerName, headers[headerName]);\n }\n }\n } catch(e) {}\n }\n },\n\n /**\n * Converts an object with parameters to a querystring\n *\n * @method paramsObjToStr\n * @param {Object} optParams Parameters object, example: `{ a: 2, b: 3 }`\n * @return {String} A query string. Example: `'a=2&b=3'`\n * @private\n */\n paramsObjToStr: function(optParams) {\n var k, m, p, a, params = [];\n if (typeof optParams === 'object') {\n for (p in optParams){\n if (optParams.hasOwnProperty(p)) {\n a = optParams[p];\n if (Object.prototype.toString.call(a) === '[object Array]' && !isNaN(a.length)) {\n for (k = 0, m = a.length; k < m; k++) {\n params = params.concat([\n encodeURIComponent(p), '[]', '=',\n encodeURIComponent(a[k]), '&'\n ]);\n }\n }\n else {\n params = params.concat([\n encodeURIComponent(p), '=',\n encodeURIComponent(a), '&'\n ]);\n }\n }\n }\n if (params.length > 0) {\n params.pop();\n }\n }\n else\n {\n return optParams;\n }\n return params.join('');\n },\n\n /**\n * Set the url parameters for a GET request\n *\n * @method setParams\n * @return {void}\n * @private\n */\n setParams: function()\n {\n var params = null, optParams = this.options.parameters;\n\n if(typeof optParams === \"object\"){\n params = this.paramsObjToStr(optParams);\n } else {\n params = '' + optParams;\n }\n\n if(params){\n if(this.url.indexOf('?') > -1) {\n this.url = this.url.split('#')[0] + '&' + params;\n } else {\n this.url = this.url.split('#')[0] + '?' + params;\n }\n }\n },\n\n /**\n * Gets an HTTP header from the response\n *\n * @method getHeader\n * @param {String} name Header name\n * @return {String} Header content\n * @public\n */\n getHeader: function(name)\n {\n if (this.usingXDomainReq && name === 'Content-Type') {\n return this.transport.contentType;\n }\n try{\n return this.transport.getResponseHeader(name);\n } catch(e) {\n return null;\n }\n },\n\n /**\n * Gets all the HTTP headers from the response\n *\n * @method getAllHeaders\n * @return {String} The headers, each separated by a newline\n * @public\n */\n getAllHeaders: function()\n {\n try {\n return this.transport.getAllResponseHeaders();\n } catch(e) {\n return null;\n }\n },\n\n /**\n * Gets the ajax response object\n *\n * @method getResponse\n * @return {Object} The response object\n * @public\n */\n getResponse: function(){\n // setup our own stuff\n var t = this.transport,\n r = {\n headerJSON: null,\n responseJSON: null,\n getHeader: this.getHeader,\n getAllHeaders: this.getAllHeaders,\n request: this,\n transport: t,\n timeTaken: new Date() - this.startTime,\n requestedUrl: this.url\n };\n\n // setup things expected from the native object\n r.readyState = t.readyState;\n try { r.responseText = t.responseText; } catch(e) {}\n try { r.responseXML = t.responseXML; } catch(e) {}\n try { r.status = t.status; } catch(e) { r.status = 0; }\n try { r.statusText = t.statusText; } catch(e) { r.statusText = ''; }\n\n return r;\n },\n\n /**\n * Aborts the request if still running. No callbacks are called\n *\n * @method abort\n * @return {void}\n * @public\n */\n abort: function(){\n if (this.transport) {\n clearTimeout(this.delayTimeout);\n clearTimeout(this.stoTimeout);\n try { this.transport.abort(); } catch(ex) {}\n this.finish();\n }\n },\n\n /**\n * Executes the state changing phase of an ajax request\n *\n * @method runStateChange\n * @return {void}\n * @public\n */\n runStateChange: function()\n {\n var rs = this.transport.readyState;\n if (rs === 3) {\n if (this.isHTTP) {\n this.safeCall('onHeaders');\n }\n } else if (rs === 4 || this.usingXDomainReq) {\n\n if (this.options.asynchronous && this.options.delay && (this.startTime + this.options.delay > new Date().getTime())) {\n this.delayTimeout = setTimeout(Ink.bind(this.runStateChange, this), this.options.delay + this.startTime - new Date().getTime());\n return;\n }\n\n var responseJSON,\n responseContent = this.transport.responseText,\n response = this.getResponse(),\n curStatus = this.transport.status;\n\n if (this.isHTTP && !this.options.asynchronous) {\n this.safeCall('onHeaders');\n }\n\n clearTimeout(this.stoTimeout);\n\n if (curStatus === 0) {\n // Status 0 indicates network error for http requests.\n // For http less requests, 0 is always returned.\n if (this.isHTTP) {\n this.safeCall('onException', new Error('Ink.Net.Ajax: network error! (HTTP status 0)'));\n } else {\n curStatus = responseContent ? 200 : 404;\n }\n }\n else if (curStatus === 304) {\n curStatus = 200;\n }\n var isSuccess = this.usingXDomainReq || 200 <= curStatus && curStatus < 300;\n\n var headerContentType = this.getHeader('Content-Type') || '';\n if (this.options.evalJS &&\n (headerContentType.indexOf(\"application/json\") >= 0 || this.options.evalJS === 'force')){\n try {\n responseJSON = this.evalJSON(responseContent, this.sanitizeJSON);\n\n if(responseJSON){\n responseContent = response.responseJSON = responseJSON;\n }\n } catch(e){\n if (isSuccess) {\n // If the request failed, then this is perhaps an error page\n // so don't notify error.\n this.safeCall('onException', e);\n }\n }\n }\n\n if (this.usingXDomainReq && headerContentType.indexOf('xml') !== -1 && 'DOMParser' in window) {\n // http://msdn.microsoft.com/en-us/library/ie/ff975278(v=vs.85).aspx\n var mimeType;\n switch (headerContentType) {\n case 'application/xml':\n case 'application/xhtml+xml':\n case 'image/svg+xml':\n mimeType = headerContentType;\n break;\n default:\n mimeType = 'text/xml';\n }\n var xmlDoc = (new DOMParser()).parseFromString( this.transport.responseText, mimeType);\n this.transport.responseXML = xmlDoc;\n response.responseXML = xmlDoc;\n }\n\n if (this.transport.responseXML != null && response.responseJSON == null && this.transport.responseXML.xml !== \"\"){\n responseContent = this.transport.responseXML;\n }\n\n if (curStatus || this.usingXDomainReq) {\n if (isSuccess) {\n this.safeCall('onSuccess', response, responseContent);\n } else {\n this.safeCall('onFailure', response, responseContent);\n }\n this.safeCall('on'+curStatus, response, responseContent);\n }\n this.finish(response, responseContent);\n }\n },\n\n /**\n * Last step after XHR is complete. Call onComplete and cleanup object\n *\n * @method finish\n * @param {Mixed} response Response object as returned from getResponse().\n * @param {Mixed} responseContent Content of the response.\n * @return {void}\n * @private\n */\n finish: function(response, responseContent){\n if (response) {\n this.safeCall('onComplete', response, responseContent);\n }\n clearTimeout(this.stoTimeout);\n\n if (this.transport) {\n // IE6 sometimes barfs on this one\n try{ this.transport.onreadystatechange = null; } catch(e){}\n\n if (typeof this.transport.destroy === 'function') {\n // Stuff for Samsung.\n this.transport.destroy();\n }\n\n // Let XHR be collected.\n this.transport = null;\n }\n },\n\n /**\n * Safely calls a callback function.\n * Verifies that the callback is well defined and traps errors\n *\n * If you pass in an error as the second argument, it gets thrown if there is no default listener.\n *\n * @method safeCall\n * @param {Function} handlerName Name of the handler we wish to call\n * @param {Error} error This error gets reported to the console using Ink.error if there's no listener to `handlerName`.\n * @param {Mixed} [args...] Arguments to get passed to the `handlerName` handler.\n * @return {void}\n * @private\n */\n safeCall: function(handlerName /*[error or rest...]*/) {\n var error = arguments[1] instanceof Error ? arguments[1] : null;\n if (typeof this.options[handlerName] === 'function') {\n try {\n this.options[handlerName].apply(this, [].slice.call(arguments, 1));\n } catch(ex) {\n Ink.error('Ink.Net.Ajax: an error was raised while executing ' + handlerName + '.', ex);\n }\n } else if (error) {\n Ink.error('Ink.Net.Ajax: ' + error);\n }\n },\n\n /**\n * Sets a new request header for the next http request\n *\n * @method setRequestHeader\n * @param {String} name Header name.\n * @param {String} value New header value.\n * @return {void}\n * @public\n */\n setRequestHeader: function(name, value){\n if (!this.options.requestHeaders) {\n this.options.requestHeaders = {};\n }\n this.options.requestHeaders[name] = value;\n },\n\n /**\n * Executes the request\n *\n * @method request\n * @return {void}\n * @private\n */\n request: function()\n {\n if(this.transport) {\n var params = null;\n if(this.requestHasBody) {\n if(this.options.postBody !== null && this.options.postBody !== '') {\n params = this.options.postBody;\n this.setParams();\n } else if (this.options.parameters !== null && this.options.parameters !== ''){\n params = this.options.parameters;\n }\n\n if (typeof params === \"object\" && !params.nodeType) {\n params = this.paramsObjToStr(params);\n } else if (typeof params !== \"object\" && params !== null){\n params = '' + params;\n }\n\n if(this.options.contentType) {\n this.setRequestHeader('Content-Type', this.options.contentType);\n }\n } else {\n this.setParams();\n }\n\n var url = this.url;\n var method = this.options.method;\n var crossDomain = this.isCrossDomain;\n\n if (crossDomain && this.options.xhrProxy) {\n this.setRequestHeader('X-Url', url);\n url = this.options.xhrProxy + encodeURIComponent(url);\n crossDomain = false;\n }\n\n try {\n this.transport.open(method, url, this.options.asynchronous);\n } catch(e) {\n this.safeCall('onException', e);\n return this.finish(this.getResponse(), null);\n }\n\n this.setHeaders();\n\n this.safeCall('onCreate');\n\n if(this.options.timeout && !isNaN(this.options.timeout)) {\n this.stoTimeout = setTimeout(Ink.bind(function() {\n if(this.options.onTimeout) {\n this.safeCall('onTimeout');\n this.abort();\n }\n }, this), (this.options.timeout * 1000));\n }\n\n if(this.options.useCredentials && !this.usingXDomainReq) {\n this.transport.withCredentials = true;\n }\n\n if(this.options.asynchronous && !this.usingXDomainReq) {\n this.transport.onreadystatechange = Ink.bind(this.runStateChange, this);\n }\n else if (this.usingXDomainReq) {\n this.transport.onload = Ink.bind(this.runStateChange, this);\n }\n\n try {\n if (crossDomain) {\n // Need explicit handling because Mozila aborts\n // the script and Chrome fails silently.per the spec\n Ink.error('Ink.Net.Ajax: You are attempting to request a URL which is cross-domain from this one. To do this, you *must* enable the `cors` option!');\n return;\n } else {\n this.startTime = new Date().getTime();\n this.transport.send(params);\n }\n } catch(e) {\n this.safeCall('onException', e);\n return this.finish(this.getResponse(), null);\n }\n\n if(!this.options.asynchronous) {\n this.runStateChange();\n }\n }\n },\n\n /**\n * Checks if a given string is valid JSON\n *\n * @method isJSON\n * @param {String} str String to be evaluated\n * @return {Boolean} True if the string is valid JSON\n * @public\n */\n isJSON: function(str)\n {\n if (typeof str !== \"string\" || !str){ return false; }\n str = str.replace(/\\\\./g, '@').replace(/\"[^\"\\\\\\n\\r]*\"/g, '');\n return (/^[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]*$/).test(str);\n },\n\n /**\n * Evaluates a given string as JSON\n *\n * @method evalJSON\n * @param {String} strJSON String to be evaluated\n * @param {Boolean} sanitize Flag to sanitize the content\n * @return {Object} JSON content as an object\n * @public\n */\n evalJSON: function(strJSON, sanitize)\n {\n if (strJSON && (!sanitize || this.isJSON(strJSON))) {\n try {\n if (typeof JSON !== \"undefined\" && typeof JSON.parse !== 'undefined'){\n return JSON.parse(strJSON);\n }\n /*jshint evil:true */\n return eval('(' + strJSON + ')');\n } catch(e) {\n throw new Error('Ink.Net.Ajax: Bad JSON string. ' + e);\n }\n }\n return null;\n }\n };\n\n /**\n * Loads content from a given url through an XMLHttpRequest.\n *\n * Shortcut function for simple AJAX use cases. Works with JSON, XML and plain text.\n *\n * @method load\n * @param {String} url Request URL\n * @param {Function} callback Callback to be executed if the request is successful\n * @return {Object} XMLHttpRequest object\n * @public\n *\n * @sample Ink_Net_Ajax_load.html \n */\n Ajax.load = function(url, callback){\n var isCrossDomain = Ajax.prototype._locationIsCrossDomain(window.location, Ajax.prototype._locationFromURL(url));\n return new Ajax(url, {\n method: 'GET',\n cors: isCrossDomain,\n onSuccess: function(response){\n callback(response.responseJSON || response.responseText, response);\n }\n });\n };\n\n /**\n * Loads content from a given url through an XMLHttpRequest.\n * Shortcut function for simple AJAX use cases.\n *\n * @method ping\n * @param {String} url Request url\n * @param {Function} callback Callback to be executed if the request is successful\n * @public\n * @return {Object} XMLHttpRequest object\n */\n Ajax.ping = function(url, callback){\n var isCrossDomain = Ajax.prototype._locationIsCrossDomain(window.location, Ajax.prototype._locationFromURL(url));\n return new Ajax(url, {\n method: 'HEAD',\n cors: isCrossDomain,\n onSuccess: function(response){\n if (typeof callback === 'function'){\n callback(response);\n }\n }\n });\n };\n\n\n return Ajax;\n});\n","/**\n * Cross Browser JsonP requests\n * @module Ink.Net.JsonP_1\n * @version 1\n */\n\nInk.createModule('Ink.Net.JsonP', '1', [], function() {\n\n 'use strict';\n\n /**\n * Executes a JSONP request\n *\n * @class Ink.Net.JsonP\n * @constructor\n *\n * @param {String} uri Request URL\n * @param {Object} options Request options\n * @param {Function} options.onSuccess Success callback. Called with the JSONP response.\n * @param {Function} [options.onFailure] Failure callback. Called when there is a timeout.\n * @param {Object} [options.failureObj] Object to be passed as argument to failure callback\n * @param {Number} [options.timeout] Timeout for the request, in seconds. defaults to 10.\n * @param {Object} [options.params] Object with URL parameters.\n * @param {String} [options.callbackParam] URL parameter which gets the name of the JSONP function to call. defaults to 'jsoncallback'.\n * @param {String} [options.randVar] (Advanced, not recommended unless you know what you're doing) A string to append to the callback name. By default, generate a random number. Use an empty string if you already passed the correct name in the internalCallback option.\n * @param {String} [options.internalCallback] (Advanced) Name of the callback function stored in the Ink.Net.JsonP object (before it's prefixed).\n *\n * @sample Ink_Net_JsonP_1.html \n */\n var JsonP = function(uri, options) {\n this.init(uri, options);\n };\n\n JsonP.prototype = {\n\n init: function(uri, options) {\n this.options = Ink.extendObj( {\n onSuccess: undefined,\n onFailure: undefined,\n failureObj: {},\n timeout: 10,\n params: {},\n callbackParam: 'jsoncallback',\n internalCallback: '_cb',\n randVar: false\n }, options || {});\n\n if(this.options.randVar !== false) {\n this.randVar = this.options.randVar;\n } else {\n this.randVar = parseInt(Math.random() * 100000, 10);\n }\n\n this.options.internalCallback += this.randVar;\n\n this.uri = uri;\n\n // prevent SAPO legacy onComplete - make it onSuccess\n if(typeof(this.options.onComplete) === 'function') {\n this.options.onSuccess = this.options.onComplete;\n }\n\n if (typeof this.uri !== 'string') {\n throw new Error('Ink.Net.JsonP: Please define an URI');\n }\n\n if (typeof this.options.onSuccess !== 'function') {\n throw new Error('Ink.Net.JsonP: please define a callback function on option onSuccess!');\n }\n\n Ink.Net.JsonP[this.options.internalCallback] = Ink.bind(function() {\n this.options.onSuccess(arguments[0]);\n this._cleanUp();\n }, this);\n\n this.timeout = setTimeout(Ink.bind(function () {\n this.abort();\n if(typeof this.options.onFailure === 'function'){\n this.options.onFailure(this.options.failureObj);\n }\n }, this),\n this.options.timeout * 1000);\n\n this._addScriptTag();\n },\n\n /**\n * Abort the request, avoiding onSuccess or onFailure being called.\n * @method abort\n * @return {void}\n **/\n abort: function () {\n Ink.Net.JsonP[this.options.internalCallback] = Ink.bindMethod(this, '_cleanUp');\n },\n\n _addParamsToGet: function(uri, params) {\n var hasQuestionMark = uri.indexOf('?') !== -1;\n var sep, pKey, pValue, parts = [uri];\n\n for (pKey in params) {\n if (params.hasOwnProperty(pKey)) {\n if (!hasQuestionMark) { sep = '?'; hasQuestionMark = true; }\n else { sep = '&'; }\n pValue = params[pKey];\n if (typeof pValue !== 'number' && !pValue) { pValue = ''; }\n parts = parts.concat([sep, pKey, '=', encodeURIComponent(pValue)]);\n }\n }\n\n return parts.join('');\n },\n\n _getScriptContainer: function() {\n return document.body ||\n document.getElementsByTagName('body')[0] ||\n document.getElementsByTagName('head')[0] ||\n document.documentElement;\n },\n\n _addScriptTag: function() {\n // enrich options will callback and random seed\n this.options.params[this.options.callbackParam] = 'Ink.Net.JsonP.' + this.options.internalCallback;\n this.options.params.rnd_seed = this.randVar;\n this.uri = this._addParamsToGet(this.uri, this.options.params);\n // create script tag\n this._scriptEl = document.createElement('script');\n this._scriptEl.type = 'text/javascript';\n this._scriptEl.src = this.uri;\n var scriptCtn = this._getScriptContainer();\n scriptCtn.appendChild(this._scriptEl);\n },\n\n _cleanUp: function () {\n if (this.timeout) {\n window.clearTimeout(this.timeout);\n }\n delete this.options.onSuccess;\n delete this.options.onFailure;\n delete Ink.Net.JsonP[this.options.internalCallback];\n this._removeScriptTag();\n },\n\n _removeScriptTag: function() {\n if (!this._scriptEl) { return; /* already removed */ }\n this._scriptEl.parentNode.removeChild(this._scriptEl);\n delete this._scriptEl;\n }\n };\n\n return JsonP;\n\n});\n","/**\n * Browser Detection and User Agent sniffing\n * @module Ink.Dom.Browser_1\n * @version 1\n */\nInk.createModule('Ink.Dom.Browser', '1', [], function() {\n 'use strict'; \n\n /**\n * @namespace Ink.Dom.Browser\n * @version 1\n * @static\n * @example\n * \n */\n var Browser = {\n /**\n * True if the browser is Internet Explorer\n *\n * @property IE\n * @type {Boolean}\n * @public\n * @static\n */\n IE: false,\n\n /**\n * True if the browser is Gecko based\n *\n * @property GECKO\n * @type {Boolean}\n * @public\n * @static\n */\n GECKO: false,\n\n /**\n * True if the browser is Opera\n *\n * @property OPERA\n * @type {Boolean}\n * @public\n * @static\n */\n OPERA: false,\n\n /**\n * True if the browser is Safari\n *\n * @property SAFARI\n * @type {Boolean}\n * @public\n * @static\n */\n SAFARI: false,\n\n /**\n * True if the browser is Konqueror\n *\n * @property KONQUEROR\n * @type {Boolean}\n * @public\n * @static\n */\n KONQUEROR: false,\n\n /**\n * True if browser is Chrome\n *\n * @property CHROME\n * @type {Boolean}\n * @public\n * @static\n */\n CHROME: false,\n\n /**\n * The specific browser model.\n * False if it is unavailable.\n *\n * @property model\n * @type {Boolean|String}\n * @public\n * @static\n */\n model: false,\n\n /**\n * The browser version.\n * False if it is unavailable.\n *\n * @property version\n * @type {Boolean|String}\n * @public\n * @static\n */\n version: false,\n\n /**\n * The user agent string.\n * False if it is unavailable.\n *\n * @property userAgent\n * @type {Boolean|String}\n * @public\n * @static\n */\n userAgent: false,\n\n /**\n * The CSS prefix (-moz-, -webkit-, -ms-, ...)\n * False if it is unavailable \n *\n * @property cssPrefix \n * @type {Boolean|String}\n * @public \n * @static \n */\n cssPrefix: false, \n\n /**\n * The DOM prefix (Moz, Webkit, ms, ...)\n * False if it is unavailable \n * @property domPrefix \n * @type {Boolean|String}\n * @public \n * @static \n */\n domPrefix: false,\n\n /**\n * Initialization function for the Browser object.\n *\n * Is called automatically when this module is loaded, and calls setDimensions, setBrowser and setReferrer.\n *\n * @method init\n * @return {void}\n * @public\n */\n init: function() {\n this.detectBrowser();\n this.setDimensions();\n this.setReferrer();\n },\n\n /**\n * Retrieves and stores window dimensions in this object. Called automatically when this module is loaded.\n *\n * @method setDimensions\n * @return {void}\n * @public\n */\n setDimensions: function() {\n //this.windowWidth=window.innerWidth !== null? window.innerWidth : document.documentElement && document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body !== null ? document.body.clientWidth : null;\n //this.windowHeight=window.innerHeight != null? window.innerHeight : document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body != null? document.body.clientHeight : null;\n var myWidth = 0, myHeight = 0;\n if ( typeof window.innerWidth=== 'number' ) {\n myWidth = window.innerWidth;\n myHeight = window.innerHeight;\n } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {\n myWidth = document.documentElement.clientWidth;\n myHeight = document.documentElement.clientHeight;\n } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {\n myWidth = document.body.clientWidth;\n myHeight = document.body.clientHeight;\n }\n this.windowWidth = myWidth;\n this.windowHeight = myHeight;\n },\n\n /**\n * Stores the referrer. Called automatically when this module is loaded.\n *\n * @method setReferrer\n * @return {void}\n * @public\n */\n setReferrer: function() {\n if (document.referrer && document.referrer.length) {\n this.referrer = window.escape(document.referrer);\n } else {\n this.referrer = false;\n }\n },\n\n /**\n * Detects the browser and stores the found properties. Called automatically when this module is loaded.\n *\n * @method detectBrowser\n * @return {void}\n * @public\n */\n detectBrowser: function() {\n this._sniffUserAgent(navigator.userAgent);\n },\n\n _sniffUserAgent: function (sAgent) {\n this.userAgent = sAgent;\n\n sAgent = sAgent.toLowerCase();\n\n if (/applewebkit\\//.test(sAgent)) {\n this.cssPrefix = '-webkit-';\n this.domPrefix = 'Webkit';\n if(/(chrome|crios)\\//.test(sAgent)) {\n // Chrome\n this.CHROME = true;\n this.model = 'chrome';\n this.version = sAgent.replace(/(.*)chrome\\/([^\\s]+)(.*)/, \"$2\");\n } else {\n // Safari\n this.SAFARI = true;\n this.model = 'safari';\n var rVersion = /version\\/([^) ]+)/;\n if (rVersion.test(sAgent)) {\n this.version = sAgent.match(rVersion)[1];\n } else {\n this.version = sAgent.replace(/(.*)applewebkit\\/([^\\s]+)(.*)/, \"$2\");\n }\n }\n } else if (/opera/.test(sAgent)) {\n // Opera\n this.OPERA = true;\n this.model = 'opera';\n this.version = sAgent.replace(/(.*)opera.([^\\s$]+)(.*)/, \"$2\");\n this.cssPrefix = '-o-';\n this.domPrefix = 'O';\n } else if (/konqueror/.test(sAgent)) {\n // Konqueroh\n this.KONQUEROR = true;\n this.model = 'konqueror';\n this.version = sAgent.replace(/(.*)konqueror\\/([^;]+);(.*)/, \"$2\");\n this.cssPrefix = '-khtml-';\n this.domPrefix = 'Khtml';\n } else if (/(msie|trident)/i.test(sAgent)) {\n // MSIE\n this.IE = true;\n this.model = 'ie';\n if (/rv:((?:\\d|\\.)+)/.test(sAgent)) { // IE 11\n this.version = sAgent.match(/rv:((?:\\d|\\.)+)/)[1];\n } else {\n this.version = sAgent.replace(/(.*)\\smsie\\s([^;]+);(.*)/, \"$2\");\n }\n this.cssPrefix = '-ms-';\n this.domPrefix = 'ms';\n } else if (/gecko/.test(sAgent)) {\n // GECKO\n // Supports only:\n // Camino, Chimera, Epiphany, Minefield (firefox 3), Firefox, Firebird, Phoenix, Galeon,\n // Iceweasel, K-Meleon, SeaMonkey, Netscape, Songbird, Sylera,\n this.cssPrefix = '-moz-';\n this.domPrefix = 'Moz';\n\n this.GECKO = true;\n\n var re = /(camino|chimera|epiphany|minefield|firefox|firebird|phoenix|galeon|iceweasel|k\\-meleon|seamonkey|netscape|songbird|sylera)/;\n if(re.test(sAgent)) {\n this.model = sAgent.match(re)[1];\n this.version = sAgent.replace(new RegExp(\"(.*)\"+this.model+\"\\/([^;\\\\s$]+)(.*)\"), \"$2\");\n } else {\n // probably is mozilla\n this.model = 'mozilla';\n var reVersion = /(.*)rv:([^)]+)(.*)/;\n if(reVersion.test(sAgent)) {\n this.version = sAgent.replace(reVersion, \"$2\");\n }\n }\n }\n },\n\n /**\n * Debug function which displays browser (and Ink.Dom.Browser) information as an alert message.\n *\n * @method debug\n * @return {void}\n * @public\n * @sample Ink_Dom_Browser_1_debug.html\n */\n debug: function() {\n /*global alert:false */\n var str = \"known browsers: (ie, gecko, opera, safari, konqueror) \\n\";\n str += [this.IE, this.GECKO, this.OPERA, this.SAFARI, this.KONQUEROR] +\"\\n\";\n str += \"cssPrefix -> \"+this.cssPrefix+\"\\n\";\n str += \"domPrefix -> \"+this.domPrefix+\"\\n\";\n str += \"model -> \"+this.model+\"\\n\";\n str += \"version -> \"+this.version+\"\\n\";\n str += \"\\n\";\n str += \"original UA -> \"+this.userAgent;\n\n alert(str);\n }\n };\n\n Browser.init();\n\n return Browser;\n});\n","/**\n * CSS Utilities and toolbox\n * @module Ink.Dom.Css_1\n * @version 1\n */\n\nInk.createModule( 'Ink.Dom.Css', 1, [], function() {\n\n 'use strict';\n\n // getComputedStyle feature detection.\n var getCs = (\"defaultView\" in document) && (\"getComputedStyle\" in document.defaultView) ? document.defaultView.getComputedStyle : window.getComputedStyle;\n\n /**\n * @namespace Ink.Dom.Css\n * @static\n */\n\n var Css = {\n /**\n * Adds of removes a class.\n * Depending on addRemState, this method either adds a class if it's true or removes if if false.\n *\n * @method addRemoveClassName\n * @param {DOMElement|string} elm DOM element or element id\n * @param {string} className class name to add or remove.\n * @param {boolean} addRemState Whether to add or remove. `true` to add, `false` to remove.\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_addRemoveClassName.html \n */\n addRemoveClassName: function(elm, className, addRemState) {\n if (addRemState) {\n return this.addClassName(elm, className);\n }\n this.removeClassName(elm, className);\n },\n\n /**\n * Adds a class to a given element\n *\n * @method addClassName\n * @param {Element|String} elm Element or element id\n * @param {String|Array} className Class or classes to add. Examples: 'my-class', ['my-class', 'other-class'], 'my-class other-class'\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_addClassName.html\n */\n addClassName: function(elm, className) {\n elm = Ink.i(elm);\n if (!elm || !className) { return null; }\n className = ('' + className).split(/[, ]+/);\n var i = 0;\n var len = className.length;\n\n for (; i < len; i++) {\n // remove whitespace and ignore on empty string\n if (className[i].replace(/^\\s+|\\s+$/g, '')) {\n if (typeof elm.classList !== \"undefined\") {\n elm.classList.add(className[i]);\n } else if (!Css.hasClassName(elm, className[i])) {\n elm.className += (elm.className ? ' ' : '') + className[i];\n }\n }\n }\n },\n\n /**\n * Removes a class from a given element\n *\n * @method removeClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String|Array} className Class names to remove. You can either use a space separated string of classnames, comma-separated list or an array\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_removeClassName.html \n */\n removeClassName: function(elm, className) {\n elm = Ink.i(elm);\n if (!elm || !className) { return null; }\n \n className = ('' + className).split(/[, ]+/);\n var i = 0;\n var len = className.length;\n\n if (typeof elm.classList !== \"undefined\"){\n for (; i < len; i++) {\n elm.classList.remove(className[i]);\n }\n } else {\n var elmClassName = elm.className || '';\n var re;\n for (; i < len; i++) {\n re = new RegExp(\"(^|\\\\s+)\" + className[i] + \"(\\\\s+|$)\");\n elmClassName = elmClassName.replace(re, ' ');\n }\n elm.className = (elmClassName\n .replace(/^\\s+/, '')\n .replace(/\\s+$/, ''));\n }\n },\n\n /**\n * Alias to addRemoveClassName. \n * Utility function, saves many if/elses.\n *\n * @method setClassName\n * @uses addRemoveClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String|Array} className Class names to add\\remove. Comma separated, space separated or simply an Array\n * @param {Boolean} [add]=false Flag to switch behavior from removal to addition. true to add, false to remove\n * @return {void}\n * @public\n */\n setClassName: function(elm, className, add) {\n this.addRemoveClassName(elm, className, add || false);\n },\n\n /**\n * Checks if an element has a class.\n * This method verifies if an element has ONE of a list of classes. If the last argument is flagged as true, instead checks if the element has ALL the classes\n * \n * @method hasClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String|Array} className Class name(s) to test\n * @param {Boolean} [all=false] Irrelevant if only one `className` is passed. If `true`, check if the element contains ALL the CSS classes. If `false`, check whether the element contains ANY of the given classes.\n * @return {Boolean} `true` if a given class is applied to a given element, `false` if it isn't.\n * @public\n * @sample Ink_Dom_Css_hasClassName.html \n */\n hasClassName: function(elm, className, all) {\n elm = Ink.i(elm);\n if (!elm || !className) { return false; }\n\n className = ('' + className).split(/[, ]+/);\n var i = 0;\n var len = className.length;\n var has;\n var re;\n\n for ( ; i < len; i++) {\n if (typeof elm.classList !== \"undefined\"){\n has = elm.classList.contains(className[i]);\n } else {\n var elmClassName = elm.className;\n if (elmClassName === className[i]) {\n has = true;\n } else {\n re = new RegExp(\"(^|\\\\s)\" + className[i] + \"(\\\\s|$)\");\n has = re.test(elmClassName);\n }\n }\n if (has && !all) { return true; } // return if looking for any class\n if (!has && all) { return false; } // return if looking for all classes\n }\n\n if (all) {\n // if we got here, all classes were found so far\n return true;\n } else {\n // if we got here with all == false, no class was found\n return false;\n }\n },\n\n /**\n * Blinks a class from an element\n * Add and removes the class from the element with a timeout, so it blinks\n *\n * @method blinkClass\n * @uses addRemoveClassName\n * @param {Element|String} element DOM element or element id\n * @param {String|Array} className Class name(s) to blink\n * @param {Number} timeout timeout in ms between adding and removing, default 100 ms\n * @param {Boolean} negate is true, class is removed then added\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_blinkClass.html \n */\n blinkClass: function(element, className, timeout, negate){\n element = Ink.i(element);\n Css.addRemoveClassName(element, className, !negate);\n setTimeout(function() {\n Css.addRemoveClassName(element, className, negate);\n }, Number(timeout) || 100);\n },\n\n /**\n * Toggles a class name from a given element\n *\n * @method toggleClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} className Class name\n * @param {Boolean} [forceAdd] Flag to force adding the the classe names if they don't exist yet.\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_toggleClassName.html \n */\n toggleClassName: function(elm, className, forceAdd) {\n if (!elm || !className) { return false; }\n\n if (typeof forceAdd !== 'undefined') {\n return Css.addRemoveClassName(elm, className, forceAdd);\n } else if (typeof elm.classList !== \"undefined\" && !/[, ]/.test(className)) {\n elm = Ink.i(elm);\n if (elm !== null){\n elm.classList.toggle(className);\n }\n } else {\n if (Css.hasClassName(elm, className)) {\n Css.removeClassName(elm, className);\n } else {\n Css.addClassName(elm, className);\n }\n }\n },\n\n /**\n * Sets the opacity of given element \n *\n * @method setOpacity\n * @param {DOMElement|String} elm DOM element or element id\n * @param {Number} value allows 0 to 1(default mode decimal) or percentage (warning using 0 or 1 will reset to default mode)\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_setOpacity.html \n */\n setOpacity: function(elm, value) {\n elm = Ink.i(elm);\n if (elm !== null){\n var val = 1;\n\n if (!isNaN(Number(value))){\n if (value <= 0) { val = 0; }\n else if (value <= 1) { val = value; }\n else if (value <= 100) { val = value / 100; }\n else { val = 1; }\n }\n\n if (typeof elm.style.opacity !== 'undefined') {\n elm.style.opacity = val;\n }\n else {\n elm.style.filter = \"alpha(opacity:\"+(val*100|0)+\")\";\n }\n }\n },\n\n /**\n * Converts a css property name to a string in camelcase to be used with CSSStyleDeclaration.\n * @method _camelCase\n * @private\n * @param {String} str String to convert\n * @return {String} Converted string\n */\n _camelCase: function(str) {\n return str ? str.replace(/-(\\w)/g, function (_, $1) {\n return $1.toUpperCase();\n }) : str;\n },\n\n\n /**\n * Gets the value for an element's style attribute\n *\n * @method getStyle\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} style Which css attribute to fetch\n * @return {Mixed} Style value\n * @public\n * @sample Ink_Dom_Css_getStyle.html \n */\n getStyle: function(elm, style) {\n elm = Ink.i(elm);\n if (elm !== null && elm.style) {\n style = style === 'float' ? 'cssFloat': this._camelCase(style);\n\n var value = elm.style[style];\n\n if (getCs && (!value || value === 'auto')) {\n var css = getCs(elm, null);\n value = css ? css[style] : null;\n }\n else if (!value && elm.currentStyle) {\n value = elm.currentStyle[style];\n if (value === 'auto' && (style === 'width' || style === 'height')) {\n value = elm[\"offset\" + style.charAt(0).toUpperCase() + style.slice(1)] + \"px\";\n }\n }\n\n if (style === 'opacity') {\n return value ? parseFloat(value, 10) : 1.0;\n }\n else if (style === 'borderTopWidth' || style === 'borderBottomWidth' ||\n style === 'borderRightWidth' || style === 'borderLeftWidth' ) {\n if (value === 'thin') { return '1px'; }\n else if (value === 'medium') { return '3px'; }\n else if (value === 'thick') { return '5px'; }\n }\n\n return value === 'auto' ? null : value;\n }\n },\n\n\n /**\n * Adds CSS rules to an element's style attribute.\n *\n * @method setStyle\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} style Which css attribute to set\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_setStyle.html \n */\n setStyle: function(elm, style) {\n elm = Ink.i(elm);\n if (elm === null) { return; }\n if (typeof style === 'string') {\n elm.style.cssText += '; '+style;\n\n if (style.indexOf('opacity') !== -1) {\n this.setOpacity(elm, style.match(/opacity:\\s*(\\d?\\.?\\d*)/)[1]);\n }\n }\n else {\n for (var prop in style) {\n if (style.hasOwnProperty(prop)){\n if (prop === 'opacity') {\n this.setOpacity(elm, style[prop]);\n }\n else if (prop === 'float' || prop === 'cssFloat') {\n if (typeof elm.style.styleFloat === 'undefined') {\n elm.style.cssFloat = style[prop];\n }\n else {\n elm.style.styleFloat = style[prop];\n }\n } else {\n elm.style[prop] = style[prop];\n }\n }\n }\n }\n },\n\n\n /**\n * Shows an element.\n * Internally it unsets the display property of an element. You can force a specific display property using forceDisplayProperty\n *\n * @method show\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} [forceDisplayProperty] Css display property to apply on show\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_show.html \n */\n show: function(elm, forceDisplayProperty) {\n elm = Ink.i(elm);\n if (elm !== null) {\n elm.style.display = forceDisplayProperty || '';\n }\n },\n\n /**\n * Hides an element.\n *\n * @method hide\n * @param {DOMElement|String} elm DOM element or element id\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_hide.html \n */\n hide: function(elm) {\n elm = Ink.i(elm);\n if (elm !== null) {\n elm.style.display = 'none';\n }\n },\n\n /**\n * Shows or hides an element.\n * If the show parameter is true, it shows the element. Otherwise, hides it.\n *\n * @method showHide\n * @param {DOMElement|String} elm DOM element or element id\n * @param {boolean} [show]=false Whether to show or hide `elm`.\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_showHide.html \n */\n showHide: function(elm, show) {\n elm = Ink.i(elm);\n if (elm) {\n elm.style.display = show ? '' : 'none';\n }\n },\n\n /**\n * Toggles an element visibility.\n * \n * @method toggle\n * @param {DOMElement|String} elm DOM element or element id\n * @param {Boolean} forceShow Forces showing if element is hidden\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_toggle.html \n */\n toggle: function(elm, forceShow) {\n elm = Ink.i(elm);\n if (elm !== null) {\n if (typeof forceShow !== 'undefined') {\n if (forceShow === true) {\n this.show(elm);\n } else {\n this.hide(elm);\n }\n } else {\n if (this.getStyle(elm,'display').toLowerCase() === 'none') {\n this.show(elm);\n }\n else {\n this.hide(elm);\n }\n }\n }\n },\n\n _getRefTag: function(head){\n if (head.firstElementChild) {\n return head.firstElementChild;\n }\n\n for (var child = head.firstChild; child; child = child.nextSibling){\n if (child.nodeType === 1){\n return child;\n }\n }\n return null;\n },\n\n /**\n * Injects style tags with rules to the page.\n *\n * @method appendStyleTag\n * @param {String} selector The css selector for the rule\n * @param {String} style The content of the style rule\n * @param {Object} options Options for the tag\n * @param {String} [options.type]='text/css' File type\n * @param {Boolean} [options.force]=false If true, the style tag will be appended to end of head\n * @return {void}\n * @public\n * \n * @sample Ink_Dom_Css_appendStyleTag.html \n */\n appendStyleTag: function(selector, style, options){\n options = Ink.extendObj({\n type: 'text/css',\n force: false\n }, options || {});\n\n var styles = document.getElementsByTagName(\"style\"),\n oldStyle = false, setStyle = true, i, l;\n\n for (i=0, l=styles.length; i= 0) {\n setStyle = false;\n }\n }\n\n if (setStyle) {\n var defStyle = document.createElement(\"style\"),\n head = document.getElementsByTagName(\"head\")[0],\n refTag = false, styleStr = '';\n\n defStyle.type = options.type;\n\n styleStr += selector +\" {\";\n styleStr += style;\n styleStr += \"} \";\n\n if (typeof defStyle.styleSheet !== \"undefined\") {\n defStyle.styleSheet.cssText = styleStr;\n } else {\n defStyle.appendChild(document.createTextNode(styleStr));\n }\n\n if (options.force){\n head.appendChild(defStyle);\n } else {\n refTag = this._getRefTag(head);\n if (refTag){\n head.insertBefore(defStyle, refTag);\n }\n }\n }\n },\n\n /**\n * Injects an external link tag.\n * This method add a stylesheet to the head of a page\n *\n * @method appendStylesheet\n * @param {String} path File path\n * @param {Object} options Options for the tag\n * @param {String} [options.media='screen'] Media type\n * @param {String} [options.type='text/css'] File type\n * @param {Boolean} [options.force=false] If true, tag will be appended to end of head\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_appendStylesheet.html \n */\n appendStylesheet: function(path, options){\n options = Ink.extendObj({\n media: 'screen',\n type: 'text/css',\n force: false\n }, options || {});\n\n var refTag,\n style = document.createElement(\"link\"),\n head = document.getElementsByTagName(\"head\")[0];\n\n style.media = options.media;\n style.type = options.type;\n style.href = path;\n style.rel = \"Stylesheet\";\n\n if (options.force){\n head.appendChild(style);\n }\n else {\n refTag = this._getRefTag(head);\n if (refTag){\n head.insertBefore(style, refTag);\n }\n }\n },\n\n /**\n * Injects an external link tag.\n * Loads CSS via LINK element inclusion in HEAD (skips append if already there)\n *\n * Works similarly to appendStylesheet but:\n * supports optional callback which gets invoked once the CSS has been applied\n *\n * @method appendStylesheetCb\n * @param {String} cssURI URI of the CSS to load, if empty ignores and just calls back directly\n * @param {Function(cssURI)} [callback] optional callback which will be called once the CSS is loaded\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_appendStylesheetCb.html \n */\n _loadingCSSFiles: {},\n _loadedCSSFiles: {},\n appendStylesheetCb: function(url, callback) {\n if (!url) {\n return callback(url);\n }\n\n if (this._loadedCSSFiles[url]) {\n return callback(url);\n }\n\n var cbs = this._loadingCSSFiles[url];\n if (cbs) {\n return cbs.push(callback);\n }\n\n this._loadingCSSFiles[url] = [callback];\n\n var linkEl = document.createElement('link');\n linkEl.type = 'text/css';\n linkEl.rel = 'stylesheet';\n linkEl.href = url;\n\n var headEl = document.getElementsByTagName('head')[0];\n headEl.appendChild(linkEl);\n\n var imgEl = document.createElement('img');\n /*\n var _self = this;\n (function(_url) {\n imgEl.onerror = function() {\n //var url = this;\n var url = _url;\n _self._loadedCSSFiles[url] = true;\n var callbacks = _self._loadingCSSFiles[url];\n for (var i = 0, f = callbacks.length; i < f; ++i) {\n callbacks[i](url);\n }\n delete _self._loadingCSSFiles[url];\n };\n })(url);\n */\n imgEl.onerror = Ink.bindEvent(function(event, _url) {\n //var url = this;\n var url = _url;\n this._loadedCSSFiles[url] = true;\n var callbacks = this._loadingCSSFiles[url];\n for (var i = 0, f = callbacks.length; i < f; ++i) {\n callbacks[i](url);\n }\n delete this._loadingCSSFiles[url];\n }, this, url);\n imgEl.src = url;\n },\n\n /**\n * Converts decimal to hexadecimal values\n * Useful to convert colors to their hexadecimal representation.\n *\n * @method decToHex\n * @param {String} dec Either a single decimal value, an rgb(r, g, b) string or an Object with r, g and b properties\n * @return {String} Hexadecimal value\n * @sample Ink_Dom_Css_decToHex.html \n */\n decToHex: function(dec) {\n var normalizeTo2 = function(val) {\n if (val.length === 1) {\n val = '0' + val;\n }\n val = val.toUpperCase();\n return val;\n };\n\n if (typeof dec === 'object') {\n var rDec = normalizeTo2(parseInt(dec.r, 10).toString(16));\n var gDec = normalizeTo2(parseInt(dec.g, 10).toString(16));\n var bDec = normalizeTo2(parseInt(dec.b, 10).toString(16));\n return rDec+gDec+bDec;\n }\n else {\n dec += '';\n var rgb = dec.match(/\\((\\d+),\\s?(\\d+),\\s?(\\d+)\\)/);\n if (rgb !== null) {\n return normalizeTo2(parseInt(rgb[1], 10).toString(16)) +\n normalizeTo2(parseInt(rgb[2], 10).toString(16)) +\n normalizeTo2(parseInt(rgb[3], 10).toString(16));\n }\n else {\n return normalizeTo2(parseInt(dec, 10).toString(16));\n }\n }\n },\n\n /**\n * Converts hexadecimal values to decimal\n * Useful to use with CSS colors\n *\n * @method hexToDec\n * @param {String} hex hexadecimal Value with 6, 3, 2 or 1 characters\n * @return {Number} Object with properties r, g, b if length of number is >= 3 or decimal value instead.\n * @sample Ink_Dom_Css_hexToDec.html \n */\n hexToDec: function(hex){\n if (hex.indexOf('#') === 0) {\n hex = hex.substr(1);\n }\n if (hex.length === 6) { // will return object RGB\n return {\n r: parseInt(hex.substr(0,2), 16),\n g: parseInt(hex.substr(2,2), 16),\n b: parseInt(hex.substr(4,2), 16)\n };\n }\n else if (hex.length === 3) { // will return object RGB\n return {\n r: parseInt(hex.charAt(0) + hex.charAt(0), 16),\n g: parseInt(hex.charAt(1) + hex.charAt(1), 16),\n b: parseInt(hex.charAt(2) + hex.charAt(2), 16)\n };\n }\n else if (hex.length <= 2) { // will return int\n return parseInt(hex, 16);\n }\n },\n\n /**\n * Get a single property from a stylesheet.\n * Use this to obtain the value of a CSS property (searched from loaded CSS documents)\n *\n * @method getPropertyFromStylesheet\n * @param {String} selector a CSS rule. must be an exact match\n * @param {String} property a CSS property\n * @return {String} value of the found property, or null if it wasn't matched\n */\n getPropertyFromStylesheet: function(selector, property) {\n var rule = this.getRuleFromStylesheet(selector);\n if (rule) {\n return rule.style[property];\n }\n return null;\n },\n\n getPropertyFromStylesheet2: function(selector, property) {\n var rules = this.getRulesFromStylesheet(selector);\n /*\n rules.forEach(function(rule) {\n var x = rule.style[property];\n if (x !== null && x !== undefined) {\n return x;\n }\n });\n */\n var x;\n for(var i=0, t=rules.length; i < t; i++) {\n x = rules[i].style[property];\n if (x !== null && x !== undefined) {\n return x;\n }\n }\n return null;\n },\n\n getRuleFromStylesheet: function(selector) {\n var sheet, rules, ri, rf, rule;\n var s = document.styleSheets;\n if (!s) {\n return null;\n }\n\n for (var si = 0, sf = document.styleSheets.length; si < sf; ++si) {\n sheet = document.styleSheets[si];\n rules = sheet.rules ? sheet.rules : sheet.cssRules;\n if (!rules) { return null; }\n\n for (ri = 0, rf = rules.length; ri < rf; ++ri) {\n rule = rules[ri];\n if (!rule.selectorText) { continue; }\n if (rule.selectorText === selector) {\n return rule;\n }\n }\n }\n\n return null;\n },\n\n getRulesFromStylesheet: function(selector) {\n var res = [];\n var sheet, rules, ri, rf, rule;\n var s = document.styleSheets;\n if (!s) { return res; }\n\n for (var si = 0, sf = document.styleSheets.length; si < sf; ++si) {\n sheet = document.styleSheets[si];\n rules = sheet.rules ? sheet.rules : sheet.cssRules;\n if (!rules) {\n return null;\n }\n\n for (ri = 0, rf = rules.length; ri < rf; ++ri) {\n rule = rules[ri];\n if (!rule.selectorText) { continue; }\n if (rule.selectorText === selector) {\n res.push(rule);\n }\n }\n }\n\n return res;\n },\n\n getPropertiesFromRule: function(selector) {\n var rule = this.getRuleFromStylesheet(selector);\n var props = {};\n var prop, i, f;\n\n /*if (typeof rule.style.length === 'snumber') {\n for (i = 0, f = rule.style.length; i < f; ++i) {\n prop = this._camelCase( rule.style[i] );\n props[prop] = rule.style[prop];\n }\n }\n else { // HANDLES IE 8, FIREFOX RULE JOINING... */\n rule = rule.style.cssText;\n var parts = rule.split(';');\n var steps, val, pre, pos;\n for (i = 0, f = parts.length; i < f; ++i) {\n if (parts[i].charAt(0) === ' ') {\n parts[i] = parts[i].substring(1);\n }\n steps = parts[i].split(':');\n prop = this._camelCase( steps[0].toLowerCase() );\n val = steps[1];\n if (val) {\n val = val.substring(1);\n\n if (prop === 'padding' || prop === 'margin' || prop === 'borderWidth') {\n\n if (prop === 'borderWidth') { pre = 'border'; pos = 'Width'; }\n else { pre = prop; pos = ''; }\n\n if (val.indexOf(' ') !== -1) {\n val = val.split(' ');\n props[pre + 'Top' + pos] = val[0];\n props[pre + 'Bottom'+ pos] = val[0];\n props[pre + 'Left' + pos] = val[1];\n props[pre + 'Right' + pos] = val[1];\n }\n else {\n props[pre + 'Top' + pos] = val;\n props[pre + 'Bottom'+ pos] = val;\n props[pre + 'Left' + pos] = val;\n props[pre + 'Right' + pos] = val;\n }\n }\n else if (prop === 'borderRadius') {\n if (val.indexOf(' ') !== -1) {\n val = val.split(' ');\n props.borderTopLeftRadius = val[0];\n props.borderBottomRightRadius = val[0];\n props.borderTopRightRadius = val[1];\n props.borderBottomLeftRadius = val[1];\n }\n else {\n props.borderTopLeftRadius = val;\n props.borderTopRightRadius = val;\n props.borderBottomLeftRadius = val;\n props.borderBottomRightRadius = val;\n }\n }\n else {\n props[prop] = val;\n }\n }\n }\n //}\n //console.log(props);\n\n return props;\n },\n\n /**\n * Change the font size of elements.\n * Changes the font size of the elements which match the given CSS rule\n * For this function to work, the CSS file must be in the same domain than the host page, otherwise JS can't access it.\n *\n * @method changeFontSize\n * @param {String} selector CSS selector rule\n * @param {Number} delta Number of pixels to change on font-size\n * @param {String} [op] Supported operations are '+' and '*'. defaults to '+'\n * @param {Number} [minVal] If result gets smaller than minVal, change does not occurr\n * @param {Number} [maxVal] If result gets bigger than maxVal, change does not occurr\n * @return {void}\n * @public\n */\n changeFontSize: function(selector, delta, op, minVal, maxVal) {\n var that = this;\n Ink.requireModules(['Ink.Dom.Selector_1'], function(Selector) {\n var e;\n if (typeof selector !== 'string') { e = '1st argument must be a CSS selector rule.'; }\n else if (typeof delta !== 'number') { e = '2nd argument must be a number.'; }\n else if (op !== undefined && op !== '+' && op !== '*') { e = '3rd argument must be one of \"+\", \"*\".'; }\n else if (minVal !== undefined && (typeof minVal !== 'number' || minVal <= 0)) { e = '4th argument must be a positive number.'; }\n else if (maxVal !== undefined && (typeof maxVal !== 'number' || maxVal < maxVal)) { e = '5th argument must be a positive number greater than minValue.'; }\n if (e) { throw new TypeError(e); }\n\n var val, el, els = Selector.select(selector);\n if (minVal === undefined) { minVal = 1; }\n op = (op === '*') ? function(a,b){return a*b;} : function(a,b){return a+b;};\n for (var i = 0, f = els.length; i < f; ++i) {\n el = els[i];\n val = parseFloat( that.getStyle(el, 'fontSize'));\n val = op(val, delta);\n if (val < minVal) { continue; }\n if (typeof maxVal === 'number' && val > maxVal) { continue; }\n el.style.fontSize = val + 'px';\n }\n });\n }\n\n };\n\n return Css;\n\n});\n","/**\n * DOM Traversal and manipulation\n * @module Ink.Dom.Element_1\n * @version 1\n */\n\nInk.createModule('Ink.Dom.Element', 1, [], function() {\n\n 'use strict';\n\n var createContextualFragmentSupport = (\n typeof document.createRange === 'function' &&\n typeof window.Range.prototype.createContextualFragment === 'function');\n\n var deleteThisTbodyToken = 'Ink.Dom.Element tbody: ' + Math.random();\n var browserCreatesTbodies = (function () {\n var div = document.createElement('div');\n div.innerHTML = '';\n return div.getElementsByTagName('tbody').length !== 0;\n }());\n\n function rect(elem){\n var dimensions = {};\n try {\n dimensions = elem.getBoundingClientRect();\n } catch(e){\n dimensions = { top: elem.offsetTop, left: elem.offsetLeft };\n }\n return dimensions;\n }\n\n /**\n * @namespace Ink.Dom.Element_1\n */\n\n var InkElement = {\n\n /**\n * Checks if something is a DOM Element.\n *\n * @method isDOMElement\n * @static\n * @param {Mixed} o The object to be checked.\n * @return {Boolean} True if it's a valid DOM Element.\n * @public\n * @example\n * var el = Ink.s('#element');\n * if( InkElement.isDOMElement( el ) === true ){\n * // It is a DOM Element.\n * } else {\n * // It is NOT a DOM Element.\n * }\n */\n isDOMElement: function(o) {\n return o !== null && typeof o === 'object' && 'nodeType' in o && o.nodeType === 1;\n },\n\n /**\n * Shortcut for `document.getElementById`\n *\n * @method get\n * @param {String|DOMElement} elm Either an ID of an element, or an element.\n * @return {DOMElement|null} The DOM element with the given id or null when it was not found\n * @public\n * @sample Ink_Dom_Element_1_get.html\n */\n get: function(elm) {\n if(typeof elm !== 'undefined') {\n if(typeof elm === 'string') {\n return document.getElementById(elm);\n }\n return elm;\n }\n return null;\n },\n\n /**\n * Creates a DOM element.\n *\n * Just a shortcut for `document.createElement(tag)`, but with the second argument you can call additional functions present in Ink.Dom.Element.\n *\n * @method create\n * @param {String} tag Tag name\n * @param {Object} properties Object with properties to be set on the element. You can also call other functions in Ink.Dom.Element like this\n * @return {Element} The newly created element.\n * @public\n * @sample Ink_Dom_Element_1_create.html\n */\n create: function(tag, properties) {\n var el = document.createElement(tag);\n //Ink.extendObj(el, properties);\n if (properties) {\n for(var property in properties) {\n if(properties.hasOwnProperty(property)) {\n if (property in InkElement) {\n InkElement[property](el, properties[property]);\n } else {\n if(property === 'className' || property === 'class') {\n el.className = properties.className || properties['class'];\n } else {\n el.setAttribute(property, properties[property]);\n }\n }\n }\n }\n }\n return el;\n },\n\n /**\n * Removes a DOM Element\n *\n * @method remove\n * @param {Element} elm The element to remove\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_remove.html\n */\n remove: function(elm) {\n elm = Ink.i(elm);\n var parEl;\n if (elm && (parEl = elm.parentNode)) {\n parEl.removeChild(elm);\n }\n },\n\n /**\n * Scrolls the window to an element\n *\n * @method scrollTo\n * @param {DOMElement|String} elm Element where to scroll\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_scrollTo.html\n */\n scrollTo: function(elm) {\n elm = InkElement.get(elm);\n if(elm) {\n if (elm.scrollIntoView) {\n return elm.scrollIntoView();\n }\n\n var elmOffset = {},\n elmTop = 0, elmLeft = 0;\n\n do {\n elmTop += elm.offsetTop || 0;\n elmLeft += elm.offsetLeft || 0;\n\n elm = elm.offsetParent;\n } while(elm);\n\n elmOffset = {x: elmLeft, y: elmTop};\n\n window.scrollTo(elmOffset.x, elmOffset.y);\n }\n },\n\n /**\n * Gets the top offset of an element\n *\n * @method offsetTop\n * @uses Ink.Dom.Browser\n *\n * @param {DOMElement|String} elm Target element\n * @return {Number} Offset from the target element to the top of the document.\n * @public\n * @sample Ink_Dom_Element_1_offsetTop.html\n */\n offsetTop: function(elm) {\n return InkElement.offset(elm)[1];\n },\n\n /**\n * Gets the left offset of an element\n *\n * @method offsetLeft\n * @uses Ink.Dom.Browser\n *\n * @param {DOMElement|String} elm Target element\n * @return {Number} Offset from the target element to the left of the document\n * @public\n * @sample Ink_Dom_Element_1_offsetLeft.html\n */\n offsetLeft: function(elm) {\n return InkElement.offset(elm)[0];\n },\n\n /**\n * Gets the relative offset of an element\n *\n * @method positionedOffset\n * @param {Element|String} element Target element\n * @return {Array} Array with the element offsetleft and offsettop relative to the closest positioned ancestor\n * @public\n * @sample Ink_Dom_Element_1_positionedOffset.html\n */\n positionedOffset: function(element) {\n var valueTop = 0, valueLeft = 0;\n element = InkElement.get(element);\n do {\n valueTop += element.offsetTop || 0;\n valueLeft += element.offsetLeft || 0;\n element = element.offsetParent;\n if (element) {\n if (element.tagName.toLowerCase() === 'body') { break; }\n\n var value = element.style.position;\n if (!value && element.currentStyle) {\n value = element.currentStyle.position;\n }\n if ((!value || value === 'auto') && typeof getComputedStyle !== 'undefined') {\n var css = getComputedStyle(element, null);\n value = css ? css.position : null;\n }\n if (value === 'relative' || value === 'absolute') { break; }\n }\n } while (element);\n return [valueLeft, valueTop];\n },\n\n /**\n * Gets the cumulative offset for an element\n *\n * Returns the top left position of the element on the page\n *\n * @method offset\n * @uses Ink.Dom.Browser\n *\n * @method offset\n * @param {DOMElement|String} elm Target element\n * @return {[Number, Number]} Array with pixel distance from the target element to the top left corner of the document\n * @public\n * @sample Ink_Dom_Element_1_offset.html\n */\n offset: function(elm) {\n /*jshint boss:true */\n elm = Ink.i(elm);\n var res = [0, 0];\n var doc = elm.ownerDocument,\n docElem = doc.documentElement,\n box = rect(elm),\n body = doc.body,\n clientTop = docElem.clientTop || body.clientTop || 0,\n clientLeft = docElem.clientLeft || body.clientLeft || 0,\n scrollTop = doc.pageYOffset || docElem.scrollTop || body.scrollTop,\n scrollLeft = doc.pageXOffset || docElem.scrollLeft || body.scrollLeft,\n top = box.top + scrollTop - clientTop,\n left = box.left + scrollLeft - clientLeft;\n res = [left, top];\n return res;\n },\n\n /**\n * Gets the scroll of the element\n *\n * @method scroll\n * @param {DOMElement|String} [elm] Target element or document.body\n * @returns {Array} offset values for x and y scroll\n * @public\n * @sample Ink_Dom_Element_1_scroll.html\n */\n scroll: function(elm) {\n elm = elm ? Ink.i(elm) : document.body;\n return [\n ( ( !window.pageXOffset ) ? elm.scrollLeft : window.pageXOffset ),\n ( ( !window.pageYOffset ) ? elm.scrollTop : window.pageYOffset )\n ];\n },\n\n _getPropPx: function(cs, prop) {\n var n, c;\n var val = cs.getPropertyValue ? cs.getPropertyValue(prop) : cs[prop];\n if (!val) { n = 0; }\n else {\n c = val.indexOf('px');\n if (c === -1) { n = 0; }\n else {\n n = parseFloat(val, 10);\n }\n }\n\n //console.log([prop, ' \"', val, '\" ', n].join(''));\n\n return n;\n },\n\n /**\n * Alias for offset()\n *\n * @method offset2\n * @param {Element} el Element to be passed to `offset()`\n * @return {void}\n * @public\n * @deprecated Kept for historic reasons. Use offset() instead.\n */\n offset2: function(el) {\n return InkElement.offset(el);\n },\n\n /**\n * Checks if an element has an attribute\n *\n * @method hasAttribute\n * @param {Object} elm Target element\n * @param {String} attr Attribute name\n * @return {Boolean} Boolean based on existance of attribute\n * @sample Ink_Dom_Element_1_hasAttribute.html\n */\n hasAttribute: function(elm, attr){\n elm = Ink.i(elm);\n return elm.hasAttribute ? elm.hasAttribute(attr) : !!elm.getAttribute(attr);\n },\n /**\n * Inserts an element right after another\n *\n * @method insertAfter\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertAfter.html\n */\n insertAfter: function(newElm, targetElm) {\n /*jshint boss:true */\n if (targetElm = InkElement.get(targetElm)) {\n if (targetElm.nextSibling !== null) {\n targetElm.parentNode.insertBefore(newElm, targetElm.nextSibling);\n } else {\n targetElm.parentNode.appendChild(newElm);\n }\n }\n },\n\n /**\n * Inserts an element before another\n *\n * @method insertBefore\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertBefore.html\n */\n insertBefore: function (newElm, targetElm) {\n /*jshint boss:true */\n if ( (targetElm = InkElement.get(targetElm)) ) {\n targetElm.parentNode.insertBefore(newElm, targetElm);\n }\n },\n\n /**\n * Inserts an element as the first child of another\n *\n * @method insertTop\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertTop.html\n */\n insertTop: function(newElm,targetElm) {\n /*jshint boss:true */\n if (targetElm = InkElement.get(targetElm)) {\n if (targetElm.firstChild) {\n targetElm.insertBefore(newElm, targetElm.firstChild);\n } else {\n targetElm.appendChild(newElm);\n }\n }\n },\n\n /**\n * Inserts an element as the last child of another\n *\n * @method insertBottom\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertBottom.html\n */\n insertBottom: function(newElm, targetElm) {\n /*jshint boss:true */\n targetElm = Ink.i(targetElm);\n targetElm.appendChild(newElm);\n },\n\n /**\n * Retrieves textContent from node\n *\n * @method textContent\n * @param {DOMNode} node Where to retreive text from. Can be any node type.\n * @return {String} The text\n * @public\n * @sample Ink_Dom_Element_1_textContent.html\n */\n textContent: function(node){\n node = Ink.i(node);\n var text, k, cs, m;\n\n switch(node && node.nodeType) {\n case 9: /*DOCUMENT_NODE*/\n // IE quirks mode does not have documentElement\n return InkElement.textContent(node.documentElement || node.body && node.body.parentNode || node.body);\n\n case 1: /*ELEMENT_NODE*/\n text = ('textContent' in node) ? node.textContent : node.innerText;\n if (typeof text !== 'undefined') {\n return text;\n }\n /* falls through */\n case 11: /*DOCUMENT_FRAGMENT_NODE*/\n text = node.textContent;\n if (typeof text !== 'undefined') {\n return text;\n }\n\n if (node.firstChild === node.lastChild) {\n // Common case: 0 or 1 children\n return InkElement.textContent(node.firstChild);\n }\n\n text = [];\n cs = node.childNodes;\n for (k = 0, m = cs.length; k < m; ++k) {\n text.push( InkElement.textContent( cs[k] ) );\n }\n return text.join('');\n\n case 3: /*TEXT_NODE*/\n case 4: /*CDATA_SECTION_NODE*/\n return node.nodeValue;\n }\n return '';\n },\n\n /**\n * Replaces text content of a DOM Node\n * This method removes any child node previously present\n *\n * @method setTextContent\n * @param {Element} node Target node where the text will be added.\n * @param {String} text Text to be added on the node.\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_setTextContent.html\n */\n setTextContent: function(node, text){\n node = Ink.i(node);\n switch(node && node.nodeType)\n {\n case 1: /*ELEMENT_NODE*/\n if ('innerText' in node) {\n node.innerText = text;\n break;\n }\n /* falls through */\n case 11: /*DOCUMENT_FRAGMENT_NODE*/\n if ('textContent' in node) {\n node.textContent = text;\n break;\n }\n /* falls through */\n case 9: /*DOCUMENT_NODE*/\n while(node.firstChild) {\n node.removeChild(node.firstChild);\n }\n if (text !== '') {\n var doc = node.ownerDocument || node;\n node.appendChild(doc.createTextNode(text));\n }\n break;\n\n case 3: /*TEXT_NODE*/\n case 4: /*CDATA_SECTION_NODE*/\n node.nodeValue = text;\n break;\n }\n },\n\n /**\n * Checks if an element is a link\n *\n * @method isLink\n * @param {Element} element Element to check if it's a link.\n * @return {Boolean} Whether the element is a link.\n * @public\n * @sample Ink_Dom_Element_1_isLink.html\n */\n isLink: function(element){\n var b = element && element.nodeType === 1 && ((/^a|area$/i).test(element.tagName) ||\n element.hasAttributeNS && element.hasAttributeNS('http://www.w3.org/1999/xlink','href'));\n return !!b;\n },\n\n /**\n * Checks if a node is an ancestor of another\n *\n * @method isAncestorOf\n * @param {DOMNode} ancestor Ancestor node\n * @param {DOMNode} node Descendant node\n * @return {Boolean} Whether `ancestor` is an ancestor of `node`\n * @public\n * @sample Ink_Dom_Element_1_isAncestorOf.html\n */\n isAncestorOf: function(ancestor, node){\n /*jshint boss:true */\n if (!node || !ancestor) {\n return false;\n }\n if (node.compareDocumentPosition) {\n return (ancestor.compareDocumentPosition(node) & 0x10) !== 0;/*Node.DOCUMENT_POSITION_CONTAINED_BY*/\n }\n while (node = node.parentNode){\n if (node === ancestor){\n return true;\n }\n }\n return false;\n },\n\n /**\n * Checks if a node is descendant of another\n *\n * @method descendantOf\n * @param {DOMNode} node The ancestor\n * @param {DOMNode} descendant The descendant\n * @return {Boolean} `true` if 'descendant' is descendant of 'node'\n * @public\n * @sample Ink_Dom_Element_1_descendantOf.html\n */\n descendantOf: function(node, descendant){\n return node !== descendant && InkElement.isAncestorOf(node, descendant);\n },\n\n /**\n * Get first child element of another\n * @method firstElementChild\n * @param {DOMElement} elm Parent node\n * @return {DOMElement} the Element child\n * @public\n * @sample Ink_Dom_Element_1_firstElementChild.html\n */\n firstElementChild: function(elm){\n if(!elm) {\n return null;\n }\n if ('firstElementChild' in elm) {\n return elm.firstElementChild;\n }\n var child = elm.firstChild;\n while(child && child.nodeType !== 1) {\n child = child.nextSibling;\n }\n return child;\n },\n\n /**\n * Get the last child element of another\n * @method lastElementChild\n * @param {DOMElement} elm Parent node\n * @return {DOMElement} the Element child\n * @public\n * @sample Ink_Dom_Element_1_lastElementChild.html\n */\n lastElementChild: function(elm){\n if(!elm) {\n return null;\n }\n if ('lastElementChild' in elm) {\n return elm.lastElementChild;\n }\n var child = elm.lastChild;\n while(child && child.nodeType !== 1) {\n child = child.previousSibling;\n }\n return child;\n },\n\n /**\n * Get the first sibling element after the node\n *\n * @method nextElementSibling\n * @param {DOMNode} node The current node\n * @return {DOMElement|Null} The first sibling element after node or null if none is found\n * @public\n * @sample Ink_Dom_Element_1_nextElementSibling.html \n */\n nextElementSibling: function(node){\n var sibling = null;\n\n if(!node){ return sibling; }\n\n if(\"nextElementSibling\" in node){\n return node.nextElementSibling;\n } else {\n sibling = node.nextSibling;\n\n // 1 === Node.ELEMENT_NODE\n while(sibling && sibling.nodeType !== 1){\n sibling = sibling.nextSibling;\n }\n\n return sibling;\n }\n },\n\n /**\n * Get the first sibling element before the node\n *\n * @method previousElementSibling\n * @param {DOMNode} node The current node\n * @return {DOMElement|Null} The first element sibling before node or null if none is found\n * @public\n * @sample Ink_Dom_Element_1_previousElementSibling.html \n */\n previousElementSibling: function(node){\n var sibling = null;\n\n if(!node){ return sibling; }\n\n if(\"previousElementSibling\" in node){\n return node.previousElementSibling;\n } else {\n sibling = node.previousSibling;\n\n // 1 === Node.ELEMENT_NODE\n while(sibling && sibling.nodeType !== 1){\n sibling = sibling.previousSibling;\n }\n\n return sibling;\n }\n },\n\n /**\n * Get an element's width in pixels.\n *\n * @method elementWidth\n * @param {DOMElement|String} element Target DOM element or target ID\n * @return {Number} The element's width\n * @public\n * @sample Ink_Dom_Element_1_elementWidth.html \n */\n elementWidth: function(element) {\n if(typeof element === \"string\") {\n element = document.getElementById(element);\n }\n return element.offsetWidth;\n },\n\n /**\n * Get an element's height in pixels.\n *\n * @method elementHeight\n * @param {DOMElement|String} element DOM element or target ID\n * @return {Number} The element's height\n * @public\n * @sample Ink_Dom_Element_1_elementHeight.html \n */\n elementHeight: function(element) {\n if(typeof element === \"string\") {\n element = document.getElementById(element);\n }\n return element.offsetHeight;\n },\n\n /**\n * Deprecated. Alias for offsetLeft()\n *\n * @method elementLeft\n * @param {DOMElement|String} element DOM element or target ID\n * @return {Number} Element's left position\n */\n elementLeft: function(element) {\n return InkElement.offsetLeft(element);\n },\n\n /**\n * Deprecated. Alias for offsetTop()\n *\n * @method elementTop\n * @param {DOMElement|string} element Target DOM element or target ID\n * @return {Number} element's top position\n */\n elementTop: function(element) {\n return InkElement.offsetTop(element);\n },\n\n /**\n * Get an element's dimensions in pixels.\n *\n * @method elementDimensions\n * @param {DOMElement|string} element DOM element or target ID\n * @return {Array} Array with element's width and height\n * @sample Ink_Dom_Element_1_elementDimensions.html \n */\n elementDimensions: function(element) {\n element = Ink.i(element);\n return [element.offsetWidth, element.offsetHeight];\n },\n\n /**\n * Get the outer dimensions of an element in pixels.\n *\n * @method outerDimensions\n * @uses Ink.Dom.Css\n *\n * @param {DOMElement} element Target element\n * @return {Array} Array with element width and height.\n * @sample Ink_Dom_Element_1_outerDimensions.html \n */\n outerDimensions: function (element) {\n var bbox = rect(element);\n\n var Css = Ink.getModule('Ink.Dom.Css_1');\n var getStyle = Ink.bindMethod(Css, 'getStyle', element);\n\n return [\n bbox.right - bbox.left + parseFloat(getStyle('marginLeft') || 0) + parseFloat(getStyle('marginRight') || 0), // w\n bbox.bottom - bbox.top + parseFloat(getStyle('marginTop') || 0) + parseFloat(getStyle('marginBottom') || 0) // h\n ];\n },\n\n /**\n * Check if an element is inside the viewport\n *\n * @method inViewport\n * @param {DOMElement} element DOM Element\n * @param {Object} [options] Options object. If you pass a Boolean value here, it is interpreted as `options.partial`\n * @param {Boolean} [options.partial]=false Return `true` even if it is only partially visible.\n * @param {Number} [options.margin]=0 Consider a margin all around the viewport with `opts.margin` width a dead zone.\n * @return {Boolean} Whether the element is inside the viewport.\n * @public\n * @sample Ink_Dom_Element_1_inViewport.html \n */\n inViewport: function (element, options) {\n var dims = rect(Ink.i(element));\n if (typeof options === 'boolean') {\n options = {partial: options, margin: 0};\n }\n options = Ink.extendObj({ partial: false, margin: 0}, options || {});\n if (options.partial) {\n return dims.bottom + options.margin > 0 && // from the top\n dims.left - options.margin < InkElement.viewportWidth() && // from the right\n dims.top - options.margin < InkElement.viewportHeight() && // from the bottom\n dims.right + options.margin > 0; // from the left\n } else {\n return dims.top + options.margin > 0 && // from the top\n dims.right - options.margin < InkElement.viewportWidth() && // from the right\n dims.bottom - options.margin < InkElement.viewportHeight() && // from the bottom\n dims.left + options.margin > 0; // from the left\n }\n },\n\n /**\n * Check if an element is hidden.\n * Taken from Mootools Element extras ( https://gist.github.com/cheeaun/73342 )\n * Does not take into account visibility:hidden\n * @method isHidden\n * @param {DOMElement} element Element to check\n * @return {Boolean} Whether the element is hidden\n * @sample Ink_Dom_Element_1_isHidden.html \n */\n isHidden: function (element) {\n var w = element.offsetWidth, \n h = element.offsetHeight,\n force = (element.tagName.toLowerCase() === 'tr');\n\n var Css = Ink.getModule('Ink.Dom.Css_1');\n\n return (w===0 && h===0 && !force) ? true :\n (w!==0 && h!==0 && !force) ? false :\n Css.getStyle(element, 'display').toLowerCase() === 'none';\n },\n\n /**\n * Check if an element is visible \n *\n * @method isVisible\n * @uses isHidden\n * @param {DOMElement} element Element to check\n * @return {Boolean} Whether the element is visible\n * @sample Ink_Dom_Element_1_isVisible.html \n */\n isVisible: function (element) {\n return !this.isHidden(element);\n },\n\n /**\n * Clones an element's position to another\n *\n * @method clonePosition\n * @param {Element} cloneTo element to be position cloned\n * @param {Element} cloneFrom element to get the cloned position\n * @return {Element} The element with positionClone\n * @public\n * @sample Ink_Dom_Element_1_clonePosition.html \n */\n clonePosition: function(cloneTo, cloneFrom){\n var pos = InkElement.offset(cloneFrom);\n cloneTo.style.left = pos[0]+'px';\n cloneTo.style.top = pos[1]+'px';\n\n return cloneTo;\n },\n\n /**\n * Text-overflow: ellipsis emulation\n * Slices off a piece of text at the end of the element and adds the ellipsis so all text fits inside.\n *\n * @method ellipsizeText\n * @param {Element} element Element to modify text content\n * @param {String} [ellipsis='\\u2026'] String to append to the chopped text\n * @return {void}\n * @public\n */\n ellipsizeText: function(element/*, ellipsis*/){\n if ((element = Ink.i(element))) {\n element.style.overflow = 'hidden';\n element.style.whiteSpace = 'nowrap';\n element.style.textOverflow = 'ellipsis';\n }\n },\n\n /**\n * Finds the closest ancestor element matching your test function\n *\n * @method findUpwardsHaving\n * @param {Element} element Element to base the search from\n * @param {Function} boolTest Testing function\n * @return {Element|false} The matched element or false if did not match\n * @public\n * @sample Ink_Dom_Element_1_findUpwardsHaving.html \n */\n findUpwardsHaving: function(element, boolTest) {\n while (element && element.nodeType === 1) {\n if (boolTest(element)) {\n return element;\n }\n element = element.parentNode;\n }\n return false;\n },\n\n /**\n * Finds the closest ancestor by class name\n *\n * @method findUpwardsByClass\n * @uses findUpwardsHaving\n * @param {DOMElement} element Element to base the search from\n * @param {String} className Class name to search\n * @returns {DOMElement|false} The matched element or false if did not match\n * @public\n * @sample Ink_Dom_Element_1_findUpwardsByClass.html \n */\n findUpwardsByClass: function(element, className) {\n var re = new RegExp(\"(^|\\\\s)\" + className + \"(\\\\s|$)\");\n var tst = function(el) {\n var cls = el.className;\n return cls && re.test(cls);\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Finds the closest ancestor by tag name\n *\n * @method findUpwardsByTag\n * @param {DOMElement} element Element to base the search from\n * @param {String} tag Tag to search\n * @returns {DOMElement|false} the matched element or false if did not match\n * @sample Ink_Dom_Element_1_findUpwardsByTag.html \n */\n findUpwardsByTag: function(element, tag) {\n tag = tag.toUpperCase();\n var tst = function(el) {\n return el.nodeName && el.nodeName.toUpperCase() === tag;\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Finds the closest ancestor by id\n *\n * @method findUpwardsById\n * @param {HtmlElement} element Element to base the search from\n * @param {String} id ID to search\n * @returns {HtmlElement|false} The matched element or false if did not match\n * @sample Ink_Dom_Element_1_findUpwardsById.html \n */\n findUpwardsById: function(element, id) {\n var tst = function(el) {\n return el.id === id;\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Finds the closest ancestor by CSS selector\n *\n * @method findUpwardsBySelector\n * @param {HtmlElement} element Element to base the search from\n * @param {String} sel CSS selector\n * @returns {HtmlElement|false} The matched element or false if did not match\n * @sample Ink_Dom_Element_1_findUpwardsBySelector.html \n */\n findUpwardsBySelector: function(element, sel) {\n var Selector = Ink.getModule('Ink.Dom.Selector', '1');\n if (!Selector) {\n throw new Error('This method requires Ink.Dom.Selector');\n }\n var tst = function(el) {\n return Selector.matchesSelector(el, sel);\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Gets the trimmed text of an element\n *\n * @method getChildrenText\n * @param {DOMElement} el Element to base the search from\n * @param {Boolean} [removeIt] Flag to remove the text from the element\n * @return {String} Text found\n * @sample Ink_Dom_Element_1_getChildrenText.html \n */\n getChildrenText: function(el, removeIt) {\n var node,\n j,\n part,\n nodes = el.childNodes,\n jLen = nodes.length,\n text = '';\n\n if (!el) {\n return text;\n }\n\n for (j = 0; j < jLen; ++j) {\n node = nodes[j];\n if (!node) { continue; }\n if (node.nodeType === 3) { // TEXT NODE\n part = InkElement._trimString( String(node.data) );\n if (part.length > 0) {\n text += part;\n if (removeIt) { el.removeChild(node); }\n }\n else { el.removeChild(node); }\n }\n }\n\n return text;\n },\n\n /**\n * String trim implementation\n * Used by getChildrenText\n *\n * function _trimString\n * param {String} text\n * return {String} trimmed text\n */\n _trimString: function(text) {\n return (String.prototype.trim) ? text.trim() : text.replace(/^\\s*/, '').replace(/\\s*$/, '');\n },\n\n /**\n * Gets value of a select element\n *\n * @method getSelectValues\n * @param {DOMElement|String} select element\n * @return {Array} The selected values\n * @sample Ink_Dom_Element_1_getSelectValues.html \n */\n getSelectValues: function (select) {\n var selectEl = Ink.i(select);\n var values = [];\n for (var i = 0; i < selectEl.options.length; ++i) {\n values.push( selectEl.options[i].value );\n }\n return values;\n },\n\n\n /* used by fills */\n _normalizeData: function(data) {\n var d, data2 = [];\n for (var i = 0, f = data.length; i < f; ++i) {\n d = data[i];\n\n if (!(d instanceof Array)) { // if not array, wraps primitive twice: val -> [val, val]\n d = [d, d];\n }\n else if (d.length === 1) { // if 1 element array: [val] -> [val, val]\n d.push(d[0]);\n }\n data2.push(d);\n }\n return data2;\n },\n\n\n /**\n * Fills a select element with options\n *\n * @method fillSelect\n * @param {DOMElement|String} container Select element which will get filled\n * @param {Array} data Data to populate the component\n * @param {Boolean} [skipEmpty] Flag to skip empty option\n * @param {String|Number} [defaultValue] Initial selected value\n * @return {void}\n * @public\n *\n * @sample Ink_Dom_Element_1_fillSelect.html \n */\n fillSelect: function(container, data, skipEmpty, defaultValue) {\n var containerEl = Ink.i(container);\n if (!containerEl) { return; }\n\n containerEl.innerHTML = '';\n var d, optionEl;\n\n if (!skipEmpty) {\n // add initial empty option\n optionEl = document.createElement('option');\n optionEl.setAttribute('value', '');\n containerEl.appendChild(optionEl);\n }\n\n data = InkElement._normalizeData(data);\n\n for (var i = 0, f = data.length; i < f; ++i) {\n d = data[i];\n\n optionEl = document.createElement('option');\n optionEl.setAttribute('value', d[0]);\n if (d.length > 2) {\n optionEl.setAttribute('extra', d[2]);\n }\n optionEl.appendChild( document.createTextNode(d[1]) );\n\n if (d[0] === defaultValue) {\n optionEl.setAttribute('selected', 'selected');\n }\n\n containerEl.appendChild(optionEl);\n }\n },\n\n\n /**\n * Creates a set of radio buttons from an array of data\n *\n * @method fillRadios\n * @param {Element|String} insertAfterEl Element after which the input elements will be created\n * @param {String} name Name for the form field ([] is added if not present as a suffix)\n * @param {Array} data Data to populate the component\n * @param {Boolean} [skipEmpty] Flag to skip creation of empty options\n * @param {String|Number} [defaultValue] Initial selected value\n * @param {String} [splitEl] Name of element to add after each input element (example: 'br')\n * @return {DOMElement} Wrapper element around the radio buttons\n */\n fillRadios: function(insertAfterEl, name, data, skipEmpty, defaultValue, splitEl) {\n insertAfterEl = Ink.i(insertAfterEl);\n var containerEl = document.createElement('span');\n InkElement.insertAfter(containerEl, insertAfterEl);\n\n data = InkElement._normalizeData(data);\n\n /*\n if (name.substring(name.length - 1) !== ']') {\n name += '[]';\n }\n */\n\n var d, inputEl;\n\n if (!skipEmpty) {\n // add initial empty option\n inputEl = document.createElement('input');\n inputEl.setAttribute('type', 'radio');\n inputEl.setAttribute('name', name);\n inputEl.setAttribute('value', '');\n containerEl.appendChild(inputEl);\n if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); }\n }\n\n for (var i = 0; i < data.length; ++i) {\n d = data[i];\n\n inputEl = document.createElement('input');\n inputEl.setAttribute('type', 'radio');\n inputEl.setAttribute('name', name);\n inputEl.setAttribute('value', d[0]);\n containerEl.appendChild(inputEl);\n containerEl.appendChild( document.createTextNode(d[1]) );\n if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); }\n\n if (d[0] === defaultValue) {\n inputEl.checked = true;\n }\n }\n\n return containerEl;\n },\n\n\n /**\n * Creates set of checkbox buttons\n *\n * @method fillChecks\n * @param {Element|String} insertAfterEl Element after which the input elements will be created\n * @param {String} name Name for the form field ([] is added if not present as a suffix)\n * @param {Array} data Data to populate the component\n * @param {String|Number} [defaultValue] Initial selected value\n * @param {String} [splitEl] Name of element to add after each input element (example: 'br')\n * @return {Element} Wrapper element around the checkboxes\n * @public\n */\n fillChecks: function(insertAfterEl, name, data, defaultValue, splitEl) {\n insertAfterEl = Ink.i(insertAfterEl);\n var containerEl = document.createElement('span');\n InkElement.insertAfter(containerEl, insertAfterEl);\n\n data = InkElement._normalizeData(data);\n\n if (name.substring(name.length - 1) !== ']') {\n name += '[]';\n }\n\n var d, inputEl;\n\n for (var i = 0; i < data.length; ++i) {\n d = data[i];\n\n inputEl = document.createElement('input');\n inputEl.setAttribute('type', 'checkbox');\n inputEl.setAttribute('name', name);\n inputEl.setAttribute('value', d[0]);\n containerEl.appendChild(inputEl);\n containerEl.appendChild( document.createTextNode(d[1]) );\n if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); }\n\n if (d[0] === defaultValue) {\n inputEl.checked = true;\n }\n }\n\n return containerEl;\n },\n\n\n /**\n * Gets the index of an element relative to a parent\n *\n * @method parentIndexOf\n * @param {Element} [parentEl] childEl's parent. Deprecated.\n * @param {Element} childEl Child Element to look for\n * @return {Number} The index of the childEl inside parentEl. Returns -1 if it's not a direct child\n * @public\n * @sample Ink_Dom_Element_1_parentIndexOf.html \n */\n parentIndexOf: function(parentEl, childEl) {\n if (!childEl) {\n // one argument form\n childEl = parentEl;\n parentEl = parentEl.parentNode;\n }\n if (!parentEl) { return false; }\n for (var i = 0, f = parentEl.children.length; i < f; ++i) {\n if (parentEl.children[i] === childEl) {\n return i;\n }\n }\n return false;\n },\n\n\n /**\n * Gets the next siblings of an element\n *\n * @method nextSiblings\n * @param {String|DOMElement} elm Element\n * @return {Array} Array of next sibling elements\n * @sample Ink_Dom_Element_1_nextSiblings.html \n */\n nextSiblings: function(elm) {\n elm = Ink.i(elm);\n if(typeof(elm) === 'object' && elm !== null && elm.nodeType && elm.nodeType === 1) {\n var elements = [],\n siblings = elm.parentNode.children,\n index = InkElement.parentIndexOf(elm.parentNode, elm);\n\n for(var i = ++index, len = siblings.length; i\" + html + \"
          \" + deleteThisTbodyToken + \"
          \";\n } else {\n div.innerHTML = \"\" + html + \"
          \";\n }\n return div.firstChild;\n },\n TBODY: function (div, html) {\n div.innerHTML = '' + html + '
          ';\n return div.firstChild.getElementsByTagName('tbody')[0];\n },\n THEAD: function (div, html) {\n div.innerHTML = '' + html + '
          ';\n return div.firstChild.getElementsByTagName('thead')[0];\n },\n TFOOT: function (div, html) {\n div.innerHTML = '' + html + '
          ';\n return div.firstChild.getElementsByTagName('tfoot')[0];\n },\n TR: function (div, html) {\n div.innerHTML = '' + html + '
          ';\n return div.firstChild.firstChild.firstChild;\n }\n },\n\n /**\n * Gets a wrapper DIV with a certain HTML content to be inserted inside another element.\n * This is necessary for appendHTML,prependHTML functions, because they need a container element to copy the children from.\n *\n * Works around IE table quirks\n * @method _getWrapper\n * @private\n * @param elm\n * @param html\n */\n _getWrapper: function (elm, html) {\n var nodeName = elm.nodeName && elm.nodeName.toUpperCase();\n var wrapper = document.createElement('div');\n var wrapFunc = InkElement._wrapElements[nodeName];\n\n if ( !wrapFunc ) {\n wrapper.innerHTML = html;\n return wrapper;\n }\n // special cases\n wrapper = wrapFunc(wrapper, html);\n // worst case: tbody auto-creation even when our HTML has a tbody.\n if (browserCreatesTbodies && nodeName === 'TABLE') {\n // terrible case. Deal with tbody creation too.\n var tds = wrapper.getElementsByTagName('td');\n for (var i = 0, len = tds.length; i < len; i++) {\n if (tds[i].innerHTML === deleteThisTbodyToken) {\n var tbody = tds[i].parentNode.parentNode;\n tbody.parentNode.removeChild(tbody);\n }\n }\n }\n return wrapper;\n },\n\n /**\n * Appends HTML to an element.\n * This method parses the html string and doesn't modify its contents\n *\n * @method appendHTML\n * @param {String|DOMElement} elm Element\n * @param {String} html Markup string\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_appendHTML.html \n */\n appendHTML: function(elm, html){\n elm = Ink.i(elm);\n if(elm !== null) {\n var wrapper = InkElement._getWrapper(elm, html);\n while (wrapper.firstChild) {\n elm.appendChild(wrapper.firstChild);\n }\n }\n },\n\n /**\n * Prepends HTML to an element.\n * This method parses the html string and doesn't modify its contents\n *\n * @method prependHTML\n * @param {String|Element} elm Element\n * @param {String} html Markup string to prepend\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_prependHTML.html \n */\n prependHTML: function(elm, html){\n elm = Ink.i(elm);\n if(elm !== null) {\n var wrapper = InkElement._getWrapper(elm, html);\n while (wrapper.lastChild) {\n elm.insertBefore(wrapper.lastChild, elm.firstChild);\n }\n }\n },\n\n /**\n * Sets the inner HTML of an element.\n *\n * @method setHTML\n * @param {String|DOMElement} elm Element\n * @param {String} html Markup string\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_setHTML.html \n */\n setHTML: function (elm, html) {\n elm = Ink.i(elm);\n if(elm !== null) {\n try {\n elm.innerHTML = html;\n } catch (e) {\n // Tables in IE7\n while (elm.firstChild) {\n elm.removeChild(elm.firstChild);\n }\n InkElement.appendHTML(elm, html);\n }\n }\n },\n\n /**\n * Wraps an element inside a container.\n *\n * The container may or may not be in the document yet.\n *\n * @method wrap\n * @param {String|Element} target Element to be wrapped\n * @param {String|Element} container Element to wrap the target\n * @return {Element} Container element\n * @public\n * @sample Ink_Dom_Element_1_wrap.html \n *\n * @example\n * before:\n *\n *
          \n *\n * call this function to wrap #target with a wrapper div.\n *\n * InkElement.wrap('target', InkElement.create('div', {id: 'container'});\n * \n * after: \n *\n *
          \n */\n wrap: function (target, container) {\n target = Ink.i(target);\n container = Ink.i(container);\n \n var nextNode = target.nextSibling;\n var parent = target.parentNode;\n\n container.appendChild(target);\n\n if (nextNode !== null) {\n parent.insertBefore(container, nextNode);\n } else {\n parent.appendChild(container);\n }\n\n return container;\n },\n\n /**\n * Places an element outside a wrapper.\n *\n * @method unwrap\n * @param {DOMElement} elem The element you're trying to unwrap. This should be an ancestor of the wrapper.\n * @param {String} [wrapperSelector] CSS Selector for the ancestor. Use this if your wrapper is not the direct parent of elem.\n * @return {void}\n * @sample Ink_Dom_Element_1_unwrap.html \n *\n * @example\n *\n * When you have this:\n *\n *
          \n *
          \n *
          \n *\n * If you do this:\n *\n * InkElement.unwrap('unwrapMe');\n *\n * You get this:\n *\n *
          \n *
          \n * \n **/\n unwrap: function (elem, wrapperSelector) {\n elem = Ink.i(elem);\n var wrapper;\n if (typeof wrapperSelector === 'string') {\n wrapper = InkElement.findUpwardsBySelector(elem, wrapperSelector);\n } else if (typeof wrapperSelector === 'object' && wrapperSelector.tagName) {\n wrapper = InkElement.findUpwardsHaving(elem, function (ancestor) {\n return ancestor === wrapperSelector;\n });\n } else {\n wrapper = elem.parentNode;\n }\n if (!wrapper || !wrapper.parentNode) { return; }\n\n InkElement.insertBefore(elem, wrapper);\n },\n\n /**\n * Replaces an element with another.\n *\n * @method replace\n * @param {Element} element The element to be replaced.\n * @param {Element} replacement The new element.\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_replace.html \n *\n * @example\n * var newelement1 = InkElement.create('div');\n * // ...\n * replace(Ink.i('element1'), newelement1);\n */\n replace: function (element, replacement) {\n element = Ink.i(element);\n if(element !== null) {\n element.parentNode.replaceChild(replacement, element);\n }\n },\n\n /**\n * Removes direct text children.\n * Useful to remove nasty layout gaps generated by whitespace on the markup.\n *\n * @method removeTextNodeChildren\n * @param {Element} el Element to remove text from\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_removeTextNodeChildren.html \n */\n removeTextNodeChildren: function(el) {\n el = Ink.i(el);\n if(el !== null) {\n var prevEl, toRemove, parent = el;\n el = el.firstChild;\n while (el) {\n toRemove = (el.nodeType === 3);\n prevEl = el;\n el = el.nextSibling;\n if (toRemove) {\n parent.removeChild(prevEl);\n }\n }\n }\n },\n\n /**\n * Creates a documentFragment from an HTML string.\n *\n * @method htmlToFragment\n * @param {String} html HTML string\n * @return {DocumentFragment} DocumentFragment containing all of the elements from the html string\n * @sample Ink_Dom_Element_1_htmlToFragment.html \n */\n htmlToFragment: (createContextualFragmentSupport ?\n function(html){\n var range;\n\n if(typeof html !== 'string'){ return document.createDocumentFragment(); }\n\n range = document.createRange();\n\n // set the context to document.body (firefox does this already, webkit doesn't)\n range.selectNode(document.body);\n\n return range.createContextualFragment(html);\n } : function (html) {\n var fragment = document.createDocumentFragment(),\n tempElement,\n current;\n\n if(typeof html !== 'string'){ return fragment; }\n\n tempElement = document.createElement('div');\n tempElement.innerHTML = html;\n\n // append child removes elements from the original parent\n while( (current = tempElement.firstChild) ){ // intentional assignment\n fragment.appendChild(current);\n }\n\n return fragment;\n }),\n\n _camelCase: function(str)\n {\n return str ? str.replace(/-(\\w)/g, function (_, $1){\n return $1.toUpperCase();\n }) : str;\n },\n\n /**\n * Gets data attributes from an element\n *\n * @method data\n * @param {String|DOMElement} selector Element or CSS selector\n * @return {Object} Object with the data-* properties. If no data-attributes are present, an empty object is returned.\n * @sample Ink_Dom_Element_1_data.html \n */\n data: function(selector) {\n var el;\n if (typeof selector !== 'object' && typeof selector !== 'string') {\n throw '[Ink.Dom.Element.data] :: Invalid selector defined';\n }\n\n if (typeof selector === 'object') {\n el = selector;\n }\n else {\n var InkDomSelector = Ink.getModule('Ink.Dom.Selector', 1);\n if (!InkDomSelector) {\n throw \"[Ink.Dom.Element.data] :: this method requires Ink.Dom.Selector - v1\";\n }\n el = InkDomSelector.select(selector);\n if (el.length <= 0) {\n throw \"[Ink.Dom.Element.data] :: Can't find any element with the specified selector\";\n }\n el = el[0];\n }\n\n var dataset = {};\n var attrs = el.attributes || [];\n\n var curAttr, curAttrName, curAttrValue;\n if (attrs) {\n for (var i = 0, total = attrs.length; i < total; ++i) {\n curAttr = attrs[i];\n curAttrName = curAttr.name;\n curAttrValue = curAttr.value;\n if (curAttrName && curAttrName.indexOf('data-') === 0) {\n dataset[InkElement._camelCase(curAttrName.replace('data-', ''))] = curAttrValue;\n }\n }\n }\n\n return dataset;\n },\n\n /**\n * Move the cursor on an input or textarea element.\n * @method moveCursorTo\n * @param {Element} el Input or Textarea element\n * @param {Number} t Index of the character to move the cursor to\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_moveCursorTo.html \n */\n moveCursorTo: function(el, t) {\n el = Ink.i(el);\n if(el !== null) {\n if (el.setSelectionRange) {\n el.setSelectionRange(t, t);\n //el.focus();\n }\n else {\n var range = el.createTextRange();\n range.collapse(true);\n range.moveEnd( 'character', t);\n range.moveStart('character', t);\n range.select();\n }\n }\n },\n\n /**\n * Get the page's width.\n * @method pageWidth\n * @return {Number} Page width in pixels\n * @sample Ink_Dom_Element_1_pageWidth.html \n */\n pageWidth: function() {\n var xScroll;\n\n if (window.innerWidth && window.scrollMaxX) {\n xScroll = window.innerWidth + window.scrollMaxX;\n } else if (document.body.scrollWidth > document.body.offsetWidth){\n xScroll = document.body.scrollWidth;\n } else {\n xScroll = document.body.offsetWidth;\n }\n\n var windowWidth;\n\n if (window.self.innerWidth) {\n if(document.documentElement.clientWidth){\n windowWidth = document.documentElement.clientWidth;\n } else {\n windowWidth = window.self.innerWidth;\n }\n } else if (document.documentElement && document.documentElement.clientWidth) {\n windowWidth = document.documentElement.clientWidth;\n } else if (document.body) {\n windowWidth = document.body.clientWidth;\n }\n\n if(xScroll < windowWidth){\n return xScroll;\n } else {\n return windowWidth;\n }\n },\n\n /**\n * Get the page's height.\n * @method pageHeight\n * @return {Number} Page height in pixels\n * @sample Ink_Dom_Element_1_pageHeight.html \n */\n pageHeight: function() {\n var yScroll;\n\n if (window.innerHeight && window.scrollMaxY) {\n yScroll = window.innerHeight + window.scrollMaxY;\n } else if (document.body.scrollHeight > document.body.offsetHeight){\n yScroll = document.body.scrollHeight;\n } else {\n yScroll = document.body.offsetHeight;\n }\n\n var windowHeight;\n\n if (window.self.innerHeight) {\n windowHeight = window.self.innerHeight;\n } else if (document.documentElement && document.documentElement.clientHeight) {\n windowHeight = document.documentElement.clientHeight;\n } else if (document.body) {\n windowHeight = document.body.clientHeight;\n }\n\n if(yScroll < windowHeight){\n return windowHeight;\n } else {\n return yScroll;\n }\n },\n\n /**\n * Get the viewport's width.\n * @method viewportWidth\n * @return {Number} Viewport width in pixels\n * @sample Ink_Dom_Element_1_viewportWidth.html \n */\n viewportWidth: function() {\n if(typeof window.innerWidth !== \"undefined\") {\n return window.innerWidth;\n }\n if (document.documentElement && typeof document.documentElement.offsetWidth !== \"undefined\") {\n return document.documentElement.offsetWidth;\n }\n },\n\n /**\n * Get the viewport's height.\n * @method viewportHeight\n * @return {Number} Viewport height in pixels\n * @sample Ink_Dom_Element_1_viewportHeight.html \n */\n viewportHeight: function() {\n if (typeof window.innerHeight !== \"undefined\") {\n return window.innerHeight;\n }\n if (document.documentElement && typeof document.documentElement.offsetHeight !== \"undefined\") {\n return document.documentElement.offsetHeight;\n }\n },\n\n /**\n * Get the scroll's width.\n * @method scrollWidth\n * @return {Number} Scroll width\n */\n scrollWidth: function() {\n if (typeof window.self.pageXOffset !== 'undefined') {\n return window.self.pageXOffset;\n }\n if (typeof document.documentElement !== 'undefined' && typeof document.documentElement.scrollLeft !== 'undefined') {\n return document.documentElement.scrollLeft;\n }\n return document.body.scrollLeft;\n },\n\n /**\n * Get the scroll's height.\n * @method scrollHeight\n * @return {Number} Scroll height\n */\n scrollHeight: function() {\n if (typeof window.self.pageYOffset !== 'undefined') {\n return window.self.pageYOffset;\n }\n if (typeof document.documentElement !== 'undefined' && typeof document.documentElement.scrollTop !== 'undefined') {\n return document.documentElement.scrollTop;\n }\n return document.body.scrollTop;\n }\n };\n\n return InkElement;\n\n});\n","/**\n * Event management\n * @module Ink.Dom.Event_1\n * @version 1\n */\n\nInk.createModule('Ink.Dom.Event', 1, [], function() {\n /* jshint\n asi:true,\n strict:false,\n laxcomma:true,\n eqeqeq:false,\n laxbreak:true,\n boss:true,\n curly:false,\n expr:true\n */\n\n /**\n * @namespace Ink.Dom.Event_1\n * @static\n */\n\n /*!\n * Bean - copyright (c) Jacob Thornton 2011-2012\n * https://github.com/fat/bean\n * MIT license\n */\n var bean = (function (name, context, definition) {\n return definition()\n })('bean', this, function (name, context) {\n name = name || 'bean'\n context = context || this\n\n var win = window\n , old = context[name]\n , namespaceRegex = /[^\\.]*(?=\\..*)\\.|.*/\n , nameRegex = /\\..*/\n , addEvent = 'addEventListener'\n , removeEvent = 'removeEventListener'\n , doc = document || {}\n , root = doc.documentElement || {}\n , W3C_MODEL = root[addEvent]\n , eventSupport = W3C_MODEL ? addEvent : 'attachEvent'\n , ONE = {} // singleton for quick matching making add() do one()\n\n , slice = Array.prototype.slice\n , str2arr = function (s, d) { return s.split(d || ' ') }\n , isString = function (o) { return typeof o == 'string' }\n , isFunction = function (o) { return typeof o == 'function' }\n\n // events that we consider to be 'native', anything not in this list will\n // be treated as a custom event\n , standardNativeEvents =\n 'click dblclick mouseup mousedown contextmenu ' + // mouse buttons\n 'mousewheel mousemultiwheel DOMMouseScroll ' + // mouse wheel\n 'mouseover mouseout mousemove selectstart selectend ' + // mouse movement\n 'keydown keypress keyup ' + // keyboard\n 'orientationchange ' + // mobile\n 'focus blur change reset select submit ' + // form elements\n 'load unload beforeunload resize move DOMContentLoaded ' + // window\n 'readystatechange message ' + // window\n 'error abort scroll ' // misc\n // element.fireEvent('onXYZ'... is not forgiving if we try to fire an event\n // that doesn't actually exist, so make sure we only do these on newer browsers\n , w3cNativeEvents =\n 'show ' + // mouse buttons\n 'input invalid ' + // form elements\n 'touchstart touchmove touchend touchcancel ' + // touch\n 'gesturestart gesturechange gestureend ' + // gesture\n 'textinput' + // TextEvent\n 'readystatechange pageshow pagehide popstate ' + // window\n 'hashchange offline online ' + // window\n 'afterprint beforeprint ' + // printing\n 'dragstart dragenter dragover dragleave drag drop dragend ' + // dnd\n 'loadstart progress suspend emptied stalled loadmetadata ' + // media\n 'loadeddata canplay canplaythrough playing waiting seeking ' + // media\n 'seeked ended durationchange timeupdate play pause ratechange ' + // media\n 'volumechange cuechange ' + // media\n 'checking noupdate downloading cached updateready obsolete ' // appcache\n\n // convert to a hash for quick lookups\n , nativeEvents = (function (hash, events, i) {\n for (i = 0; i < events.length; i++) events[i] && (hash[events[i]] = 1)\n return hash\n }({}, str2arr(standardNativeEvents + (W3C_MODEL ? w3cNativeEvents : ''))))\n\n // custom events are events that we *fake*, they are not provided natively but\n // we can use native events to generate them\n , customEvents = (function () {\n var isAncestor = 'compareDocumentPosition' in root\n ? function (element, container) {\n return container.compareDocumentPosition && (container.compareDocumentPosition(element) & 16) === 16\n }\n : 'contains' in root\n ? function (element, container) {\n container = container.nodeType === 9 || container === window ? root : container\n return container !== element && container.contains(element)\n }\n : function (element, container) {\n while (element = element.parentNode) if (element === container) return 1\n return 0\n }\n , check = function (event) {\n var related = event.relatedTarget\n return !related\n ? related == null\n : (related !== this && related.prefix !== 'xul' && !/document/.test(this.toString())\n && !isAncestor(related, this))\n }\n\n return {\n mouseenter: { base: 'mouseover', condition: check }\n , mouseleave: { base: 'mouseout', condition: check }\n , mousewheel: { base: /Firefox/.test(navigator.userAgent) ? 'DOMMouseScroll' : 'mousewheel' }\n }\n }())\n\n // we provide a consistent Event object across browsers by taking the actual DOM\n // event object and generating a new one from its properties.\n , Event = (function () {\n // a whitelist of properties (for different event types) tells us what to check for and copy\n var commonProps = str2arr('altKey attrChange attrName bubbles cancelable ctrlKey currentTarget ' +\n 'detail eventPhase getModifierState isTrusted metaKey relatedNode relatedTarget shiftKey ' +\n 'srcElement target timeStamp type view which propertyName path')\n , mouseProps = commonProps.concat(str2arr('button buttons clientX clientY dataTransfer ' +\n 'fromElement offsetX offsetY pageX pageY screenX screenY toElement movementX movementY region'))\n , mouseWheelProps = mouseProps.concat(str2arr('wheelDelta wheelDeltaX wheelDeltaY wheelDeltaZ ' +\n 'axis')) // 'axis' is FF specific\n , keyProps = commonProps.concat(str2arr('char charCode key keyCode keyIdentifier ' +\n 'keyLocation location isComposing code'))\n , textProps = commonProps.concat(str2arr('data'))\n , touchProps = commonProps.concat(str2arr('touches targetTouches changedTouches scale rotation'))\n , messageProps = commonProps.concat(str2arr('data origin source'))\n , stateProps = commonProps.concat(str2arr('state'))\n , overOutRegex = /over|out/\n // some event types need special handling and some need special properties, do that all here\n , typeFixers = [\n { // key events\n reg: /key/i\n , fix: function (event, newEvent) {\n newEvent.keyCode = event.keyCode || event.which\n return keyProps\n }\n }\n , { // mouse events\n reg: /click|mouse(?!(.*wheel|scroll))|menu|drag|drop/i\n , fix: function (event, newEvent, type) {\n newEvent.rightClick = event.which === 3 || event.button === 2\n newEvent.pos = { x: 0, y: 0 }\n if (event.pageX || event.pageY) {\n newEvent.clientX = event.pageX\n newEvent.clientY = event.pageY\n } else if (event.clientX || event.clientY) {\n newEvent.clientX = event.clientX + doc.body.scrollLeft + root.scrollLeft\n newEvent.clientY = event.clientY + doc.body.scrollTop + root.scrollTop\n }\n if (overOutRegex.test(type)) {\n newEvent.relatedTarget = event.relatedTarget\n || event[(type == 'mouseover' ? 'from' : 'to') + 'Element']\n }\n return mouseProps\n }\n }\n , { // mouse wheel events\n reg: /mouse.*(wheel|scroll)/i\n , fix: function () { return mouseWheelProps }\n }\n , { // TextEvent\n reg: /^text/i\n , fix: function () { return textProps }\n }\n , { // touch and gesture events\n reg: /^touch|^gesture/i\n , fix: function () { return touchProps }\n }\n , { // message events\n reg: /^message$/i\n , fix: function () { return messageProps }\n }\n , { // popstate events\n reg: /^popstate$/i\n , fix: function () { return stateProps }\n }\n , { // everything else\n reg: /.*/\n , fix: function () { return commonProps }\n }\n ]\n , typeFixerMap = {} // used to map event types to fixer functions (above), a basic cache mechanism\n\n , Event = function (event, element, isNative) {\n if (!arguments.length) return\n event = event || ((element.ownerDocument || element.document || element).parentWindow || win).event\n this.originalEvent = event\n this.isNative = isNative\n this.isBean = true\n\n if (!event) return\n\n var type = event.type\n , target = event.target || event.srcElement\n , i, l, p, props, fixer\n\n this.target = target && target.nodeType === 3 ? target.parentNode : target\n\n if (isNative) { // we only need basic augmentation on custom events, the rest expensive & pointless\n fixer = typeFixerMap[type]\n if (!fixer) { // haven't encountered this event type before, map a fixer function for it\n for (i = 0, l = typeFixers.length; i < l; i++) {\n if (typeFixers[i].reg.test(type)) { // guaranteed to match at least one, last is .*\n typeFixerMap[type] = fixer = typeFixers[i].fix\n break\n }\n }\n }\n\n props = fixer(event, this, type)\n for (i = props.length; i--;) {\n if (!((p = props[i]) in this) && p in event) this[p] = event[p]\n }\n }\n }\n\n // preventDefault() and stopPropagation() are a consistent interface to those functions\n // on the DOM, stop() is an alias for both of them together\n Event.prototype.preventDefault = function () {\n if (this.originalEvent.preventDefault) this.originalEvent.preventDefault()\n else this.originalEvent.returnValue = false\n }\n Event.prototype.stopPropagation = function () {\n if (this.originalEvent.stopPropagation) this.originalEvent.stopPropagation()\n else this.originalEvent.cancelBubble = true\n }\n Event.prototype.stop = function () {\n this.preventDefault()\n this.stopPropagation()\n this.stopped = true\n }\n // stopImmediatePropagation() has to be handled internally because we manage the event list for\n // each element\n // note that originalElement may be a Bean#Event object in some situations\n Event.prototype.stopImmediatePropagation = function () {\n if (this.originalEvent.stopImmediatePropagation) this.originalEvent.stopImmediatePropagation()\n this.isImmediatePropagationStopped = function () { return true }\n }\n Event.prototype.isImmediatePropagationStopped = function () {\n return this.originalEvent.isImmediatePropagationStopped && this.originalEvent.isImmediatePropagationStopped()\n }\n Event.prototype.clone = function (currentTarget) {\n //TODO: this is ripe for optimisation, new events are *expensive*\n // improving this will speed up delegated events\n var ne = new Event(this, this.element, this.isNative)\n ne.currentTarget = currentTarget\n return ne\n }\n\n return Event\n }())\n\n // if we're in old IE we can't do onpropertychange on doc or win so we use doc.documentElement for both\n , targetElement = function (element, isNative) {\n return !W3C_MODEL && !isNative && (element === doc || element === win) ? root : element\n }\n\n /**\n * Bean maintains an internal registry for event listeners. We don't touch elements, objects\n * or functions to identify them, instead we store everything in the registry.\n * Each event listener has a RegEntry object, we have one 'registry' for the whole instance.\n */\n , RegEntry = (function () {\n // each handler is wrapped so we can handle delegation and custom events\n var wrappedHandler = function (element, fn, condition, args) {\n var call = function (event, eargs) {\n return fn.apply(element, args ? slice.call(eargs, event ? 0 : 1).concat(args) : eargs)\n }\n , findTarget = function (event, eventElement) {\n return fn.__beanDel ? fn.__beanDel.ft(event.target, element) : eventElement\n }\n , handler = condition\n ? function (event) {\n var target = findTarget(event, this) // deleated event\n if (condition.apply(target, arguments)) {\n if (event) event.currentTarget = target\n return call(event, arguments)\n }\n }\n : function (event) {\n if (fn.__beanDel) event = event.clone(findTarget(event)) // delegated event, fix the fix\n return call(event, arguments)\n }\n handler.__beanDel = fn.__beanDel\n return handler\n }\n\n , RegEntry = function (element, type, handler, original, namespaces, args, root) {\n var customType = customEvents[type]\n , isNative\n\n if (type == 'unload') {\n // self clean-up\n handler = once(removeListener, element, type, handler, original)\n }\n\n if (customType) {\n if (customType.condition) {\n handler = wrappedHandler(element, handler, customType.condition, args)\n }\n type = customType.base || type\n }\n\n this.isNative = isNative = nativeEvents[type] && !!element[eventSupport]\n this.customType = !W3C_MODEL && !isNative && type\n this.element = element\n this.type = type\n this.original = original\n this.namespaces = namespaces\n this.eventType = W3C_MODEL || isNative ? type : 'propertychange'\n this.target = targetElement(element, isNative)\n this[eventSupport] = !!this.target[eventSupport]\n this.root = root\n this.handler = wrappedHandler(element, handler, null, args)\n }\n\n // given a list of namespaces, is our entry in any of them?\n RegEntry.prototype.inNamespaces = function (checkNamespaces) {\n var i, j, c = 0\n if (!checkNamespaces) return true\n if (!this.namespaces) return false\n for (i = checkNamespaces.length; i--;) {\n for (j = this.namespaces.length; j--;) {\n if (checkNamespaces[i] == this.namespaces[j]) c++\n }\n }\n return checkNamespaces.length === c\n }\n\n // match by element, original fn (opt), handler fn (opt)\n RegEntry.prototype.matches = function (checkElement, checkOriginal, checkHandler) {\n return this.element === checkElement &&\n (!checkOriginal || this.original === checkOriginal) &&\n (!checkHandler || this.handler === checkHandler)\n }\n\n return RegEntry\n }())\n\n , registry = (function () {\n // our map stores arrays by event type, just because it's better than storing\n // everything in a single array.\n // uses '$' as a prefix for the keys for safety and 'r' as a special prefix for\n // rootListeners so we can look them up fast\n var map = {}\n\n // generic functional search of our registry for matching listeners,\n // `fn` returns false to break out of the loop\n , forAll = function (element, type, original, handler, root, fn) {\n var pfx = root ? 'r' : '$'\n if (!type || type == '*') {\n // search the whole registry\n for (var t in map) {\n if (t.charAt(0) == pfx) {\n forAll(element, t.substr(1), original, handler, root, fn)\n }\n }\n } else {\n var i = 0, l, list = map[pfx + type], all = element == '*'\n if (!list) return\n for (l = list.length; i < l; i++) {\n if ((all || list[i].matches(element, original, handler)) && !fn(list[i], list, i, type)) return\n }\n }\n }\n\n , has = function (element, type, original, root) {\n // we're not using forAll here simply because it's a bit slower and this\n // needs to be fast\n var i, list = map[(root ? 'r' : '$') + type]\n if (list) {\n for (i = list.length; i--;) {\n if (!list[i].root && list[i].matches(element, original, null)) return true\n }\n }\n return false\n }\n\n , get = function (element, type, original, root) {\n var entries = []\n forAll(element, type, original, null, root, function (entry) {\n return entries.push(entry)\n })\n return entries\n }\n\n , put = function (entry) {\n var has = !entry.root && !this.has(entry.element, entry.type, null, false)\n , key = (entry.root ? 'r' : '$') + entry.type\n ;(map[key] || (map[key] = [])).push(entry)\n return has\n }\n\n , del = function (entry) {\n forAll(entry.element, entry.type, null, entry.handler, entry.root, function (entry, list, i) {\n list.splice(i, 1)\n entry.removed = true\n if (list.length === 0) delete map[(entry.root ? 'r' : '$') + entry.type]\n return false\n })\n }\n\n // dump all entries, used for onunload\n , entries = function () {\n var t, entries = []\n for (t in map) {\n if (t.charAt(0) == '$') entries = entries.concat(map[t])\n }\n return entries\n }\n\n return { has: has, get: get, put: put, del: del, entries: entries }\n }())\n\n // we need a selector engine for delegated events, use querySelectorAll if it exists\n // but for older browsers we need Qwery, Sizzle or similar\n , selectorEngine\n , setSelectorEngine = function (e) {\n if (!arguments.length) {\n selectorEngine = doc.querySelectorAll\n ? function (s, r) {\n return r.querySelectorAll(s)\n }\n : function () {\n throw new Error('Bean: No selector engine installed') // eeek\n }\n } else {\n selectorEngine = e\n }\n }\n\n // we attach this listener to each DOM event that we need to listen to, only once\n // per event type per DOM element\n , rootListener = function (event, type) {\n if (!W3C_MODEL && type && event && event.propertyName != '_on' + type) return\n\n var listeners = registry.get(this, type || event.type, null, false)\n , l = listeners.length\n , i = 0\n\n event = new Event(event, this, true)\n if (type) event.type = type\n\n // iterate through all handlers registered for this type, calling them unless they have\n // been removed by a previous handler or stopImmediatePropagation() has been called\n for (; i < l && !event.isImmediatePropagationStopped(); i++) {\n if (!listeners[i].removed) listeners[i].handler.call(this, event)\n }\n }\n\n // add and remove listeners to DOM elements\n , listener = W3C_MODEL\n ? function (element, type, add) {\n // new browsers\n element[add ? addEvent : removeEvent](type, rootListener, false)\n }\n : function (element, type, add, custom) {\n // IE8 and below, use attachEvent/detachEvent and we have to piggy-back propertychange events\n // to simulate event bubbling etc.\n var entry\n if (add) {\n registry.put(entry = new RegEntry(\n element\n , custom || type\n , function (event) { // handler\n rootListener.call(element, event, custom)\n }\n , rootListener\n , null\n , null\n , true // is root\n ))\n if (custom && element['_on' + custom] == null) element['_on' + custom] = 0\n entry.target.attachEvent('on' + entry.eventType, entry.handler)\n } else {\n entry = registry.get(element, custom || type, rootListener, true)[0]\n if (entry) {\n entry.target.detachEvent('on' + entry.eventType, entry.handler)\n registry.del(entry)\n }\n }\n }\n\n , once = function (rm, element, type, fn, originalFn) {\n // wrap the handler in a handler that does a remove as well\n return function () {\n fn.apply(this, arguments)\n rm(element, type, originalFn)\n }\n }\n\n , removeListener = function (element, orgType, handler, namespaces) {\n var type = orgType && orgType.replace(nameRegex, '')\n , handlers = registry.get(element, type, null, false)\n , removed = {}\n , i, l\n\n for (i = 0, l = handlers.length; i < l; i++) {\n if ((!handler || handlers[i].original === handler) && handlers[i].inNamespaces(namespaces)) {\n // TODO: this is problematic, we have a registry.get() and registry.del() that\n // both do registry searches so we waste cycles doing this. Needs to be rolled into\n // a single registry.forAll(fn) that removes while finding, but the catch is that\n // we'll be splicing the arrays that we're iterating over. Needs extra tests to\n // make sure we don't screw it up. @rvagg\n registry.del(handlers[i])\n if (!removed[handlers[i].eventType] && handlers[i][eventSupport])\n removed[handlers[i].eventType] = { t: handlers[i].eventType, c: handlers[i].type }\n }\n }\n // check each type/element for removed listeners and remove the rootListener where it's no longer needed\n for (i in removed) {\n if (removed.hasOwnProperty(i)) {\n if (!registry.has(element, removed[i].t, null, false)) {\n // last listener of this type, remove the rootListener\n listener(element, removed[i].t, false, removed[i].c)\n }\n }\n }\n }\n\n // set up a delegate helper using the given selector, wrap the handler function\n , delegate = function (selector, fn) {\n //TODO: findTarget (therefore $) is called twice, once for match and once for\n // setting e.currentTarget, fix this so it's only needed once\n var findTarget = function (target, root) {\n var i, array = isString(selector) ? selectorEngine(selector, root) : selector\n for (; target && target !== root; target = target.parentNode) {\n for (i = array.length; i--;) {\n if (array[i] === target) return target\n }\n }\n }\n , handler = function (e) {\n var match = findTarget(e.target, this)\n if (match) fn.apply(match, arguments)\n }\n\n // __beanDel isn't pleasant but it's a private function, not exposed outside of Bean\n handler.__beanDel = {\n ft : findTarget // attach it here for customEvents to use too\n , selector : selector\n }\n return handler\n }\n\n , fireListener = W3C_MODEL ? function (isNative, type, element) {\n // modern browsers, do a proper dispatchEvent()\n var evt = doc.createEvent(isNative ? 'HTMLEvents' : 'UIEvents')\n evt[isNative ? 'initEvent' : 'initUIEvent'](type, true, true, win, 1)\n element.dispatchEvent(evt)\n } : function (isNative, type, element) {\n // old browser use onpropertychange, just increment a custom property to trigger the event\n element = targetElement(element, isNative)\n isNative ? element.fireEvent('on' + type, doc.createEventObject()) : element['_on' + type]++\n }\n\n /**\n * Public API: off(), on(), add(), (remove()), one(), fire(), clone()\n */\n\n /**\n * off(element[, eventType(s)[, handler ]])\n */\n , off = function (element, typeSpec, fn) {\n var isTypeStr = isString(typeSpec)\n , k, type, namespaces, i\n\n if (isTypeStr && typeSpec.indexOf(' ') > 0) {\n // off(el, 't1 t2 t3', fn) or off(el, 't1 t2 t3')\n typeSpec = str2arr(typeSpec)\n for (i = typeSpec.length; i--;)\n off(element, typeSpec[i], fn)\n return element\n }\n\n type = isTypeStr && typeSpec.replace(nameRegex, '')\n if (type && customEvents[type]) type = customEvents[type].base\n\n if (!typeSpec || isTypeStr) {\n // off(el) or off(el, t1.ns) or off(el, .ns) or off(el, .ns1.ns2.ns3)\n if (namespaces = isTypeStr && typeSpec.replace(namespaceRegex, '')) namespaces = str2arr(namespaces, '.')\n removeListener(element, type, fn, namespaces)\n } else if (isFunction(typeSpec)) {\n // off(el, fn)\n removeListener(element, null, typeSpec)\n } else {\n // off(el, { t1: fn1, t2, fn2 })\n for (k in typeSpec) {\n if (typeSpec.hasOwnProperty(k)) off(element, k, typeSpec[k])\n }\n }\n\n return element\n }\n\n /**\n * on(element, eventType(s)[, selector], handler[, args ])\n */\n , on = function(element, events, selector, fn) {\n var originalFn, type, types, i, args, entry, first\n\n //TODO: the undefined check means you can't pass an 'args' argument, fix this perhaps?\n if (selector === undefined && typeof events == 'object') {\n //TODO: this can't handle delegated events\n for (type in events) {\n if (events.hasOwnProperty(type)) {\n on.call(this, element, type, events[type])\n }\n }\n return\n }\n\n if (!isFunction(selector)) {\n // delegated event\n originalFn = fn\n args = slice.call(arguments, 4)\n fn = delegate(selector, originalFn, selectorEngine)\n } else {\n args = slice.call(arguments, 3)\n fn = originalFn = selector\n }\n\n types = str2arr(events)\n\n // special case for one(), wrap in a self-removing handler\n if (this === ONE) {\n fn = once(off, element, events, fn, originalFn)\n }\n\n for (i = types.length; i--;) {\n // add new handler to the registry and check if it's the first for this element/type\n first = registry.put(entry = new RegEntry(\n element\n , types[i].replace(nameRegex, '') // event type\n , fn\n , originalFn\n , str2arr(types[i].replace(namespaceRegex, ''), '.') // namespaces\n , args\n , false // not root\n ))\n if (entry[eventSupport] && first) {\n // first event of this type on this element, add root listener\n listener(element, entry.eventType, true, entry.customType)\n }\n }\n\n return element\n }\n\n /**\n * add(element[, selector], eventType(s), handler[, args ])\n *\n * Deprecated: kept (for now) for backward-compatibility\n */\n , add = function (element, events, fn, delfn) {\n return on.apply(\n null\n , !isString(fn)\n ? slice.call(arguments)\n : [ element, fn, events, delfn ].concat(arguments.length > 3 ? slice.call(arguments, 5) : [])\n )\n }\n\n /**\n * one(element, eventType(s)[, selector], handler[, args ])\n */\n , one = function () {\n return on.apply(ONE, arguments)\n }\n\n /**\n * fire(element, eventType(s)[, args ])\n *\n * The optional 'args' argument must be an array, if no 'args' argument is provided\n * then we can use the browser's DOM event system, otherwise we trigger handlers manually\n */\n , fire = function (element, type, args) {\n var types = str2arr(type)\n , i, j, l, names, handlers\n\n for (i = types.length; i--;) {\n type = types[i].replace(nameRegex, '')\n if (names = types[i].replace(namespaceRegex, '')) names = str2arr(names, '.')\n if (!names && !args && element[eventSupport]) {\n fireListener(nativeEvents[type], type, element)\n } else {\n // non-native event, either because of a namespace, arguments or a non DOM element\n // iterate over all listeners and manually 'fire'\n handlers = registry.get(element, type, null, false)\n args = [false].concat(args)\n for (j = 0, l = handlers.length; j < l; j++) {\n if (handlers[j].inNamespaces(names)) {\n handlers[j].handler.apply(element, args)\n }\n }\n }\n }\n return element\n }\n\n /**\n * clone(dstElement, srcElement[, eventType ])\n *\n * TODO: perhaps for consistency we should allow the same flexibility in type specifiers?\n */\n , clone = function (element, from, type) {\n var handlers = registry.get(from, type, null, false)\n , l = handlers.length\n , i = 0\n , args, beanDel\n\n for (; i < l; i++) {\n if (handlers[i].original) {\n args = [ element, handlers[i].type ]\n if (beanDel = handlers[i].handler.__beanDel) args.push(beanDel.selector)\n args.push(handlers[i].original)\n on.apply(null, args)\n }\n }\n return element\n }\n\n , bean = {\n 'on' : on\n , 'add' : add\n , 'one' : one\n , 'off' : off\n , 'remove' : off\n , 'clone' : clone\n , 'fire' : fire\n , 'Event' : Event\n , 'setSelectorEngine' : setSelectorEngine\n , 'noConflict' : function () {\n context[name] = old\n return this\n }\n }\n\n // for IE, clean up on unload to avoid leaks\n if (win.attachEvent) {\n var cleanup = function () {\n var i, entries = registry.entries()\n for (i in entries) {\n if (entries[i].type && entries[i].type !== 'unload') off(entries[i].element, entries[i].type)\n }\n win.detachEvent('onunload', cleanup)\n win.CollectGarbage && win.CollectGarbage()\n }\n win.attachEvent('onunload', cleanup)\n }\n\n // initialize selector engine to internal default (qSA or throw Error)\n setSelectorEngine(Ink.ss)\n\n return bean\n });\n\n /**\n * Keep this declaration here and off Bean as it extends the Event\n * object and some properties are readonly in strict mode\n */\n 'use strict';\n\n var InkEvent = {\n\n KEY_BACKSPACE: 8,\n KEY_TAB: 9,\n KEY_RETURN: 13,\n KEY_ESC: 27,\n KEY_SPACE: 32,\n KEY_LEFT: 37,\n KEY_UP: 38,\n KEY_RIGHT: 39,\n KEY_DOWN: 40,\n KEY_DELETE: 46,\n KEY_HOME: 36,\n KEY_END: 35,\n KEY_PAGEUP: 33,\n KEY_PAGEDOWN: 34,\n KEY_INSERT: 45,\n \n /**\n * Creates a throttled version of a function.\n * Returns a function which calls `func`, waiting at least `wait` milliseconds between calls. This is useful for events such as `scroll` or `resize`, which can be triggered too many times per second, slowing down the browser with needless function calls.\n *\n * *note:* This does not delay the first function call to the function.\n *\n * @method throttle\n * @param {Function} func Function to call. Arguments and context are both passed.\n * @param {Number} [wait]=0 Milliseconds to wait between calls.\n * @return {Function} A function throttled which will only be called at most every `wait` milliseconds.\n * @sample Ink_Dom_Event_1_throttle.html \n **/\n throttle: function (func, wait) {\n wait = wait || 0;\n var lastCall = 0; // Warning: This breaks on Jan 1st 1970 0:00\n var timeout;\n function throttled() {\n var now = +new Date();\n var timeDiff = now - lastCall;\n if (timeDiff >= wait) {\n lastCall = now;\n return func.apply(this, [].slice.call(arguments));\n } else {\n var that = this;\n var args = [].slice.call(arguments);\n\n if (timeout) {\n // Clear the old timeout because that one has old arguments\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(function () {\n timeout = null;\n return throttled.apply(that, args);\n }, wait - timeDiff);\n }\n }\n return throttled;\n },\n\n /**\n * Gets the event's target element.\n *\n * @method element\n * @param {Object} ev Event object\n * @return {Element} The target\n * @public\n * @sample Ink_Dom_Event_1_element.html \n */\n element: function(ev) {\n var node = ev.delegationTarget ||\n ev.target ||\n // IE stuff\n (ev.type === 'mouseout' && ev.fromElement) ||\n (ev.type === 'mouseleave' && ev.fromElement) ||\n (ev.type === 'mouseover' && ev.toElement) ||\n (ev.type === 'mouseenter' && ev.toElement) ||\n ev.srcElement ||\n null;\n return node && (node.nodeType === 3 || node.nodeType === 4) ? node.parentNode : node;\n },\n\n /**\n * Gets the event's related target element.\n *\n * @method relatedTarget\n * @param {Object} ev event object\n * @return {DOMNode} The related target\n * @sample Ink_Dom_Event_1_relatedTarget.html \n */\n relatedTarget: function(ev){\n var node = ev.relatedTarget ||\n // IE stuff\n (ev.type === 'mouseout' && ev.toElement) ||\n (ev.type === 'mouseleave' && ev.toElement) ||\n (ev.type === 'mouseover' && ev.fromElement) ||\n (ev.type === 'mouseenter' && ev.fromElement) ||\n null;\n return node && (node.nodeType === 3 || node.nodeType === 4) ? node.parentNode : node;\n },\n\n /**\n * Find closest ancestor element by tag name related to the event target.\n * Navigate up the DOM tree, looking for a tag with the name `elmTagName`.\n *\n * If such tag is not found, `document` is returned.\n *\n * @method findElement\n * @param {Object} ev Event object\n * @param {String} elmTagName Tag name to find\n * @param {Boolean} [force]=false Flag to skip returning `document` and to return `false` instead.\n * @return {DOMElement} the first element which matches given tag name or the document element if the wanted tag is not found\n * @sample Ink_Dom_Event_1_findElement.html \n */\n findElement: function(ev, elmTagName, force)\n {\n var node = this.element(ev);\n while(true) {\n if(node.nodeName.toLowerCase() === elmTagName.toLowerCase()) {\n return node;\n } else {\n node = node.parentNode;\n if(!node) {\n if(force) {\n return false;\n }\n return document;\n }\n if(!node.parentNode){\n if(force){ return false; }\n return document;\n }\n }\n }\n },\n\n /**\n * Attaches an event to element\n *\n * @method observe\n * @param {DOMElement|String} element Element id or element\n * @param {String} eventName Event name\n * @param {Function} callBack Receives the event object as a parameter. If you're manually firing custom events, check it's eventName property to make sure you're handling the right event.\n * @param {Boolean} [useCapture] Flag to change event listening from bubbling to capture.\n * @return {Function} The event handler used. Hang on to this if you want to `stopObserving` later.\n * @sample Ink_Dom_Event_1_observe.html \n */\n observe: function(element, eventName, callBack, useCapture) {\n element = Ink.i(element);\n if(element) {\n if(element.addEventListener) {\n element.addEventListener(eventName, callBack, !!useCapture);\n } else {\n element.attachEvent('on' + eventName, (callBack = Ink.bind(callBack, element)));\n }\n return callBack;\n }\n },\n\n /**\n * Like observe, but listen to the event only once.\n *\n * @method observeOnce\n * @param {DOMElement|String} element Element id or element\n * @param {String} eventName Event name\n * @param {Function} callBack Receives the event object as a parameter. If you're manually firing custom events, check it's eventName property to make sure you're handling the right event.\n * @param {Boolean} [useCapture] Flag to change event listening from bubbling to capture.\n * @return {Function} The event handler used. Hang on to this if you want to `stopObserving` later.\n * @sample Ink_Dom_Event_1_observeOnce.html \n */\n observeOnce: function (element, eventName, callBack, useCapture) {\n var onceBack = function () {\n InkEvent.stopObserving(element, eventName, handler);\n return callBack.apply(this, arguments);\n };\n var handler = InkEvent.observe(element, eventName, onceBack, useCapture);\n return handler;\n },\n\n /**\n * Attaches an event to a selector or array of elements.\n *\n * @method observeMulti\n * @param {Array|String} elements Array of elements which are going to be observed. A selector is acceptable too.\n * @param {String} eventName Event name\n * @param {Function} callBack Receives the event object as a parameter. If you're manually firing custom events, check it's eventName property to make sure you're handling the right event.\n * @param {Boolean} [useCapture] Flag change event listening from bubbling to capture.\n * @return {Function} The used callback.\n * @sample Ink_Dom_Event_1_observeMulti.html \n */\n observeMulti: function (elements, eventName, callBack, useCapture) {\n if (typeof elements === 'string') {\n elements = Ink.ss(elements);\n } else if ( /* is an element */ elements && elements.nodeType === 1) {\n elements = [elements];\n }\n if (!elements[0]) { return false; }\n\n for (var i = 0, len = elements.length; i < len; i++) {\n this.observe(elements[i], eventName, callBack, useCapture);\n }\n return callBack;\n },\n\n /**\n * Observes an event on an element and its descendants matching the selector.\n *\n * Requires Ink.Dom.Selector if you need to use a selector.\n *\n * @method observeDelegated\n * @param {Element|String} element Element to observe.\n * @param {String} eventName Event name to observe.\n * @param {String} selector Child element selector. When null, finds any element.\n * @param {Function} callback Callback to be called when the event is fired\n * @return {Function} The used callback, for ceasing to listen to the event later.\n * @public\n * @sample Ink_Dom_Event_1_observeDelegated.html \n **/\n observeDelegated: function (element, eventName, selector, callback) {\n return InkEvent.observe(element, eventName, function (event) {\n var fromElement = InkEvent.element(event);\n if (!fromElement || fromElement === element) { return; }\n\n var cursor = fromElement;\n\n // Go up the document tree until we hit the element itself.\n while (cursor !== element && cursor !== document && cursor) {\n if (Ink.Dom.Selector_1.matchesSelector(cursor, selector)) {\n event.delegationTarget = cursor;\n return callback(event);\n }\n cursor = cursor.parentNode;\n }\n });\n },\n\n /**\n * Removes an event attached to an element.\n *\n * @method stopObserving\n * @param {DOMElement|String} element Element id or element\n * @param {String} eventName Event name\n * @param {Function} callBack Callback function\n * @param {Boolean} [useCapture] Set to true if the event was being observed with useCapture set to true as well.\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stopObserving.html \n */\n stopObserving: function(element, eventName, callBack, useCapture) {\n element = Ink.i(element);\n\n if(element) {\n if(element.removeEventListener) {\n element.removeEventListener(eventName, callBack, !!useCapture);\n } else {\n element.detachEvent('on' + eventName, callBack);\n }\n }\n },\n\n /**\n * Stops event propagation and bubbling.\n *\n * @method stop\n * @param {Object} event Event handle\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stop.html \n */\n stop: function(event)\n {\n if(event.cancelBubble !== null) {\n event.cancelBubble = true;\n }\n if(event.stopPropagation) {\n event.stopPropagation();\n }\n if(event.preventDefault) {\n event.preventDefault();\n }\n if(window.attachEvent) {\n event.returnValue = false;\n }\n if(event.cancel !== null) {\n event.cancel = true;\n }\n },\n\n /**\n * Stops event propagation.\n *\n * @method stopPropagation\n * @param {Object} event Event handle\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stopPropagation.html \n */\n stopPropagation: function(event) {\n if(event.cancelBubble !== null) {\n event.cancelBubble = true;\n }\n if(event.stopPropagation) {\n event.stopPropagation();\n }\n },\n\n /**\n * Stops event default behaviour.\n *\n * @method stopDefault\n * @param {Object} event Event handle\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stopDefault.html \n */\n stopDefault: function(event)\n {\n if(event.preventDefault) {\n event.preventDefault();\n }\n if(window.attachEvent) {\n event.returnValue = false;\n }\n if(event.cancel !== null) {\n event.cancel = true;\n }\n },\n\n /**\n * Gets the pointer's coordinates from the event object.\n *\n * @method pointer\n * @param {Object} ev Event object\n * @return {Object} An object with the mouse X and Y position\n * @public\n * @sample Ink_Dom_Event_1_pointer.html \n */\n pointer: function(ev)\n {\n return {\n x: this.pointerX(ev),\n y: this.pointerY(ev)\n };\n },\n\n /**\n * Gets the pointer's X coordinate.\n *\n * @method pointerX\n * @param {Object} ev Event object\n * @return {Number} Mouse X position\n * @public\n */\n pointerX: function(ev)\n {\n return (ev.touches && ev.touches[0] && ev.touches[0].clientX) ||\n (ev.pageX) ||\n (ev.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));\n },\n\n /**\n * Gets the pointer's Y coordinate.\n *\n * @method pointerY\n * @param {Object} ev Event object\n * @return {Number} Mouse Y position\n * @public\n */\n pointerY: function(ev)\n {\n return (ev.touches && ev.touches[0] && ev.touches[0].clientY) ||\n (ev.pageY) ||\n (ev.clientY + (document.documentElement.scrollTop || document.body.scrollTop));\n },\n\n /**\n * Checks if an event is a left click.\n *\n * @method isLeftClick\n * @param {Object} ev Event object\n * @return {Boolean} True if the event is a left click\n * @public\n * @sample Ink_Dom_Event_1_isLeftClick.html \n */\n isLeftClick: function(ev) {\n if (window.addEventListener) {\n if(ev.button === 0){\n return true;\n } else if(ev.type === 'touchend' && ev.button === null){\n // [todo] do the above check for pointerEvents too\n return true;\n }\n }\n else {\n if(ev.button === 1){ return true; }\n }\n return false;\n },\n\n /**\n * Checks if an event is a right click.\n *\n * @method isRightClick\n * @param {Object} ev Event object\n * @return {Boolean} True if the event is a right click\n * @public\n * @sample Ink_Dom_Event_1_isRightClick.html \n */\n isRightClick: function(ev) {\n return (ev.button === 2);\n },\n\n /**\n * Checks if an event is a middle click.\n *\n * @method isMiddleClick\n * @param {Object} ev Event object\n * @return {Boolean} True if the event is a middle click\n * @public\n * @sample Ink_Dom_Event_1_isMiddleClick.html \n */\n isMiddleClick: function(ev) {\n if (window.addEventListener) {\n return (ev.button === 1);\n }\n else {\n return (ev.button === 4);\n }\n return false;\n },\n\n /**\n * Gets character from an event.\n *\n * @method getCharFromKeyboardEvent\n * @param {Object} event Keyboard event\n * @param {Boolean} [changeCasing] If true uppercases, if false lowercases, otherwise keeps casing\n * @return {String} Character representation of pressed key combination\n * @public\n * @sample Ink_Dom_Event_1_getCharFromKeyboardEvent.html \n */\n getCharFromKeyboardEvent: function(event, changeCasing) {\n var k = event.keyCode;\n var c = String.fromCharCode(k);\n\n var shiftOn = event.shiftKey;\n if (k >= 65 && k <= 90) { // A-Z\n if (typeof changeCasing === 'boolean') {\n shiftOn = changeCasing;\n }\n return (shiftOn) ? c : c.toLowerCase();\n }\n else if (k >= 96 && k <= 105) { // numpad digits\n return String.fromCharCode( 48 + (k-96) );\n }\n switch (k) {\n case 109: case 189: return '-';\n case 107: case 187: return '+';\n }\n return c;\n },\n\n debug: function(){}\n};\n\n/**\n * Lets you attach event listeners to both elements and objects.\n * http://github.com/fat/bean#on\n *\n * @method on\n * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object\n * @param {String} eventType An Event (or multiple events, space separated) to listen to\n * @param {String} [selector] A CSS DOM Element selector string to bind the listener to child elements matching the selector\n * @param {Function} [handler] The callback function\n * @param {Object} [args...] Additional arguments to pass to the callback function when triggered\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_on.html \n */\n\n/**\n * Alias for `on` but will only be executed once.\n * bean.one() is an alias for bean.on() except that the handler will only be executed once and then removed for the event type(s).\n * http://github.com/fat/bean#one\n *\n * @method one\n * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object\n * @param {String} eventType An Event (or multiple events, space separated) to listen to\n * @param {String} [selector] A CSS DOM Element selector string to bind the listener to child elements matching the selector\n * @param {Function} [handler] The callback function\n * @param [args...] Additional arguments to pass to the callback function when triggered\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_one.html \n */\n\n/**\n * Removes event handlers.\n * bean.off() is how you get rid of handlers once you no longer want them active. It's also a good idea to call off on elements before you remove them from your DOM; this gives Bean a chance to clean up some things and prevents memory leaks.\n * http://github.com/fat/bean#off\n *\n * @method off\n * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object\n * @param {String} eventType An Event (or multiple events, space separated) to remove\n * @param {Function} [handler] The specific callback function to remove\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_off.html \n */\n\n/**\n * Clones events from one object to another\n * bean.clone() is a method for cloning events from one DOM element or object to another.\n * http://github.com/fat/bean#clone\n *\n * @method clone\n * @param {DOMElement|Object} destElement An HTML DOM element or any JavaScript Object to copy events to\n * @param {String} srcElement An HTML DOM element or any JavaScript Object to copy events from\n * @param {String} [eventType] An Event (or multiple events, space separated) to clone\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_clone.html \n */\n\n/**\n * Triggers events.\n * http://github.com/fat/bean#fire\n *\n * @method fire\n * @param {DOMElement|Object} destElement An HTML DOM element or any JavaScript Object fire the event on\n * @param {String} eventType An Event (or multiple events, space separated) to fire\n * @param [args...] Additional arguments to pass to the callback function when triggered\n *\n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_fire.html \n */\n\nreturn Ink.extendObj(InkEvent, bean);\n\n});\n","/**\n * @module Ink.Dom.FormSerialize_1\n * Two way serialization of form data and javascript objects.\n * Valid applications are ad hoc AJAX/syndicated submission of forms, restoring form values from server side state, etc.\n */\n\nInk.createModule('Ink.Dom.FormSerialize', 1, ['Ink.Util.Array_1', 'Ink.Dom.Element_1', 'Ink.Dom.Selector_1'], function (InkArray, InkElement, Selector) {\n 'use strict';\n\n // Check whether something is not a string or a DOM element, but still has length.\n function isArrayIsh(obj) {\n return obj != null &&\n (!InkElement.isDOMElement(obj)) &&\n (InkArray.isArray(obj) || (typeof obj !== 'string' && typeof obj.length === 'number'));\n }\n\n function toArray(obj) {\n if (isArrayIsh(obj)) { return obj; }\n else { return [obj]; }\n }\n\n /**\n * @namespace Ink.Dom.FormSerialize\n * @static\n **/\n var FormSerialize = {\n\n /**\n * Serializes a form element into a JS object\n * It turns field *names* (not IDs!) into keys and field values into values.\n *\n * note: Multi-select and checkboxes with multiple values will result in arrays\n *\n * @method serialize\n * @param {DOMElement|String} form Form element to extract data\n * @param {Object} [options] Options object, containing:\n * @param {Boolean} [options.outputUnchecked=false] Whether to emit unchecked checkboxes and unselected radio buttons.\n * @return {Object} Map of fieldName -> String|String[]|Boolean\n * @sample Ink_Dom_FormSerialize_serialize.html \n */\n serialize: function(form, options) {\n options = options || {};\n var out = {};\n var emptyArrayToken = {}; // A hack so that empty select[multiple] elements appear although empty.\n\n var pairs = this.asPairs(form, { elements: true, emptyArray: emptyArrayToken, outputUnchecked: options.outputUnchecked });\n if (pairs == null) { return pairs; }\n InkArray.forEach(pairs, function (pair) {\n var name = pair[0].replace(/\\[\\]$/, '');\n var value = pair[1];\n var el = pair[2];\n\n if (value === emptyArrayToken) {\n out[name] = []; // It's an empty select[multiple]\n } else if (!(FormSerialize._resultsInArray(el) || /\\[\\]$/.test(pair[0]))) {\n out[name] = value;\n } else {\n out[name] = out[name] || [];\n out[name].push(value);\n }\n });\n\n return out;\n },\n\n /**\n * Like `serialize`, but returns an array of [fieldName, value] pairs.\n *\n * @method asPairs\n * @param {DOMElement|String} form Form element\n * @param {Object} [options] Options object, containing:\n * @param {Boolean} [options.elements] Instead of returning an array of [fieldName, value] pairs, return an array of [fieldName, value, fieldElement] triples.\n * @param {Boolean} [options.emptyArray] What to emit as the value of an empty select[multiple]. If you don't pass this option, nothing comes out.\n * @param {Boolean} [options.outputUnchecked=false] Whether to emit unchecked checkboxes and unselected radio buttons.\n * @return {Array} Array of [fieldName, value] pairs.\n **/\n asPairs: function (form, options) {\n var out = [];\n options = options || {};\n\n function emit(name, val, el) {\n if (options.elements) {\n out.push([name, val, el]);\n } else {\n out.push([name, val]);\n }\n }\n\n function serializeEl(el) {\n var elNodeName = el.nodeName.toLowerCase();\n var elType = (el.type + '').toLowerCase();\n\n if (elNodeName === 'select' && el.multiple) {\n var didEmit = false;\n InkArray.forEach(Selector.select('option:checked', el), function (thisOption) {\n emit(el.name, thisOption.value, el);\n didEmit = true;\n });\n if (!didEmit && 'emptyArray' in options) {\n emit(el.name, options.emptyArray, el);\n }\n } else if (elNodeName === 'input' && (elType === 'checkbox' || elType === 'radio') && options.outputUnchecked) {\n // It's an empty checkbox and we wouldn't emit it otherwise but the user asked for it using outputUnchecked\n emit(el.name, null, el);\n } else {\n emit(el.name, el.value, el);\n }\n }\n\n if ((form = Ink.i(form))) {\n var inputs = InkArray.filter(form.elements, function (elm) {\n return FormSerialize._isSerialized(elm, options);\n });\n for (var i = 0, len = inputs.length; i < len; i++) {\n serializeEl(inputs[i]);\n }\n return out;\n }\n\n return null;\n },\n\n /**\n * Sets form elements' values with values from an object\n *\n * Note: You can't set the values of an input with `type=\"file\"` (browser prohibits it)\n *\n * @method fillIn \n * @param {Element|String} form Form element to be populated\n * @param {Object|Array} map2 Mapping of fields to values contained in fields. Can be a hash (keys as names, strings or arrays for values), or an array of [name, value] pairs.\n * @return {void}\n * @sample Ink_Dom_FormSerialize_fillIn.html \n */\n fillIn: function(form, map2) {\n if (!(form = Ink.i(form))) { return null; }\n\n var pairs;\n\n if (typeof map2 === 'object' && !isArrayIsh(map2)) {\n pairs = FormSerialize._objToPairs(map2);\n } else if (isArrayIsh(map2)) {\n pairs = map2;\n } else {\n return null;\n }\n\n return FormSerialize._fillInPairs(form, pairs);\n },\n\n _objToPairs: function (obj) {\n var pairs = [];\n var val;\n for (var name in obj) if (obj.hasOwnProperty(name)) {\n val = toArray(obj[name]);\n for (var i = 0, len = val.length; i < len; i++) {\n pairs.push([name, val[i]]);\n }\n if (len === 0) {\n pairs.push([name, []]);\n }\n }\n return pairs;\n },\n\n _fillInPairs: function (form, pairs) {\n pairs = InkArray.groupBy(pairs, {\n key: function (pair) { return pair[0].replace(/\\[\\]$/, ''); }\n });\n\n // For each chunk...\n pairs = InkArray.map(pairs, function (pair) {\n // Join the items in the chunk by concatenating the values together and leaving the names alone\n var values = InkArray.reduce(pair, function (left, right) {\n return [null, left[1].concat([right[1]])];\n }, [null, []])[1];\n return [pair[0][0], values];\n });\n\n var name;\n var inputs;\n var values;\n for (var i = 0, len = pairs.length; i < len; i++) {\n name = pairs[i][0];\n\n if (name in form) {\n inputs = form[name];\n } else if ((name + '[]') in form) {\n inputs = form[name + '[]'];\n name = name + '[]';\n } else {\n continue;\n }\n\n inputs = toArray(inputs);\n values = pairs[i][1];\n\n FormSerialize._fillInOne(name, inputs, values);\n }\n },\n\n _fillInOne: function (name, inputs, values) {\n var firstOne = inputs[0];\n var firstNodeName = firstOne.nodeName.toLowerCase();\n var firstType = firstOne.getAttribute('type');\n firstType = firstType && firstType.toLowerCase();\n var isSelectMulti = firstNodeName === 'select' && InkElement.hasAttribute(firstOne, 'multiple');\n\n if (firstType === 'checkbox' || firstType === 'radio') {\n FormSerialize._fillInBoolean(inputs, values, 'checked');\n } else if (isSelectMulti) {\n FormSerialize._fillInBoolean(inputs[0].options, values, 'selected');\n } else {\n if (inputs.length !== values.length) {\n Ink.warn('Form had ' + inputs.length + ' inputs named \"' + name + '\", but received ' + values.length + ' values.');\n }\n\n for (var i = 0, len = Math.min(inputs.length, values.length); i < len; i += 1) {\n inputs[i].value = values[i];\n }\n }\n },\n\n _fillInBoolean: function (inputs, values, checkAttr /* 'selected' or 'checked' */) {\n InkArray.forEach(inputs, function (input) {\n var isChecked = InkArray.inArray(input.value, values);\n input[checkAttr] = isChecked;\n });\n },\n\n /**\n * Whether FormSerialize.serialize() should produce an array when looking at this element.\n * @method _resultsInArray\n * @private\n * @param element\n **/\n _resultsInArray: function (element) {\n var type = element.getAttribute('type');\n var nodeName = element.nodeName.toLowerCase();\n\n return type === 'checkbox' ||\n (nodeName === 'select' && InkElement.hasAttribute(element, 'multiple'));\n },\n\n _isSerialized: function (element, options) {\n options = options || {};\n if (!InkElement.isDOMElement(element)) { return false; }\n if (!InkElement.hasAttribute(element, 'name')) { return false; }\n\n var nodeName = element.nodeName.toLowerCase();\n\n if (!nodeName || nodeName === 'fieldset') { return false; }\n\n if (element.type === 'checkbox' || element.type === 'radio') {\n if (options.outputUnchecked) { return true; }\n return !!element.checked;\n }\n\n return true;\n }\n };\n\n return FormSerialize;\n});\n","/**\n * Execute code only when the DOM is loaded.\n * @module Ink.Dom.Loaded_1\n * @version 1\n */\n \nInk.createModule('Ink.Dom.Loaded', 1, [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Dom.Loaded_1\n **/\n var Loaded = {\n\n /**\n * Callbacks and their contexts. Array of 2-arrays.\n *\n * []\n *\n * @attribute _contexts Array\n * @private\n * \n */\n _contexts: [], // Callbacks' queue\n\n /**\n * Specify a function to execute when the DOM is fully loaded.\n *\n * @method run\n * @param {Object} [win]=window Window object to attach/add the event\n * @param {Function} fn Callback function to be executed after the DOM is ready\n * @return {void}\n * @public\n * @sample Ink_Dom_Loaded_run.html \n */\n run: function(win, fn) {\n if (!fn) {\n fn = win;\n win = window;\n }\n\n var context;\n\n for (var i = 0, len = this._contexts.length; i < len; i++) {\n if (this._contexts[i][0] === win) {\n context = this._contexts[i][1];\n break;\n }\n }\n if (!context) {\n context = {\n cbQueue: [],\n win: win,\n doc: win.document,\n root: win.document.documentElement,\n done: false,\n top: true\n };\n context.handlers = {\n checkState: Ink.bindEvent(this._checkState, this, context),\n poll: Ink.bind(this._poll, this, context)\n };\n this._contexts.push(\n [win, context] // Javascript Objects cannot map different windows to\n // different values.\n );\n }\n\n var ael = context.doc.addEventListener;\n context.add = ael ? 'addEventListener' : 'attachEvent';\n context.rem = ael ? 'removeEventListener' : 'detachEvent';\n context.pre = ael ? '' : 'on';\n context.det = ael ? 'DOMContentLoaded' : 'onreadystatechange';\n context.wet = context.pre + 'load';\n\n var csf = context.handlers.checkState;\n var alreadyLoaded = (\n /complete|loaded/.test(context.doc.readyState) &&\n context.win.location.toString() !== 'about:blank'); // https://code.google.com/p/chromium/issues/detail?id=32357\n\n if (alreadyLoaded){\n setTimeout(Ink.bind(function () {\n fn.call(context.win, 'lazy');\n }, this), 0);\n } else {\n context.cbQueue.push(fn);\n\n context.doc[context.add]( context.det , csf );\n context.win[context.add]( context.wet , csf );\n\n var frameElement = 1;\n try{\n frameElement = context.win.frameElement;\n } catch(e) {}\n if ( !ael && context.root && context.root.doScroll ) { // IE HACK\n try {\n context.top = !frameElement;\n } catch(e) { }\n if (context.top) {\n this._poll(context);\n }\n }\n }\n },\n\n /**\n * Function that will be running the callbacks after the page is loaded\n *\n * @method _checkState\n * @param {Event} event Triggered event\n * @private\n */\n _checkState: function(event, context) {\n if ( !event || (event.type === 'readystatechange' && !/complete|loaded/.test(context.doc.readyState))) {\n return;\n }\n var where = (event.type === 'load') ? context.win : context.doc;\n where[context.rem](context.pre+event.type, context.handlers.checkState, false);\n this._ready(context);\n },\n\n /**\n * Polls the load progress of the page to see if it has already loaded or not\n *\n * @method _poll\n * @private\n */\n\n /**\n * (old IE only) wait until a doScroll() call does not throw an error\n *\n * @method _poll\n * @private\n */\n _poll: function(context) {\n try {\n context.root.doScroll('left');\n } catch(e) {\n return setTimeout(context.handlers.poll, 50);\n }\n this._ready(context);\n },\n\n /**\n * Function that runs the callbacks from the queue when the document is ready.\n *\n * @method _ready\n * @private\n */\n _ready: function(context) {\n if (!context.done) {\n context.done = true;\n for (var i = 0; i < context.cbQueue.length; ++i) {\n context.cbQueue[i].call(context.win);\n }\n context.cbQueue = [];\n }\n }\n };\n\n return Loaded;\n\n});\n","/**\n * CSS selector engine\n * @module Ink.Dom.Selector_1\n * @version 1\n */\n \nInk.createModule('Ink.Dom.Selector', 1, [], function() {\n /*jshint forin:false, eqnull:true, noempty:false, expr:true, boss:true, maxdepth:false*/\n\t'use strict';\n\n/*!\n * Sizzle CSS Selector Engine\n * Copyright 2013 jQuery Foundation and other contributors\n * Released under the MIT license\n * http://sizzlejs.com/\n */\n\nvar i,\n\tcachedruns,\n\tExpr,\n\tgetText,\n\tisXML,\n\tcompile,\n\toutermostContext,\n\trecompare,\n\tsortInput,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + -(new Date()),\n\tpreferredDoc = window.document,\n\tsupport = {},\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\thasDuplicate = false,\n\tsortOrder = function() { return 0; },\n\n\t// General-purpose constants\n\tstrundefined = typeof undefined,\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Array methods\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf if we can't use a native one\n\tindexOf = arr.indexOf || function( elem ) {\n\t\tvar i = 0,\n\t\t\tlen = this.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( this[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\toperators = \"([*^$|!~]?=)\",\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:\" + operators + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\n\t// Prefer arguments quoted,\n\t// then not containing pseudos/brackets,\n\t// then attribute selectors/non-parenthetical expressions,\n\t// then anything else\n\t// These preferences are here to reduce the number of selectors\n\t// needing tokenize in the PSEUDO preFilter\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes.replace( 3, 8 ) + \")*)|.*)\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([\\\\x20\\\\t\\\\r\\\\n\\\\f>+~])\" + whitespace + \"*\" ),\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"NAME\": new RegExp( \"^\\\\[name=['\\\"]?(\" + characterEncoding + \")['\\\"]?\\\\]\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trsibling = /[\\x20\\t\\r\\n\\f]*[+~]/,\n\n\trnative = /^[^{]+\\{\\s*\\[native code/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trescape = /'|\\\\/g,\n\trattributeQuotes = /\\=[\\x20\\t\\r\\n\\f]*([^'\"\\]]*)[\\x20\\t\\r\\n\\f]*\\]/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = /\\\\([\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|.)/g,\n\tfunescape = function( _, escaped ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\treturn high !== high ?\n\t\t\tescaped :\n\t\t\t// BMP codepoint\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\n/*\n * For feature detection\n * @param {Function} fn The function to test for native support\n */\nfunction isNative( fn ) {\n\treturn rnative.test( fn + \"\" );\n}\n\n/*\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar cache,\n\t\tkeys = [];\n\n\treturn (cache = function( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key += \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key ] = value);\n\t});\n}\n\n/*\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/*\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( documentIsHTML && !seed ) {\n\n\t\t// Shortcuts\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && !rbuggyQSA.test(selector) ) {\n\t\t\told = true;\n\t\t\tnid = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType === 9 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/*\n * Detect xml\n * @param {Element|Object} elem An element or a document\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/*\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar doc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\n\t// Support tests\n\tdocumentIsHTML = !isXML( doc );\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Check if attributes should be retrieved by attribute nodes\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.innerHTML = \"\";\n\t\tvar type = typeof div.lastChild.getAttribute(\"multiple\");\n\t\t// IE8 returns a string for some attributes even when not present\n\t\treturn type !== \"boolean\" && type !== \"string\";\n\t});\n\n\t// Check if getElementsByClassName can be trusted\n\tsupport.getElementsByClassName = assert(function( div ) {\n\t\t// Opera can't find a second classname (in 9.6)\n\t\tdiv.innerHTML = \"\";\n\t\tif ( !div.getElementsByClassName || !div.getElementsByClassName(\"e\").length ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Safari 3.2 caches class attributes and doesn't catch changes\n\t\tdiv.lastChild.className = \"e\";\n\t\treturn div.getElementsByClassName(\"e\").length === 2;\n\t});\n\n\t// Check if getElementsByName privileges form controls or returns elements by ID\n\t// If so, assume (for broader support) that getElementById returns elements by name\n\tsupport.getByName = assert(function( div ) {\n\t\t// Inject content\n\t\tdiv.id = expando + 0;\n\t\t// Support: Windows 8 Native Apps\n\t\t// Assigning innerHTML with \"name\" attributes throws uncatchable exceptions\n\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx\n\t\tdiv.appendChild( document.createElement(\"a\") ).setAttribute( \"name\", expando );\n\t\tdiv.appendChild( document.createElement(\"i\") ).setAttribute( \"name\", expando );\n\t\tdocElem.appendChild( div );\n\n\t\t// Test\n\t\tvar pass = doc.getElementsByName &&\n\t\t\t// buggy browsers will return fewer than the correct 2\n\t\t\tdoc.getElementsByName( expando ).length === 2 +\n\t\t\t// buggy browsers will return more than the correct 0\n\t\t\tdoc.getElementsByName( expando + 0 ).length;\n\n\t\t// Cleanup\n\t\tdocElem.removeChild( div );\n\n\t\treturn pass;\n\t});\n\n\t// Support: Webkit<537.32\n\t// Detached nodes confoundingly follow *each other*\n\tsupport.sortDetached = assert(function( div1 ) {\n\t\treturn div1.compareDocumentPosition &&\n\t\t\t// Should return 1, but Webkit returns 4 (following)\n\t\t\t(div1.compareDocumentPosition( document.createElement(\"div\") ) & 1);\n\t});\n\n\t// IE6/7 return modified attributes\n\tExpr.attrHandle = assert(function( div ) {\n\t\tdiv.innerHTML = \"
          \";\n\t\treturn div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&\n\t\t\tdiv.firstChild.getAttribute(\"href\") === \"#\";\n\t}) ?\n\t\t{} :\n\t\t{\n\t\t\t\"href\": function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"href\", 2 );\n\t\t\t},\n\t\t\t\"type\": function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"type\");\n\t\t\t}\n\t\t};\n\n\t// ID find and filter\n\tif ( support.getByName ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\n\t\t\t\treturn m ?\n\t\t\t\t\tm.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode(\"id\").value === id ?\n\t\t\t\t\t\t[m] :\n\t\t\t\t\t\tundefined :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t}\n\t\t} :\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Name\n\tExpr.find[\"NAME\"] = support.getByName && function( tag, context ) {\n\t\tif ( typeof context.getElementsByName !== strundefined ) {\n\t\t\treturn context.getElementsByName( name );\n\t\t}\n\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21),\n\t// no need to also add to buggyMatches since matches checks buggyQSA\n\t// A support test would require too much code (would include document ready)\n\trbuggyQSA = [ \":focus\" ];\n\n\tif ( (support.qsa = isNative(doc.querySelectorAll)) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdiv.innerHTML = \"\";\n\n\t\t\t// IE8 - Some boolean attributes are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:checked|disabled|ismap|multiple|readonly|selected|value)\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Opera 10-12/IE8 - ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tif ( div.querySelectorAll(\"[i^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:\\\"\\\"|'')\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = isNative(docElem.contains) || docElem.compareDocumentPosition ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t// Document order sorting\n\tsortOrder = docElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );\n\n\t\tif ( compare ) {\n\t\t\t// Disconnected nodes\n\t\t\tif ( compare & 1 ||\n\t\t\t\t(recompare && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t\tif ( a === doc || contains(preferredDoc, a) ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( b === doc || contains(preferredDoc, b) ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\t// Maintain original order\n\t\t\t\treturn sortInput ?\n\t\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t\t0;\n\t\t\t}\n\n\t\t\treturn compare & 4 ? -1 : 1;\n\t\t}\n\n\t\t// Not directly comparable, sort on existence of method\n\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\t} else if ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\t// rbuggyQSA always contains :focus, so no need for an existence check\n\tif ( support.matchesSelector && documentIsHTML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) {\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch(e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [elem] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\tvar val;\n\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tif ( documentIsHTML ) {\n\t\tname = name.toLowerCase();\n\t}\n\tif ( (val = Expr.attrHandle[ name ]) ) {\n\t\treturn val( elem );\n\t}\n\tif ( !documentIsHTML || support.attributes ) {\n\t\treturn elem.getAttribute( name );\n\t}\n\treturn ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?\n\t\tname :\n\t\tval && val.specified ? val.value : null;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n// Document sorting and removing duplicates\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\t// Compensate for sort limitations\n\trecompare = !support.sortDetached;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\treturn results;\n};\n\n/*\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns Returns -1 if a precedes b, 1 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n// Returns a function to use in pseudos for input types\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n// Returns a function to use in pseudos for buttons\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n// Returns a function to use in pseudos for positionals\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/*\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( ; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (see #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[5] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[4] ) {\n\t\t\t\tmatch[2] = match[4];\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeName ) {\n\t\t\tif ( nodeName === \"*\" ) {\n\t\t\t\treturn function() { return true; };\n\t\t\t}\n\n\t\t\tnodeName = nodeName.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\")) || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\n\t\t\t// not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t// Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === elem.type );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( tokens = [] );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar data, cache, outerCache,\n\t\t\t\tdirkey = dirruns + \" \" + doneName;\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {\n\t\t\t\t\t\t\tif ( (data = cache[1]) === true || data === cachedruns ) {\n\t\t\t\t\t\t\t\treturn data === true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcache = outerCache[ dir ] = [ dirkey ];\n\t\t\t\t\t\t\tcache[1] = matcher( elem, context, xml ) || cachedruns;\n\t\t\t\t\t\t\tif ( cache[1] === true ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\t// A counter to specify which element is currently being matched\n\tvar matcherCachedRuns = 0,\n\t\tbySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, expandContext ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tsetMatched = [],\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\toutermost = expandContext != null,\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", expandContext && context.parentNode || context ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t\tcachedruns = matcherCachedRuns;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t\tcachedruns = ++matcherCachedRuns;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !group ) {\n\t\t\tgroup = tokenize( selector );\n\t\t}\n\t\ti = group.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( group[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\t}\n\treturn cached;\n};\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tmatch = tokenize( selector );\n\n\tif ( !seed ) {\n\t\t// Try to minimize operations if there is only one group\n\t\tif ( match.length === 1 ) {\n\n\t\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t\ttokens = match[0] = match[0].slice( 0 );\n\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\t\tcontext.nodeType === 9 && documentIsHTML &&\n\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\t\tif ( !context ) {\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\n\t\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t\t}\n\n\t\t\t// Fetch a seed set for right-to-left matching\n\t\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\ttoken = tokens[i];\n\n\t\t\t\t// Abort if we hit a combinator\n\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\t\tif ( (seed = find(\n\t\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\t\trsibling.test( tokens[0].type ) && context.parentNode || context\n\t\t\t\t\t)) ) {\n\n\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\tcompile( selector, match )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector )\n\t);\n\treturn results;\n}\n\n// Deprecated\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\n// Check sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Initialize with the default document\nsetDocument();\n\n// Always assume the presence of duplicates if sort doesn't\n// pass them to our comparison function (as in Google Chrome).\n[0, 0].sort( sortOrder );\nsupport.detectDuplicates = hasDuplicate;\n\n// EXPOSE\n/*if ( typeof define === \"function\" && define.amd ) {\n\tdefine(function() { return Sizzle; });\n} else {\n\twindow.Sizzle = Sizzle;\n}*/\n// EXPOSE\n\n/**\n * @namespace Ink.Dom.Selector\n * @static\n */\n\n/**\n * Alias for the Sizzle selector engine\n *\n * @method select\n * @param {String} selector CSS selector to search for elements\n * @param {DOMElement} [context] By default the search is done in the document element. However, you can specify an element as search context\n * @param {Array} [results] By default this is considered an empty array. But if you want to merge it with other searches you did, pass their result array through here.\n * @return {Array} Array of resulting DOM Elements\n * @sample Ink_Dom_Selector_select.html\n */\n\n/**\n * Filters elements that match a CSS selector.\n *\n * @method matches\n * @param {String} selector CSS selector to search for elements\n * @param {Array} matches Elements to be 'matched' with\n * @return {Array} Elements that matched\n * @sample Ink_Dom_Selector_matches.html\n */\n\n/**\n * Checks if an element matches a given selector\n *\n * @method matchesSelector\n * @param {DOMElement} element Element to test\n * @param {String} selector CSS selector to test the element with\n * @return {Boolean} True if element matches the CSS selector\n * @sample Ink_Dom_Selector_matchesSelector.html \n */\n\nreturn {\n select: Sizzle,\n matches: Sizzle.matches,\n matchesSelector: Sizzle.matchesSelector\n};\n\n\n}); //( window );\n","/**\n * Animate.css Utility\n *\n * This module is a wrapper around animate.css's CSS classes to produce animation.\n * It contains options to ease common tasks, like listen to the \"animationend\" event with all necessary prefixes, remove the necessary class names when the animation finishes, or configure the duration of your animation with the necessary browser prefix.\n *\n * @module Ink.UI.Animate_1\n * @version 1\n */\n\nInk.createModule('Ink.UI.Animate', 1, ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Css_1'], function (Common, InkEvent, Css) {\n 'use strict';\n\n var animationPrefix = (function (el) {\n return ('animationName' in el.style) ? 'animation' :\n ('webkitAnimationName' in el.style) ? 'webkitAnimation' : null;\n }(document.createElement('div')));\n\n var animationEndEventName = {\n animation: 'animationend',\n webkitAnimation: 'webkitAnimationEnd'\n }[animationPrefix];\n\n /**\n * @class Ink.UI.Animate_1\n * @constructor\n *\n * @param {Element} element Animated element\n * @param {Object} options Options object\n * @param {String} options.animation Animation name\n * @param {String|Number} [options.duration] Duration name (fast|medium|slow) or duration in milliseconds. Defaults to 'medium'.\n * @param {Boolean} [options.removeClass] Flag to remove the CSS class when finished animating. Defaults to false.\n * @param {Function} [options.onEnd] Callback for the animation end\n *\n * @sample Ink_UI_Animate_1.html\n *\n **/\n function Animate() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n Animate._name = 'Animate_1';\n\n Animate._optionDefinition = {\n trigger: ['Element', null],\n duration: ['String', 'slow'], // Actually a string with a duration name, or a number of ms\n animation: ['String'],\n removeClass: ['Boolean', true],\n onEnd: ['Function', function () {}]\n };\n\n Animate.prototype._init = function () {\n if (!isNaN(parseInt(this._options.duration, 10))) {\n this._options.duration = parseInt(this._options.duration, 10);\n }\n\n if (this._options.trigger) {\n InkEvent.observe(this._options.trigger, 'click', Ink.bind(function () {\n this.animate();\n }, this)); // later\n } else {\n this.animate();\n }\n };\n\n Animate.prototype.animate = function () {\n Animate.animate(this._element, this._options.animation, this._options);\n };\n\n Ink.extendObj(Animate, {\n /**\n * Browser prefix for the CSS animations.\n *\n * @property _animationPrefix\n * @private\n **/\n _animationPrefix: animationPrefix,\n\n /**\n * Boolean which says whether this browser has CSS3 animation support.\n *\n * @property animationSupported\n **/\n animationSupported: !!animationPrefix,\n\n /**\n * Prefixed 'animationend' event name.\n *\n * @property animationEndEventName\n **/\n animationEndEventName: animationEndEventName,\n\n /**\n * Animate an element using one of the animate.css classes\n *\n * **Note: This is a utility method inside the `Animate` class, which you can access through `Animate.animate()`. Do not mix these up.**\n *\n * @static\n * @method animate\n * @param {Element} element Animated element\n * @param {String} animation Animation name\n * @param {Object} [options] Options object, containing:\n * @param {Function} [options.onEnd=null] Callback for animation end.\n * @param {Boolean} [options.removeClass=false] Whether to remove the Css class when finished.\n * @param {String|Number} [options.duration=medium] Duration name (the fast|medium|slow strings) or, duration in milliseconds.\n *\n * @return {void}\n * @public\n *\n * @sample Ink_UI_Animate_1_animate.html\n **/\n animate: function (element, animation, options) {\n element = Common.elOrSelector(element);\n\n if (typeof options === 'number' || typeof options === 'string') {\n options = { duration: options };\n } else if (!options) {\n options = {};\n }\n\n if (typeof arguments[3] === 'function') {\n options.onEnd = arguments[3];\n }\n\n if (typeof options.duration !== 'number' && typeof options.duration !== 'string') {\n options.duration = 400;\n }\n\n if (!Animate.animationSupported) {\n if (options.onEnd) {\n setTimeout(function () {\n options.onEnd(null);\n }, 0);\n }\n return;\n }\n\n if (typeof options.duration === 'number') {\n element.style[animationPrefix + 'Duration'] = options.duration + 'ms';\n } else if (typeof options.duration === 'string') {\n Css.addClassName(element, options.duration);\n }\n\n Css.addClassName(element, ['animated', animation]);\n\n function onAnimationEnd(event) {\n if (event.target !== element) { return; }\n if (event.animationName !== animation) { return; }\n if (options.onEnd) { options.onEnd(event); }\n if (options.removeClass) {\n Css.removeClassName(element, animation);\n }\n if (typeof options.duration === 'string') {\n Css.removeClassName(element, options.duration);\n }\n element.removeEventListener(animationEndEventName, onAnimationEnd, false);\n }\n\n element.addEventListener(animationEndEventName, onAnimationEnd, false);\n }\n });\n\n Common.createUIComponent(Animate);\n\n return Animate;\n});\n","/**\n * Flexible Carousel\n * @module Ink.UI.Carousel_1\n * @version 1\n */\n\nInk.createModule('Ink.UI.Carousel', '1',\n ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Css_1', 'Ink.Dom.Element_1', 'Ink.UI.Pagination_1', 'Ink.Dom.Browser_1', 'Ink.Dom.Selector_1'],\n function(Common, InkEvent, Css, InkElement, Pagination, Browser/*, Selector*/) {\n 'use strict';\n\n /*\n * TODO:\n * keyboardSupport\n */\n\n function limitRange(n, min, max) {\n return Math.min(max, Math.max(min, n));\n }\n\n var requestAnimationFrame = window.requestAnimationFrame ||\n function (cb) { return setTimeout(cb, 1000 / 30); };\n\n /**\n * @class Ink.UI.Carousel_1\n * @constructor\n *\n * @param {String|Element} selector DOM element or element id\n * @param {Object} [options] Carousel Options\n * @param {Integer} [options.autoAdvance] Milliseconds to wait before auto-advancing pages. Set to 0 to disable auto-advance. Defaults to 0.\n * @param {String} [options.axis] Axis of the carousel. Set to 'y' for a vertical carousel. Defaults to 'x'.\n * @param {Number} [options.initialPage] Initial index page of the carousel. Defaults to 0.\n * @param {Boolean} [options.spaceAfterLastSlide=true] If there are not enough slides to fill the full width of the last page, leave white space. Defaults to `true`.\n * @param {Boolean} [options.swipe] Enable swipe support if available. Defaults to true.\n * @param {Mixed} [options.pagination] Either an ul element to add pagination markup to or an `Ink.UI.Pagination` instance to use.\n * @param {Function} [options.onChange] Callback to be called when the page changes.\n *\n * @sample Ink_UI_Carousel_1.html\n */\n function Carousel() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n Carousel._name = 'Carousel_1';\n\n Carousel._optionDefinition = {\n autoAdvance: ['Integer', 0],\n axis: ['String', 'x'],\n initialPage: ['Integer', 0],\n spaceAfterLastSlide: ['Boolean', true],\n keyboardSupport:['Boolean', false],\n pagination: ['String', null],\n onChange: ['Function', null],\n onInit: ['Function', function () {}],\n swipe: ['Boolean', true]\n // TODO exponential swipe\n // TODO specify break point for next page when moving finger\n };\n\n Carousel.prototype = {\n _init: function () {\n this._handlers = {\n paginationChange: Ink.bindMethod(this, '_onPaginationChange'),\n windowResize: InkEvent.throttle(Ink.bindMethod(this, 'refit'), 200)\n };\n\n InkEvent.observe(window, 'resize', this._handlers.windowResize);\n\n this._isY = (this._options.axis === 'y');\n\n var ulEl = Ink.s('ul.stage', this._element);\n ulEl.style.width = '100%';\n this._ulEl = ulEl;\n\n InkElement.removeTextNodeChildren(ulEl);\n\n if (this._options.pagination == null) {\n this._currentPage = this._options.initialPage;\n }\n\n this.refit(); // recalculate this._numPages\n\n if (this._isY) {\n // Override white-space: no-wrap which is only necessary to make sure horizontal stuff stays horizontal, but breaks stuff intended to be vertical.\n this._ulEl.style.whiteSpace = 'normal';\n }\n\n if (this._options.swipe) {\n InkEvent.observe(this._element, 'touchstart', Ink.bindMethod(this, '_onTouchStart'));\n InkEvent.observe(this._element, 'touchmove', Ink.bindMethod(this, '_onTouchMove'));\n InkEvent.observe(this._element, 'touchend', Ink.bindMethod(this, '_onTouchEnd'));\n }\n\n this._setUpPagination();\n this._setUpAutoAdvance();\n\n this._options.onInit.call(this, this);\n },\n\n /**\n * Repositions elements around.\n * Measure the carousel once again, adjusting the involved elements' sizes. This is called automatically when the window resizes, in order to cater for changes from responsive media queries, for instance.\n *\n * @method refit\n * @return {void}\n * @public\n */\n refit: function() {\n var _isY = this._isY;\n\n var size = function (elm, perpendicular) {\n if (!elm) { return 0; }\n\n if (!perpendicular) {\n return InkElement.outerDimensions(elm)[_isY ? 1 : 0];\n } else {\n return InkElement.outerDimensions(elm)[_isY ? 0 : 1];\n }\n };\n\n this._liEls = Ink.ss('li.slide', this._ulEl);\n var numSlides = this._liEls.length;\n\n var contRect = this._ulEl.getBoundingClientRect();\n this._ctnLength = _isY ? contRect.bottom - contRect.top : contRect.right - contRect.left;\n this._elLength = size(this._liEls[0]);\n this._slidesPerPage = Math.floor( this._ctnLength / this._elLength ) || 1;\n if (!isFinite(this._slidesPerPage)) { this._slidesPerPage = 1; }\n\n var numPages = Math.ceil( numSlides / this._slidesPerPage );\n var numPagesChanged = this._numPages !== numPages;\n this._numPages = numPages;\n this._deltaLength = this._slidesPerPage * this._elLength;\n \n this._IE7();\n\n if (this._pagination && numPagesChanged) {\n this._pagination.setSize(this._numPages);\n }\n this.setPage(limitRange(this.getPage(), 0, this._numPages - 1));\n },\n\n _setUpPagination: function () {\n if (this._options.pagination) {\n if (Common.isDOMElement(this._options.pagination) ||\n typeof this._options.pagination === 'string') {\n // if dom element or css selector string...\n this._pagination = new Pagination(this._options.pagination, {\n size: this._numPages,\n onChange: this._handlers.paginationChange\n });\n } else {\n // assumes instantiated pagination\n this._pagination = this._options.pagination;\n this._pagination.setOnChange(this._handlers.paginationChange);\n this._pagination.setSize(this._numPages);\n }\n this._pagination.setCurrent(this._options.initialPage || 0);\n } else {\n this._currentPage = this._options.initialPage || 0;\n }\n },\n\n _setUpAutoAdvance: function () {\n if (!this._options.autoAdvance) { return; }\n var self = this;\n\n setTimeout(function autoAdvance() {\n self.nextPage(true /* wrap */);\n setTimeout(autoAdvance, self._options.autoAdvance);\n }, this._options.autoAdvance);\n },\n\n /**\n * Refits elements for IE7 because it doesn't support inline-block.\n *\n * @method _IE7\n * @private\n */\n _IE7: function () {\n if (Browser.IE && '' + Browser.version.split('.')[0] === '7') {\n // var numPages = this._numPages;\n var slides = Ink.ss('li.slide', this._ulEl);\n var stl = function (prop, val) {slides[i].style[prop] = val; };\n for (var i = 0, len = slides.length; i < len; i++) {\n stl('position', 'absolute');\n stl(this._isY ? 'top' : 'left', (i * this._elLength) + 'px');\n }\n }\n },\n\n _onTouchStart: function (event) {\n if (event.touches.length > 1) { return; }\n\n this._swipeData = {\n x: InkEvent.pointerX(event),\n y: InkEvent.pointerY(event)\n };\n\n var ulRect = this._ulEl.getBoundingClientRect();\n\n this._swipeData.firstUlPos = ulRect[this._isY ? 'top' : 'left'];\n\n this._swipeData.inUlX = this._swipeData.x - ulRect.left;\n this._swipeData.inUlY = this._swipeData.y - ulRect.top;\n\n setTransitionProperty(this._ulEl, 'none');\n\n this._touchMoveIsFirstTouchMove = true;\n },\n\n _onTouchMove: function (event) {\n if (event.touches.length > 1) { return; /* multitouch event, not my problem. */ }\n\n var pointerX = InkEvent.pointerX(event);\n var pointerY = InkEvent.pointerY(event);\n\n var deltaY = this._swipeData.y - pointerY;\n var deltaX = this._swipeData.x - pointerX;\n\n if (this._touchMoveIsFirstTouchMove) {\n var aDeltaY = Math.abs(deltaY);\n var aDeltaX = Math.abs(deltaX);\n\n this._touchMoveIsFirstTouchMove = undefined;\n this._scrolling = this._isY ?\n aDeltaX > aDeltaY :\n aDeltaY > aDeltaX ;\n\n if (!this._scrolling) {\n this._onAnimationFrame();\n }\n }\n\n if (!this._scrolling && this._swipeData) {\n InkEvent.stopDefault(event);\n\n this._swipeData.pointerDelta = this._isY ? deltaY : deltaX;\n this._swipeData.pointerPos = this._isY ? pointerY : pointerX;\n }\n },\n\n _onAnimationFrame: function () {\n var swipeData = this._swipeData;\n\n if (!swipeData || this._scrolling || this._touchMoveIsFirstTouchMove) { return; }\n\n var elRect = this._element.getBoundingClientRect();\n\n var newPos;\n\n if (!this._isY) {\n newPos = swipeData.pointerPos - swipeData.inUlX - elRect.left;\n } else {\n newPos = swipeData.pointerPos - swipeData.inUlY - elRect.top;\n }\n\n this._ulEl.style[this._isY ? 'top' : 'left'] = newPos + 'px';\n\n requestAnimationFrame(Ink.bindMethod(this, '_onAnimationFrame'));\n },\n\n _onTouchEnd: function (event) {\n if (this._swipeData && this._swipeData.pointerPos && !this._scrolling && !this._touchMoveIsFirstTouchMove) {\n var snapToNext = 0.1; // swipe 10% of the way to change page\n\n var pointerDelta = this._swipeData.pointerDelta;\n\n var curPage = this.getPage();\n\n // How many pages were advanced? May be fractional.\n var progressInPages = pointerDelta / this._elLength / this._slidesPerPage;\n\n // Have we advanced enough to change page?\n if (Math.abs(progressInPages) > snapToNext) {\n curPage += Math[ pointerDelta < 0 ? 'floor' : 'ceil' ](progressInPages);\n }\n\n curPage = limitRange(curPage, 0, this._numPages - 1);\n\n // If something used to calculate progressInPages was zero, we get NaN here.\n if (!isNaN(curPage)) {\n this.setPage(curPage);\n }\n\n InkEvent.stopDefault(event);\n }\n\n setTransitionProperty(this._ulEl, null /* transition: left, top */);\n this._swipeData = null;\n this._touchMoveIsFirstTouchMove = undefined;\n this._scrolling = undefined;\n },\n\n _onPaginationChange: function(pgn) {\n this._setPage(pgn.getCurrent());\n },\n\n /**\n * Gets the current page index\n * @method getPage\n * @return {Number} The current page number\n * @public\n **/\n getPage: function () {\n if (this._pagination) {\n return this._pagination.getCurrent();\n } else {\n return this._currentPage || 0;\n }\n },\n\n /**\n * Gets the Ink Pagination element this carousel is using.\n * @method getPagination\n * @return {Pagination} The pagination instance, if any. Otherwise, `null`.\n * @public\n **/\n getPagination: function () {\n return this._pagination || null;\n },\n\n /**\n * Sets the current page index\n * @method setPage\n * @param {Number} page Index of the destination page.\n * @param {Boolean} [wrap=false] Flag to activate circular counting (for example, if you set the page to `5` and there are only 4 pages, you're actually going to the first page).\n * @return {void}\n * @public\n **/\n setPage: function (page, wrap) {\n if (wrap) {\n // Pages outside the range [0..this._numPages] are wrapped.\n page = page % this._numPages;\n if (page < 0) { page = this._numPages - page; }\n }\n page = limitRange(page, 0, this._numPages - 1);\n\n if (page === this._currentPage) {\n if (this._swipeData) {\n this._setPage(page); // Just advance the view.\n }\n return;\n }\n\n if (this._pagination) {\n this._pagination.setCurrent(page); // _setPage is called by pagination because it listens to its Change event.\n } else {\n this._setPage(page);\n }\n },\n\n _setPage: function (page) {\n var _lengthToGo = page * this._deltaLength;\n var isLastPage = page === (this._numPages - 1);\n\n if (!this._options.spaceAfterLastSlide && isLastPage && page > 0) { \n var _itemsInLastPage = this._liEls.length - (page * this._slidesPerPage);\n if(_itemsInLastPage < this._slidesPerPage) {\n _lengthToGo = ((page - 1) * this._deltaLength) + (_itemsInLastPage * this._elLength);\n }\n }\n\n this._ulEl.style[ this._isY ? 'top' : 'left'] =\n ['-', (_lengthToGo / this._ctnLength) * 100, '%'].join('');\n\n if (this._options.onChange) {\n this._options.onChange.call(this, page);\n }\n\n this._currentPage = page;\n },\n\n /**\n * Goes to the next page\n * @method nextPage\n * @param {Boolean} [wrap=false] Flag to loop from last page to first page.\n * @return {void}\n * @public\n **/\n nextPage: function (wrap) {\n this.setPage(this.getPage() + 1, wrap);\n },\n\n /**\n * Goes to the previous page\n * @method previousPage\n * @param {Boolean} [wrap=false] Flag to loop from first page to last page.\n * @return {void}\n * @public\n **/\n previousPage: function (wrap) { this.setPage(this.getPage() - 1, wrap); },\n\n /**\n * Returns how many slides fit into a page\n * @method getSlidesPerPage\n * @return {Number} The number of slides per page\n * @public\n */\n getSlidesPerPage: function() {\n return this._slidesPerPage;\n },\n\n /**\n * Get the amount of pages in the carousel.\n * @method getTotalPages\n * @return {Number} The number of pages\n * @public\n */\n getTotalPages: function() {\n return this._numPages;\n },\n\n /**\n * Get the stage element (your UL with the class \".stage\").\n * @method getStageElm\n * @public\n * @return {Element} Stage element\n **/\n getStageElm: function() {\n return this._ulEl;\n },\n\n /**\n * Get a list of your slides (elements with the \".slide\" class inside your stage)\n * @method getSlidesList\n * @return {Element[]} Array containing the slides.\n * @public\n */\n getSlidesList: function() {\n return this._liEls;\n },\n\n /**\n * Get the total number of slides\n * @method getTotalSlides\n * @return {Number} The number of slides\n * @public\n */\n getTotalSlides: function() {\n return this.getSlidesList().length;\n }\n };\n\n function setTransitionProperty(el, newTransition) {\n el.style.transitionProperty =\n el.style.oTransitionProperty =\n el.style.msTransitionProperty =\n el.style.mozTransitionProperty =\n el.style.webkitTransitionProperty = newTransition;\n }\n\n Common.createUIComponent(Carousel);\n\n return Carousel;\n\n});\n","/**\n * Closing utilities\n * @module Ink.UI.Close_1\n * @version 1\n */\nInk.createModule('Ink.UI.Close', '1', ['Ink.Dom.Event_1','Ink.Dom.Element_1'], function(InkEvent, InkElement) {\n 'use strict';\n\n /**\n * Subscribes clicks on the document.body.\n * Whenever an element with the classes \".ink-close\" or \".ink-dismiss\" is clicked, this module finds an ancestor \".ink-alert\" or \".ink-alert-block\" element and removes it from the DOM.\n * This module should be created only once per page.\n * \n * @class Ink.UI.Close\n * @constructor\n * @example\n * \n *\n * @sample Ink_UI_Close_1.html\n */\n function Close() {\n InkEvent.observe(document.body, 'click', function(ev) {\n var el = InkEvent.element(ev);\n\n el = InkElement.findUpwardsByClass(el, 'ink-close') ||\n InkElement.findUpwardsByClass(el, 'ink-dismiss');\n\n if (!el) {\n return; // ink-close or ink-dismiss class not found\n }\n\n var toRemove = InkElement.findUpwardsByClass(el, 'ink-alert') ||\n InkElement.findUpwardsByClass(el, 'ink-alert-block') ||\n el;\n\n if (toRemove) {\n InkEvent.stop(ev);\n InkElement.remove(toRemove);\n }\n });\n }\n\n Close._name = 'Close_1';\n\n return Close;\n});\n","/**\n * Auxiliar utilities for UI Modules\n * @module Ink.UI.Common_1\n * @version 1\n */\n \nInk.createModule('Ink.UI.Common', '1', ['Ink.Dom.Element_1', 'Ink.Net.Ajax_1','Ink.Dom.Css_1','Ink.Dom.Selector_1','Ink.Util.Url_1'], function(InkElement, Ajax,Css,Selector,Url) {\n\n 'use strict';\n\n var nothing = {} /* a marker, for reference comparison. */;\n\n var keys = Object.keys || function (obj) {\n var ret = [];\n for (var k in obj) if (obj.hasOwnProperty(k)) {\n ret.push(k);\n }\n return ret;\n };\n\n var es6WeakMapSupport = 'WeakMap' in window;\n var instances = es6WeakMapSupport ? new WeakMap() : null;\n // Old Registry\n var _reg = [];\n var domRegistry = {\n get: function get(el) {\n return es6WeakMapSupport ?\n instances.get(el) :\n _reg[el.getAttribute('__InkInstance')];\n },\n set: function set(el, thing) {\n if (es6WeakMapSupport) {\n instances.set(el, thing);\n } else {\n el.setAttribute('__InkInstance', _reg.push(thing) - 1);\n }\n }\n };\n\n /**\n * @namespace Ink.UI.Common_1\n */\n\n var Common = {\n\n /**\n * Supported Ink Layouts\n *\n * @property Layouts\n * @type Object\n * @readOnly\n */\n Layouts: {\n TINY: 'tiny',\n SMALL: 'small',\n MEDIUM: 'medium',\n LARGE: 'large',\n XLARGE: 'xlarge'\n },\n\n /**\n * Checks if an item is a valid DOM Element.\n *\n * @method isDOMElement\n * @static\n * @param {Mixed} o The object to be checked.\n * @return {Boolean} True if it's a valid DOM Element.\n * @example\n * var el = Ink.s('#element');\n * if( Ink.UI.Common.isDOMElement( el ) === true ){\n * // It is a DOM Element.\n * } else {\n * // It is NOT a DOM Element.\n * }\n */\n isDOMElement: InkElement.isDOMElement,\n\n /**\n * Checks if an item is a valid integer.\n *\n * @method isInteger\n * @static\n * @param {Mixed} n The value to be checked.\n * @return {Boolean} True if it's a valid integer.\n * @example\n * var value = 1;\n * if( Ink.UI.Common.isInteger( value ) === true ){\n * // It is an integer.\n * } else {\n * // It is NOT an integer.\n * }\n */\n isInteger: function(n) {\n return (typeof n === 'number' && n % 1 === 0);\n },\n\n /**\n * Gets a DOM Element. \n *\n * @method elOrSelector\n * @static\n * @param {Element|String} elOrSelector DOM Element or CSS Selector\n * @param {String} fieldName The name of the field. Commonly used for debugging.\n * @return {Element} Returns the Element passed or the first result of the CSS Selector. Otherwise it throws an exception.\n * @example\n * // In case there are several .myInput, it will retrieve the first found\n * var el = Ink.UI.Common.elOrSelector('.myInput','My Input');\n */\n elOrSelector: function(elOrSelector, fieldName) {\n if (!Common.isDOMElement(elOrSelector)) {\n var t = Selector.select(elOrSelector);\n if (t.length === 0) {\n Ink.warn(fieldName + ' must either be a DOM Element or a selector expression!\\nThe script element must also be after the DOM Element itself.');\n return null;\n }\n return t[0];\n }\n return elOrSelector;\n },\n\n /**\n * Like `elOrSelector` but returns an array of elements.\n *\n * @method elsOrSelector\n *\n * @static\n * @param {Element|Array|String} elsOrSelector DOM Element, array of DOM Elements, or CSS Selector\n * @param {String} [fieldName] The name of the field. Used for the error shown when no elements are found.\n * @param {Boolean} required If this is true, throw an error instead of returning an empty array.\n * @return {Array} The selected Elements, or the given Elements\n * @example\n * var elements = Ink.UI.Common.elsOrSelector('input.my-inputs', 'My Input');\n */\n elsOrSelector: function(elsOrSelector, fieldName, required) {\n var ret;\n if (typeof elsOrSelector === 'string') {\n ret = Selector.select(elsOrSelector);\n } else if (Common.isDOMElement(elsOrSelector)) {\n ret = [elsOrSelector];\n } else if (elsOrSelector && typeof elsOrSelector === 'object' && typeof elsOrSelector.length === 'number') {\n ret = elsOrSelector;\n }\n\n if (ret && ret.length) {\n return ret;\n } else {\n if (required) {\n throw new TypeError(fieldName + ' must either be a DOM Element, an Array of elements, or a selector expression!\\nThe script element must also be after the DOM Element itself.');\n } else {\n return [];\n }\n }\n },\n\n /**\n * Gets options an object and element's metadata.\n *\n * The element's data attributes take precedence. Values from the element's data-atrributes are coerced into the required type.\n *\n * @method options\n *\n * @param {Object} [fieldId] Name to be used in error reports.\n * @param {Object} defaults Object with the options' types and defaults.\n * @param {Object} overrides Options to override the defaults. Usually passed when instantiating an UI module.\n * @param {Element} [element] Element with data-attributes\n * @return {Object} An object containing all the option values.\n *\n * @example\n *\n * this._options = Ink.UI.Common.options('MyComponent', {\n * 'anobject': ['Object', null], // Defaults to null\n * 'target': ['Element', null],\n * 'stuff': ['Number', 0.1],\n * 'stuff2': ['Integer', 0],\n * 'doKickFlip': ['Boolean', false],\n * 'targets': ['Elements'], // Required option since no default was given\n * 'onClick': ['Function', null]\n * }, options || {}, elm)\n *\n * @example\n *\n * ### Note about booleans\n *\n * Here is how options are read from the markup\n * data-attributes, for several values`data-a-boolean`.\n *\n * Options considered true:\n *\n * - `data-a-boolean=\"true\"`\n * - (Every other value which is not on the list below.)\n * \n * Options considered false:\n *\n * - `data-a-boolean=\"false\"`\n * - `data-a-boolean=\"\"`\n * - `data-a-boolean`\n *\n * Options which go to default:\n *\n * - (no attribute). When `data-a-boolean` is ommitted, the\n * option is not considered true nor false, and as such\n * defaults to what is in the `defaults` argument.\n *\n **/\n options: function (fieldId, defaults, overrides, element) {\n // TODO Change Common.options's signature? the below looks better, more manageable\n // var options = Common.options({\n // element: this._element,\n // modName: constructor._name,\n // options: constructor._optionDefinition,\n // defaults: constructor._globalDefaults\n // });\n\n if (typeof fieldId !== 'string') {\n element = overrides;\n overrides = defaults;\n defaults = fieldId;\n fieldId = '';\n }\n overrides = overrides || {};\n var out = {};\n var dataAttrs = element ? InkElement.data(element) : {};\n var fromDataAttrs;\n var type;\n var lType;\n var defaultVal;\n\n var invalidStr = function (str) {\n if (fieldId) { str = fieldId + ': \"' + ('' + str).replace(/\"/, '\\\\\"') + '\"'; }\n return str;\n };\n\n var quote = function (str) {\n return '\"' + ('' + str).replace(/\"/, '\\\\\"') + '\"';\n };\n\n var invalidThrow = function (str) {\n throw new Error(invalidStr(str));\n };\n\n var invalid = function (str) {\n Ink.error(invalidStr(str) + '. Ignoring option.');\n };\n\n function optionValue(key) {\n type = defaults[key][0];\n lType = type.toLowerCase();\n defaultVal = defaults[key].length === 2 ? defaults[key][1] : nothing;\n\n if (!type) {\n invalidThrow('Ink.UI.Common.options: Always specify a type!');\n }\n if (!(lType in Common._coerce_funcs)) {\n invalidThrow('Ink.UI.Common.options: ' + defaults[key][0] + ' is not a valid type. Use one of ' + keys(Common._coerce_funcs).join(', '));\n\n }\n if (!defaults[key].length || defaults[key].length > 2) {\n invalidThrow('the \"defaults\" argument must be an object mapping option names to [typestring, optional] arrays.');\n }\n\n if (key in dataAttrs) {\n fromDataAttrs = Common._coerce_from_string(lType, dataAttrs[key], key, fieldId);\n // (above can return `nothing`)\n } else {\n fromDataAttrs = nothing;\n }\n\n if (fromDataAttrs !== nothing) {\n if (!Common._options_validate(fromDataAttrs, lType)) {\n invalid('(' + key + ' option) Invalid ' + lType + ' ' + quote(fromDataAttrs));\n return defaultVal;\n } else {\n return fromDataAttrs;\n }\n } else if (key in overrides) {\n return overrides[key];\n } else if (defaultVal !== nothing) {\n return defaultVal;\n } else {\n invalidThrow('Option ' + key + ' is required!');\n }\n }\n\n for (var key in defaults) {\n if (defaults.hasOwnProperty(key)) {\n out[key] = optionValue(key);\n }\n }\n\n return out;\n },\n\n _coerce_from_string: function (type, val, paramName, fieldId) {\n if (type in Common._coerce_funcs) {\n return Common._coerce_funcs[type](val, paramName, fieldId);\n } else {\n return val;\n }\n },\n\n _options_validate: function (val, type) {\n if (type in Common._options_validate_types) {\n return Common._options_validate_types[type].call(Common, val);\n } else {\n // 'object' options cannot be passed through data-attributes.\n // Json you say? Not any good to embed in HTML.\n return false;\n }\n },\n\n _coerce_funcs: (function () {\n var ret = {\n element: function (val) {\n return Common.elOrSelector(val, '');\n },\n elements: function (val) {\n return Common.elsOrSelector(val, '', false /*not required, so don't throw an exception now*/);\n },\n object: function (val) { return val; },\n number: function (val) { return parseFloat(val); },\n 'boolean': function (val) {\n return !(val === 'false' || val === '' || val === null);\n },\n string: function (val) { return val; },\n 'function': function (val, paramName, fieldId) {\n Ink.error(fieldId + ': You cannot specify the option \"' + paramName + '\" through data-attributes because it\\'s a function');\n return nothing;\n }\n };\n ret['float'] = ret.integer = ret.number;\n return ret;\n }()),\n\n _options_validate_types: (function () {\n var types = {\n string: function (val) {\n return typeof val === 'string';\n },\n number: function (val) {\n return typeof val === 'number' && !isNaN(val) && isFinite(val);\n },\n integer: function (val) {\n return val === Math.round(val);\n },\n element: function (val) {\n return Common.isDOMElement(val);\n },\n elements: function (val) {\n return val && typeof val === 'object' && typeof val.length === 'number' && val.length;\n },\n 'boolean': function (val) {\n return typeof val === 'boolean';\n },\n object: function () { return true; }\n };\n types['float'] = types.number;\n return types;\n }()),\n\n /**\n * Deep copy (clone) an object.\n * Note: The object cannot have referece loops.\n *\n * @method clone\n * @static\n * @deprecated\n * @param {Object} o The object to be cloned/copied.\n * @return {Object} Returns the result of the clone/copy.\n * @example\n * var originalObj = {\n * key1: 'value1',\n * key2: 'value2',\n * key3: 'value3'\n * };\n * var cloneObj = Ink.UI.Common.clone( originalObj );\n */\n clone: function(o) {\n try {\n return JSON.parse( JSON.stringify(o) );\n } catch (ex) {\n throw new Error('Given object cannot have loops!');\n }\n },\n\n\n /**\n * Gets an element's one-base index relative to its parent.\n *\n * Deprecated. Use Ink.Dom.Element.parentIndexOf instead.\n *\n * @method childIndex\n * @deprecated\n * @static\n * @param {Element} childEl Valid DOM Element.\n * @return {Number} Numerical position of an element relatively to its parent.\n * @example\n * \n *
            \n *
          • One
          • \n *
          • Two
          • \n *
          • Three
          • \n *
          • Four
          • \n *
          \n *\n * \n */\n childIndex: InkElement.parentIndexOf,\n\n /**\n * AJAX JSON request shortcut method\n * It provides a more convenient way to do an AJAX request and expect a JSON response.It also offers a callback option, as third parameter, for better async handling.\n *\n * @method ajaxJSON\n * @static\n * @async\n * @param {String} endpoint Valid URL to be used as target by the request.\n * @param {Object} params This field is used in the thrown Exception to identify the parameter.\n * @param {Function} cb Callback for the request.\n * @return {void}\n * @public\n * @example\n * // In case there are several .myInput, it will retrieve the first found\n * var el = Ink.UI.Common.elOrSelector('.myInput','My Input');\n */\n ajaxJSON: function(endpoint, params, cb) {\n new Ajax(\n endpoint,\n {\n evalJS: 'force',\n method: 'POST',\n parameters: params,\n\n onSuccess: function( r) {\n try {\n r = r.responseJSON;\n if (r.status !== 'ok') {\n throw 'server error: ' + r.message;\n }\n cb(null, r);\n } catch (ex) {\n cb(ex);\n }\n },\n\n onFailure: function() {\n cb('communication failure');\n }\n }\n );\n },\n\n\n /**\n * Gets the current Ink layout.\n *\n * @method currentLayout\n * @static\n * @return {String} A string representation of the current layout name.\n * @public\n * @example\n * var inkLayout = Ink.UI.Common.currentLayout();\n * if (inkLayout === 'small') {\n * // ...\n * }\n */\n currentLayout: function() {\n var i, f, k, v, el, detectorEl = Selector.select('#ink-layout-detector')[0];\n if (!detectorEl) {\n detectorEl = document.createElement('div');\n detectorEl.id = 'ink-layout-detector';\n for (k in Common.Layouts) {\n if (Common.Layouts.hasOwnProperty(k)) {\n v = Common.Layouts[k];\n el = document.createElement('div');\n el.className = 'show-' + v + ' hide-all';\n el.setAttribute('data-ink-layout', v);\n detectorEl.appendChild(el);\n }\n }\n document.body.appendChild(detectorEl);\n }\n\n for (i = 0, f = detectorEl.children.length; i < f; ++i) {\n el = detectorEl.children[i];\n if (Css.getStyle(el, 'display') === 'block') {\n return el.getAttribute('data-ink-layout');\n }\n }\n\n return 'large';\n },\n\n\n /**\n * Sets the location's hash (window.location.hash).\n *\n * @method hashSet\n * @static\n * @param {Object} o Object with the info to be placed in the location's hash.\n * @return {void}\n * @example\n * // It will set the location's hash like: #key1=value1&key2=value2&key3=value3\n * Ink.UI.Common.hashSet({\n * key1: 'value1',\n * key2: 'value2',\n * key3: 'value3'\n * });\n */\n hashSet: function(o) {\n if (typeof o !== 'object') { throw new TypeError('o should be an object!'); }\n var hashParams = Url.getAnchorString();\n hashParams = Ink.extendObj(hashParams, o);\n window.location.hash = Url.genQueryString('', hashParams).substring(1);\n },\n\n /**\n * Removes children nodes from a given object.\n * This method was initially created to help solve a problem in Internet Explorer(s) that occurred when trying to set the innerHTML of some specific elements like 'table'.\n *\n * @method cleanChildren\n * @static\n * @param {Element} parentEl Valid DOM Element\n * @return {void}\n * @public\n * @example\n * \n *
            \n *
          • One
          • \n *
          • Two
          • \n *
          • Three
          • \n *
          • Four
          • \n *
          \n *\n * \n *\n * \n *
            \n */\n cleanChildren: function(parentEl) {\n if( !Common.isDOMElement(parentEl) ){\n throw new Error('Please provide a valid DOMElement');\n }\n InkElement.setHTML(parentEl, '');\n },\n\n /**\n * Stores the id and/or classes of an element in an object.\n *\n * @method storeIdAndClasses\n * @static\n * @param {Element} fromEl Valid DOM Element to get the id and classes from.\n * @param {Object} inObj Object where the id and classes will be saved.\n * @return {void}\n * @public\n * @example\n *
            \n *\n * \n */\n storeIdAndClasses: function(fromEl, inObj) {\n if( !Common.isDOMElement(fromEl) ){\n throw 'Please provide a valid Element as first parameter';\n }\n\n var id = fromEl.id;\n if (id) {\n inObj._id = id;\n }\n\n var classes = fromEl.className;\n if (classes) {\n inObj._classes = classes;\n }\n },\n\n /**\n * Sets the id and className properties of an element based \n *\n * @method restoreIdAndClasses\n * @static\n * @param {Element} toEl Valid DOM Element to set the id and classes on.\n * @param {Object} inObj Object where the id and classes to be set are. This method uses the same format as the one given in `storeIdAndClasses`\n * @return {void}\n * @public\n * @example\n *
            \n *\n * \n *\n * \n *
            \n */\n restoreIdAndClasses: function(toEl, inObj) {\n\n if( !Common.isDOMElement(toEl) ){\n throw 'Please provide a valid Element as first parameter';\n }\n\n if (inObj._id && toEl.id !== inObj._id) {\n toEl.id = inObj._id;\n }\n\n if (inObj._classes && toEl.className.indexOf(inObj._classes) === -1) {\n if (toEl.className) { toEl.className += ' ' + inObj._classes; }\n else { toEl.className = inObj._classes; }\n }\n\n if (inObj._instanceId && !toEl.getAttribute('data-instance')) {\n toEl.setAttribute('data-instance', inObj._instanceId);\n }\n },\n\n _warnDoubleInstantiation: function (elm, newInstance) {\n var instances = Common.getInstance(elm);\n\n if (getName(newInstance) === '') { return; }\n if (!instances) { return; }\n\n var nameWithoutVersion = getName(newInstance);\n\n if (!nameWithoutVersion) { return; }\n\n for (var i = 0, len = instances.length; i < len; i++) {\n if (nameWithoutVersion === getName(instances[i])) {\n // Yes, I am using + to concatenate and , to split\n // arguments.\n //\n // Elements can't be concatenated with strings, but if\n // they are passed in an argument, modern debuggers will\n // pretty-print them and make it easy to find them in the\n // element inspector.\n //\n // On the other hand, if strings are passed as different\n // arguments, they get pretty printed. And the pretty\n // print of a string has quotes around it.\n //\n // If some day people find out that strings are not\n // just text and they start preserving contextual\n // information, then by all means change this to a\n // regular concatenation.\n //\n // But they won't. So don't change this.\n Ink.warn('Creating more than one ' + nameWithoutVersion + 'for the same element.',\n '(Was creating a ' + nameWithoutVersion + ' on:', elm, ').');\n return false;\n }\n }\n\n function getName(thing) {\n return ((thing.constructor && (thing.constructor._name)) ||\n thing._name ||\n '').replace(/_.*?$/, '');\n }\n\n return true;\n },\n\n /**\n * Saves an object (which should inherit BaseUIComponent) in the registry, associated with an element. You can retrieve it later by calling getInstance.\n *\n * This won't allow two instances of the same class to be created on a single element. It will fail and print a warning to the console if you try to do it. That is a common error when using Ink.\n *\n * @method registerInstance\n * @static\n * @param {Object} inst Object to be registered\n * @param {Element} [el=inst._element] Element to associate with `inst`. Defaults to `_element` property of `inst`.\n * @return {Boolean} `true` if we could create the instance, `false` otherwise.\n */\n registerInstance: function(inst, el) {\n if (!inst) { return; }\n\n if (!el) { el = inst._element; }\n\n if (!Common.isDOMElement(el)) { throw new TypeError('Ink.UI.Common.registerInstance: The element passed in is not a DOM element!'); }\n\n // [todo] this belongs in the BaseUIComponent's initialization\n if (Common._warnDoubleInstantiation(el, inst) === false) {\n return false;\n }\n\n var instances = domRegistry.get(el);\n\n if (!instances) {\n instances = [];\n domRegistry.set(el, instances);\n }\n\n instances.push(inst);\n\n return true;\n },\n\n /**\n * Unregisters (removes from the registry) a UI component instance from whatever element it's on.\n *\n * @method unregisterInstance\n * @static\n * @param {String} inst Instance to be unregistered.\n * @return {void}\n * @public\n */\n unregisterInstance: function(inst) {\n if (!inst || !inst._element) { return; }\n var instances = domRegistry.get(inst._element);\n for (var i = 0, len = instances.length; i < len; i++) {\n if (instances[i] === inst) {\n instances.splice(i, 1);\n }\n }\n },\n\n /**\n * Gets an UI component instance from an element.\n *\n * This function is already available in the UI components' classes themselves. You can call Modal.getInstance() and retrieve a modal.\n *\n * @method getInstance\n * @static\n * @param {String|Element} el Element from which we want the instances. A selector is okay.\n * @param {BaseUIComponent} [UIComponent] If you pass an Ink UI component class (Like Ink.UI.Modal or Ink.UI.Carousel), this won't return an array of all instances associated with the element. Instead it will return only the object which is an instance of that class.\n * @return {Object|Array} Returns an array containing all the instances in that element.\n * @public\n */\n getInstance: function(el, UIComponent) {\n var givenEl = el; // So we can warn it later.\n\n el = Common.elOrSelector(el);\n\n if (!Common.isDOMElement(el)) {\n Ink.warn('Ink.UI.Common: getInstance called on non-element (' + givenEl + ')');\n return [];\n }\n\n var instances = domRegistry.get(el);\n\n if (!instances) {\n instances = [];\n }\n\n if (typeof UIComponent !== 'function') {\n return instances;\n }\n\n for (var i = 0, len = instances.length; i < len; i++) {\n if (instances[i] instanceof UIComponent) {\n return instances[i];\n }\n }\n\n return null;\n },\n\n /**\n * Gets an instance based on a selector.\n *\n * @method getInstanceFromSelector\n * @static\n * @param {String} selector CSS selector to get the instances from. This function will only use the *first* element.\n * @return {Object|Array} Returns an array of the instances in the selected element.\n * @public\n */\n getInstanceFromSelector: function(selector) {\n return Common.getInstance(selector);\n },\n\n /**\n * Gets all the instance ids\n *\n * @method getInstanceIds\n * @static\n * @return {Array} Collection of instance ids\n */\n getInstanceIds: function() {\n if( _reg.length > 0 ) return _reg;\n var res = [];\n for (var id in instances) {\n if (instances.hasOwnProperty(id)) {\n res.push( id );\n }\n }\n return res;\n },\n\n /**\n * Gets all the instances\n *\n * @method getInstances\n * @static\n * @return {Array} Collection of existing instances.\n * @public\n */\n getInstances: function() {\n if( _reg.length > 0 ) return _reg;\n var res = [];\n for (var id in instances) {\n if (instances.hasOwnProperty(id)) {\n res.push( instances[id] );\n }\n }\n return res;\n },\n\n /**\n * Boilerplate method to destroy a component.\n * Components should copy this method as its destroy method and modify it.\n *\n * @method destroyComponent\n * @return {void}\n * @public\n * @static\n */\n destroyComponent: function() {\n Common.unregisterInstance(this);\n this._element.parentNode.removeChild(this._element);\n }\n };\n\n\n\n\n /**\n * Ink UI Base Class\n **/\n\n function warnStub() {\n /* jshint validthis: true */\n if (!this || this === window || typeof this.constructor !== 'function') { return; }\n Ink.warn('You called a method on an incorrectly instantiated ' + this.constructor._name + ' component. Check the warnings above to see what went wrong.');\n }\n\n function stub(prototype, obj) {\n for (var k in prototype) if (prototype.hasOwnProperty(k)) {\n if (k === 'constructor') { continue; }\n if (typeof obj[k] === 'function') {\n obj[k] = warnStub;\n }\n }\n }\n\n /**\n * Ink UI Base Class\n *\n * You don't use this class directly, or inherit from it directly.\n *\n * See createUIComponent() (in this module) for how to create a UI component and inherit from this. It's not plain old JS inheritance, for several reasons.\n *\n * @class Ink.UI.Common.BaseUIComponent\n * @constructor\n *\n * @param {Element|String} element Element to associate this UI component with. It's the element you can get later using `comp.getElement()`\n * @param {Object} [options] Options to pass to the component. You should see your specific UI component for this information.\n * @public\n **/\n function BaseUIComponent(element, options) {\n var constructor = this.constructor;\n var _name = constructor._name;\n\n if (!this || this === window) {\n throw new Error('Use \"new InkComponent()\" instead of \"InkComponent()\"');\n }\n\n if (this && !(this instanceof BaseUIComponent)) {\n throw new Error('You forgot to call Ink.UI.Common.createUIComponent() on this module!');\n }\n\n if (!element && !constructor._componentOptions.elementIsOptional) {\n Ink.error(new Error(_name + ': You need to pass an element or a selector as the first argument to \"new ' + _name + '()\"'));\n return;\n } else {\n this._element = Common.elsOrSelector(element,\n _name + ': An element with the selector \"' + element + '\" was not found!')[0];\n }\n\n if (!this._element && !constructor._componentOptions.elementIsOptional) {\n isValidInstance = false;\n Ink.error(new Error(element + ' does not match an element on the page. You need to pass a valid selector to \"new ' + _name + '\".'));\n }\n\n this._options = Common.options(_name, constructor._optionDefinition, options, this._element);\n\n var isValidInstance = BaseUIComponent._validateInstance(this) === true;\n\n if (isValidInstance && typeof this._init === 'function') {\n try {\n this._init.apply(this, arguments);\n } catch(e) {\n isValidInstance = false;\n Ink.error(e);\n }\n }\n\n if (!isValidInstance) {\n BaseUIComponent._stubInstance(this, constructor, _name);\n } else if (this._element) {\n Common.registerInstance(this);\n }\n }\n\n /**\n * Calls the `instance`'s _validate() method so it can validate itself.\n *\n * Returns false if the method exists, was called, but no Error was returned or thrown.\n *\n * @method _validateInstance\n * @private\n */\n BaseUIComponent._validateInstance = function (instance) {\n var err;\n\n if (typeof instance._validate !== 'function') { return true; }\n\n try {\n err = instance._validate();\n } catch (e) {\n err = e;\n }\n\n if (err instanceof Error) {\n instance._validationError = err;\n return false;\n }\n\n return true;\n };\n\n\n /**\n * Replaces every method in the instance with stub functions which just call Ink.warn().\n *\n * This avoids breaking the page when there are errors.\n *\n * @method _stubInstance\n * @param instance\n * @param constructor\n * @param name\n * @private\n */\n BaseUIComponent._stubInstance = function (instance, constructor, name) {\n stub(constructor.prototype, instance);\n stub(BaseUIComponent.prototype, instance);\n Ink.warn(name + ' was not correctly created. ' + (instance._validationError || ''));\n };\n\n // TODO BaseUIComponent.setGlobalOptions = function () {}\n // TODO BaseUIComponent.createMany = function (selector) {}\n BaseUIComponent.getInstance = function (elOrSelector) {\n elOrSelector = Common.elOrSelector(elOrSelector);\n return Common.getInstance(elOrSelector, this /* get instance by constructor */);\n };\n\n Ink.extendObj(BaseUIComponent.prototype, {\n /**\n * Get an UI component's option's value.\n *\n * @method getOption\n * @param {String} name The option's name.\n * @return {Mixed} The option value, or undefined if nothing is found.\n *\n * @example\n *\n * var myUIComponent = new Modal('#element', { trigger: '#trigger' }); // or anything else inheriting BaseUIComponent\n * myUIComponent.getOption('trigger'); // -> The trigger element (not the selector string, mind you)\n *\n **/\n getOption: function (name) {\n if (this.constructor && !(name in this.constructor._optionDefinition)) {\n Ink.error('\"' + name + '\" is not an option for ' + this.constructor._name);\n return undefined;\n }\n\n return this._options[name];\n },\n\n /**\n * Sets an option's value.\n *\n * @method getOption\n * @param {String} name Name of the option.\n * @param {Mixed} value New option value.\n * @return {void}\n * @public\n *\n * @example\n *\n * var myUIComponent = new Modal(...);\n * myUIComponent.setOption('trigger', '#some-element');\n **/\n setOption: function (name, value) {\n if (this.constructor && !(name in this.constructor._optionDefinition)) {\n Ink.error('\"' + name + ' is not an option for ' + this.constructor._name);\n return;\n }\n\n this._options[name] = value;\n },\n\n /**\n * Get the element associated with an UI component (IE the one you used in the constructor)\n *\n * @method getElement\n * @return {Element} The component's element.\n *\n * @example\n * var myUIComponent = new Modal('#element'); // or anything else inheriting BaseUIComponent\n * myUIComponent.getElement(); // -> The '#element' (not the selector string, mind you).\n *\n **/\n getElement: function () {\n return this._element;\n }\n });\n\n Common.BaseUIComponent = BaseUIComponent;\n\n /**\n * Take a constructor, and make it an Ink UI component.\n *\n * Makes it inherit BaseUIComponent, makes sure it has the basic properties Ink.UI.Common needs it to have, adds the necessary static methods, sets its options, etc.\n *\n * @method createUIComponent\n * @param {Function} theConstructor UI component constructor. It should have an _init function in its prototype, an _optionDefinition object, and a _name property indicating its name.\n * @param {Object} [options] Options hash, containing:\n * @param {Boolean} [options.elementIsOptional=false] Whether the element argument is optional (For example, when the component might work on existing markup or create its own).\n * @return {void}\n * @public\n **/\n Common.createUIComponent = function createUIComponent(theConstructor, options) {\n theConstructor._componentOptions = options || {};\n\n function assert(test, msg) {\n if (!test) {\n throw new Error('Ink.UI_1.createUIComponent: ' + msg);\n }\n }\n\n function assertProp(prop, propType, message) {\n var propVal = theConstructor[prop];\n // Check that the property was passed\n assert(typeof propVal !== 'undefined',\n theConstructor + ' doesn\\'t have a \"' + prop + '\" property. ' + message);\n // Check that its type is correct\n assert(propType && typeof propVal === propType,\n 'typeof ' + theConstructor + '.' + prop + ' is not \"' + propType + '\". ' + message);\n }\n\n assert(typeof theConstructor === 'function',\n 'constructor argument is not a function!');\n\n assertProp('_name', 'string', 'This property is used for error ' +\n 'messages. Set it to the full module path and version (Ink.My.Module_1).');\n assertProp('_optionDefinition', 'object', 'This property contains the ' +\n 'option names, types and defaults. See Ink.UI.Common.options() for reference.');\n\n // Extend the instance methods and props\n var _oldProto = theConstructor.prototype;\n\n if (typeof Object.create === 'function') {\n theConstructor.prototype = Object.create(BaseUIComponent.prototype);\n } else {\n theConstructor.prototype = (function hideF() {\n function F() {}\n F.prototype = BaseUIComponent.prototype;\n return new F();\n }());\n }\n\n Ink.extendObj(theConstructor.prototype, _oldProto);\n theConstructor.prototype.constructor = theConstructor;\n // Extend static methods\n Ink.extendObj(theConstructor, BaseUIComponent);\n };\n\n return Common;\n\n});\n","/**\n * Date selector\n * @module Ink.UI.DatePicker_1\n * @version 1\n */\n\nInk.createModule('Ink.UI.DatePicker', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1','Ink.Util.Date_1', 'Ink.Dom.Browser_1'], function(Common, Event, Css, InkElement, Selector, InkArray, InkDate ) {\n 'use strict';\n\n // Clamp a number into a min/max limit\n function clamp(n, min, max) {\n if (n > max) { n = max; }\n if (n < min) { n = min; }\n\n return n;\n }\n\n function dateishFromYMDString(YMD) {\n var split = YMD.split('-');\n return dateishFromYMD(+split[0], +split[1] - 1, +split[2]);\n }\n\n function dateishFromYMD(year, month, day) {\n return {_year: year, _month: month, _day: day};\n }\n\n function dateishFromDate(date) {\n return {_year: date.getFullYear(), _month: date.getMonth(), _day: date.getDate()};\n }\n\n /**\n * @class Ink.UI.DatePicker\n * @constructor\n * @version 1\n *\n * @param {String|Element} selector Datepicker element\n * @param {Object} [options] Options\n * @param {Boolean} [options.autoOpen] Flag to automatically open the datepicker.\n * @param {String} [options.cleanText] Text for the clean button. Defaults to 'Clear'.\n * @param {String} [options.closeText] Text for the close button. Defaults to 'Close'.\n * @param {String} [options.cssClass] CSS class to be applied on the datepicker\n * @param {String|Element} [options.pickerField] (if not using in an input[type=\"text\"]) Element which displays the DatePicker when clicked. Defaults to an \"open\" link.\n * @param {String} [options.dateRange] Enforce limits to year, month and day for the Date, ex: '1990-08-25:2020-11'\n * @param {Boolean} [options.displayInSelect] Flag to display the component in a select element.\n * @param {String|Element} [options.dayField] (if using options.displayInSelect) `select` field with days.\n * @param {String|Element} [options.monthField] (if using options.displayInSelect) `select` field with months.\n * @param {String|Element} [options.yearField] (if using options.displayInSelect) `select` field with years.\n * @param {String} [options.format] Date format string\n * @param {Object} [options.month] Hash of month names. Defaults to english month names. January is 1.\n * @param {String} [options.nextLinkText] Text for the previous button. Defaults to '«'.\n * @param {String} [options.ofText] Text to show between month and year. Defaults to ' of '.\n * @param {Boolean} [options.onFocus] If the datepicker should open when the target element is focused. Defaults to true.\n * @param {Function} [options.onMonthSelected] Callback to execute when the month is selected.\n * @param {Function} [options.onSetDate] Callback to execute when the date is set.\n * @param {Function} [options.onYearSelected] Callback to execute when the year is selected.\n * @param {String} [options.position] Position for the datepicker. Either 'right' or 'bottom'. Defaults to 'right'.\n * @param {String} [options.prevLinkText] Text for the previous button. Defaults to '«'.\n * @param {Boolean} [options.showClean] If the clean button should be visible. Defaults to true.\n * @param {Boolean} [options.showClose] If the close button should be visible. Defaults to true.\n * @param {Boolean} [options.shy] If the datepicker should hide automatically when the user clicks outside. Defaults to true.\n * @param {String} [options.startDate] Date to define initial month. Must be in yyyy-mm-dd format.\n * @param {Number} [options.startWeekDay] First day of the week. Sunday is zero. Defaults to 1 (Monday).\n * @param {Function} [options.validYearFn] Callback to execute when 'rendering' the month (in the month view)\n * @param {Function} [options.validMonthFn] Callback to execute when 'rendering' the month (in the month view)\n * @param {Function} [options.validDayFn] Callback to execute when 'rendering' the day (in the month view)\n * @param {Function} [options.nextValidDateFn] Function to calculate the next valid date, given the current. Useful when there's invalid dates or time frames.\n * @param {Function} [options.prevValidDateFn] Function to calculate the previous valid date, given the current. Useful when there's invalid dates or time frames.\n * @param {Object} [options.wDay] Hash of week day names. Sunday is 0. Defaults to { 0:'Sunday', 1:'Monday', etc...\n * @param {String} [options.yearRange] Enforce limits to year for the Date, ex: '1990:2020' (deprecated)\n *\n * @sample Ink_UI_DatePicker_1.html\n */\n function DatePicker() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n DatePicker._name = 'DatePicker_1';\n\n DatePicker._optionDefinition = {\n autoOpen: ['Boolean', false],\n cleanText: ['String', 'Clear'],\n closeText: ['String', 'Close'],\n pickerField: ['Element', null],\n containerElement:['Element', null],\n cssClass: ['String', 'ink-calendar bottom'],\n dateRange: ['String', null],\n \n // use this in a \n *\n * By applying this UI class to the above input, you get a tag field with the tags \"initial\" and \"value\". The class preserves the original input element. It remains hidden and is updated with new tag information dynamically, so regular HTML form logic still applies.\n *\n * Below \"input\" refers to the current value of the input tag (updated as the user enters text, of course), and \"output\" refers to the value which this class writes back to said input tag.\n *\n * @class Ink.UI.TagField\n * @version 1\n * @constructor\n * @param {String|Element} element Selector or DOM Input Element.\n * @param {Object} [options] Options object\n * @param {String|Array} [options.tags] Initial tags in the input\n * @param {Boolean} [options.allowRepeated] Flag to allow user to input several tags. Defaults to true.\n * @param {RegExp} [options.separator] Split the input by this RegExp. Defaults to /[,;(space)]+/g (spaces, commas and semicolons)\n * @param {String} [options.outSeparator] Use this string to separate each tag from the next in the output. Defaults to ','.\n * @param {Boolean} [options.autoSplit] Flag to activate tag creation when the user types a separator. Defaults to true.\n * @param {Integer} [options.maxTags] Maximum number of tags allowed. Set to -1 for no limit. Defaults to -1.\n * @example\n */\n function TagField() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n TagField._name = 'TagField_1';\n\n TagField._optionDefinition = {\n tags: ['String', []],\n tagQuery: ['Object', null],\n tagQueryAsync: ['Object', null],\n allowRepeated: ['Boolean', false],\n maxTags: ['Integer', -1],\n outSeparator: ['String', ','],\n separator: ['String', /[,; ]+/g],\n autoSplit: ['Boolean', true]\n };\n\n TagField.prototype = {\n /**\n * Init function called by the constructor\n * \n * @method _init\n * @private\n */\n _init: function() {\n var o = this._options;\n if (typeof o.separator === 'string') {\n o.separator = new RegExp(o.separator, 'g');\n }\n\n if (typeof o.tags === 'string') {\n // coerce to array using the separator\n o.tags = this._readInput(o.tags);\n }\n\n Css.addClassName(this._element, 'hide-all');\n\n this._viewElm = InkElement.create('div', {\n className: 'ink-tagfield',\n insertAfter: this._element\n });\n\n this._input = InkElement.create('input', {\n type: 'text',\n className: 'new-tag-input',\n insertBottom: this._viewElm\n });\n\n var tags = [].concat(o.tags, this._tagsFromMarkup(this._element));\n\n this._tags = [];\n\n InkArray.each(tags, Ink.bindMethod(this, '_addTag'));\n\n InkEvent.observe(this._input, 'keyup', Ink.bindEvent(this._onKeyUp, this));\n InkEvent.observe(this._input, 'change', Ink.bindEvent(this._onKeyUp, this));\n InkEvent.observe(this._input, 'keydown', Ink.bindEvent(this._onKeyDown, this));\n InkEvent.observe(this._input, 'blur', Ink.bindEvent(this._onBlur, this));\n InkEvent.observe(this._viewElm, 'click', Ink.bindEvent(this._refocus, this));\n },\n\n destroy: function () {\n InkElement.remove(this._viewElm);\n Css.removeClassName(this._element, 'hide-all');\n },\n\n _tagsFromMarkup: function (element) {\n var tagname = element.tagName.toLowerCase();\n if (tagname === 'input') {\n return this._readInput(element.value);\n } else if (tagname === 'select') {\n return InkArray.map(element.getElementsByTagName('option'), function (option) {\n return InkElement.textContent(option);\n });\n } else {\n throw new Error('Cannot read tags from a ' + tagname + ' tag. Unknown tag');\n }\n },\n\n _tagsToMarkup: function (tags, element) {\n var tagname = element.tagName.toLowerCase();\n if (tagname === 'input') {\n if (this._options.separator) {\n element.value = tags.join(this._options.outSeparator);\n }\n } else if (tagname === 'select') {\n element.innerHTML = '';\n InkArray.each(tags, function (tag) {\n var opt = InkElement.create('option', {selected: 'selected'});\n InkElement.setTextContent(opt, tag);\n element.appendChild(opt);\n });\n } else {\n throw new Error('TagField: Cannot read tags from a ' + tagname + ' tag. Unknown tag');\n }\n },\n\n _addTag: function (tag) {\n if (this._options.maxTags !== -1 &&\n this._tags.length >= this._options.maxTags) {\n return;\n }\n if ((!this._options.allowRepeated &&\n InkArray.inArray(tag, this._tags, tag)) || !tag) {\n return false;\n }\n var elm = InkElement.create('span', {\n className: 'ink-tag',\n setTextContent: tag + ' '\n });\n\n var remove = InkElement.create('span', {\n className: 'remove fa fa-times',\n insertBottom: elm\n });\n InkEvent.observe(remove, 'click', Ink.bindEvent(this._removeTag, this, null));\n\n var spc = document.createTextNode(' ');\n\n this._tags.push(tag);\n this._viewElm.insertBefore(elm, this._input);\n this._viewElm.insertBefore(spc, this._input);\n this._tagsToMarkup(this._tags, this._element);\n },\n\n _readInput: function (text) {\n if (this._options.separator) {\n return InkArray.filter(text.split(this._options.separator), isTruthy);\n } else {\n return [text];\n }\n },\n\n _onKeyUp: function () { // TODO control input box size\n if (!this._options.autoSplit) {\n return;\n }\n\n var split;\n if (!buggySplit) {\n split = this._input.value.split(this._options.separator);\n } else {\n split = splitFunction(this._input.value, this._options.separator);\n }\n\n if (split.length <= 1) {\n return;\n }\n var last = split[split.length - 1];\n split = split.splice(0, split.length - 1);\n split = InkArray.filter(split, isTruthy);\n \n InkArray.each(split, Ink.bind(this._addTag, this));\n this._input.value = last;\n },\n\n _onKeyDown: function (event) {\n if (event.which === enterKey) {\n return this._onEnterKeyDown(event);\n } else if (event.which === backspaceKey) {\n return this._onBackspaceKeyDown();\n } else if (this._removeConfirm) {\n // user pressed another key, cancel removal from a backspace key\n this._unsetRemovingVisual(this._tags.length - 1);\n }\n },\n\n /**\n * When the user presses backspace twice on the empty input, we delete the last tag on the field.\n * @method onBackspaceKeyDown\n * @return {void}\n * @private\n */\n _onBackspaceKeyDown: function () {\n if (this._input.value) { return; }\n\n if (this._removeConfirm) {\n this._unsetRemovingVisual(this._tags.length - 1);\n this._removeTag(this._tags.length - 1);\n this._removeConfirm = null;\n } else {\n this._setRemovingVisual(this._tags.length - 1);\n }\n },\n\n _onEnterKeyDown: function (event) {\n var tag = this._input.value;\n if (tag) {\n this._addTag(tag);\n this._input.value = '';\n }\n InkEvent.stopDefault(event);\n },\n\n _onBlur: function () {\n this._addTag(this._input.value);\n this._input.value = '';\n },\n\n /* For when the user presses backspace.\n * Set the style of the tag so that it seems like it's going to be removed\n * if they press backspace again. */\n _setRemovingVisual: function (tagIndex) {\n var elm = this._viewElm.children[tagIndex];\n if (!elm) { return; }\n\n Css.addClassName(elm, 'tag-deleting');\n\n this._removeRemovingVisualTimeout = setTimeout(Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex), 4000);\n InkEvent.observe(this._input, 'blur', Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex));\n this._removeConfirm = true;\n },\n _unsetRemovingVisual: function (tagIndex) {\n var elm = this._viewElm.children[tagIndex];\n if (elm) {\n Css.removeClassName(elm, 'tag-deleting');\n clearTimeout(this._removeRemovingVisualTimeout);\n }\n this._removeConfirm = null;\n },\n\n _removeTag: function (event) {\n var index;\n if (typeof event === 'object') { // click event on close button\n var elm = InkEvent.element(event).parentNode;\n index = InkElement.parentIndexOf(this._viewElm, elm);\n } else if (typeof event === 'number') { // manual removal\n index = event;\n }\n this._tags = InkArray.remove(this._tags, index, 1);\n InkElement.remove(this._viewElm.children[index]);\n this._tagsToMarkup(this._tags, this._element);\n },\n\n _refocus: function (event) {\n this._input.focus();\n InkEvent.stop(event);\n return false;\n }\n };\n\n Common.createUIComponent(TagField);\n\n return TagField;\n});\n","/**\n * Toggle the visibility of elements.\n * @module Ink.UI.Toggle_1\n * @version 1\n */\n\n Ink.createModule('Ink.UI.Toggle', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, InkEvent, Css, InkElement, Selector, InkArray ) {\n 'use strict';\n\n /**\n * *Important note: Do NOT use this as a dropdown! Use Ink.UI.Dropdown for that.*\n *\n * You need two elements to use Toggle: the `trigger` element, and the `target` element (or elements). The default behaviour is to toggle the `target`(s) when you click the `trigger`.\n *\n * The toggle has a state. It is either \"on\" or \"off\". It works by switching between the CSS classes in `classNameOn` and `classNameOff` according to the current state.\n *\n * When you initialize the Toggle, it will check if the targets are visible to figure out what the initial state is. You can force the toggle to consider itself turned \"on\" or \"off\" by setting the `initialState` option to `true` or `false`, respectively.\n *\n * You can get the current state of the Toggle by calling `getState`, or by checking if your `trigger` element has the \"active\" class.\n * The state can be changed through JavaScript. Just call `setState(true)`\n * to turn the Toggle on (or `setState(false)` to turn it off).\n *\n * @class Ink.UI.Toggle\n * @constructor\n * @version 1\n * @param {String|Element} selector Trigger element. By clicking this, the target (or targets) are triggered.\n * @param {Object} [options] Options object, containing:\n *\n * @param {String} options.target CSS Selector that specifies the elements that this component will toggle\n * @param {Boolean} [options.isAccordion] Set this to true to signal that this toggle is part of an accordion with other toggles. The toggles of an accordion must be common descendants of an element with the class \"accordion\". If they're not, Ink will warn you about this on the console.\n * @param {String} [options.classNameOn] CSS class to toggle when on. Defaults to 'show-all'.\n * @param {String} [options.classNameOff] CSS class to toggle when off. Defaults to 'hide-all'.\n * @param {String} [options.triggerEvent] Event that will trigger the toggling. Defaults to 'click'.\n * @param {Boolean} [options.closeOnClick] Flag to toggle the targe off when clicking outside the toggled content. Defaults to true.\n * @param {Boolean} [options.canToggleAnAncestor] Set to true if you want the toggle to target ancestors of itself. Defaults to false.\n * @param {String} [options.closeOnInsideClick] Toggle off when a child element matching this selector is clicked. Set to null to deactivate the check. Defaults to 'a[href]'.\n * @param {Boolean} [options.initialState] Flag to define initial state. false: off, true: on, null: markup. Defaults to null.\n * @param {Function} [options.onChangeState] Callback when the toggle state changes. Return `false` to cancel the event.\n *\n * @sample Ink_UI_Toggle_1_constructor.html\n */\n function Toggle(){\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n Toggle._name = 'Toggle_1';\n\n Toggle._optionDefinition = {\n target: ['Elements'],\n triggerEvent: ['String', 'click'],\n closeOnClick: ['Boolean', true],\n canToggleAnAncestor: ['Boolean', false],\n isAccordion: ['Boolean', false],\n initialState: ['Boolean', null], // May be true, false, or null to be what it is right now\n classNameOn: ['String', 'show-all'],\n classNameOff: ['String', 'hide-all'],\n closeOnInsideClick: ['String', 'a[href]'], // closes the toggle when a target is clicked and it is a link\n onChangeState: ['Function', null]\n };\n\n Toggle.prototype = {\n\n /**\n * Init function called by the constructor\n *\n * @method _init\n * @private\n */\n _init: function(){\n var i, len;\n\n this._targets = Common.elsOrSelector(this._options.target);\n\n // Boolean option handling\n this._options.closeOnClick = this._options.closeOnClick;\n // Actually a throolean\n if (this._options.initialState === null) {\n this._options.initialState = Css.hasClassName(this._targets[0], this._options.classNameOn);\n }\n\n if (this._options.classNameOn !== 'show-all' || this._options.classNameOff !== 'hide-all') {\n for (i = 0, len = this._targets.length; i < len; i++) {\n Css.removeClassName(this._targets[i], 'show-all');\n Css.removeClassName(this._targets[i], 'hide-all');\n }\n }\n\n if (this._options.isAccordion) {\n this._accordionContainer = InkElement.findUpwardsByClass(\n this._element, 'accordion');\n if (!this._accordionContainer) {\n Ink.warn('Ink.UI.Toggle_1: This toggle has the isToggle option set to `true`, but is not a descendant of an element with the class \"accordion\"! Because of this, it won\\'t be able to find other toggles in the same accordion and cooperate with them.');\n }\n }\n\n this._constructing = true;\n\n this._bindEvents();\n\n if (this._options.initialState !== null) {\n this.setState(this._options.initialState, true);\n } else {\n // Add initial classes matching the current \"display\" of the object.\n var state = Css.getStyle(this._targets[0], 'display') !== 'none';\n this.setState(state, true);\n }\n // Aditionally, remove any inline \"display\" style.\n for (i = 0, len = this._targets.length; i < len; i++) {\n if (this._targets[i].style.display) {\n this._targets[i].style.display = ''; // becomes default\n }\n }\n\n this._element.setAttribute('data-is-toggle-trigger', 'true');\n\n this._constructing = false;\n },\n\n /**\n * @method _bindEvents\n * @private\n */\n _bindEvents: function () {\n if ( this._options.triggerEvent ) {\n InkEvent.on(\n this._element,\n this._options.triggerEvent,\n Ink.bind(this._onTriggerEvent, this));\n }\n if( this._options.closeOnClick ){\n InkEvent.observe( document, 'click', Ink.bind(this._onOutsideClick, this));\n }\n if( this._options.closeOnInsideClick ) {\n var sel = this._options.closeOnInsideClick;\n if (sel.toString() === 'true') {\n sel = '*';\n }\n InkEvent.observeMulti(this._targets, 'click', Ink.bind(function (e) {\n if ( InkElement.findUpwardsBySelector(InkEvent.element(e), sel) ) {\n this.setState(false, true);\n }\n }, this));\n }\n },\n\n /**\n * Event handler. It's responsible for handling the `triggerEvent` as defined in the options.\n *\n * This will trigger the toggle.\n *\n * @method _onTriggerEvent\n * @param {Event} event\n * @private\n */\n _onTriggerEvent: function( event ){\n // When the togglee is a child of the toggler, we get the togglee's events here. We have to check that this event is for us.\n var target = InkEvent.element(event);\n\n var isAncestorOfClickedElement = InkArray.some(this._targets, function (thisOne) {\n return thisOne === target || InkElement.isAncestorOf(thisOne, target);\n });\n\n if (!this._options.canToggleAnAncestor && isAncestorOfClickedElement) {\n return;\n }\n\n var has = this.getState();\n this.setState(!has, true);\n if (!has && this._firstTime) {\n this._firstTime = false;\n }\n\n InkEvent.stopDefault(event);\n },\n\n /**\n * Be compatible with accordions\n *\n * @method _updateAccordion\n **/\n _updateAccordion: function () {\n if (!this._accordionContainer) { return; }\n if (this.getState() === false) { return; }\n\n var elms = Selector.select('[data-is-toggle-trigger]', this._accordionContainer);\n for (var i = 0; i < elms.length; i++) {\n var otherToggle = Toggle.getInstance(elms[i]);\n if (otherToggle && (otherToggle !== this) && otherToggle.getState() === true) {\n otherToggle.setState(false, true);\n }\n }\n },\n\n /**\n * Click handler. Will handle clicks outside the toggle component.\n *\n * @method _onOutsideClick\n * @param {Event} event\n * @private\n */\n _onOutsideClick: function( event ){\n var tgtEl = InkEvent.element(event);\n var shades;\n\n if (!InkElement.isAncestorOf(document.documentElement, tgtEl)) {\n // Because if the element was removed while the click event was\n // bubbling, we can't tell where it came from\n return;\n }\n\n if (InkElement.findUpwardsBySelector(tgtEl, '[data-is-toggle-trigger=\"true\"]')) { return; }\n\n var ancestorOfTargets = InkArray.some(this._targets, function (target) {\n return InkElement.isAncestorOf(target, tgtEl) || target === tgtEl;\n });\n\n if( (this._element === tgtEl) || InkElement.isAncestorOf(this._element, tgtEl) || ancestorOfTargets) {\n return;\n } else if( (shades = Ink.ss('.ink-shade')).length ) {\n var shadesLength = shades.length;\n\n for( var i = 0; i < shadesLength; i++ ){\n if( InkElement.isAncestorOf(shades[i],tgtEl) && InkElement.isAncestorOf(shades[i],this._element) ){\n return;\n }\n }\n }\n\n this.setState(false, true); // dismiss\n },\n\n /**\n * Sets the state of the toggle. (on/off)\n *\n * @method setState\n * @param {Boolean} on New state (on/off)\n * @param {Boolean} callHandler Whether to call the onChangeState handler.\n * @return {void}\n */\n setState: function (on, callHandler) {\n if (on === this.getState() && !this._constructing) { return; }\n\n var i, len;\n if (this._group && on) {\n for (i = 0, len = this._group.length; i < len; i++) {\n if (this._group[i].getState() === true) {\n this._group[i].setState(false, true);\n }\n }\n }\n\n if (callHandler && typeof this._options.onChangeState === 'function') {\n var ret = this._options.onChangeState(on);\n if (ret === false) { return false; } // Canceled by the event handler\n }\n for (i = 0, len = this._targets.length; i < len; i++) {\n Css.addRemoveClassName(this._targets[i], this._options.classNameOn, on);\n Css.addRemoveClassName(this._targets[i], this._options.classNameOff, !on);\n }\n Css.addRemoveClassName(this._element, 'active', on);\n\n if (this._accordionContainer) {\n this._updateAccordion();\n }\n },\n\n /**\n * Gets the state of the toggle. (on/off)\n *\n * @method getState\n *\n * @return {Boolean} whether the toggle is toggled on.\n */\n getState: function () {\n return Css.hasClassName(this._element, 'active');\n }\n };\n\n Common.createUIComponent(Toggle);\n\n return Toggle;\n});\n","/**\n * Content Tooltips\n * @module Ink.UI.Tooltip_1\n * @version 1\n */\nInk.createModule('Ink.UI.Tooltip', '1', ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1', 'Ink.Dom.Selector_1', 'Ink.Util.Array_1', 'Ink.Dom.Css_1', 'Ink.Dom.Browser_1'], function (Common, InkEvent, InkElement, Selector, InkArray, Css) {\n 'use strict';\n\n /**\n * Tooltips are useful as a means to display information about functionality while avoiding clutter.\n *\n * Tooltips show up when you hover elements which \"have\" tooltips.\n *\n * This class will \"give\" a tooltip to many elements, selected by its first argument (`target`). This is contrary to the other UI modules in Ink, which are created once per element.\n *\n * You can define options either through the second argument of the Tooltip constructor, or as data-attributes in each `target` element. Options set through data-attributes all start with \"data-tip\", and override options passed into the Tooltip constructor.\n *\n * @class Ink.UI.Tooltip\n * @constructor\n *\n * @param {Element|String} target Target element or selector of elements, to display the tooltips on.\n * @param {Object} [options] Options object\n * @param {String} [options.text] Text content for the tooltip.\n * @param {String} [options.html] HTML for the tooltip. Same as above, but won't escape HTML.\n * @param {String} [options.where] Positioning for the tooltip. Options are 'up', 'down', 'left', 'right', 'mousemove' (follows the cursor), and 'mousefix' (stays fixed). Defaults to 'up'.\n * \n * @param {String} [options.color] Color of the tooltip. Options are red, orange, blue, green and black. Default is white.\n * @param {Number} [options.fade] Number of seconds to fade in/out. Defaults to 0.3.\n * @param {Boolean} [options.forever] Flag to prevent the tooltip from being erased when the mouse hovers away from the target.\n * @param {Number} [options.timeout] Number of seconds the tooltip will stay open. Useful together with options.forever. Defaults to 0.\n * @param {Number} [options.delay] Time the tooltip waits until it is displayed. Useful to avoid getting the attention of the user unnecessarily\n * @param {Element|Selector} [options.template] Element or selector containing HTML to be cloned into the tooltips. Can be a hidden element, because CSS `display` is set to `block`.\n * @param {String} [options.templatefield] Selector within the template element to choose where the text is inserted into the tooltip. Useful when a wrapper DIV is required.\n * @param {Number} [options.left] Spacing from the target to the tooltip, when `where` is `mousemove` or `mousefix`. Defaults to 10.\n * @param {Number} [options.top] Spacing from the target to the tooltip, when `where` is `mousemove` or `mousefix`. Defaults to 10.\n * @param {Number} [options.spacing] Spacing between the tooltip and the target element, when `where` is not `mousemove` or `mousefix`. Defaults to 8.\n * \n * @sample Ink_UI_Tooltip_1.html\n */\n function Tooltip(element, options) {\n this._init(element, options || {});\n }\n\n function EachTooltip(root, elm) {\n this._init(root, elm);\n }\n\n var transitionDurationName,\n transitionPropertyName,\n transitionTimingFunctionName;\n (function () { // Feature detection\n var test = document.createElement('DIV');\n var names = ['transition', 'oTransition', 'msTransition', 'mozTransition',\n 'webkitTransition'];\n for (var i = 0; i < names.length; i++) {\n if (typeof test.style[names[i] + 'Duration'] !== 'undefined') {\n transitionDurationName = names[i] + 'Duration';\n transitionPropertyName = names[i] + 'Property';\n transitionTimingFunctionName = names[i] + 'TimingFunction';\n break;\n }\n }\n }());\n\n // Body or documentElement\n var bodies = document.getElementsByTagName('body');\n var body = bodies.length ? bodies[0] : document.documentElement;\n\n Tooltip.prototype = {\n _init: function(element, options) {\n var elements;\n\n this.options = Ink.extendObj({\n where: 'up',\n zIndex: 10000,\n left: 10,\n top: 10,\n spacing: 8,\n forever: 0,\n color: '',\n timeout: 0,\n delay: 0,\n template: null,\n templatefield: null,\n fade: 0.3,\n text: ''\n }, options || {});\n\n if (typeof element === 'string') {\n elements = Selector.select(element);\n } else if (typeof element === 'object') {\n elements = [element];\n } else {\n throw 'Element expected';\n }\n\n this.tooltips = [];\n\n for (var i = 0, len = elements.length; i < len; i++) {\n this.tooltips[i] = new EachTooltip(this, elements[i]);\n }\n },\n /**\n * Destroys the tooltips created by this instance\n *\n * @method destroy\n * @return {void}\n * @public\n */\n destroy: function () {\n InkArray.each(this.tooltips, function (tooltip) {\n tooltip._destroy();\n });\n this.tooltips = null;\n this.options = null;\n }\n };\n\n EachTooltip.prototype = {\n _oppositeDirections: {\n left: 'right',\n right: 'left',\n up: 'down',\n down: 'up'\n },\n _init: function(root, elm) {\n InkEvent.observe(elm, 'mouseover', Ink.bindEvent(this._onMouseOver, this));\n InkEvent.observe(elm, 'focus', Ink.bindEvent(this._onMouseOver, this));\n InkEvent.observe(elm, 'mouseout', Ink.bindEvent(this._onMouseOut, this));\n InkEvent.observe(elm, 'blur', Ink.bindEvent(this._onMouseOut, this));\n InkEvent.observe(elm, 'mousemove', Ink.bindEvent(this._onMouseMove, this));\n\n this.root = root;\n this.element = elm;\n this._delayTimeout = null;\n this.tooltip = null;\n\n Common.registerInstance(this, this.element);\n },\n _makeTooltip: function (mousePosition) {\n if (!this._getOpt('text') &&\n !this._getOpt('html') &&\n !InkElement.hasAttribute(this.element, 'title')) {\n return false;\n }\n\n var tooltip = this._createTooltipElement();\n\n if (this.tooltip) {\n this._removeTooltip();\n }\n\n this.tooltip = tooltip;\n\n this._fadeInTooltipElement(tooltip);\n this._placeTooltipElement(tooltip, mousePosition);\n\n InkEvent.observe(tooltip, 'mouseover', Ink.bindEvent(this._onTooltipMouseOver, this));\n\n var timeout = this._getFloatOpt('timeout');\n if (timeout) {\n setTimeout(Ink.bind(function () {\n if (this.tooltip === tooltip) {\n this._removeTooltip();\n }\n }, this), timeout * 1000);\n }\n },\n _createTooltipElement: function () {\n var template = this._getOpt('template'), // User template instead of our HTML\n templatefield = this._getOpt('templatefield'),\n \n tooltip, // The element we float\n field; // Element where we write our message. Child or same as the above\n\n if (template) { // The user told us of a template to use. We copy it.\n var temp = document.createElement('DIV');\n temp.innerHTML = Common.elOrSelector(template, 'options.template').outerHTML;\n tooltip = temp.firstChild;\n \n if (templatefield) {\n field = Selector.select(templatefield, tooltip);\n if (field) {\n field = field[0];\n } else {\n throw 'options.templatefield must be a valid selector within options.template';\n }\n } else {\n field = tooltip; // Assume same element if user did not specify a field\n }\n } else { // We create the default structure\n tooltip = document.createElement('DIV');\n Css.addClassName(tooltip, 'ink-tooltip');\n Css.addClassName(tooltip, this._getOpt('color'));\n\n field = document.createElement('DIV');\n Css.addClassName(field, 'content');\n\n tooltip.appendChild(field);\n }\n \n if (this._getOpt('html')) {\n field.innerHTML = this._getOpt('html');\n } else if (this._getOpt('text')) {\n InkElement.setTextContent(field, this._getOpt('text'));\n } else {\n InkElement.setTextContent(field, this.element.getAttribute('title'));\n }\n tooltip.style.display = 'block';\n tooltip.style.position = 'absolute';\n tooltip.style.zIndex = this._getIntOpt('zIndex');\n\n return tooltip;\n },\n _fadeInTooltipElement: function (tooltip) {\n var fadeTime = this._getFloatOpt('fade');\n if (transitionDurationName && fadeTime) {\n tooltip.style.opacity = '0';\n tooltip.style[transitionDurationName] = fadeTime + 's';\n tooltip.style[transitionPropertyName] = 'opacity';\n tooltip.style[transitionTimingFunctionName] = 'ease-in-out';\n setTimeout(function () {\n tooltip.style.opacity = '1';\n }, 0); // Wait a tick\n }\n },\n _placeTooltipElement: function (tooltip, mousePosition) {\n var where = this._getOpt('where');\n\n if (mousePosition === null && (where === 'mousemove' || where === 'mousefix')) {\n // When there are no mouse coords available (focus event)\n where = 'up';\n }\n\n if (where === 'mousemove' || where === 'mousefix') {\n var mPos = mousePosition;\n this._setPos(mPos[0], mPos[1]);\n body.appendChild(tooltip);\n } else if (where.match(/(up|down|left|right)/)) {\n body.appendChild(tooltip);\n var targetElementPos = InkElement.offset(this.element);\n var tleft = targetElementPos[0],\n ttop = targetElementPos[1];\n\n var centerh = (InkElement.elementWidth(this.element) / 2) - (InkElement.elementWidth(tooltip) / 2),\n centerv = (InkElement.elementHeight(this.element) / 2) - (InkElement.elementHeight(tooltip) / 2);\n var spacing = this._getIntOpt('spacing');\n\n var tooltipDims = InkElement.elementDimensions(tooltip);\n var elementDims = InkElement.elementDimensions(this.element);\n\n var maxX = InkElement.scrollWidth() + InkElement.viewportWidth();\n var maxY = InkElement.scrollHeight() + InkElement.viewportHeight();\n \n where = this._getWhereValueInsideViewport(where, {\n left: tleft - tooltipDims[0],\n right: tleft + tooltipDims[0],\n top: ttop + tooltipDims[1],\n bottom: ttop + tooltipDims[1]\n }, {\n right: maxX,\n bottom: maxY\n });\n \n if (where === 'up') {\n ttop -= tooltipDims[1];\n ttop -= spacing;\n tleft += centerh;\n } else if (where === 'down') {\n ttop += elementDims[1];\n ttop += spacing;\n tleft += centerh;\n } else if (where === 'left') {\n tleft -= tooltipDims[0];\n tleft -= spacing;\n ttop += centerv;\n } else if (where === 'right') {\n tleft += elementDims[0];\n tleft += spacing;\n ttop += centerv;\n }\n \n var arrow = null;\n if (where.match(/(up|down|left|right)/)) {\n arrow = document.createElement('SPAN');\n Css.addClassName(arrow, 'arrow');\n Css.addClassName(arrow, this._oppositeDirections[where]);\n tooltip.appendChild(arrow);\n }\n\n var tooltipLeft = tleft;\n var tooltipTop = ttop;\n\n var toBottom = (tooltipTop + tooltipDims[1]) - maxY;\n var toRight = (tooltipLeft + tooltipDims[0]) - maxX;\n var toLeft = 0 - tooltipLeft;\n var toTop = 0 - tooltipTop;\n\n if (toBottom > 0) {\n if (arrow) { arrow.style.top = (tooltipDims[1] / 2) + toBottom + 'px'; }\n tooltipTop -= toBottom;\n } else if (toTop > 0) {\n if (arrow) { arrow.style.top = (tooltipDims[1] / 2) - toTop + 'px'; }\n tooltipTop += toTop;\n } else if (toRight > 0) {\n if (arrow) { arrow.style.left = (tooltipDims[0] / 2) + toRight + 'px'; }\n tooltipLeft -= toRight;\n } else if (toLeft > 0) {\n if (arrow) { arrow.style.left = (tooltipDims[0] / 2) - toLeft + 'px'; }\n tooltipLeft += toLeft;\n }\n\n tooltip.style.left = tooltipLeft + 'px';\n tooltip.style.top = tooltipTop + 'px';\n }\n },\n\n /**\n * Get a value for \"where\" (left/right/up/down) which doesn't put the\n * tooltip off the screen\n *\n * @method _getWhereValueInsideViewport\n * @param where {String} \"where\" value which was given by the user and we might change\n * @param bbox {BoundingBox} A bounding box like what you get from getBoundingClientRect ({top, bottom, left, right}) with pixel positions from the top left corner of the viewport.\n * @param viewport {BoundingBox} Bounding box for the viewport. \"top\" and \"left\" are omitted because these coordinates are relative to the top-left corner of the viewport so they are zero.\n *\n * @TODO: we can't use getBoundingClientRect in this case because it returns {0,0,0,0} on our uncreated tooltip.\n */\n _getWhereValueInsideViewport: function (where, bbox, viewport) {\n if (where === 'left' && bbox.left < 0) {\n return 'right';\n } else if (where === 'right' && bbox.right > viewport.right) {\n return 'left';\n } else if (where === 'up' && bbox.top < 0) {\n return 'down';\n } else if (where === 'down' && bbox.bottom > viewport.bottom) {\n return 'up';\n }\n\n return where;\n },\n _removeTooltip: function() {\n var tooltip = this.tooltip;\n if (!tooltip) {return;}\n\n var remove = Ink.bind(InkElement.remove, {}, tooltip);\n\n if (this._getOpt('where') !== 'mousemove' && transitionDurationName) {\n tooltip.style.opacity = 0;\n // remove() will operate on correct tooltip, although this.tooltip === null then\n setTimeout(remove, this._getFloatOpt('fade') * 1000);\n } else {\n remove();\n }\n this.tooltip = null;\n },\n _getOpt: function (option) {\n var dataAttrVal = InkElement.data(this.element)[InkElement._camelCase('tip-' + option)];\n if (dataAttrVal /* either null or \"\" may signify the absense of this attribute*/) {\n return dataAttrVal;\n }\n var instanceOption = this.root.options[option];\n if (typeof instanceOption !== 'undefined') {\n return instanceOption;\n }\n },\n _getIntOpt: function (option) {\n return parseInt(this._getOpt(option), 10);\n },\n _getFloatOpt: function (option) {\n return parseFloat(this._getOpt(option), 10);\n },\n _destroy: function () {\n if (this.tooltip) {\n InkElement.remove(this.tooltip);\n }\n this.root = null; // Cyclic reference = memory leaks\n this.element = null;\n this.tooltip = null;\n },\n _onMouseOver: function(e) {\n // on IE < 10 you can't access the mouse event not even a tick after it fired\n var mousePosition;\n if (e.type !== 'mouseover') {\n // No mouse coords available\n mousePosition = null;\n } else {\n mousePosition = this._getMousePosition(e);\n }\n var delay = this._getFloatOpt('delay');\n if (delay) {\n this._delayTimeout = setTimeout(Ink.bind(function () {\n if (!this.tooltip) {\n this._makeTooltip(mousePosition);\n }\n this._delayTimeout = null;\n }, this), delay * 1000);\n } else {\n this._makeTooltip(mousePosition);\n }\n },\n _onMouseMove: function(e) {\n if (this._getOpt('where') === 'mousemove' && this.tooltip) {\n var mPos = this._getMousePosition(e);\n this._setPos(mPos[0], mPos[1]);\n }\n },\n _onMouseOut: function () {\n if (!this._getIntOpt('forever')) {\n this._removeTooltip();\n }\n if (this._delayTimeout) {\n clearTimeout(this._delayTimeout);\n this._delayTimeout = null;\n }\n },\n _onTooltipMouseOver: function () {\n if (this.tooltip) { // If tooltip is already being removed, this has no effect\n this._removeTooltip();\n }\n },\n _setPos: function(left, top) {\n left += this._getIntOpt('left');\n top += this._getIntOpt('top');\n var pageDims = this._getPageXY();\n if (this.tooltip) {\n var elmDims = [InkElement.elementWidth(this.tooltip), InkElement.elementHeight(this.tooltip)];\n var scrollDim = this._getScroll();\n\n if((elmDims[0] + left - scrollDim[0]) >= (pageDims[0] - 20)) {\n left = (left - elmDims[0] - this._getIntOpt('left') - 10);\n }\n if((elmDims[1] + top - scrollDim[1]) >= (pageDims[1] - 20)) {\n top = (top - elmDims[1] - this._getIntOpt('top') - 10);\n }\n\n this.tooltip.style.left = left + 'px';\n this.tooltip.style.top = top + 'px';\n }\n },\n _getPageXY: function() {\n var cWidth = 0;\n var cHeight = 0;\n if( typeof( window.innerWidth ) === 'number' ) {\n cWidth = window.innerWidth;\n cHeight = window.innerHeight;\n } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {\n cWidth = document.documentElement.clientWidth;\n cHeight = document.documentElement.clientHeight;\n } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {\n cWidth = document.body.clientWidth;\n cHeight = document.body.clientHeight;\n }\n return [parseInt(cWidth, 10), parseInt(cHeight, 10)];\n },\n _getScroll: function() {\n var dd = document.documentElement, db = document.body;\n if (dd && (dd.scrollLeft || dd.scrollTop)) {\n return [dd.scrollLeft, dd.scrollTop];\n } else if (db) {\n return [db.scrollLeft, db.scrollTop];\n } else {\n return [0, 0];\n }\n },\n _getMousePosition: function(e) {\n return [parseInt(InkEvent.pointerX(e), 10), parseInt(InkEvent.pointerY(e), 10)];\n }\n };\n\n return Tooltip;\n});\n","/**\n * Elements in a tree structure\n * @module Ink.UI.TreeView_1\n * @version 1\n */\nInk.createModule('Ink.UI.TreeView', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, Event, Css, Element, Selector, InkArray ) {\n 'use strict';\n\n\n /**\n * Shows elements in a tree structure which can be expanded and contracted.\n * A TreeView is built with \"node\"s and \"children\". \"node\"s are `li` tags, and \"children\" are `ul` tags.\n * You can build your TreeView out of a regular UL and LI element structure which you already use to display lists with several levels.\n * If you want a node to be open when the TreeView is built, just add the data-open=\"true\" attribute to it.\n * \n * @class Ink.UI.TreeView\n * @constructor\n * @version 1\n * @param {String|Element} selector Element or selector.\n * @param {String} [options] Options object, containing:\n * @param {String} [options.node] Selector for the nodes. Defaults to 'li'.\n * @param {String} [options.children] Selector for the children. Defaults to 'ul'.\n * @param {String} [options.parentClass] CSS classes to be added to parent nodes. Defaults to 'parent'.\n * @param {String} [options.openClass] CSS classes to be added to the icon when a parent is open. Defaults to 'fa fa-minus-circle'.\n * @param {String} [options.closedClass] CSS classes to be added to the icon when a parent is closed. Defaults to 'fa fa-plus-circle'.\n * @param {String} [options.hideClass] CSS Class to toggle visibility of the children. Defaults to 'hide-all'.\n * @param {String} [options.iconTag] The name of icon tag. The component tries to find a tag with that name as a direct child of the node. If it doesn't find it, it creates it. Defaults to 'i'.\n * @param {Boolean} [options.stopDefault] Flag to stops the default behavior of the click handler. Defaults to true.\n * @example\n * \n * \n * \n * @sample Ink_UI_TreeView_1.html\n */\n function TreeView() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n TreeView._name = 'TreeView_1';\n\n TreeView._optionDefinition = {\n 'node': ['String', 'li'],\n 'children': ['String','ul'],\n 'parentClass': ['String','parent'],\n 'openNodeClass': ['String', 'open'],\n 'openClass': ['String','fa fa-minus-circle'],\n 'closedClass': ['String','fa fa-plus-circle'],\n 'hideClass': ['String','hide-all'],\n 'iconTag': ['String', 'i'],\n 'stopDefault' : ['Boolean', true]\n };\n\n TreeView.prototype = {\n /**\n * Init function called by the constructor. Sets the necessary event handlers.\n * \n * @method _init\n * @private\n */\n _init: function(){\n this._handlers = {\n click: Ink.bindEvent(this._onClick,this)\n };\n\n Event.on(this._element, 'click', this._options.node, this._handlers.click);\n\n InkArray.each(Ink.ss(this._options.node, this._element), Ink.bind(function(item){\n if( this.isParent(item) ) {\n Css.addClassName(item, this._options.parentClass);\n\n var isOpen = this.isOpen(item);\n if( !this._getIcon(item) ){\n Element.create(this._options.iconTag, { insertTop: item });\n }\n\n this._setNodeOpen(item, isOpen);\n }\n },this));\n },\n\n _getIcon: function (node) {\n return Ink.s('> ' + this._options.iconTag, node);\n },\n\n /**\n * Checks if a node is open.\n *\n * @method isOpen\n * @param {Element} node The tree node to check\n * @return {Boolean} Whether the node is open.\n **/\n isOpen: function (node) {\n if (!this._getChild(node)) {\n throw new Error('not a node!');\n }\n\n return node.getAttribute('data-open') === 'true' ||\n Css.hasClassName(node, this._options.openNodeClass);\n },\n\n /**\n * Checks if a node is a parent.\n *\n * @method isParent\n * @param {Element} node Node to check\n * @return {Boolean} Whether `node` is a parent.\n **/\n isParent: function (node) {\n return Css.hasClassName(node, this._options.parentClass) ||\n this._getChild(node) != null;\n },\n\n _setNodeOpen: function (node, beOpen) {\n var child = this._getChild(node);\n if (child) {\n Css.setClassName(child, this._options.hideClass, !beOpen);\n var icon = this._getIcon(node);\n\n node.setAttribute('data-open', beOpen);\n\n /*\n * Don't refactor this to\n *\n * setClassName(el, className, status); setClassName(el, className, !status);\n *\n * because it won't work with multiple classes.\n *\n * Doing:\n * setClassName(el, 'fa fa-whatever', true);setClassName(el, 'fa fa-whatever-else', false);\n *\n * will remove 'fa' although it is a class we want.\n */\n\n var toAdd = beOpen ? this._options.openClass : this._options.closedClass;\n var toRemove = beOpen ? this._options.closedClass : this._options.openClass;\n Css.removeClassName(icon, toRemove);\n Css.addClassName(icon, toAdd);\n\n Css.setClassName(node, this._options.openNodeClass, beOpen);\n } else {\n Ink.error('Ink.UI.TreeView: node', node, 'is not a node!');\n }\n },\n\n /**\n * Opens one of the tree nodes\n *\n * Make sure you pass the node's Element\n * @method open\n * @param {Element} node The node you wish to open.\n * @return {void}\n **/\n open: function (node) {\n this._setNodeOpen(node, true);\n },\n\n /**\n * Closes one of the tree nodes\n *\n * Make sure you pass the node's Element\n * @method close\n * @param {Element} node The node you wish to close.\n * @return {void}\n **/\n close: function (node) {\n this._setNodeOpen(node, false);\n },\n\n /**\n * Toggles a node state\n *\n * @method toggle\n * @param {Element} node The node to toggle.\n * @return {void}\n **/\n toggle: function (node) {\n if (this.isOpen(node)) {\n this.close(node);\n } else {\n this.open(node);\n }\n },\n\n /**\n * @method _getChild\n **/\n _getChild: function (node) {\n return Selector.select(this._options.children, node)[0] || null;\n },\n\n /**\n * Handles the click event (as specified in the _init function).\n * \n * @method _onClick\n * @param {Event} ev DOM click event.\n * @return {void}\n * @private\n */\n _onClick: function(ev){\n /**\n * Summary:\n * If the clicked element is a \"node\" as defined in the options, will check if it has any \"child\".\n * If so, will toggle its state and stop the event's default behavior if the stopDefault option is true.\n **/\n\n if (!this.isParent(ev.currentTarget) ||\n Selector.matchesSelector(ev.target, this._options.node) ||\n Selector.matchesSelector(ev.target, this._options.children)) {\n return;\n }\n\n if (this._options.stopDefault){\n ev.preventDefault();\n }\n\n this.toggle(ev.currentTarget);\n }\n };\n\n Common.createUIComponent(TreeView);\n\n return TreeView;\n});\n","Ink.createModule('Ink.UI.Upload', '1', [\n 'Ink.Dom.Event_1',\n 'Ink.Dom.Element_1',\n 'Ink.Dom.Browser_1',\n 'Ink.UI.Common_1'\n], function(Event, Element, Browser, Common) {\n 'use strict';\n\n var DirectoryReader = function(options) {\n this.init(options);\n };\n\n DirectoryReader.prototype = {\n init: function(options) {\n this._options = Ink.extendObj({\n entry: undefined,\n maxDepth: 10\n }, options || {});\n\n try {\n this._read();\n } catch(e) {\n Ink.error(e);\n }\n },\n\n\n _read: function() {\n if(!this._options.entry) {\n Ink.error('You must specify the entry!');\n return;\n }\n\n try {\n this._readDirectories();\n } catch(e) {\n Ink.error(e);\n }\n },\n\n\n _readDirectories: function() {\n var entries = [],\n running = false,\n maxDepth = 0;\n\n /* TODO return as tree because much better well */\n var _readEntries = Ink.bind(function(currentEntry) {\n var dir = currentEntry.createReader();\n running = true;\n\n dir.readEntries(Ink.bind(function(res) {\n if(res.length > 0) {\n for(var i = 0, len = res.length; i=0; i--) {\n if(typeof(arr[i]) === 'undefined' || arr[i] === null || arr[i] === '') {\n arr.splice(i, 1);\n }\n }\n return arr;\n }\n };\n\n var Queue = {\n lists: [],\n items: [],\n\n\n /**\n * Create new queue list\n * @function create\n * @public\n * @param {String} list name\n * @param {Function} function to iterate on items\n * @return {Object} list id\n */\n create: function(name) {\n var id;\n name = String(name);\n this.lists.push({name: name});\n id = this.lists.length - 1;\n return id;\n },\n\n\n getItems: function(parentId) {\n if(!parentId) {\n return this.items;\n }\n var items = [];\n for(var i = 0, len = this.items.length; i=0; i--) {\n if(this.items[i] && id === this.items[i].parentId) {\n this.remove(this.items[i].parentId, this.items[i].pid);\n }\n }\n if(!keepList) {\n this.lists.splice(id, 1);\n }\n return true;\n } catch(e) {\n Ink.error('Purge: invalid id');\n return false;\n }\n },\n\n\n /**\n * add an item to a list\n * @function add\n * @public\n * @param {String} name\n * @param {Object} item\n * @return {Number} pid\n */\n add: function(parentId, item, priority) {\n if(!this.lists[parentId]) {\n return false;\n }\n if(typeof(item) !== 'object') {\n item = String(item);\n }\n\n var pid = parseInt(Math.round(Math.random() * 100000) + \"\" + Math.round(Math.random() * 100000), 10);\n priority = priority || 0;\n\n this.items.push({parentId: parentId, item: item, priority: priority || 0, pid: pid});\n return pid;\n },\n\n\n /**\n * View list\n * @function view\n * @public\n * @param {Number} list id\n * @param {Number} process id\n * @return {Object} item\n */\n view: function(parentId, pid) {\n var id = this._searchByPid(parentId, pid);\n if(id === false) {\n return false;\n }\n return this.items[id];\n },\n\n\n /**\n * Remove an item\n * @function remove\n * @public\n * @param {Object} item\n * @return {Object|Boolean} removed item or false if not found\n */\n remove: function(parentId, pid) {\n try {\n var id = this._searchByPid(parentId, pid);\n if(id === false) {\n return false;\n }\n this.items.splice(id, 1);\n return true;\n } catch(e) {\n Ink.error('Remove: invalid id');\n return false;\n }\n },\n\n _searchByPid: function(parentId, pid) {\n if(!parentId && typeof(parentId) === 'boolean' || !pid) {\n return false;\n }\n\n parentId = parseInt(parentId, 10);\n pid = parseInt(pid, 10);\n\n if(isNaN(parentId) || isNaN(pid)) {\n return false;\n }\n\n for(var i = 0, len = this.items.length; i this._options.minSizeToUseChunks;\n },\n\n\n _dropEventHandler: function(ev) {\n Event.stop(ev);\n\n this.publish('DropComplete', ev.dataTransfer);\n\n var data = ev.dataTransfer;\n\n if(!data || !data.files || !data.files.length) {\n return false;\n }\n\n this._files = data.files;\n this._files = Array.prototype.slice.call(this._files || [], 0);\n\n // check if webkitGetAsEntry exists on first item\n if(data.items && data.items[0] && data.items[0].webkitGetAsEntry) {\n if(!this._options.foldersEnabled) {\n return setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);\n }\n var entry, folders = [];\n for(var i = ev.dataTransfer.items.length-1; i>=0; i--) {\n entry = ev.dataTransfer.items[i].webkitGetAsEntry();\n if(entry && entry.isDirectory) {\n folders.push(entry);\n this._files[i].isDirectory = true;\n this._files.splice(i, 1);\n }\n }\n // starting callback hell\n this._addFolderToQueue(folders, Ink.bind(function() {\n setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);\n }, this));\n } else {\n setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);\n }\n\n return true;\n },\n\n\n _addFolderToQueue: function(folders, cb) {\n var files = [], invalidFolders = {};\n\n if(!folders || !folders.length) {\n cb();\n return files;\n }\n\n var getFiles = function(entries) {\n var files = [];\n for(var i = 0, len = entries.length; i this._options.maxFilesize) {\n this.publish('MaxSizeFailure', file, this._options.maxFilesize);\n continue;\n }\n\n fileID = parseInt(Math.round(Math.random() * 100000) + \"\" + Math.round(Math.random() * 100000), 10);\n o = { id: i, data: file, fileID: fileID, directory: file.isDirectory };\n Queue.add(this._queueId, o);\n\n this.publish('FileAddedToQueue', o);\n }\n this._processQueue(true);\n this._files = [];\n },\n\n\n _processQueue: function(internalUpload) {\n if(this._queueRunning) {\n return false;\n }\n\n this.running = 0;\n var max = 1, i = 0, items,\n queueLen = Queue.items.length;\n this._queueRunning = true;\n\n this.interval = setInterval(Ink.bind(function() {\n if(Queue.items.length === i && this.running === 0) {\n Queue.purge(this._queueId, true);\n this._queueRunning = false;\n clearInterval(this.interval);\n this.publish('QueueEnd', this._queueId, queueLen);\n }\n\n items = Queue.getItems(this._queueId);\n\n if(this.running < max && items[i]) {\n if(!items[i].canceled) {\n _doRequest.call(this, items[i].pid, items[i].item.data, items[i].item.fileID, items[i].item.directory, internalUpload);\n this.running++;\n i++;\n } else {\n var j = i;\n while(items[j] && items[j].canceled) {\n i++;\n j++;\n }\n }\n return true;\n }\n return false;\n }, this), 100);\n\n\n var _doRequest = function(pid, data, fileID, directory, internalUpload) {\n var o = {\n file: data,\n fileID: fileID,\n cb: Ink.bind(function() {\n this.running--;\n }, this)\n };\n if(internalUpload) {\n if(directory) {\n // do magic\n o.cb();\n } else {\n this._upload(o);\n }\n }\n };\n\n return true;\n },\n\n\n _upload: function(o) {\n var file = o.file,\n xhr = new XMLHttpRequest(),\n fileID = o.fileID;\n\n this.publish('BeforeUpload', file, this._options.extraData, fileID, xhr, this._supportChunks(file.size));\n\n var forceAbort = function(showError) {\n if(o.cb && typeof(o.cb === 'function')) {\n o.cb();\n }\n\n this.publish('OnProgress', {\n length: file.size,\n lengthComputable: true,\n loaded: file.size,\n total: file.size\n }, file, fileID);\n this.publish('EndUpload', file, fileID, (showError ? { error: true } : true));\n this.publish('InvalidFile', file, 'name');\n xhr.abort();\n };\n\n if(this._options.INVALID_FILE_NAME && this._options.INVALID_FILE_NAME instanceof RegExp) {\n if(this._options.INVALID_FILE_NAME.test(o.file.name)) {\n forceAbort.call(this);\n return;\n }\n }\n\n // If file was renamed, abort it\n // FU OPERA: Opera always return lastModified date as null\n if(!file.lastModifiedDate && !Ink.Dom.Browser.OPERA) {\n forceAbort.call(this, true);\n return;\n }\n\n xhr.upload.onprogress = Ink.bind(this.publish, this, 'OnProgress', file, fileID);\n\n var endpoint, method;\n if(this._supportChunks(file.size)) {\n if(file.size <= file.chunk_offset) {\n endpoint = this._options.endpointChunkCommit;\n method = 'POST';\n } else {\n endpoint = this._options.endpointChunk;\n if(file.chunk_upload_id) {\n endpoint += '?upload_id=' + file.chunk_upload_id;\n }\n if(file.chunk_offset) {\n endpoint += '&offset=' + file.chunk_offset;\n }\n method = 'PUT';\n }\n } else {\n endpoint = this._options.endpoint;\n method = 'POST';\n }\n\n xhr.open(method, endpoint, true);\n xhr.withCredentials = true;\n xhr.setRequestHeader(\"x-requested-with\", \"XMLHttpRequest\");\n if(this._supportChunks(file.size)) {\n xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n }\n\n var fd = new FormData(),\n blob;\n\n if(\"Blob\" in window && typeof Blob === 'function') {\n blob = new Blob([file], { type: file.type });\n if(this._supportChunks(file.size)) {\n file.chunk_offset = file.chunk_offset || 0;\n blob = blob.slice(file.chunk_offset, file.chunk_offset + this._options.chunkSize);\n } else {\n fd.append(this._options.fileFormName, blob, file.name);\n }\n } else {\n fd.append(this._options.fileFormName, file);\n }\n\n if(!this._supportChunks(file.size)) {\n for(var k in this._options.extraData) {\n if(this._options.extraData.hasOwnProperty(k)) {\n fd.append(k, this._options.extraData[k]);\n }\n }\n } else {\n fd.append('upload_id', file.chunk_upload_id);\n fd.append('path', file.upload_path);\n }\n\n if(!file.hasParent) {\n if(!this._supportChunks(file.size)) {\n xhr.send(fd);\n } else {\n if(file.size <= file.chunk_offset) {\n xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name);\n } else {\n xhr.send(blob);\n }\n }\n } else {\n this.publish('cbCreateFolder', file.parentID, file.fullPath, this._options.extraData, this._folders, file.rootPath, Ink.bind(function() {\n if(!this._supportChunks(file.size)) {\n xhr.send(fd);\n } else {\n if(file.size <= file.chunk_offset) {\n xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name);\n } else {\n xhr.send(blob);\n }\n }\n }, this));\n }\n\n\n xhr.onload = Ink.bindEvent(function() {\n /* jshint boss:true */\n if(this._supportChunks(file.size) && file.size > file.chunk_offset) {\n if(xhr.response) {\n var response = JSON.parse(xhr.response);\n\n // check expected offset\n var invalidOffset = file.chunk_offset && response.offset !== (file.chunk_offset + this._options.chunkSize) && file.size !== response.offset;\n if(invalidOffset) {\n if(o.cb) {\n o.cb();\n }\n this.publish('ErrorUpload', file, fileID);\n } else {\n file.chunk_upload_id = response.upload_id;\n file.chunk_offset = response.offset;\n file.chunk_expires = response.expires;\n this._upload(o);\n }\n } else {\n if(o.cb) {\n o.cb();\n }\n this.publish('ErrorUpload', file, fileID);\n }\n return (xhr = null);\n }\n\n if(o.cb) {\n o.cb();\n }\n\n if(xhr.responseText && xhr['status'] < 400) {\n this.publish('EndUpload', file, fileID, xhr.responseText);\n } else {\n this.publish('ErrorUpload', file, fileID);\n }\n return (xhr = null);\n }, this);\n\n\n xhr.onerror = Ink.bindEvent(function() {\n if(o.cb) {\n o.cb();\n }\n this.publish('ErrorUpload', file, fileID);\n }, this);\n\n xhr.onabort = Ink.bindEvent(function() {\n if(o.cb) {\n o.cb();\n }\n this.publish('AbortUpload', file, fileID, {\n abortAll: Ink.bind(this.abortAll, this),\n abortOne: Ink.bind(this.abortOne, this)\n });\n }, this);\n },\n\n\n abortAll: function() {\n if(!this._queueRunning) {\n return false;\n }\n clearInterval(this.interval);\n this._queueRunning = false;\n Queue.purge(this._queueId, true);\n return true;\n },\n\n abortOne: function(id, cb) {\n var items = Queue.getItems(0),\n o;\n for(var i = 0, len = items.length; i [ [1, 1], [2, 2], [3], [1] ]\n * InkArray.groupBy([1.1, 1.2, 2.1], { key: Math.floor }) // -> [ [1.1, 1.2], [2.1] ]\n * InkArray.groupBy([1.1, 1.2, 2.1], { key: Math.floor, pairs: true }) // -> [ [1, [1.1, 1.2]], [2, [2.1]] ]\n *\n **/\n groupBy: function (arr, options) {\n options = options || {};\n var ret = [];\n var latestGroup;\n function eq(a, b) {\n return outKey(a) === outKey(b);\n }\n function outKey(item) {\n if (typeof options.key === 'function') {\n return options.key(item);\n } else {\n return item;\n }\n }\n\n for (var i = 0, len = arr.length; i < len; i++) {\n latestGroup = [arr[i]];\n\n // Chunkin'\n while ((i + 1 < len) && eq(arr[i], arr[i + 1])) {\n latestGroup.push(arr[i + 1]);\n i++;\n }\n\n if (options.pairs) {\n ret.push([outKey(arr[i]), latestGroup]);\n } else {\n ret.push(latestGroup);\n }\n }\n return ret;\n },\n\n /**\n * Replacement for Array.prototype.reduce.\n *\n * Uses Array.prototype.reduce if available.\n *\n * Produces a single result from a list of values by calling an \"aggregator\" function.\n *\n * Falls back to Array.prototype.reduce if available.\n *\n * @method reduce\n * @param {Array} array Input array to be reduced.\n * @param {Function} callback `function (previousValue, currentValue, index, all) { return {Mixed} }` to execute for each value.\n * @param {Mixed} initial Object used as the first argument to the first call of `callback`\n * @return {Mixed} Reduced array.\n *\n * @example\n * var sum = InkArray.reduce([1, 2, 3], function (a, b) { return a + b; }); // -> 6\n */\n reduce: function (array, callback, initial) {\n if (arrayProto.reduce) {\n return arrayProto.reduce.apply(array, arrayProto.slice.call(arguments, 1));\n }\n\n // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Polyfill\n var t = Object( array ), len = t.length >>> 0, k = 0, value;\n if ( arguments.length >= 3 ) {\n value = initial;\n } else {\n while ( k < len && !(k in t) ) k++;\n if ( k >= len )\n throw new TypeError('Reduce of empty array with no initial value');\n value = t[ k++ ];\n }\n for ( ; k < len ; k++ ) {\n if ( k in t ) {\n value = callback( value, t[k], k, t );\n }\n }\n return value;\n },\n\n /**\n * Checks if a value exists in array\n *\n * @method inArray\n * @public\n * @static\n * @param {Mixed} value Value to check\n * @param {Array} arr Array to search in\n * @return {Boolean} True if value exists in the array\n * @sample Ink_Util_Array_inArray.html\n */\n inArray: function(value, arr) {\n if (typeof arr === 'object') {\n for (var i = 0, f = arr.length; i < f; ++i) {\n if (arr[i] === value) {\n return true;\n }\n }\n }\n return false;\n },\n\n /**\n * Sorts an array of objects by an object property\n *\n * @method sortMulti\n * @param {Array} arr Array of objects to sort\n * @param {String} key Property to sort by\n * @return {Array|Boolean} False if it's not an array, returns a sorted array if it's an array.\n * @public\n * @static\n * @sample Ink_Util_Array_sortMulti.html\n */\n sortMulti: function(arr, key) {\n if (typeof arr === 'undefined' || arr.constructor !== Array) { return false; }\n if (typeof key !== 'string') { return arr.sort(); }\n if (arr.length > 0) {\n if (typeof(arr[0][key]) === 'undefined') { return false; }\n arr.sort(function(a, b){\n var x = a[key];\n var y = b[key];\n return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n });\n }\n return arr;\n },\n\n /**\n * Gets the indexes of a value in an array\n *\n * @method keyValue\n * @param {String} value Value to search for.\n * @param {Array} arr Array to run the search in.\n * @param {Boolean} [first] Flag to stop the search at the first match. It also returns an index number instead of an array of indexes.\n * @return {Boolean|Number|Array} False for no matches. Array of matches or first match index.\n * @public\n * @static\n * @sample Ink_Util_Array_keyValue.html\n */\n keyValue: function(value, arr, first) {\n if (typeof value !== 'undefined' && typeof arr === 'object' && this.inArray(value, arr)) {\n var aKeys = [];\n for (var i = 0, f = arr.length; i < f; ++i) {\n if (arr[i] === value) {\n if (typeof first !== 'undefined' && first === true) {\n return i;\n } else {\n aKeys.push(i);\n }\n }\n }\n return aKeys;\n }\n return false;\n },\n\n /**\n * Shuffles an array.\n *\n * @method shuffle\n * @param {Array} arr Array to shuffle\n * @return {Array|Boolean} Shuffled Array or false if not an array.\n * @public\n * @static\n * @sample Ink_Util_Array_shuffle.html\n */\n shuffle: function(arr) {\n if (typeof(arr) !== 'undefined' && arr.constructor !== Array) { return false; }\n var total = arr.length,\n tmp1 = false,\n rnd = false;\n\n while (total--) {\n rnd = Math.floor(Math.random() * (total + 1));\n tmp1 = arr[total];\n arr[total] = arr[rnd];\n arr[rnd] = tmp1;\n }\n return arr;\n },\n\n /**\n * Runs a function through each of the elements of an array.\n *\n * Uses Array.prototype.forEach if available.\n *\n * @method forEach\n * @param {Array} array The array to be cycled/iterated\n * @param {Function} callback The function receives as arguments the value, index and array.\n * @param {Mixed} context The value of `this` inside the `callback` you passed.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Array_forEach.html\n */\n forEach: function(array, callback, context) {\n if (arrayProto.forEach) {\n return arrayProto.forEach.call(array, callback, context);\n }\n for (var i = 0, len = array.length >>> 0; i < len; i++) {\n callback.call(context, array[i], i, array);\n }\n },\n\n /**\n * Alias for backwards compatibility. See forEach\n *\n * @method each\n * @param {Mixed} [forEachArguments] (see forEach)\n * @return {void} (see forEach)\n */\n each: function () {\n InkArray.forEach.apply(InkArray, arrayProto.slice.call(arguments));\n },\n\n /**\n * Runs a function for each item in the array.\n * Uses Array.prototype.map if available.\n * That function will receive each item as an argument and its return value will change the corresponding array item.\n * @method map\n * @param {Array} array The array to map over\n * @param {Function} mapFn The map function. Will take `(item, index, array)` as arguments and the `this` value will be the `context` argument you pass to this function.\n * @param {Object} [context] Object to be `this` in the map function.\n * @return {Array} A copy of the original array, with all of its items processed by the map function.\n *\n * @sample Ink_Util_Array_map.html\n */\n map: function (array, mapFn, context) {\n if (arrayProto.map) {\n return arrayProto.map.call(array, mapFn, context);\n }\n var mapped = new Array(len);\n for (var i = 0, len = array.length >>> 0; i < len; i++) {\n mapped[i] = mapFn.call(context, array[i], i, array);\n }\n return mapped;\n },\n\n /**\n * Filters an array based on a truth test.\n * This method runs a test function on all the array values and returns a new array with all the values that pass the test.\n * @method filter\n * @param {Array} array The array to filter\n * @param {Function} test A test function taking `(item, index, array)`\n * @param {Object} [context] Object to be `this` in the test function.\n * @return {Array} Returns the filtered array\n *\n * @sample Ink_Util_Array_filter.html\n */\n filter: function (array, test, context) {\n if (arrayProto.filter) {\n return arrayProto.filter.call(array, test, context);\n }\n var filtered = [],\n val = null;\n for (var i = 0, len = array.length; i < len; i++) {\n val = array[i]; // it might be mutated\n if (test.call(context, val, i, array)) {\n filtered.push(val);\n }\n }\n return filtered;\n },\n\n /**\n * Checks if some element in the array passes a truth test\n *\n * @method some\n * @param {Array} arr The array to iterate through\n * @param {Function} cb The callback to be called on the array's elements. It receives the value, the index and the array as arguments.\n * @param {Object} context Object of the callback function\n * @return {Boolean} True if the callback returns true at any point, false otherwise\n * @public\n * @static\n * @sample Ink_Util_Array_some.html\n */\n some: function(arr, cb, context){\n\n if (arr === null){\n throw new TypeError('First argument is invalid.');\n }\n\n var t = Object(arr);\n var len = t.length >>> 0;\n if (typeof cb !== \"function\"){ throw new TypeError('Second argument must be a function.'); }\n\n for (var i = 0; i < len; i++) {\n if (i in t && cb.call(context, t[i], i, t)){ return true; }\n }\n\n return false;\n },\n\n /**\n * Compares the values of two arrays and return the matches\n *\n * @method intersect\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n * @return {Array} Empty array if one of the arrays is false (or do not intersect) | Array with the intersected values\n * @public\n * @static\n * @sample Ink_Util_Array_intersect.html\n */\n intersect: function(arr1, arr2) {\n if (!arr1 || !arr2 || arr1 instanceof Array === false || arr2 instanceof Array === false) {\n return [];\n }\n\n var shared = [];\n for (var i = 0, I = arr1.length; i 0) {\n for (x = start; x < stop; x += step) {\n r.push(x);\n }\n } else {\n for (x = start; x > stop; x += step) {\n r.push(x);\n }\n }\n\n return r;\n },\n\n /**\n * Inserts a value on a specified index\n *\n * @method insert\n * @param {Array} arr Array where the value will be inserted\n * @param {Number} idx Index of the array where the value should be inserted\n * @param {Mixed} value Value to be inserted\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Array_insert.html\n */\n insert: function(arr, idx, value) {\n arr.splice(idx, 0, value);\n },\n\n /**\n * Removes a range of values from the array\n *\n * @method remove\n * @param {Array} arr Array where the value will be removed\n * @param {Number} from Index of the array where the removal will start removing.\n * @param {Number} rLen Number of items to be removed from the index onwards.\n * @return {Array} An array with the remaining values\n * @public\n * @static\n * @sample Ink_Util_Array_remove.html\n */\n remove: function(arr, from, rLen){\n var output = [];\n\n for(var i = 0, iLen = arr.length; i < iLen; i++){\n if(i >= from && i < from + rLen){\n continue;\n }\n\n output.push(arr[i]);\n }\n\n return output;\n }\n };\n\n return InkArray;\n\n});\n","/**\n * Binary Packing algorithm implementation\n * @module Ink.Util.BinPack_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.BinPack', '1', [], function() {\n\n 'use strict';\n\n /*jshint boss:true */\n\n // https://github.com/jakesgordon/bin-packing/\n\n /*\n Copyright (c) 2011, 2012, 2013 Jake Gordon and contributors\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\n\n\n var Packer = function(w, h) {\n this.init(w, h);\n };\n\n Packer.prototype = {\n\n init: function(w, h) {\n this.root = { x: 0, y: 0, w: w, h: h };\n },\n\n fit: function(blocks) {\n var n, node, block;\n for (n = 0; n < blocks.length; ++n) {\n block = blocks[n];\n if (node = this.findNode(this.root, block.w, block.h)) {\n block.fit = this.splitNode(node, block.w, block.h);\n }\n }\n },\n\n findNode: function(root, w, h) {\n if (root.used) {\n return this.findNode(root.right, w, h) || this.findNode(root.down, w, h);\n }\n else if ((w <= root.w) && (h <= root.h)) {\n return root;\n }\n else {\n return null;\n }\n },\n\n splitNode: function(node, w, h) {\n node.used = true;\n node.down = { x: node.x, y: node.y + h, w: node.w, h: node.h - h };\n node.right = { x: node.x + w, y: node.y, w: node.w - w, h: h };\n return node;\n }\n\n };\n\n\n\n var GrowingPacker = function() {};\n\n GrowingPacker.prototype = {\n\n fit: function(blocks) {\n var n, node, block, len = blocks.length;\n var w = len > 0 ? blocks[0].w : 0;\n var h = len > 0 ? blocks[0].h : 0;\n this.root = { x: 0, y: 0, w: w, h: h };\n for (n = 0; n < len ; n++) {\n block = blocks[n];\n if (node = this.findNode(this.root, block.w, block.h)) {\n block.fit = this.splitNode(node, block.w, block.h);\n }\n else {\n block.fit = this.growNode(block.w, block.h);\n }\n }\n },\n\n findNode: function(root, w, h) {\n if (root.used) {\n return this.findNode(root.right, w, h) || this.findNode(root.down, w, h);\n }\n else if ((w <= root.w) && (h <= root.h)) {\n return root;\n }\n else {\n return null;\n }\n },\n\n splitNode: function(node, w, h) {\n node.used = true;\n node.down = { x: node.x, y: node.y + h, w: node.w, h: node.h - h };\n node.right = { x: node.x + w, y: node.y, w: node.w - w, h: h };\n return node;\n },\n\n growNode: function(w, h) {\n var canGrowDown = (w <= this.root.w);\n var canGrowRight = (h <= this.root.h);\n\n var shouldGrowRight = canGrowRight && (this.root.h >= (this.root.w + w)); // attempt to keep square-ish by growing right when height is much greater than width\n var shouldGrowDown = canGrowDown && (this.root.w >= (this.root.h + h)); // attempt to keep square-ish by growing down when width is much greater than height\n\n if (shouldGrowRight) {\n return this.growRight(w, h);\n }\n else if (shouldGrowDown) {\n return this.growDown(w, h);\n }\n else if (canGrowRight) {\n return this.growRight(w, h);\n }\n else if (canGrowDown) {\n return this.growDown(w, h);\n }\n else {\n return null; // need to ensure sensible root starting size to avoid this happening\n }\n },\n\n growRight: function(w, h) {\n this.root = {\n used: true,\n x: 0,\n y: 0,\n w: this.root.w + w,\n h: this.root.h,\n down: this.root,\n right: { x: this.root.w, y: 0, w: w, h: this.root.h }\n };\n var node;\n if (node = this.findNode(this.root, w, h)) {\n return this.splitNode(node, w, h);\n }\n else {\n return null;\n }\n },\n\n growDown: function(w, h) {\n this.root = {\n used: true,\n x: 0,\n y: 0,\n w: this.root.w,\n h: this.root.h + h,\n down: { x: 0, y: this.root.h, w: this.root.w, h: h },\n right: this.root\n };\n var node;\n if (node = this.findNode(this.root, w, h)) {\n return this.splitNode(node, w, h);\n }\n else {\n return null;\n }\n }\n\n };\n\n\n\n var sorts = {\n random: function() { return Math.random() - 0.5; },\n w: function(a, b) { return b.w - a.w; },\n h: function(a, b) { return b.h - a.h; },\n a: function(a, b) { return b.area - a.area; },\n max: function(a, b) { return Math.max(b.w, b.h) - Math.max(a.w, a.h); },\n min: function(a, b) { return Math.min(b.w, b.h) - Math.min(a.w, a.h); },\n height: function(a, b) { return sorts.msort(a, b, ['h', 'w']); },\n width: function(a, b) { return sorts.msort(a, b, ['w', 'h']); },\n area: function(a, b) { return sorts.msort(a, b, ['a', 'h', 'w']); },\n maxside: function(a, b) { return sorts.msort(a, b, ['max', 'min', 'h', 'w']); },\n msort: function(a, b, criteria) { /* sort by multiple criteria */\n var diff, n;\n for (n = 0; n < criteria.length; ++n) {\n diff = sorts[ criteria[n] ](a, b);\n if (diff !== 0) {\n return diff;\n }\n }\n return 0;\n }\n };\n\n\n\n // end of Jake's code\n\n\n\n // aux, used to display blocks in unfitted property\n var toString = function() {\n return [this.w, ' x ', this.h].join('');\n };\n\n\n\n /**\n * Binary Packing algorithm implementation\n *\n * Based on the work of Jake Gordon\n *\n * see https://github.com/jakesgordon/bin-packing/\n *\n * @namespace Ink.Util.BinPack\n * @version 1\n * @static\n */\n var BinPack = {\n\n /**\n * @method binPack\n * @param {Object} o Options\n * @param {Array} o.blocks Array of items with width and height integer attributes.\n * @param {Array} [o.dimensions] Flag to fix container dimensions\n * @param {String} [o.sorter] Sorting function. One of: random, height, width, area, maxside\n * @return {Object} Returns an object containing container dimensions, filled ratio, fitted blocks, unfitted blocks and all blocks\n * @static\n */\n binPack: function(o) {\n var i, f, bl;\n\n\n\n // calculate area if not there already\n for (i = 0, f = o.blocks.length; i < f; ++i) {\n bl = o.blocks[i];\n if (! ('area' in bl) ) {\n bl.area = bl.w * bl.h;\n }\n }\n\n\n\n // apply algorithm\n var packer = o.dimensions ? new Packer(o.dimensions[0], o.dimensions[1]) : new GrowingPacker();\n\n if (!o.sorter) { o.sorter = 'maxside'; }\n\n o.blocks.sort( sorts[ o.sorter ] );\n\n packer.fit(o.blocks);\n\n var dims2 = [packer.root.w, packer.root.h];\n\n\n\n // layout is done here, generating report data...\n var fitted = [];\n var unfitted = [];\n\n for (i = 0, f = o.blocks.length; i < f; ++i) {\n bl = o.blocks[i];\n if (bl.fit) {\n fitted.push(bl);\n }\n else {\n bl.toString = toString; // TO AID SERIALIZATION\n unfitted.push(bl);\n }\n }\n\n var area = dims2[0] * dims2[1];\n var fit = 0;\n for (i = 0, f = fitted.length; i < f; ++i) {\n bl = fitted[i];\n fit += bl.area;\n }\n\n return {\n dimensions: dims2,\n filled: fit / area,\n blocks: o.blocks,\n fitted: fitted,\n unfitted: unfitted\n };\n }\n };\n\n\n\n return BinPack;\n\n});","/**\n * Cookie Utilities\n * @module Ink.Util.Cookie_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Cookie', '1', [], function() {\n 'use strict';\n\n /**\n * @namespace Ink.Util.Cookie_1\n */\n var Cookie = {\n\n /**\n * Gets an object with the current page cookies, or a specific cookie if you specify the `name`.\n *\n * @method get\n * @param {String} [name] The cookie name.\n * @return {String|Object} If the name is specified, it returns the value of that key. Otherwise it returns the full cookie object\n * @public\n * @static\n * @sample Ink_Util_Cookie_get.html\n */\n get: function(name)\n {\n var cookie = document.cookie || false;\n\n var _Cookie = {};\n\n if(cookie) {\n cookie = cookie.replace(new RegExp(\"; \", \"g\"), ';');\n\n var aCookie = cookie.split(';');\n var aItem = [];\n if(aCookie.length > 0) {\n for(var i=0; i < aCookie.length; i++) {\n aItem = aCookie[i].split('=');\n if(aItem.length === 2) {\n _Cookie[aItem[0]] = decodeURIComponent(aItem[1]);\n }\n }\n }\n if(name) {\n if(typeof(_Cookie[name]) !== 'undefined') {\n return _Cookie[name];\n } else {\n return null;\n }\n }\n }\n return _Cookie;\n },\n\n /**\n * Sets a cookie.\n *\n * @method set\n * @param {String} name Cookie name.\n * @param {String} value Cookie value.\n * @param {Number} [expires] Number of seconds the cookie will be valid for.\n * @param {String} [path] Path for the cookie. Defaults to '/'.\n * @param {String} [domain] Domain for the cookie. Defaults to current hostname.\n * @param {Boolean} [secure] Flag for secure. Default 'false'.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Cookie_set.html\n */\n set: function(name, value, expires, path, domain, secure)\n {\n var sName;\n if(!name || value===false || typeof(name) === 'undefined' || typeof(value) === 'undefined') {\n return false;\n } else {\n sName = name+'='+encodeURIComponent(value);\n }\n var sExpires = false;\n var sPath = false;\n var sDomain = false;\n var sSecure = false;\n\n if(expires && typeof(expires) !== 'undefined' && !isNaN(expires)) {\n var oDate = new Date();\n var sDate = (parseInt(Number(oDate.valueOf()), 10) + (Number(parseInt(expires, 10)) * 1000));\n\n var nDate = new Date(sDate);\n var expiresString = nDate.toGMTString();\n\n var re = new RegExp(\"([^\\\\s]+)(\\\\s\\\\d\\\\d)\\\\s(\\\\w\\\\w\\\\w)\\\\s(.*)\");\n expiresString = expiresString.replace(re, \"$1$2-$3-$4\");\n\n sExpires = 'expires='+expiresString;\n } else {\n if(typeof(expires) !== 'undefined' && !isNaN(expires) && Number(parseInt(expires, 10))===0) {\n sExpires = '';\n } else {\n sExpires = 'expires=Thu, 01-Jan-2037 00:00:01 GMT';\n }\n }\n\n if(path && typeof(path) !== 'undefined') {\n sPath = 'path='+path;\n } else {\n sPath = 'path=/';\n }\n\n if(domain) {\n sDomain = 'domain='+domain;\n } else if (/\\./.test(window.location.hostname)) {\n // When trying to set domain=localhost or any other domain\n // without dots, setting the cookie fails.\n // Anyways, the cookies are bound to the current domain by default so let it be.\n sDomain = 'domain='+window.location.hostname;\n }\n\n if(secure && typeof(secure) !== 'undefined') {\n sSecure = secure;\n } else {\n sSecure = false;\n }\n\n document.cookie = sName +\n '; ' + sExpires +\n '; ' + sPath +\n (sDomain ? '; ' + sDomain : '') +\n '; ' + sSecure;\n },\n\n /**\n * Deletes a cookie.\n *\n * @method remove\n * @param {String} cookieName Cookie name.\n * @param {String} [path] Path of the cookie. Defaults to '/'.\n * @param {String} [domain] Domain of the cookie. Defaults to current hostname.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Cookie_remove.html\n */\n remove: function(cookieName, path, domain) {\n var expiresDate = -1;\n\n this.set(cookieName, 'deleted', expiresDate, path, domain);\n }\n };\n\n return Cookie;\n\n});\n","/**\n * Date utility functions\n * @module Ink.Util.Date_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Date', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Date_1 \n */\n var InkDate = {\n\n /**\n * Function that returns the string representation of the month [PT only]\n *\n * @method _months\n * @param {Number} index Month javascript (0 to 11)\n * @return {String} The month's name\n * @private\n * @static\n * @example\n * console.log( InkDate._months(0) ); // Result: Janeiro\n */\n _months: function(index){\n var _m = ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];\n return _m[index];\n },\n\n /**\n * Function that returns the month [PT only] ( 0 to 11 )\n *\n * @method _iMonth\n * @param {String} month Month javascript (0 to 11)\n * @return {Number} The month's number\n * @private\n * @static\n * @example\n * console.log( InkDate._iMonth('maio') ); // Result: 4\n */\n _iMonth : function( month )\n {\n if ( Number( month ) ) { return +month - 1; }\n return {\n 'janeiro' : 0 ,\n 'jan' : 0 ,\n 'fevereiro' : 1 ,\n 'fev' : 1 ,\n 'março' : 2 ,\n 'mar' : 2 ,\n 'abril' : 3 ,\n 'abr' : 3 ,\n 'maio' : 4 ,\n 'mai' : 4 ,\n 'junho' : 5 ,\n 'jun' : 5 ,\n 'julho' : 6 ,\n 'jul' : 6 ,\n 'agosto' : 7 ,\n 'ago' : 7 ,\n 'setembro' : 8 ,\n 'set' : 8 ,\n 'outubro' : 9 ,\n 'out' : 9 ,\n 'novembro' : 10 ,\n 'nov' : 10 ,\n 'dezembro' : 11 ,\n 'dez' : 11\n }[ month.toLowerCase( ) ];\n } ,\n\n /**\n * Function that returns the representation the day of the week [PT Only]\n *\n * @method _wDays\n * @param {Number} index Week's day index\n * @return {String} The week's day name\n * @private\n * @static\n * @example\n * console.log( InkDate._wDays(0) ); // Result: Domingo\n */\n _wDays: function(index){\n var _d = ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'];\n return _d[index];\n },\n\n /**\n * Function that returns day of the week in javascript 1 to 7\n *\n * @method _iWeek\n * @param {String} week Week's day name\n * @return {Number} The week's day index\n * @private\n * @static\n * @example\n * console.log( InkDate._iWeek('quarta') ); // Result: 3\n */\n _iWeek: function( week )\n {\n if ( Number( week ) ) { return +week || 7; }\n return {\n 'segunda' : 1 ,\n 'seg' : 1 ,\n 'terça' : 2 ,\n 'ter' : 2 ,\n 'quarta' : 3 ,\n 'qua' : 3 ,\n 'quinta' : 4 ,\n 'qui' : 4 ,\n 'sexta' : 5 ,\n 'sex' : 5 ,\n 'sábado' : 6 ,\n 'sáb' : 6 ,\n 'domingo' : 7 ,\n 'dom' : 7\n }[ week.toLowerCase( ) ];\n },\n\n /**\n * Function that returns the number of days of a given month (m) on a given year (y)\n *\n * @method _daysInMonth\n * @param {Number} _m Month\n * @param {Number} _y Year\n * @return {Number} Number of days of a give month on a given year\n * @private\n * @static\n * @example\n * console.log( InkDate._daysInMonth(2,2013) ); // Result: 28\n */\n _daysInMonth: function(_m,_y){\n var nDays;\n\n if(_m===1 || _m===3 || _m===5 || _m===7 || _m===8 || _m===10 || _m===12)\n {\n nDays= 31;\n }\n else if ( _m===4 || _m===6 || _m===9 || _m===11)\n {\n nDays = 30;\n }\n else\n {\n if((_y%400===0) || (_y%4===0 && _y%100!==0))\n {\n nDays = 29;\n }\n else\n {\n nDays = 28;\n }\n }\n return nDays;\n },\n\n /**\n * Formats a date object.\n * This works exactly as php date() function. http://php.net/manual/en/function.date.php\n *\n * @method get\n * @param {String} format The format in which the date it will be formatted.\n * @param {Date} [_date] The date to format. Can receive unix timestamp or a date object. Defaults to current time.\n * @return {String} Formatted date\n * @public\n * @static\n * @sample Ink_Util_Date_get.html \n */\n get: function(format, _date){\n /*jshint maxcomplexity:65 */\n if(typeof(format) === 'undefined' || format === ''){\n format = \"Y-m-d\";\n }\n\n\n var iFormat = format.split(\"\");\n var result = new Array(iFormat.length);\n var escapeChar = \"\\\\\";\n var jsDate;\n\n if (typeof(_date) === 'undefined'){\n jsDate = new Date();\n } else if (typeof(_date)==='number'){\n jsDate = new Date(_date*1000);\n } else {\n jsDate = new Date(_date);\n }\n\n var jsFirstDay, jsThisDay, jsHour;\n /* This switch is presented in the same order as in php date function (PHP 5.2.2) */\n for (var i = 0; i < iFormat.length; i++) {\n switch(iFormat[i]) {\n case escapeChar:\n result[i] = iFormat[i+1];\n i++;\n break;\n\n\n /* DAY */\n case \"d\": /* Day of the month, 2 digits with leading zeros; ex: 01 to 31 */\n var jsDay = jsDate.getDate();\n result[i] = (String(jsDay).length > 1) ? jsDay : \"0\" + jsDay;\n break;\n\n case \"D\": /* A textual representation of a day, three letters; Seg to Dom */\n result[i] = this._wDays(jsDate.getDay()).substring(0, 3);\n break;\n\n case \"j\": /* Day of the month without leading zeros; ex: 1 to 31 */\n result[i] = jsDate.getDate();\n break;\n\n case \"l\": /* A full textual representation of the day of the week; Domingo to Sabado */\n result[i] = this._wDays(jsDate.getDay());\n break;\n\n case \"N\": /* ISO-8601 numeric representation of the day of the week; 1 (Segunda) to 7 (Domingo) */\n result[i] = jsDate.getDay() || 7;\n break;\n\n case \"S\": /* English ordinal suffix for the day of the month, 2 characters; st, nd, rd or th. Works well with j */\n var temp = jsDate.getDate();\n var suffixes = [\"st\", \"nd\", \"rd\"];\n var suffix = \"\";\n\n if (temp >= 11 && temp <= 13) {\n result[i] = \"th\";\n } else {\n result[i] = (suffix = suffixes[String(temp).substr(-1) - 1]) ? (suffix) : (\"th\");\n }\n break;\n\n case \"w\": /* Numeric representation of the day of the week; 0 (for Sunday) through 6 (for Saturday) */\n result[i] = jsDate.getDay();\n break;\n\n case \"z\": /* The day of the year (starting from 0); 0 to 365 */\n jsFirstDay = Date.UTC(jsDate.getFullYear(), 0, 0);\n jsThisDay = Date.UTC(jsDate.getFullYear(), jsDate.getMonth(), jsDate.getDate());\n result[i] = Math.floor((jsThisDay - jsFirstDay) / (1000 * 60 * 60 * 24));\n break;\n\n /* WEEK */\n case \"W\": /* ISO-8601 week number of year, weeks starting on Monday; ex: 42 (the 42nd week in the year) */\n var jsYearStart = new Date( jsDate.getFullYear( ) , 0 , 1 );\n jsFirstDay = jsYearStart.getDay() || 7;\n\n var days = Math.floor( ( jsDate - jsYearStart ) / ( 24 * 60 * 60 * 1000 ) + 1 );\n\n result[ i ] = Math.ceil( ( days - ( 8 - jsFirstDay ) ) / 7 ) + 1;\n break;\n\n\n /* MONTH */\n case \"F\": /* A full textual representation of a month, such as Janeiro or Marco; Janeiro a Dezembro */\n result[i] = this._months(jsDate.getMonth());\n break;\n\n case \"m\": /* Numeric representation of a month, with leading zeros; 01 to 12 */\n var jsMonth = String(jsDate.getMonth() + 1);\n result[i] = (jsMonth.length > 1) ? jsMonth : \"0\" + jsMonth;\n break;\n\n case \"M\": /* A short textual representation of a month, three letters; Jan a Dez */\n result[i] = this._months(jsDate.getMonth()).substring(0,3);\n break;\n\n case \"n\": /* Numeric representation of a month, without leading zeros; 1 a 12 */\n result[i] = jsDate.getMonth() + 1;\n break;\n\n case \"t\": /* Number of days in the given month; ex: 28 */\n result[i] = this._daysInMonth(jsDate.getMonth()+1,jsDate.getYear());\n break;\n\n /* YEAR */\n case \"L\": /* Whether it's a leap year; 1 if it is a leap year, 0 otherwise. */\n var jsYear = jsDate.getFullYear();\n result[i] = (jsYear % 4) ? false : ( (jsYear % 100) ? true : ( (jsYear % 400) ? false : true ) );\n break;\n\n case \"o\": /* ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. */\n throw '\"o\" not implemented!';\n\n case \"Y\": /* A full numeric representation of a year, 4 digits; 1999 */\n result[i] = jsDate.getFullYear();\n break;\n\n case \"y\": /* A two digit representation of a year; 99 */\n result[i] = String(jsDate.getFullYear()).substring(2);\n break;\n\n /* TIME */\n case \"a\": /* Lowercase Ante meridiem and Post meridiem; am or pm */\n result[i] = (jsDate.getHours() < 12) ? \"am\" : \"pm\";\n break;\n\n case \"A\": /* Uppercase Ante meridiem and Post meridiem; AM or PM */\n result[i] = (jsDate.getHours < 12) ? \"AM\" : \"PM\";\n break;\n\n case \"B\": /* Swatch Internet time; 000 through 999 */\n throw '\"B\" not implemented!';\n\n case \"g\": /* 12-hour format of an hour without leading zeros; 1 to 12 */\n jsHour = jsDate.getHours();\n result[i] = (jsHour <= 12) ? jsHour : (jsHour - 12);\n break;\n\n case \"G\": /* 24-hour format of an hour without leading zeros; 1 to 23 */\n result[i] = String(jsDate.getHours());\n break;\n\n case \"h\": /* 12-hour format of an hour with leading zeros; 01 to 12 */\n jsHour = String(jsDate.getHours());\n jsHour = (jsHour <= 12) ? jsHour : (jsHour - 12);\n result[i] = (jsHour.length > 1) ? jsHour : \"0\" + jsHour;\n break;\n\n case \"H\": /* 24-hour format of an hour with leading zeros; 01 to 24 */\n jsHour = String(jsDate.getHours());\n result[i] = (jsHour.length > 1) ? jsHour : \"0\" + jsHour;\n break;\n\n case \"i\": /* Minutes with leading zeros; 00 to 59 */\n var jsMinute = String(jsDate.getMinutes());\n result[i] = (jsMinute.length > 1) ? jsMinute : \"0\" + jsMinute;\n break;\n\n case \"s\": /* Seconds with leading zeros; 00 to 59; */\n var jsSecond = String(jsDate.getSeconds());\n result[i] = (jsSecond.length > 1) ? jsSecond : \"0\" + jsSecond;\n break;\n\n case \"u\": /* Microseconds */\n throw '\"u\" not implemented!';\n\n\n /* TIMEZONE */\n\n case \"e\": /* Timezone identifier */\n throw '\"e\" not implemented!';\n\n case \"I\": /* \"1\" if Daylight Savings Time, \"0\" otherwise. Works only on the northern hemisphere */\n jsFirstDay = new Date(jsDate.getFullYear(), 0, 1);\n result[i] = (jsDate.getTimezoneOffset() !== jsFirstDay.getTimezoneOffset()) ? (1) : (0);\n break;\n\n case \"O\": /* Difference to Greenwich time (GMT) in hours */\n var jsMinZone = jsDate.getTimezoneOffset();\n var jsMinutes = jsMinZone % 60;\n jsHour = String(((jsMinZone - jsMinutes) / 60) * -1);\n\n if (jsHour.charAt(0) !== \"-\") {\n jsHour = \"+\" + jsHour;\n }\n\n jsHour = (jsHour.length === 3) ? (jsHour) : (jsHour.replace(/([+\\-])(\\d)/, \"$1\" + 0 + \"$2\"));\n result[i] = jsHour + jsMinutes + \"0\";\n break;\n\n case \"P\": /* Difference to Greenwich time (GMT) with colon between hours and minutes */\n throw '\"P\" not implemented!';\n\n case \"T\": /* Timezone abbreviation */\n throw '\"T\" not implemented!';\n\n case \"Z\": /* Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. */\n result[i] = jsDate.getTimezoneOffset() * 60;\n break;\n\n\n /* FULL DATE/TIME */\n\n case \"c\": /* ISO 8601 date */\n throw '\"c\" not implemented!';\n\n case \"r\": /* RFC 2822 formatted date */\n var jsDayName = this._wDays(jsDate.getDay()).substr(0, 3);\n var jsMonthName = this._months(jsDate.getMonth()).substr(0, 3);\n result[i] = jsDayName + \", \" + jsDate.getDate() + \" \" + jsMonthName + this.get(\" Y H:i:s O\",jsDate);\n break;\n\n case \"U\": /* Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) */\n result[i] = Math.floor(jsDate.getTime() / 1000);\n break;\n\n default:\n result[i] = iFormat[i];\n }\n }\n\n return result.join('');\n\n },\n\n /**\n * Creates a date object based on a format string.\n * This works exactly as php date() function. http://php.net/manual/en/function.date.php\n *\n * @method set\n * @param {String} [format] The format in which the date will be formatted. Defaults to 'Y-m-d'\n * @param {String} str_date The date formatted.\n * @return {Date} Date object based on the formatted date and format\n * @public\n * @static\n * @sample Ink_Util_Date_set.html \n */\n set : function( format , str_date ) {\n if ( typeof str_date === 'undefined' ) { return ; }\n if ( typeof format === 'undefined' || format === '' ) { format = \"Y-m-d\"; }\n\n var iFormat = format.split(\"\");\n var result = new Array( iFormat.length );\n var escapeChar = \"\\\\\";\n var mList;\n\n var objIndex = {\n year : undefined ,\n month : undefined ,\n day : undefined ,\n dayY : undefined ,\n dayW : undefined ,\n week : undefined ,\n hour : undefined ,\n hourD : undefined ,\n min : undefined ,\n sec : undefined ,\n msec : undefined ,\n ampm : undefined ,\n diffM : undefined ,\n diffH : undefined ,\n date : undefined\n };\n\n var matches = 0;\n\n /* This switch is presented in the same order as in php date function (PHP 5.2.2) */\n for ( var i = 0; i < iFormat.length; i++) {\n switch( iFormat[ i ] ) {\n case escapeChar:\n result[i] = iFormat[ i + 1 ];\n i++;\n break;\n\n /* DAY */\n case \"d\": /* Day of the month, 2 digits with leading zeros; ex: 01 to 31 */\n result[ i ] = '(\\\\d{2})';\n objIndex.day = { original : i , match : matches++ };\n break;\n\n case \"j\": /* Day of the month without leading zeros; ex: 1 to 31 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.day = { original : i , match : matches++ };\n break;\n\n case \"D\": /* A textual representation of a day, three letters; Seg to Dom */\n result[ i ] = '([\\\\wá]{3})';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"l\": /* A full textual representation of the day of the week; Domingo to Sabado */\n result[i] = '([\\\\wá]{5,7})';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"N\": /* ISO-8601 numeric representation of the day of the week; 1 (Segunda) to 7 (Domingo) */\n result[ i ] = '(\\\\d)';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"w\": /* Numeric representation of the day of the week; 0 (for Sunday) through 6 (for Saturday) */\n result[ i ] = '(\\\\d)';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"S\": /* English ordinal suffix for the day of the month, 2 characters; st, nd, rd or th. Works well with j */\n result[ i ] = '\\\\w{2}';\n break;\n\n case \"z\": /* The day of the year (starting from 0); 0 to 365 */\n result[ i ] = '(\\\\d{1,3})';\n objIndex.dayY = { original : i , match : matches++ };\n break;\n\n /* WEEK */\n case \"W\": /* ISO-8601 week number of year, weeks starting on Monday; ex: 42 (the 42nd week in the year) */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.week = { original : i , match : matches++ };\n break;\n\n /* MONTH */\n case \"F\": /* A full textual representation of a month, such as Janeiro or Marco; Janeiro a Dezembro */\n result[ i ] = '([\\\\wç]{4,9})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"M\": /* A short textual representation of a month, three letters; Jan a Dez */\n result[ i ] = '(\\\\w{3})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"m\": /* Numeric representation of a month, with leading zeros; 01 to 12 */\n result[ i ] = '(\\\\d{2})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"n\": /* Numeric representation of a month, without leading zeros; 1 a 12 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"t\": /* Number of days in the given month; ex: 28 */\n result[ i ] = '\\\\d{2}';\n break;\n\n /* YEAR */\n case \"L\": /* Whether it's a leap year; 1 if it is a leap year, 0 otherwise. */\n result[ i ] = '\\\\w{4,5}';\n break;\n\n case \"o\": /* ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. */\n throw '\"o\" not implemented!';\n\n case \"Y\": /* A full numeric representation of a year, 4 digits; 1999 */\n result[ i ] = '(\\\\d{4})';\n objIndex.year = { original : i , match : matches++ };\n break;\n\n case \"y\": /* A two digit representation of a year; 99 */\n result[ i ] = '(\\\\d{2})';\n if ( typeof objIndex.year === 'undefined' || iFormat[ objIndex.year.original ] !== 'Y' ) {\n objIndex.year = { original : i , match : matches++ };\n }\n break;\n\n /* TIME */\n case \"a\": /* Lowercase Ante meridiem and Post meridiem; am or pm */\n result[ i ] = '(am|pm)';\n objIndex.ampm = { original : i , match : matches++ };\n break;\n\n case \"A\": /* Uppercase Ante meridiem and Post meridiem; AM or PM */\n result[ i ] = '(AM|PM)';\n objIndex.ampm = { original : i , match : matches++ };\n break;\n\n case \"B\": /* Swatch Internet time; 000 through 999 */\n throw '\"B\" not implemented!';\n\n case \"g\": /* 12-hour format of an hour without leading zeros; 1 to 12 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.hourD = { original : i , match : matches++ };\n break;\n\n case \"G\": /* 24-hour format of an hour without leading zeros; 1 to 23 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.hour = { original : i , match : matches++ };\n break;\n\n case \"h\": /* 12-hour format of an hour with leading zeros; 01 to 12 */\n result[ i ] = '(\\\\d{2})';\n objIndex.hourD = { original : i , match : matches++ };\n break;\n\n case \"H\": /* 24-hour format of an hour with leading zeros; 01 to 24 */\n result[ i ] = '(\\\\d{2})';\n objIndex.hour = { original : i , match : matches++ };\n break;\n\n case \"i\": /* Minutes with leading zeros; 00 to 59 */\n result[ i ] = '(\\\\d{2})';\n objIndex.min = { original : i , match : matches++ };\n break;\n\n case \"s\": /* Seconds with leading zeros; 00 to 59; */\n result[ i ] = '(\\\\d{2})';\n objIndex.sec = { original : i , match : matches++ };\n break;\n\n case \"u\": /* Microseconds */\n throw '\"u\" not implemented!';\n\n /* TIMEZONE */\n case \"e\": /* Timezone identifier */\n throw '\"e\" not implemented!';\n\n case \"I\": /* \"1\" if Daylight Savings Time, \"0\" otherwise. Works only on the northern hemisphere */\n result[i] = '\\\\d';\n break;\n\n case \"O\": /* Difference to Greenwich time (GMT) in hours */\n result[ i ] = '([-+]\\\\d{4})';\n objIndex.diffH = { original : i , match : matches++ };\n break;\n\n case \"P\": /* Difference to Greenwich time (GMT) with colon between hours and minutes */\n throw '\"P\" not implemented!';\n\n case \"T\": /* Timezone abbreviation */\n throw '\"T\" not implemented!';\n\n case \"Z\": /* Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. */\n result[ i ] = '(\\\\-?\\\\d{1,5})';\n objIndex.diffM = { original : i , match : matches++ };\n break;\n\n /* FULL DATE/TIME */\n case \"c\": /* ISO 8601 date */\n throw '\"c\" not implemented!';\n\n case \"r\": /* RFC 2822 formatted date */\n result[ i ] = '([\\\\wá]{3}, \\\\d{1,2} \\\\w{3} \\\\d{4} \\\\d{2}:\\\\d{2}:\\\\d{2} [+\\\\-]\\\\d{4})';\n objIndex.date = { original : i , match : matches++ };\n break;\n\n case \"U\": /* Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) */\n result[ i ] = '(\\\\d{1,13})';\n objIndex.date = { original : i , match : matches++ };\n break;\n\n default:\n result[ i ] = iFormat[ i ];\n }\n }\n\n var pattr = new RegExp( result.join('') );\n\n try {\n mList = str_date.match( pattr );\n if ( !mList ) { return; }\n }\n catch ( e ) { return ; }\n\n var _haveDatetime = typeof objIndex.date !== 'undefined';\n\n var _haveYear = typeof objIndex.year !== 'undefined';\n\n var _haveYDay = typeof objIndex.dayY !== 'undefined';\n\n var _haveDay = typeof objIndex.day !== 'undefined';\n var _haveMonth = typeof objIndex.month !== 'undefined';\n var _haveMonthDay = _haveMonth && _haveDay;\n var _haveOnlyDay = !_haveMonth && _haveDay;\n\n var _haveWDay = typeof objIndex.dayW !== 'undefined';\n var _haveWeek = typeof objIndex.week !== 'undefined';\n var _haveWeekWDay = _haveWeek && _haveWDay;\n var _haveOnlyWDay = !_haveWeek && _haveWDay;\n\n var _validDate = _haveYDay || _haveMonthDay || !_haveYear && _haveOnlyDay || _haveWeekWDay || !_haveYear && _haveOnlyWDay;\n var _noDate = !_haveYear && !_haveYDay && !_haveDay && !_haveMonth && !_haveWDay && !_haveWeek;\n\n var _haveHour12 = typeof objIndex.hourD !== 'undefined' && typeof objIndex.ampm !== 'undefined';\n var _haveHour24 = typeof objIndex.hour !== 'undefined';\n var _haveHour = _haveHour12 || _haveHour24;\n\n var _haveMin = typeof objIndex.min !== 'undefined';\n var _haveSec = typeof objIndex.sec !== 'undefined';\n var _haveMSec = typeof objIndex.msec !== 'undefined';\n\n var _haveMoreM = !_noDate || _haveHour;\n var _haveMoreS = _haveMoreM || _haveMin;\n\n var _haveDiffM = typeof objIndex.diffM !== 'undefined';\n var _haveDiffH = typeof objIndex.diffH !== 'undefined';\n //var _haveGMT = _haveDiffM || _haveDiffH;\n var hour;\n var min;\n\n if ( _haveDatetime ) {\n if ( iFormat[ objIndex.date.original ] === 'U' ) {\n return new Date( +mList[ objIndex.date.match + 1 ] * 1000 );\n }\n\n var dList = mList[ objIndex.date.match + 1 ].match( /\\w{3}, (\\d{1,2}) (\\w{3}) (\\d{4}) (\\d{2}):(\\d{2}):(\\d{2}) ([+\\-]\\d{4})/ );\n hour = +dList[ 4 ] + ( +dList[ 7 ].slice( 0 , 3 ) );\n min = +dList[ 5 ] + ( dList[ 7 ].slice( 0 , 1 ) + dList[ 7 ].slice( 3 ) ) / 100 * 60;\n\n return new Date( dList[ 3 ] , this._iMonth( dList[ 2 ] ) , dList[ 1 ] , hour , min , dList[ 6 ] );\n }\n\n var _d = new Date( );\n var year;\n var month;\n var day;\n var sec;\n var msec;\n var gmt;\n\n if ( !_validDate && !_noDate ) { return ; }\n\n if ( _validDate ) {\n if ( _haveYear ) {\n var _y = _d.getFullYear( ) - 50 + '';\n year = mList[ objIndex.year.match + 1 ];\n if ( iFormat[ objIndex.year.original ] === 'y' ) {\n year = +_y.slice( 0 , 2 ) + ( year >= ( _y ).slice( 2 ) ? 0 : 1 ) + year;\n }\n } else {\n year = _d.getFullYear();\n }\n\n if ( _haveYDay ) {\n month = 0;\n day = mList[ objIndex.dayY.match + 1 ];\n } else if ( _haveDay ) {\n if ( _haveMonth ) {\n month = this._iMonth( mList[ objIndex.month.match + 1 ] );\n } else {\n month = _d.getMonth( );\n }\n\n day = mList[ objIndex.day.match + 1 ];\n } else {\n month = 0;\n\n var week;\n if ( _haveWeek ) {\n week = mList[ objIndex.week.match + 1 ];\n } else {\n week = this.get( 'W' , _d );\n }\n\n day = ( week - 2 ) * 7 + ( 8 - ( ( new Date( year , 0 , 1 ) ).getDay( ) || 7 ) ) + this._iWeek( mList[ objIndex.week.match + 1 ] );\n }\n\n if ( month === 0 && day > 31 ) {\n var aux = new Date( year , month , day );\n month = aux.getMonth( );\n day = aux.getDate( );\n }\n }\n else {\n year = _d.getFullYear( );\n month = _d.getMonth( );\n day = _d.getDate( );\n }\n\n if ( _haveHour12 ) { hour = +mList[ objIndex.hourD.match + 1 ] + ( mList[ objIndex.ampm.match + 1 ] === 'pm' ? 12 : 0 ); }\n else if ( _haveHour24 ) { hour = mList[ objIndex.hour.match + 1 ]; }\n else if ( _noDate ) { hour = _d.getHours( ); }\n else { hour = '00'; }\n\n if ( _haveMin ) { min = mList[ objIndex.min.match + 1 ]; }\n else if ( !_haveMoreM ) { min = _d.getMinutes( ); }\n else { min = '00'; }\n\n if ( _haveSec ) { sec = mList[ objIndex.sec.match + 1 ]; }\n else if ( !_haveMoreS ) { sec = _d.getSeconds( ); }\n else { sec = '00'; }\n\n if ( _haveMSec ) { msec = mList[ objIndex.msec.match + 1 ]; }\n else { msec = '000'; }\n\n if ( _haveDiffH ) { gmt = mList[ objIndex.diffH.match + 1 ]; }\n else if ( _haveDiffM ) { gmt = String( -1 * mList[ objIndex.diffM.match + 1 ] / 60 * 100 ).replace( /^(\\d)/ , '+$1' ).replace( /(^[\\-+])(\\d{3}$)/ , '$10$2' ); }\n else { gmt = '+0000'; }\n\n return new Date( year, month, day, hour, min, sec );\n }\n };\n\n\n return InkDate;\n\n});\n","/**\n * Dump/Profiling Utilities\n * @module Ink.Util.Dumper_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Dumper', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Dumper_1 \n */\n\n var Dumper = {\n\n /**\n * Hex code for the 'tab'\n * \n * @property _tab\n * @type {String}\n * @private\n * @readOnly\n * @static\n *\n */\n _tab: '\\xA0\\xA0\\xA0\\xA0',\n\n /**\n * Function that returns the argument passed formatted\n *\n * @method _formatParam\n * @param {Mixed} param The thing to format.\n * @return {String} The argument passed formatted\n * @private\n * @static\n */\n _formatParam: function(param)\n {\n var formated = '';\n\n switch(typeof(param)) {\n case 'string':\n formated = '(string) '+param;\n break;\n case 'number':\n formated = '(number) '+param;\n break;\n case 'boolean':\n formated = '(boolean) '+param;\n break;\n case 'object':\n if(param !== null) {\n if(param.constructor === Array) {\n formated = 'Array \\n{\\n' + this._outputFormat(param, 0) + '\\n}';\n } else {\n formated = 'Object \\n{\\n' + this._outputFormat(param, 0) + '\\n}';\n }\n } else {\n formated = 'null';\n }\n break;\n default:\n formated = false;\n }\n\n return formated;\n },\n\n /**\n * Function that returns the tabs concatenated\n *\n * @method _getTabs\n * @param {Number} numberOfTabs Number of Tabs\n * @return {String} Tabs concatenated\n * @private\n * @static\n */\n _getTabs: function(numberOfTabs)\n {\n var tabs = '';\n for(var _i = 0; _i < numberOfTabs; _i++) {\n tabs += this._tab;\n }\n return tabs;\n },\n\n /**\n * Function that formats the parameter to display.\n *\n * @method _outputFormat\n * @param {Mixed} param The thing to format.\n * @param {Number} indent Indentation level.\n * @return {String} The parameter passed formatted to displat\n * @private\n * @static\n */\n _outputFormat: function(param, indent)\n {\n var formated = '';\n //var _strVal = false;\n var _typeof = false;\n for(var key in param) {\n if(param[key] !== null) {\n if(typeof(param[key]) === 'object' && (param[key].constructor === Array || param[key].constructor === Object)) {\n if(param[key].constructor === Array) {\n _typeof = 'Array';\n } else if(param[key].constructor === Object) {\n _typeof = 'Object';\n }\n formated += this._tab + this._getTabs(indent) + '[' + key + '] => '+_typeof+'\\n';\n formated += this._tab + this._getTabs(indent) + '{\\n';\n formated += this._outputFormat(param[key], indent + 1) + this._tab + this._getTabs(indent) + '}\\n';\n } else if(param[key].constructor === Function) {\n continue;\n } else {\n formated = formated + this._tab + this._getTabs(indent) + '[' + key + '] => ' + param[key] + '\\n';\n }\n } else {\n formated = formated + this._tab + this._getTabs(indent) + '[' + key + '] => null \\n';\n }\n }\n return formated;\n },\n\n /**\n * Prints variable structure.\n *\n * @method printDump\n * @param {Mixed} param Variable to be dumped.\n * @param {DOMElement|String} [target] Element to print the dump on.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Dumper_printDump.html \n */\n printDump: function(param, target)\n {\n /*jshint evil:true */\n if(!target || typeof(target) === 'undefined') {\n document.write('
            '+this._formatParam(param)+'
            ');\n } else {\n if(typeof(target) === 'string') {\n document.getElementById(target).innerHTML = '
            ' + this._formatParam(param) + '
            ';\n } else if(typeof(target) === 'object') {\n target.innerHTML = '
            '+this._formatParam(param)+'
            ';\n } else {\n throw \"TARGET must be an element or an element ID\";\n }\n }\n },\n\n /**\n * Get a variable's structure.\n *\n * @method returnDump\n * @param {Mixed} param Variable to get the structure.\n * @return {String} The variable's structure.\n * @public\n * @static\n * @sample Ink_Util_Dumper_returnDump.html \n */\n returnDump: function(param)\n {\n return this._formatParam(param);\n },\n\n /**\n * Alert a variable's structure.\n *\n * @method alertDump\n * @param {Mixed} param Variable to be dumped.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Dumper_alertDump.html \n */\n alertDump: function(param)\n {\n window.alert(this._formatParam(param).replace(/()(Array|Object)(<\\/b>)/g, \"$2\"));\n },\n\n /**\n * Prints the variable structure to a new window.\n *\n * @method windowDump\n * @param {Mixed} param Variable to be dumped.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Dumper_windowDump.html \n */\n windowDump: function(param)\n {\n var dumperwindow = 'dumperwindow_'+(Math.random() * 10000);\n var win = window.open('',\n dumperwindow,\n 'width=400,height=300,left=50,top=50,status,menubar,scrollbars,resizable'\n );\n win.document.open();\n win.document.write('
            '+this._formatParam(param)+'
            ');\n win.document.close();\n win.focus();\n }\n\n };\n\n return Dumper;\n\n});\n","/**\n * Internationalization Utilities \n * @module Ink.Util.I18n_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.I18n', '1', [], function () {\n 'use strict';\n\n var pattrText = /\\{(?:(\\{.*?})|(?:%s:)?(\\d+)|(?:%s)?|([\\w-]+))}/g;\n\n var funcOrVal = function( ret , args ) {\n if ( typeof ret === 'function' ) {\n return ret.apply(this, args);\n } else if (typeof ret !== undefined) {\n return ret;\n } else {\n return '';\n }\n };\n\n /**\n * You can use this module to internationalize your applications. It roughly emulates GNU gettext's API.\n *\n * @class Ink.Util.I18n\n * @constructor\n *\n * @param {Object} dict Object mapping language codes (in the form of `pt_PT`, `pt_BR`, `fr`, `en_US`, etc.) to their `dictionaries`\n * @param {String} [lang='pt_PT'] language code of the target language\n * @param {Boolean} [testMode=false] Sets the test mode (see `testMode()`) on construction.\n *\n * @sample Ink_Util_I18n_1.html\n */\n var I18n = function( dict , lang , testMode ) {\n if ( !( this instanceof I18n ) ) { return new I18n( dict , lang , testMode ); }\n\n this.reset( )\n .lang( lang )\n .testMode( testMode )\n .append( dict || { } , lang );\n };\n\n I18n.prototype = {\n reset: function( ) {\n this._dicts = [ ];\n this._dict = { };\n this._testMode = false;\n this._lang = this._gLang;\n\n return this;\n },\n /**\n * Adds translation strings for the helper to use.\n *\n * @method append\n * @param {Object} dict Object containing language objects identified by their language code\n * @return {I18n} (itself)\n *\n * @sample Ink_Util_I18n_1_append.html\n */\n append: function( dict ) {\n this._dicts.push( dict );\n\n this._dict = Ink.extendObj(this._dict , dict[ this._lang ] );\n\n return this;\n },\n /**\n * Gets or sets the language.\n * If there are more dictionaries available in cache, they will be loaded.\n *\n * @method lang\n * @param {String} [lang] Language code to set this instance to. Omit this argument if you want to get the language code instead.\n * @return {String|I18n} The language code, if called without arguments, or this I18n instance if called with an argument.\n */\n lang: function( lang ) {\n if ( !arguments.length ) { return this._lang; }\n\n if ( lang && this._lang !== lang ) {\n this._lang = lang;\n\n this._dict = { };\n\n for ( var i = 0, l = this._dicts.length; i < l; i++ ) {\n this._dict = Ink.extendObj( this._dict , this._dicts[ i ][ lang ] || { } );\n }\n }\n\n return this;\n },\n /**\n * Sets or unsets test mode.\n * In test mode, unknown strings are wrapped in `[ ... ]`. This is useful for debugging your application and to make sure all your translation keys are in place.\n *\n * @method testMode\n * @param {Boolean} [newTestMode] Flag to set the test mode state. Omit this argument to *get* the current testMode instead.\n * @return {String|I18n} The current testMode, if called without arguments, or this I18n instance if called with an argument.\n *\n */\n testMode: function( newTestMode ) {\n if ( !arguments.length ) { return !!this._testMode; }\n\n if ( newTestMode !== undefined ) { this._testMode = !!newTestMode; }\n\n return this;\n },\n\n /**\n * Gest a key from the current dictionary\n *\n * @method getKey\n * @param {String} key Key you wish to get from the dictionary.\n * @return {Mixed} The object which happened to be in the current language dictionary on the given key.\n *\n * @sample Ink_Util_I18n_1_getKey.html\n */\n getKey: function( key ) {\n var ret;\n var gLang = this._gLang;\n var lang = this._lang;\n \n if ( key in this._dict ) {\n ret = this._dict[ key ];\n } else {\n I18n.langGlobal( lang );\n \n ret = this._gDict[ key ];\n \n I18n.langGlobal( gLang );\n }\n \n return ret;\n },\n\n /**\n * Translates a string.\n * Given a translation key, return a translated string, with replaced parameters.\n * When a translated string is not available, the original string is returned unchanged.\n *\n * @method text\n * @param {String} str Key to look for in i18n dictionary (which is returned verbatim if unknown)\n * @param {Object} [namedParms] Named replacements. Replaces {named} with values in this object.\n * @param {String} [args] Replacement #1 (replaces first {} and all {1})\n * @param {String} [arg2] Replacement #2 (replaces second {} and all {2})\n * @param {String} [argn...] Replacement #n (replaces nth {} and all {n})\n *\n * @return {String} Translated string.\n *\n * @sample Ink_Util_I18n_1_text.html\n */\n text: function( str /*, replacements...*/ ) {\n if ( typeof str !== 'string' ) { return; } // Backwards-compat\n\n var pars = Array.prototype.slice.call( arguments , 1 );\n var idx = 0;\n var isObj = typeof pars[ 0 ] === 'object';\n\n var original = this.getKey( str );\n if ( original === undefined ) { original = this._testMode ? '[' + str + ']' : str; }\n if ( typeof original === 'number' ) { original += ''; }\n\n if (typeof original === 'string') {\n original = original.replace( pattrText , function( m , $1 , $2 , $3 ) {\n var ret =\n $1 ? $1 :\n $2 ? pars[ $2 - ( isObj ? 0 : 1 ) ] :\n $3 ? pars[ 0 ][ $3 ] || '' :\n pars[ (idx++) + ( isObj ? 1 : 0 ) ];\n return funcOrVal( ret , [idx].concat(pars) );\n });\n return original;\n }\n \n return (\n typeof original === 'function' ? original.apply( this , pars ) :\n original instanceof Array ? funcOrVal( original[ pars[ 0 ] ] , pars ) :\n typeof original === 'object' ? funcOrVal( original[ pars[ 0 ] ] , pars ) :\n '');\n },\n\n /**\n * Translates and pluralizes text.\n * Given a singular string, a plural string and a number, translates either the singular or plural string.\n *\n * @method ntext\n *\n * @param {String} strSin Word to use when count is 1\n * @param {String} strPlur Word to use otherwise\n * @param {Number} count Number which defines which word to use\n * @param {Mixed} [args...] Extra arguments, to be passed to `text()`\n *\n * @return {String} Pluralized text string.\n *\n * @sample Ink_Util_I18n_1_ntext.html\n */\n ntext: function( strSin , strPlur , count ) {\n var pars = Array.prototype.slice.apply( arguments );\n var original;\n\n if ( pars.length === 2 && typeof strPlur === 'number' ) {\n original = this.getKey( strSin );\n if ( !( original instanceof Array ) ) { return ''; }\n\n pars.splice( 0 , 1 );\n original = original[ strPlur === 1 ? 0 : 1 ];\n } else {\n pars.splice( 0 , 2 );\n original = count === 1 ? strSin : strPlur;\n }\n\n return this.text.apply( this , [ original ].concat( pars ) );\n },\n\n /**\n * Gets the ordinal suffix of a number.\n *\n * This works by using transforms (in the form of Objects or Functions) passed into the function or found in the special key `_ordinals` in the active language dictionary.\n *\n * @method ordinal\n *\n * @param {Number} num Input number\n * @param {Object|Function} [options]={} Dictionaries for translating. Each of these options' fallback is found in the current language's dictionary. The lookup order is the following: `exceptions`, `byLastDigit`, `default`. Each of these may be either an `Object` or a `Function`. If it's a function, it is called (with `number` and `digit` for any function except for byLastDigit, which is called with the `lastDigit` of the number in question), and if the function returns a string, that is used. If it's an object, the property is looked up using `obj[prop]`. If what is found is a string, it is used directly.\n * @param {Object|Function} [options.byLastDigit]={} If the language requires the last digit to be considered, mappings of last digits to ordinal suffixes can be created here.\n * @param {Object|Function} [options.exceptions]={} Map unique, special cases to their ordinal suffixes.\n *\n * @returns {String} Ordinal suffix for `num`.\n *\n * @sample Ink_Util_I18n_1_ordinal.html\n **/\n ordinal: function( num ) {\n if ( num === undefined ) { return ''; }\n\n var lastDig = +num.toString( ).slice( -1 );\n\n var ordDict = this.getKey( '_ordinals' );\n if ( ordDict === undefined ) { return ''; }\n\n if ( typeof ordDict === 'string' ) { return ordDict; }\n\n var ret;\n\n if ( typeof ordDict === 'function' ) {\n ret = ordDict( num , lastDig );\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n if ( 'exceptions' in ordDict ) {\n ret = typeof ordDict.exceptions === 'function' ? ordDict.exceptions( num , lastDig ) :\n num in ordDict.exceptions ? funcOrVal( ordDict.exceptions[ num ] , [num , lastDig] ) :\n undefined;\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n if ( 'byLastDigit' in ordDict ) {\n ret = typeof ordDict.byLastDigit === 'function' ? ordDict.byLastDigit( lastDig , num ) :\n lastDig in ordDict.byLastDigit ? funcOrVal( ordDict.byLastDigit[ lastDig ] , [lastDig , num] ) :\n undefined;\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n if ( 'default' in ordDict ) {\n ret = funcOrVal( ordDict['default'] , [ num , lastDig ] );\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n return '';\n },\n\n /**\n * Create an alias.\n *\n * Returns an alias to this I18n instance. It contains the I18n methods documented here, but is also a function. If you call it, it just calls `text()`. This is commonly assigned to \"_\".\n *\n * @method alias\n * @returns {Function} an alias to `text()` on this instance. You can also access the rest of the translation API through this alias.\n *\n * @sample Ink_Util_I18n_1_alias.html\n */\n alias: function( ) {\n var ret = Ink.bind( I18n.prototype.text , this );\n ret.ntext = Ink.bind( I18n.prototype.ntext , this );\n ret.append = Ink.bind( I18n.prototype.append , this );\n ret.ordinal = Ink.bind( I18n.prototype.ordinal , this );\n ret.testMode = Ink.bind( I18n.prototype.testMode , this );\n\n return ret;\n }\n };\n\n /**\n * Resets I18n global state (global dictionaries, and default language for instances)\n *\n * @method reset\n * @return {void}\n * @static\n *\n **/\n I18n.reset = function( ) {\n I18n.prototype._gDicts = [ ];\n I18n.prototype._gDict = { };\n I18n.prototype._gLang = 'pt_PT';\n };\n I18n.reset( );\n\n /**\n * Adds a dictionary to be used in all I18n instances for the corresponding language.\n *\n * @method appendGlobal\n * @static\n *\n * @param {Object} dict Dictionary to be added\n * @param {String} lang Language fo the dictionary being added\n * @return {void}\n *\n */\n I18n.appendGlobal = function( dict , lang ) {\n if ( lang ) {\n if ( !( lang in dict ) ) {\n var obj = { };\n\n obj[ lang ] = dict;\n\n dict = obj;\n }\n\n if ( lang !== I18n.prototype._gLang ) { I18n.langGlobal( lang ); }\n }\n\n I18n.prototype._gDicts.push( dict );\n\n Ink.extendObj( I18n.prototype._gDict , dict[ I18n.prototype._gLang ] );\n };\n\n /**\n * Gets or sets the current default language of I18n instances.\n *\n * @method langGlobal\n * @param {String} [lang] the new language for all I18n instances. Omit this argument if you wish to *get* the current default language instead.\n *\n * @static\n *\n * @return {String} language code, or nothing if not used as a setter.\n */\n I18n.langGlobal = function( lang ) {\n if ( !arguments.length ) { return I18n.prototype._gLang; }\n\n if ( lang && I18n.prototype._gLang !== lang ) {\n I18n.prototype._gLang = lang;\n\n I18n.prototype._gDict = { };\n\n for ( var i = 0, l = I18n.prototype._gDicts.length; i < l; i++ ) {\n Ink.extendObj( I18n.prototype._gDict , I18n.prototype._gDicts[ i ][ lang ] || { } );\n }\n }\n };\n\n return I18n;\n});","/**\n * JSON Utilities\n * @module Ink.Util.Json_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Json', '1', [], function() {\n 'use strict';\n\n var function_call = Function.prototype.call;\n var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n\n function twoDigits(n) {\n var r = '' + n;\n if (r.length === 1) {\n return '0' + r;\n } else {\n return r;\n }\n }\n\n var dateToISOString = Date.prototype.toISOString ?\n Ink.bind(function_call, Date.prototype.toISOString) :\n function(date) {\n // Adapted from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString\n return date.getUTCFullYear() +\n '-' + twoDigits( date.getUTCMonth() + 1 ) +\n '-' + twoDigits( date.getUTCDate() ) +\n 'T' + twoDigits( date.getUTCHours() ) +\n ':' + twoDigits( date.getUTCMinutes() ) +\n ':' + twoDigits( date.getUTCSeconds() ) +\n '.' + String( (date.getUTCMilliseconds()/1000).toFixed(3) ).slice( 2, 5 ) +\n 'Z';\n };\n\n /**\n * Use this class to convert JSON strings to JavaScript objects\n * `.parse()` and also to do the opposite operation `.stringify()`.\n * Internally, the standard JSON implementation is used if available\n * Otherwise, the functions mimic the standard implementation.\n *\n * Here's how to produce JSON from an existing object:\n * \n * Ink.requireModules(['Ink.Util.Json_1'], function (Json) {\n * var obj = {\n * key1: 'value1',\n * key2: 'value2',\n * keyArray: ['arrayValue1', 'arrayValue2', 'arrayValue3']\n * };\n * Json.stringify(obj); // The above object as a JSON string\n * });\n *\n * And here is how to parse JSON:\n *\n * Ink.requireModules(['Ink.Util.Json_1'], function (Json) {\n * var source = '{\"key\": \"value\", \"array\": [true, null, false]}';\n * Json.parse(source); // The above JSON string as an object\n * });\n *\n * @namespace Ink.Util.Json_1 \n * @static\n * \n */\n var InkJson = {\n _nativeJSON: window.JSON || null,\n\n _convertToUnicode: false,\n\n // Escape characters so as to embed them in JSON strings\n _escape: function (theString) {\n var _m = { '\\b': '\\\\b', '\\t': '\\\\t', '\\n': '\\\\n', '\\f': '\\\\f', '\\r': '\\\\r', '\"': '\\\\\"', '\\\\': '\\\\\\\\' };\n\n if (/[\"\\\\\\x00-\\x1f]/.test(theString)) {\n theString = theString.replace(/([\\x00-\\x1f\\\\\"])/g, function(a, b) {\n var c = _m[b];\n if (c) {\n return c;\n }\n c = b.charCodeAt();\n return '\\\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);\n });\n }\n\n return theString;\n },\n\n // A character conversion map\n _toUnicode: function (theString)\n {\n if(!this._convertToUnicode) {\n return this._escape(theString);\n } else {\n var unicodeString = '';\n var inInt = false;\n var theUnicode = false;\n var i = 0;\n var total = theString.length;\n while(i < total) {\n inInt = theString.charCodeAt(i);\n if( (inInt >= 32 && inInt <= 126) ||\n //(inInt >= 48 && inInt <= 57) ||\n //(inInt >= 65 && inInt <= 90) ||\n //(inInt >= 97 && inInt <= 122) ||\n inInt === 8 ||\n inInt === 9 ||\n inInt === 10 ||\n inInt === 12 ||\n inInt === 13 ||\n inInt === 32 ||\n inInt === 34 ||\n inInt === 47 ||\n inInt === 58 ||\n inInt === 92) {\n\n if(inInt === 34 || inInt === 92 || inInt === 47) {\n theUnicode = '\\\\'+theString.charAt(i);\n } else if(inInt === 8) {\n theUnicode = '\\\\b';\n } else if(inInt === 9) {\n theUnicode = '\\\\t';\n } else if(inInt === 10) {\n theUnicode = '\\\\n';\n } else if(inInt === 12) {\n theUnicode = '\\\\f';\n } else if(inInt === 13) {\n theUnicode = '\\\\r';\n } else {\n theUnicode = theString.charAt(i);\n }\n } else {\n if(this._convertToUnicode) {\n theUnicode = theString.charCodeAt(i).toString(16)+''.toUpperCase();\n while (theUnicode.length < 4) {\n theUnicode = '0' + theUnicode;\n }\n theUnicode = '\\\\u' + theUnicode;\n } else {\n theUnicode = theString.charAt(i);\n }\n }\n unicodeString += theUnicode;\n\n i++;\n }\n\n return unicodeString;\n }\n\n },\n\n _stringifyValue: function(param) {\n if (typeof param === 'string') {\n return '\"' + this._toUnicode(param) + '\"';\n } else if (typeof param === 'number' && (isNaN(param) || !isFinite(param))) { // Unusable numbers go null\n return 'null';\n } else if (typeof param === 'undefined' || param === null) { // And so does undefined\n return 'null';\n } else if (typeof param.toJSON === 'function') {\n var t = param.toJSON();\n if (typeof t === 'string') {\n return '\"' + this._escape(t) + '\"';\n } else {\n return this._escape(t.toString());\n }\n } else if (typeof param === 'number' || typeof param === 'boolean') { // These ones' toString methods return valid JSON.\n return '' + param;\n } else if (typeof param === 'function') {\n return 'null'; // match JSON.stringify\n } else if (param.constructor === Date) {\n return '\"' + this._escape(dateToISOString(param)) + '\"';\n } else if (param.constructor === Array) {\n var arrayString = '';\n for (var i = 0, len = param.length; i < len; i++) {\n if (i > 0) {\n arrayString += ',';\n }\n arrayString += this._stringifyValue(param[i]);\n }\n return '[' + arrayString + ']';\n } else { // Object\n var objectString = '';\n for (var k in param) {\n if ({}.hasOwnProperty.call(param, k)) {\n if (objectString !== '') {\n objectString += ',';\n }\n objectString += '\"' + this._escape(k) + '\": ' + this._stringifyValue(param[k]);\n }\n }\n return '{' + objectString + '}';\n }\n },\n\n /**\n * Serializes a JSON object into a string.\n *\n * @method stringify\n * @param {Object} input Data to be serialized into JSON\n * @param {Boolean} convertToUnicode When `true`, converts string contents to unicode \\uXXXX\n * @return {String} Serialized string\n *\n * @sample Ink_Util_Json_stringify.html \n */\n stringify: function(input, convertToUnicode) {\n this._convertToUnicode = !!convertToUnicode;\n if(!this._convertToUnicode && this._nativeJSON) {\n return this._nativeJSON.stringify(input);\n }\n return this._stringifyValue(input); // And recurse.\n },\n \n /**\n * Parses a JSON text through a function\n * \n * @method parse\n * @param text {String} Input string\n * @param reviver {Function} Function receiving `(key, value)`, and `this`=(containing object), used to walk objects.\n * \n * @return {Object} JSON object\n *\n * @sample Ink_Util_Json_parse.html \n */\n /* From https://github.com/douglascrockford/JSON-js/blob/master/json.js */\n parse: function (text, reviver) {\n /*jshint evil:true*/\n\n// The parse method takes a text and an optional reviver function, and returns\n// a JavaScript value if the text is a valid JSON text.\n\n var j;\n\n function walk(holder, key) {\n\n// The walk method is used to recursively walk the resulting structure so\n// that modifications can be made.\n\n var k, v, value = holder[key];\n if (value && typeof value === 'object') {\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = walk(value, k);\n if (v !== undefined) {\n value[k] = v;\n } else {\n delete value[k];\n }\n }\n }\n }\n return reviver.call(holder, key, value);\n }\n\n\n// Parsing happens in four stages. In the first stage, we replace certain\n// Unicode characters with escape sequences. JavaScript handles many characters\n// incorrectly, either silently deleting them, or treating them as line endings.\n\n text = String(text);\n cx.lastIndex = 0;\n if (cx.test(text)) {\n text = text.replace(cx, function (a) {\n return '\\\\u' +\n ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n });\n }\n\n// In the second stage, we run the text against regular expressions that look\n// for non-JSON patterns. We are especially concerned with '()' and 'new'\n// because they can cause invocation, and '=' because it can cause mutation.\n// But just to be safe, we want to reject all unexpected forms.\n\n// We split the second stage into 4 regexp operations in order to work around\n// crippling inefficiencies in IE's and Safari's regexp engines. First we\n// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we\n// replace all simple value tokens with ']' characters. Third, we delete all\n// open brackets that follow a colon or comma or that begin the text. Finally,\n// we look to see that the remaining characters are only whitespace or ']' or\n// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.\n\n if (/^[\\],:{}\\s]*$/\n .test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')\n .replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']')\n .replace(/(?:^|:|,)(?:\\s*\\[)+/g, ''))) {\n\n// In the third stage we use the eval function to compile the text into a\n// JavaScript structure. The '{' operator is subject to a syntactic ambiguity\n// in JavaScript: it can begin a block or an object literal. We wrap the text\n// in parens to eliminate the ambiguity.\n\n j = eval('(' + text + ')');\n\n// In the optional fourth stage, we recursively walk the new structure, passing\n// each name/value pair to a reviver function for possible transformation.\n\n return typeof reviver === 'function' ?\n walk({'': j}, '') :\n j;\n }\n\n// If the text is not JSON parseable, then a SyntaxError is thrown.\n\n throw new SyntaxError('JSON.parse');\n }\n };\n\n return InkJson;\n});\n","/**\n * String Utilities\n * @module Ink.Util.String_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.String', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.String_1 \n */\n var InkUtilString = {\n\n /**\n * List of special chars\n * \n * @property _chars\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _chars: ['&','à','á','â','ã','ä','å','æ','ç','è','é',\n 'ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô',\n 'õ','ö','ø','ù','ú','û','ü','ý','þ','ÿ','À',\n 'Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë',\n 'Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö',\n 'Ø','Ù','Ú','Û','Ü','Ý','Þ','€','\\\"','ß','<',\n '>','¢','£','¤','¥','¦','§','¨','©','ª','«',\n '¬','\\xad','®','¯','°','±','²','³','´','µ','¶',\n '·','¸','¹','º','»','¼','½','¾'],\n\n /**\n * List of the special characters' html entities\n * \n * @property _entities\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _entities: ['amp','agrave','aacute','acirc','atilde','auml','aring',\n 'aelig','ccedil','egrave','eacute','ecirc','euml','igrave',\n 'iacute','icirc','iuml','eth','ntilde','ograve','oacute',\n 'ocirc','otilde','ouml','oslash','ugrave','uacute','ucirc',\n 'uuml','yacute','thorn','yuml','Agrave','Aacute','Acirc',\n 'Atilde','Auml','Aring','AElig','Ccedil','Egrave','Eacute',\n 'Ecirc','Euml','Igrave','Iacute','Icirc','Iuml','ETH','Ntilde',\n 'Ograve','Oacute','Ocirc','Otilde','Ouml','Oslash','Ugrave',\n 'Uacute','Ucirc','Uuml','Yacute','THORN','euro','quot','szlig',\n 'lt','gt','cent','pound','curren','yen','brvbar','sect','uml',\n 'copy','ordf','laquo','not','shy','reg','macr','deg','plusmn',\n 'sup2','sup3','acute','micro','para','middot','cedil','sup1',\n 'ordm','raquo','frac14','frac12','frac34'],\n\n /**\n * List of accented chars\n * \n * @property _accentedChars\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _accentedChars:['à','á','â','ã','ä','å',\n 'è','é','ê','ë',\n 'ì','í','î','ï',\n 'ò','ó','ô','õ','ö',\n 'ù','ú','û','ü',\n 'ç','ñ',\n 'À','Á','Â','Ã','Ä','Å',\n 'È','É','Ê','Ë',\n 'Ì','Í','Î','Ï',\n 'Ò','Ó','Ô','Õ','Ö',\n 'Ù','Ú','Û','Ü',\n 'Ç','Ñ'],\n\n /**\n * List of the accented chars (above), but without the accents\n * \n * @property _accentedRemovedChars\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _accentedRemovedChars:['a','a','a','a','a','a',\n 'e','e','e','e',\n 'i','i','i','i',\n 'o','o','o','o','o',\n 'u','u','u','u',\n 'c','n',\n 'A','A','A','A','A','A',\n 'E','E','E','E',\n 'I','I','I','I',\n 'O','O','O','O','O',\n 'U','U','U','U',\n 'C','N'],\n /**\n * Object that contains the basic HTML unsafe chars, as keys, and their HTML entities as values\n * \n * @property _htmlUnsafeChars\n * @type {Object}\n * @private\n * @readOnly\n * @static\n */\n _htmlUnsafeChars:{'<':'<','>':'>','&':'&','\"':'"',\"'\":'''},\n\n /**\n * Capitalizes a word.\n * If param as more than one word, it converts first letter of all words that have more than 2 letters\n *\n * @method ucFirst\n * @param {String} string String to capitalize.\n * @param {Boolean} [firstWordOnly]=false Flag to capitalize only the first word.\n * @return {String} Camel cased string.\n * @public\n * @static\n * @sample Ink_Util_String_ucFirst.html \n */\n ucFirst: function(string, firstWordOnly) {\n var replacer = firstWordOnly ? /(^|\\s)(\\w)(\\S{2,})/ : /(^|\\s)(\\w)(\\S{2,})/g;\n return string ? String(string).replace(replacer, function(_, $1, $2, $3){\n return $1 + $2.toUpperCase() + $3.toLowerCase();\n }) : string;\n },\n\n /**\n * Trims whitespace from strings\n *\n * @method trim\n * @param {String} string String to be trimmed\n * @return {String} Trimmed string\n * @public\n * @static\n * @sample Ink_Util_String_trim.html \n */\n trim: function(string)\n {\n if (typeof string === 'string') {\n return string.replace(/^\\s+|\\s+$|\\n+$/g, '');\n }\n return string;\n },\n\n /**\n * Strips HTML tags from strings\n *\n * @method stripTags\n * @param {String} string String to strip tags from.\n * @param {String} allowed Comma separated list of allowed tags.\n * @return {String} Stripped string\n * @public\n * @static\n * @sample Ink_Util_String_stripTags.html \n */\n stripTags: function(string, allowed)\n {\n if (allowed && typeof allowed === 'string') {\n var aAllowed = InkUtilString.trim(allowed).split(',');\n var aNewAllowed = [];\n var cleanedTag = false;\n for(var i=0; i < aAllowed.length; i++) {\n if(InkUtilString.trim(aAllowed[i]) !== '') {\n cleanedTag = InkUtilString.trim(aAllowed[i].replace(/(<|\\>)/g, '').replace(/\\s/, ''));\n aNewAllowed.push('(<'+cleanedTag+'\\\\s[^>]+>|<(\\\\s|\\\\/)?(\\\\s|\\\\/)?'+cleanedTag+'>)');\n }\n }\n var strAllowed = aNewAllowed.join('|');\n var reAllowed = new RegExp(strAllowed, \"i\");\n\n var aFoundTags = string.match(new RegExp(\"<[^>]*>\", \"g\"));\n\n for(var j=0; j < aFoundTags.length; j++) {\n if(!aFoundTags[j].match(reAllowed)) {\n string = string.replace((new RegExp(aFoundTags[j], \"gm\")), '');\n }\n }\n return string;\n } else {\n return string.replace(/<[^\\>]+\\>/g, '');\n }\n },\n\n /**\n * Encodes string into HTML entities.\n *\n * @method htmlEntitiesEncode\n * @param {String} string Input string.\n * @return {String} HTML encoded string.\n * @public\n * @static\n * @sample Ink_Util_String_htmlEntitiesEncode.html \n */\n htmlEntitiesEncode: function(string)\n {\n if (string && string.replace) {\n var re = false;\n for (var i = 0; i < InkUtilString._chars.length; i++) {\n re = new RegExp(InkUtilString._chars[i], \"gm\");\n string = string.replace(re, '&' + InkUtilString._entities[i] + ';');\n }\n }\n return string;\n },\n\n /**\n * Decodes string from HTML entities.\n *\n * @method htmlEntitiesDecode\n * @param {String} string String to be decoded\n * @return {String} Decoded string\n * @public\n * @static\n * @sample Ink_Util_String_htmlEntitiesDecode.html \n */\n htmlEntitiesDecode: function(string)\n {\n if (string && string.replace) {\n var re = false;\n for (var i = 0; i < InkUtilString._entities.length; i++) {\n re = new RegExp(\"&\"+InkUtilString._entities[i]+\";\", \"gm\");\n string = string.replace(re, InkUtilString._chars[i]);\n }\n string = string.replace(/&#[^;]+;?/g, function($0){\n if ($0.charAt(2) === 'x') {\n return String.fromCharCode(parseInt($0.substring(3), 16));\n }\n else {\n return String.fromCharCode(parseInt($0.substring(2), 10));\n }\n });\n }\n return string;\n },\n\n /**\n * Encode a string to UTF-8.\n *\n * @method utf8Encode\n * @param {String} string String to be encoded\n * @return {String} string UTF-8 encoded string\n * @public\n * @static\n */\n utf8Encode: function(string) {\n /*jshint bitwise:false*/\n string = string.replace(/\\r\\n/g,\"\\n\");\n var utfstring = \"\";\n\n for (var n = 0; n < string.length; n++) {\n\n var c = string.charCodeAt(n);\n\n if (c < 128) {\n utfstring += String.fromCharCode(c);\n }\n else if((c > 127) && (c < 2048)) {\n utfstring += String.fromCharCode((c >> 6) | 192);\n utfstring += String.fromCharCode((c & 63) | 128);\n }\n else {\n utfstring += String.fromCharCode((c >> 12) | 224);\n utfstring += String.fromCharCode(((c >> 6) & 63) | 128);\n utfstring += String.fromCharCode((c & 63) | 128);\n }\n\n }\n return utfstring;\n },\n\n /**\n * Truncates a string without breaking words. Inserts an ellipsis HTML entity at the end of the string if it's too long.\n *\n * @method shortString\n * @param {String} str String to truncate\n * @param {Number} n Number of chars of the short string\n * @return {String} Truncated string, or the original `str` if it's shorter than `n`\n * @public\n * @static\n * @sample Ink_Util_String_shortString.html \n */\n shortString: function(str,n) {\n var words = str.split(' ');\n var resultstr = '';\n for(var i = 0; i < words.length; i++ ){\n if((resultstr + words[i] + ' ').length>=n){\n resultstr += '…';\n break;\n }\n resultstr += words[i] + ' ';\n }\n return resultstr;\n },\n\n /**\n * Truncates a string, breaking words and adding ... at the end.\n *\n * @method truncateString\n * @param {String} str String to truncate\n * @param {Number} length Limit for the returned string, ellipsis included.\n * @return {String} Truncated String\n * @public\n * @static\n * @sample Ink_Util_String_truncateString.html \n */\n truncateString: function(str, length) {\n if(str.length - 1 > length) {\n return str.substr(0, length - 1) + \"\\u2026\";\n } else {\n return str;\n }\n },\n\n /**\n * Decodes a string from UTF-8.\n *\n * @method utf8Decode\n * @param {String} string String to be decoded\n * @return {String} Decoded string\n * @public\n * @static\n */\n utf8Decode: function(string) {\n /*jshint bitwise:false*/\n var ret = \"\";\n var i = 0, c = 0, c2 = 0, c3 = 0;\n\n while ( i < string.length ) {\n\n c = string.charCodeAt(i);\n\n if (c < 128) {\n ret += String.fromCharCode(c);\n i++;\n }\n else if((c > 191) && (c < 224)) {\n c2 = string.charCodeAt(i+1);\n ret += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n i += 2;\n }\n else {\n c2 = string.charCodeAt(i+1);\n c3 = string.charCodeAt(i+2);\n ret += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n i += 3;\n }\n\n }\n return ret;\n },\n\n /**\n * Removes all accented characters from a string.\n *\n * @method removeAccentedChars\n * @param {String} string String to remove accents from\n * @return {String} String without accented chars\n * @public\n * @static\n * @sample Ink_Util_String_removeAccentedChars.html \n */\n removeAccentedChars: function(string)\n {\n var newString = string;\n var re = false;\n for (var i = 0; i < InkUtilString._accentedChars.length; i++) {\n re = new RegExp(InkUtilString._accentedChars[i], \"gm\");\n newString = newString.replace(re, '' + InkUtilString._accentedRemovedChars[i] + '');\n }\n return newString;\n },\n\n /**\n * Count the number of occurrences of a specific needle in a haystack\n *\n * @method substrCount\n * @param {String} haystack String to search in\n * @param {String} needle String to search for\n * @return {Number} Number of occurrences\n * @public\n * @static\n * @sample Ink_Util_String_substrCount.html \n */\n substrCount: function(haystack,needle)\n {\n return haystack ? haystack.split(needle).length - 1 : 0;\n },\n\n /**\n * Eval a JSON - We recommend you Ink.Util.Json\n *\n * @method evalJSON\n * @param {String} strJSON JSON string to eval\n * @param {Boolean} sanitize Flag to sanitize input\n * @return {Object} JS Object\n * @public\n * @static\n */\n evalJSON: function(strJSON, sanitize) {\n /* jshint evil:true */\n if( (typeof sanitize === 'undefined' || sanitize === null) || InkUtilString.isJSON(strJSON)) {\n try {\n if(typeof(JSON) !== \"undefined\" && typeof(JSON.parse) !== 'undefined'){\n return JSON.parse(strJSON);\n }\n return eval('('+strJSON+')');\n } catch(e) {\n throw new Error('ERROR: Bad JSON string...');\n }\n }\n },\n\n /**\n * Checks if a string is a valid JSON object (string encoded)\n *\n * @method isJSON\n * @param {String} str String to check\n * @return {Boolean} Return whether it's JSON.\n * @public\n * @static\n */\n isJSON: function(str)\n {\n str = str.replace(/\\\\./g, '@').replace(/\"[^\"\\\\\\n\\r]*\"/g, '');\n return (/^[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]*$/).test(str);\n },\n\n /**\n * Escapes unsafe html chars as HTML entities\n *\n * @method htmlEscapeUnsafe\n * @param {String} str String to escape\n * @return {String} Escaped string\n * @public\n * @static\n * @sample Ink_Util_String_htmlEscapeUnsafe.html \n */\n htmlEscapeUnsafe: function(str){\n var chars = InkUtilString._htmlUnsafeChars;\n return str !== null ? String(str).replace(/[<>&'\"]/g,function(c){return chars[c];}) : str;\n },\n\n /**\n * Normalizes whitespace in string.\n * String is trimmed and sequences of whitespaces are collapsed.\n *\n * @method normalizeWhitespace\n * @param {String} str String to normalize\n * @return {String} Normalized string\n * @public\n * @static\n * @sample Ink_Util_String_normalizeWhitespace.html \n */\n normalizeWhitespace: function(str){\n return str !== null ? InkUtilString.trim(String(str).replace(/\\s+/g,' ')) : str;\n },\n\n /**\n * Converts string to unicode.\n *\n * @method toUnicode\n * @param {String} str String to convert\n * @return {String} Unicoded String\n * @public\n * @static\n * @sample Ink_Util_String_toUnicode.html \n */\n toUnicode: function(str) {\n if (typeof str === 'string') {\n var unicodeString = '';\n var inInt = false;\n var theUnicode = false;\n var total = str.length;\n var i=0;\n\n while(i < total)\n {\n inInt = str.charCodeAt(i);\n if( (inInt >= 32 && inInt <= 126) ||\n inInt === 8 ||\n inInt === 9 ||\n inInt === 10 ||\n inInt === 12 ||\n inInt === 13 ||\n inInt === 32 ||\n inInt === 34 ||\n inInt === 47 ||\n inInt === 58 ||\n inInt === 92) {\n\n /*\n if(inInt == 34 || inInt == 92 || inInt == 47) {\n theUnicode = '\\\\'+str.charAt(i);\n } else {\n }\n */\n if(inInt === 8) {\n theUnicode = '\\\\b';\n } else if(inInt === 9) {\n theUnicode = '\\\\t';\n } else if(inInt === 10) {\n theUnicode = '\\\\n';\n } else if(inInt === 12) {\n theUnicode = '\\\\f';\n } else if(inInt === 13) {\n theUnicode = '\\\\r';\n } else {\n theUnicode = str.charAt(i);\n }\n } else {\n theUnicode = str.charCodeAt(i).toString(16)+''.toUpperCase();\n while (theUnicode.length < 4) {\n theUnicode = '0' + theUnicode;\n }\n theUnicode = '\\\\u' + theUnicode;\n }\n unicodeString += theUnicode;\n\n i++;\n }\n return unicodeString;\n }\n },\n\n /**\n * Escapes a unicode character.\n *\n * @method escape\n * @param {String} c Character to escape\n * @return {String} Escaped character. Returns \\xXX if hex smaller than 0x100, otherwise \\uXXXX\n * @public\n * @static\n * @sample Ink_Util_String_escape.html \n */\n escape: function(c) {\n var hex = (c).charCodeAt(0).toString(16).split('');\n if (hex.length < 3) {\n while (hex.length < 2) { hex.unshift('0'); }\n hex.unshift('x');\n }\n else {\n while (hex.length < 4) { hex.unshift('0'); }\n hex.unshift('u');\n }\n\n hex.unshift('\\\\');\n return hex.join('');\n },\n\n /**\n * Unescapes a unicode character escape sequence\n *\n * @method unescape\n * @param {String} es Escape sequence\n * @return {String} String un-unicoded\n * @public\n * @static\n * @sample Ink_Util_String_unescape.html \n */\n unescape: function(es) {\n var idx = es.lastIndexOf('0');\n idx = idx === -1 ? 2 : Math.min(idx, 2);\n //console.log(idx);\n var hexNum = es.substring(idx);\n //console.log(hexNum);\n var num = parseInt(hexNum, 16);\n return String.fromCharCode(num);\n },\n\n /**\n * Escapes unicode characters in a string as unicode character entities (`\\x##`, where the `##` are hex digits).\n *\n * @method escapeText\n * @param {String} txt String with characters outside the ASCII printable range (32 < charCode < 127)\n * @param {Array} [whiteList] Whitelist of characters which should NOT be escaped\n * @return {String} String escaped with unicode character entities.\n * @public\n * @static\n * @sample Ink_Util_String_escapeText.html \n */\n escapeText: function(txt, whiteList) {\n if (whiteList === undefined) {\n whiteList = ['[', ']', '\\'', ','];\n }\n var txt2 = [];\n var c, C;\n for (var i = 0, f = txt.length; i < f; ++i) {\n c = txt[i];\n C = c.charCodeAt(0);\n if (C < 32 || C > 126 && whiteList.indexOf(c) === -1) {\n c = InkUtilString.escape(c);\n }\n txt2.push(c);\n }\n return txt2.join('');\n },\n\n /**\n * Regex to check escaped strings\n *\n * @property escapedCharRegex\n * @type {Regex}\n * @public\n * @readOnly\n * @static\n */\n escapedCharRegex: /(\\\\x[0-9a-fA-F]{2})|(\\\\u[0-9a-fA-F]{4})/g,\n\n /**\n * Removes unicode entities (in the format \"\\x##\" or \"\\u####\", where \"#\" is a hexadecimal digit)\n *\n * @method unescapeText\n * @param {String} txt Text you intend to remove unicode character entities.\n * @return {String} Unescaped string\n * @public\n * @static\n * @sample Ink_Util_String_unescapeText.html \n */\n unescapeText: function(txt) {\n /*jshint boss:true */\n var m;\n while (m = InkUtilString.escapedCharRegex.exec(txt)) {\n m = m[0];\n txt = txt.replace(m, InkUtilString.unescape(m));\n InkUtilString.escapedCharRegex.lastIndex = 0;\n }\n return txt;\n },\n\n /**\n * Compares two strings.\n *\n * @method strcmp\n * @param {String} str1 First String\n * @param {String} str2 Second String\n * @return {Number} 0 if given strings are equal, 1 if str1 is greater than str2, and -1 if str2 is greater than str1.\n * @public\n * @static\n * @sample Ink_Util_String_strcmp.html \n */\n strcmp: function(str1, str2) {\n return ((str1 === str2) ? 0 : ((str1 > str2) ? 1 : -1));\n },\n\n /**\n * Splits a string into smaller chunks\n *\n * @method packetize\n * @param {String} str String to divide\n * @param {Number} maxLen Maximum chunk size (in characters)\n * @return {Array} Chunks of the original string\n * @public\n * @static\n * @sample Ink_Util_String_packetize.html \n */\n packetize: function(str, maxLen) {\n var len = str.length;\n var parts = new Array( Math.ceil(len / maxLen) );\n var chars = str.split('');\n var sz, i = 0;\n while (len) {\n sz = Math.min(maxLen, len);\n parts[i++] = chars.splice(0, sz).join('');\n len -= sz;\n }\n return parts;\n }\n };\n\n return InkUtilString;\n\n});\n","/**\n * URL Utilities\n * @module Ink.Util.Url_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Url', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Url_1\n */\n var Url = {\n\n /**\n * Auxiliary string for encoding\n *\n * @property _keyStr\n * @type {String}\n * @readOnly\n * @private\n */\n _keyStr : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n\n\n /**\n * Gets URL of current page\n *\n * @method getUrl\n * @return {String} Current URL\n * @public\n * @static\n * @sample Ink_Util_Url_getUrl.html \n */\n getUrl: function()\n {\n return window.location.href;\n },\n\n /**\n * Generates an URL string.\n *\n * @method genQueryString\n * @param {String} uri Base URL\n * @param {Object} params Object to transform to query string\n * @return {String} URI with query string set\n * @public\n * @static\n * @sample Ink_Util_Url_genQueryString.html \n */\n genQueryString: function(uri, params) {\n var hasQuestionMark = uri.indexOf('?') !== -1;\n var sep, pKey, pValue, parts = [uri];\n\n for (pKey in params) {\n if (params.hasOwnProperty(pKey)) {\n if (!hasQuestionMark) {\n sep = '?';\n hasQuestionMark = true;\n } else {\n sep = '&';\n }\n pValue = params[pKey];\n if (typeof pValue !== 'number' && !pValue) {\n pValue = '';\n }\n parts = parts.concat([sep, encodeURIComponent(pKey), '=', encodeURIComponent(pValue)]);\n }\n }\n\n return parts.join('');\n },\n\n /**\n * Gets an object from an URL encoded string.\n *\n * @method getQueryString\n * @param {String} [str] URL String. When not specified it uses the current URL.\n * @return {Object} Key-Value pair object\n * @public\n * @static\n * @sample Ink_Util_Url_getQueryString.html \n */\n getQueryString: function(str)\n {\n var url;\n if(str && typeof(str) !== 'undefined') {\n url = str;\n } else {\n url = this.getUrl();\n }\n var aParams = {};\n if(url.match(/\\?(.+)/i)) {\n var queryStr = url.replace(/^(.*)\\?([^\\#]+)(\\#(.*))?/g, \"$2\");\n if(queryStr.length > 0) {\n var aQueryStr = queryStr.split(/[;&]/);\n for(var i=0; i < aQueryStr.length; i++) {\n var pairVar = aQueryStr[i].split('=');\n aParams[decodeURIComponent(pairVar[0])] = (typeof(pairVar[1]) !== 'undefined' && pairVar[1]) ? decodeURIComponent(pairVar[1]) : false;\n }\n }\n }\n return aParams;\n },\n\n /**\n * Gets the URL hash value\n *\n * @method getAnchor\n * @param {String} [str] URL String. Defaults to current page URL.\n * @return {String|Boolean} Hash in the URL. If there's no hash, returns false.\n * @public\n * @static\n * @sample Ink_Util_Url_getAnchor.html \n */\n getAnchor: function(str)\n {\n var url;\n if(str && typeof(str) !== 'undefined') {\n url = str;\n } else {\n url = this.getUrl();\n }\n var anchor = false;\n if(url.match(/#(.+)/)) {\n anchor = url.replace(/([^#]+)#(.*)/, \"$2\");\n }\n return anchor;\n },\n\n /**\n * Gets the anchor string of an URL\n *\n * @method getAnchorString\n * @param {String} [string] URL to parse. Defaults to current URL.\n * @return {Object} Key-value pair object of the URL's hashtag 'variables'\n * @public\n * @static\n * @sample Ink_Util_Url_getAnchorString.html \n */\n getAnchorString: function(string)\n {\n var url;\n if(string && typeof(string) !== 'undefined') {\n url = string;\n } else {\n url = this.getUrl();\n }\n var aParams = {};\n if(url.match(/#(.+)/i)) {\n var anchorStr = url.replace(/^([^#]+)#(.*)?/g, \"$2\");\n if(anchorStr.length > 0) {\n var aAnchorStr = anchorStr.split(/[;&]/);\n for(var i=0; i < aAnchorStr.length; i++) {\n var pairVar = aAnchorStr[i].split('=');\n aParams[decodeURIComponent(pairVar[0])] = (typeof(pairVar[1]) !== 'undefined' && pairVar[1]) ? decodeURIComponent(pairVar[1]) : false;\n }\n }\n }\n return aParams;\n },\n\n\n /**\n * Parses URL string into URL parts\n *\n * @method parseUrl\n * @param {String} url URL to be parsed\n * @return {Object} Parsed URL as a key-value object.\n * @public\n * @static\n * @sample Ink_Util_Url_parseUrl.html \n */\n parseUrl: function(url) {\n var aURL = {};\n if(url && typeof url === 'string') {\n if(url.match(/^([^:]+):\\/\\//i)) {\n var re = /^([^:]+):\\/\\/([^\\/]*)\\/?([^\\?#]*)\\??([^#]*)#?(.*)/i;\n if(url.match(re)) {\n aURL.scheme = url.replace(re, \"$1\");\n aURL.host = url.replace(re, \"$2\");\n aURL.path = '/'+url.replace(re, \"$3\");\n aURL.query = url.replace(re, \"$4\") || false;\n aURL.fragment = url.replace(re, \"$5\") || false;\n }\n } else {\n var re1 = new RegExp(\"^([^\\\\?]+)\\\\?([^#]+)#(.*)\", \"i\");\n var re2 = new RegExp(\"^([^\\\\?]+)\\\\?([^#]+)#?\", \"i\");\n var re3 = new RegExp(\"^([^\\\\?]+)\\\\??\", \"i\");\n if(url.match(re1)) {\n aURL.scheme = false;\n aURL.host = false;\n aURL.path = url.replace(re1, \"$1\");\n aURL.query = url.replace(re1, \"$2\");\n aURL.fragment = url.replace(re1, \"$3\");\n } else if(url.match(re2)) {\n aURL.scheme = false;\n aURL.host = false;\n aURL.path = url.replace(re2, \"$1\");\n aURL.query = url.replace(re2, \"$2\");\n aURL.fragment = false;\n } else if(url.match(re3)) {\n aURL.scheme = false;\n aURL.host = false;\n aURL.path = url.replace(re3, \"$1\");\n aURL.query = false;\n aURL.fragment = false;\n }\n }\n if(aURL.host) {\n var regPort = /^(.*?)\\\\:(\\\\d+)$/i;\n // check for port\n if(aURL.host.match(regPort)) {\n var tmpHost1 = aURL.host;\n aURL.host = tmpHost1.replace(regPort, \"$1\");\n aURL.port = tmpHost1.replace(regPort, \"$2\");\n } else {\n aURL.port = false;\n }\n // check for user and pass\n if(aURL.host.match(/@/i)) {\n var tmpHost2 = aURL.host;\n aURL.host = tmpHost2.split('@')[1];\n var tmpUserPass = tmpHost2.split('@')[0];\n if(tmpUserPass.match(/\\:/)) {\n aURL.user = tmpUserPass.split(':')[0];\n aURL.pass = tmpUserPass.split(':')[1];\n } else {\n aURL.user = tmpUserPass;\n aURL.pass = false;\n }\n }\n }\n }\n return aURL;\n },\n\n /**\n * Formats an URL object into an URL string.\n *\n * @method format\n * @param {String|Location|Object} urlObj Window.location, a.href, or parseUrl object to format\n * @return {String} Full URL.\n */\n format: function (urlObj) {\n var protocol = '';\n var host = '';\n var path = '';\n var frag = '';\n var query = '';\n\n if (typeof urlObj.protocol === 'string') {\n protocol = urlObj.protocol + '//'; // here it comes with the colon\n } else if (typeof urlObj.scheme === 'string') {\n protocol = urlObj.scheme + '://';\n }\n\n host = urlObj.host || urlObj.hostname || '';\n path = urlObj.path || '';\n\n if (typeof urlObj.query === 'string') {\n query = urlObj.query;\n } else if (typeof urlObj.search === 'string') {\n query = urlObj.search.replace(/^\\?/, '');\n }\n if (typeof urlObj.fragment === 'string') {\n frag = urlObj.fragment;\n } else if (typeof urlObj.hash === 'string') {\n frag = urlObj.hash.replace(/#$/, '');\n }\n\n return [\n protocol,\n host,\n path,\n query && '?' + query,\n frag && '#' + frag\n ].join('');\n },\n\n /**\n * Gets the last loaded script element\n *\n * @method currentScriptElement\n * @param {String} [match] String to match against the script src attribute\n * @return {DOMElement|Boolean} Returns the `script` DOM Element or false if unable to find it.\n * @public\n * @static\n * @sample Ink_Util_Url_currentScriptElement.html \n */\n currentScriptElement: function(match)\n {\n var aScripts = document.getElementsByTagName('script');\n if(typeof(match) === 'undefined') {\n if(aScripts.length > 0) {\n return aScripts[(aScripts.length - 1)];\n } else {\n return false;\n }\n } else {\n var curScript = false;\n var re = new RegExp(\"\"+match+\"\", \"i\");\n for(var i=0, total = aScripts.length; i < total; i++) {\n curScript = aScripts[i];\n if(re.test(curScript.src)) {\n return curScript;\n }\n }\n return false;\n }\n }\n };\n\n return Url;\n\n});\n","/**\n * Validation Utilities\n * @module Ink.Util.Validator_1\n * @version 1\n */\n \nInk.createModule('Ink.Util.Validator', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Validator_1 \n */\n var Validator = {\n\n /**\n * List of country codes avaible for the isPhone method\n *\n * @property _countryCodes\n * @type {Array}\n * @private\n * @static\n * @readOnly\n */\n _countryCodes : [\n 'AO',\n 'CV',\n 'MZ',\n 'PT'\n ],\n\n /**\n * International number for portugal\n *\n * @property _internacionalPT\n * @type {Number}\n * @private\n * @static\n * @readOnly\n *\n */\n _internacionalPT: 351,\n\n /**\n * List of all portuguese number prefixes\n *\n * @property _indicativosPT\n * @type {Object}\n * @private\n * @static\n * @readOnly\n *\n */\n _indicativosPT: {\n 21: 'lisboa',\n 22: 'porto',\n 231: 'mealhada',\n 232: 'viseu',\n 233: 'figueira da foz',\n 234: 'aveiro',\n 235: 'arganil',\n 236: 'pombal',\n 238: 'seia',\n 239: 'coimbra',\n 241: 'abrantes',\n 242: 'ponte de sôr',\n 243: 'santarém',\n 244: 'leiria',\n 245: 'portalegre',\n 249: 'torres novas',\n 251: 'valença',\n 252: 'vila nova de famalicão',\n 253: 'braga',\n 254: 'peso da régua',\n 255: 'penafiel',\n 256: 'são joão da madeira',\n 258: 'viana do castelo',\n 259: 'vila real',\n 261: 'torres vedras',\n 262: 'caldas da raínha',\n 263: 'vila franca de xira',\n 265: 'setúbal',\n 266: 'évora',\n 268: 'estremoz',\n 269: 'santiago do cacém',\n 271: 'guarda',\n 272: 'castelo branco',\n 273: 'bragança',\n 274: 'proença-a-nova',\n 275: 'covilhã',\n 276: 'chaves',\n 277: 'idanha-a-nova',\n 278: 'mirandela',\n 279: 'moncorvo',\n 281: 'tavira',\n 282: 'portimão',\n 283: 'odemira',\n 284: 'beja',\n 285: 'moura',\n 286: 'castro verde',\n 289: 'faro',\n 291: 'funchal, porto santo',\n 292: 'corvo, faial, flores, horta, pico',\n 295: 'angra do heroísmo, graciosa, são jorge, terceira',\n 296: 'ponta delgada, são miguel, santa maria',\n\n 91 : 'rede móvel 91 (Vodafone / Yorn)',\n 93 : 'rede móvel 93 (Optimus)',\n 96 : 'rede móvel 96 (TMN)',\n 92 : 'rede móvel 92 (TODOS)',\n //925 : 'rede móvel 925 (TMN 925)',\n //926 : 'rede móvel 926 (TMN 926)',\n //927 : 'rede móvel 927 (TMN 927)',\n //922 : 'rede móvel 922 (Phone-ix)',\n\n 707: 'número único',\n 760: 'número único',\n 800: 'número grátis',\n 808: 'chamada local',\n 30: 'voip'\n },\n /**\n * International number for Cabo Verde\n *\n * @property _internacionalCV\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalCV: 238,\n\n /**\n * List of all Cabo Verde number prefixes\n *\n * @property _indicativosCV\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosCV: {\n 2: 'fixo',\n 91: 'móvel 91',\n 95: 'móvel 95',\n 97: 'móvel 97',\n 98: 'móvel 98',\n 99: 'móvel 99'\n },\n /**\n * International number for Angola\n *\n * @property _internacionalAO\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalAO: 244,\n\n /**\n * List of all Angola number prefixes\n *\n * @property _indicativosAO\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosAO: {\n 2: 'fixo',\n 91: 'móvel 91',\n 92: 'móvel 92'\n },\n /**\n * International number for Mozambique\n *\n * @property _internacionalMZ\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalMZ: 258,\n\n /**\n * List of all Mozambique number prefixes\n *\n * @property _indicativosMZ\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosMZ: {\n 2: 'fixo',\n 82: 'móvel 82',\n 84: 'móvel 84'\n },\n\n /**\n * International number for Timor\n *\n * @property _internacionalTL\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalTL: 670,\n\n /**\n * List of all Timor number prefixes\n *\n * @property _indicativosTL\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosTL: {\n 3: 'fixo',\n 7: 'móvel 7'\n },\n\n /**\n * Regular expression groups for several groups of characters\n *\n * http://en.wikipedia.org/wiki/C0_Controls_and_Basic_Latin\n * http://en.wikipedia.org/wiki/Plane_%28Unicode%29#Basic_Multilingual_Plane\n * http://en.wikipedia.org/wiki/ISO_8859-1\n *\n * @property _characterGroups\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _characterGroups: {\n numbers: ['0-9'],\n asciiAlpha: ['a-zA-Z'],\n latin1Alpha: ['a-zA-Z', '\\u00C0-\\u00FF'],\n unicodeAlpha: ['a-zA-Z', '\\u00C0-\\u00FF', '\\u0100-\\u1FFF', '\\u2C00-\\uD7FF'],\n /* whitespace characters */\n space: [' '],\n dash: ['-'],\n underscore: ['_'],\n nicknamePunctuation: ['_.-'],\n\n singleLineWhitespace: ['\\t '],\n newline: ['\\n'],\n whitespace: ['\\t\\n\\u000B\\f\\r\\u00A0 '],\n\n asciiPunctuation: ['\\u0021-\\u002F', '\\u003A-\\u0040', '\\u005B-\\u0060', '\\u007B-\\u007E'],\n latin1Punctuation: ['\\u0021-\\u002F', '\\u003A-\\u0040', '\\u005B-\\u0060', '\\u007B-\\u007E', '\\u00A1-\\u00BF', '\\u00D7', '\\u00F7'],\n unicodePunctuation: ['\\u0021-\\u002F', '\\u003A-\\u0040', '\\u005B-\\u0060', '\\u007B-\\u007E', '\\u00A1-\\u00BF', '\\u00D7', '\\u00F7', '\\u2000-\\u206F', '\\u2E00-\\u2E7F', '\\u3000-\\u303F']\n },\n\n /**\n * Creates a regular expression for several character groups.\n *\n * @method createRegExp\n *\n * @param {Object} groups\n * Groups to build regular expressions for. Possible keys are:\n *\n * - **numbers**: 0-9\n * - **asciiAlpha**: a-z, A-Z\n * - **latin1Alpha**: asciiAlpha, plus printable characters in latin-1\n * - **unicodeAlpha**: unicode alphanumeric characters.\n * - **space**: ' ', the space character.\n * - **dash**: dash character.\n * - **underscore**: underscore character.\n * - **nicknamePunctuation**: dash, dot, underscore\n * - **singleLineWhitespace**: space and tab (whitespace which only spans one line).\n * - **newline**: newline character ('\\n')\n * - **whitespace**: whitespace characters in the ASCII character set.\n * - **asciiPunctuation**: punctuation characters in the ASCII character set.\n * - **latin1Punctuation**: punctuation characters in latin-1.\n * - **unicodePunctuation**: punctuation characters in unicode.\n *\n * @returns {RegExp} A regular expression with the given groups.\n */\n createRegExp: function (groups) {\n var re = '^[';\n for (var key in groups) if (groups.hasOwnProperty(key)) {\n if (!(key in Validator._characterGroups)) {\n throw new Error('group ' + key + ' is not a valid character group');\n } else if (groups[key]) {\n re += Validator._characterGroups[key].join('');\n }\n }\n if (re === '^[') {\n // No changes\n return new RegExp('$^'); // match nothing\n }\n return new RegExp(re + ']*?$');\n },\n\n /**\n * Checks if a field has the required groups.\n *\n * @method checkCharacterGroups\n * @param {String} s The validation string\n * @param {Object} [groups={}] What groups are included. See `createRegExp`\n * @return {Boolean} Whether this is a valid string (all groups pass).\n * @sample Ink_Util_Validator_checkCharacterGroups.html \n */\n checkCharacterGroups: function (s, groups) {\n return Validator.createRegExp(groups).test(s);\n },\n\n /**\n * Checks if a field contains unicode printable characters.\n *\n * @method unicode\n * @param {String} s The validation string\n * @param {Object} [options={}] Optional configuration object. See createRegexp\n * @return {Boolean} Whether this is a valid unicode string.\n */\n unicode: function (s, options) {\n return Validator.checkCharacterGroups(s, Ink.extendObj({\n unicodeAlpha: true}, options));\n },\n\n /**\n * Checks if a field only contains latin-1 alphanumeric characters. \n * Takes options for allowing singleline whitespace, cross-line whitespace and punctuation.\n *\n * @method latin1\n *\n * @param {String} s The validation string\n * @param {Object} [options={}] Optional configuration object. See createRegexp\n * @return {Boolean} Whether this is a valid latin1 string.\n * @sample Ink_Util_Validator_latin1.html \n */\n latin1: function (s, options) {\n return Validator.checkCharacterGroups(s, Ink.extendObj({\n latin1Alpha: true}, options));\n },\n\n /**\n * Checks if a field only contains only ASCII alphanumeric characters. \n * Takes options for allowing singleline whitespace, cross-line whitespace and punctuation.\n *\n * @method ascii\n *\n * @param {String} s The validation string\n * @param {Object} [options={}] Optional configuration object. See createRegexp\n * @return {Boolean} Whether this is a valid ascii string.\n * @sample Ink_Util_Validator_ascii.html \n */\n ascii: function (s, options) {\n return Validator.checkCharacterGroups(s, Ink.extendObj({\n asciiAlpha: true}, options));\n },\n\n /**\n * Checks if a number is a valid\n *\n * @method number\n * @param {String} numb The number\n * @param {Object} [options] Further options\n * @param {String} [options.decimalSep='.'] Allow decimal separator.\n * @param {String} [options.thousandSep=\",\"] Strip this character from the number.\n * @param {String} [options.negative=false] Allow negative numbers.\n * @param {String} [options.decimalPlaces=null] Maximum number of decimal places. Use `0` for an integer number.\n * @param {Number} [options.max=null] Maximum number\n * @param {Number} [options.min=null] Minimum number\n * @param {Boolean}[options.returnNumber=false] When this option is `true`, return the number itself when the value is valid.\n * @return {Boolean|Number} `false` when invalid, `true` when valid. If `options.returnNumber` is `true`, return the parsed, valid number or `false`.\n * @sample Ink_Util_Validator_number.html \n */\n number: function (numb, options) {\n numb = numb + '';\n options = Ink.extendObj({\n decimalSep: '.',\n thousandSep: '',\n negative: true,\n decimalPlaces: null,\n maxDigits: null,\n max: null,\n min: null,\n returnNumber: false\n }, options || {});\n // smart recursion thing sets up aliases for options.\n if (options.thousandSep) {\n numb = numb.replace(new RegExp('\\\\' + options.thousandSep, 'g'), '');\n options.thousandSep = '';\n return Validator.number(numb, options);\n }\n if (options.negative === false) {\n options.min = 0;\n options.negative = true;\n return Validator.number(numb, options);\n }\n if (options.decimalSep !== '.') {\n numb = numb.replace(new RegExp('\\\\' + options.decimalSep, 'g'), '.');\n }\n\n if (!/^(-)?(\\d+)?(\\.\\d+)?$/.test(numb) || numb === '') {\n return false; // forbidden character found\n }\n \n var split;\n if (options.decimalSep && numb.indexOf(options.decimalSep) !== -1) {\n split = numb.split(options.decimalSep);\n if (options.decimalPlaces !== null &&\n split[1].length > options.decimalPlaces) {\n return false;\n }\n } else {\n split = ['' + numb, ''];\n }\n \n if (options.maxDigits!== null) {\n if (split[0].replace(/-/g, '').length > options.maxDigits) {\n return split;\n }\n }\n \n // Now look at the actual float\n var ret = parseFloat(numb);\n \n if (options.maxExcl !== null && ret >= options.maxExcl ||\n options.minExcl !== null && ret <= options.minExcl) {\n return false;\n }\n if (options.max !== null && ret > options.max ||\n options.min !== null && ret < options.min) {\n return false;\n }\n \n if (options.returnNumber) {\n return ret;\n } else {\n return true;\n }\n },\n\n /**\n * Checks if a year is Leap \"Bissexto\"\n *\n * @method _isLeapYear\n * @param {Number} year Year to be checked\n * @return {Boolean} True if it is a leap year.\n * @private\n * @static\n * @example\n * Ink.requireModules(['Ink.Util.Validator_1'], function( InkValidator ){\n * console.log( InkValidator._isLeapYear( 2004 ) ); // Result: true\n * console.log( InkValidator._isLeapYear( 2006 ) ); // Result: false\n * });\n */\n _isLeapYear: function(year){\n var yearRegExp = /^\\d{4}$/;\n\n if(yearRegExp.test(year)){\n return ((year%4) ? false: ((year%100) ? true : ((year%400)? false : true)) );\n }\n\n return false;\n },\n\n /**\n * Object with the date formats available for validation\n *\n * @property _dateParsers\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _dateParsers: {\n 'yyyy-mm-dd': {day:5, month:3, year:1, sep: '-', parser: /^(\\d{4})(\\-)(\\d{1,2})(\\-)(\\d{1,2})$/},\n 'yyyy/mm/dd': {day:5, month:3, year:1, sep: '/', parser: /^(\\d{4})(\\/)(\\d{1,2})(\\/)(\\d{1,2})$/},\n 'yy-mm-dd': {day:5, month:3, year:1, sep: '-', parser: /^(\\d{2})(\\-)(\\d{1,2})(\\-)(\\d{1,2})$/},\n 'yy/mm/dd': {day:5, month:3, year:1, sep: '/', parser: /^(\\d{2})(\\/)(\\d{1,2})(\\/)(\\d{1,2})$/},\n 'dd-mm-yyyy': {day:1, month:3, year:5, sep: '-', parser: /^(\\d{1,2})(\\-)(\\d{1,2})(\\-)(\\d{4})$/},\n 'dd/mm/yyyy': {day:1, month:3, year:5, sep: '/', parser: /^(\\d{1,2})(\\/)(\\d{1,2})(\\/)(\\d{4})$/},\n 'dd-mm-yy': {day:1, month:3, year:5, sep: '-', parser: /^(\\d{1,2})(\\-)(\\d{1,2})(\\-)(\\d{2})$/},\n 'dd/mm/yy': {day:1, month:3, year:5, sep: '/', parser: /^(\\d{1,2})(\\/)(\\d{1,2})(\\/)(\\d{2})$/}\n },\n\n /**\n * Gets the number of days in a given month of a given year\n *\n * @method _daysInMonth\n * @param {Number} _m Month (1 to 12)\n * @param {Number} _y Year\n * @return {Number} Returns the number of days in a given month of a given year\n * @private\n * @static\n * @example\n * Ink.requireModules(['Ink.Util.Validator_1'], function( InkValidator ){\n * console.log( InkValidator._daysInMonth( 2, 2004 ) ); // Result: 29\n * console.log( InkValidator._daysInMonth( 2, 2006 ) ); // Result: 28\n * });\n */\n _daysInMonth: function(_m,_y){\n var nDays=0;\n\n _m = parseInt(_m, 10);\n _y = parseInt(_y, 10);\n\n if(_m===1 || _m===3 || _m===5 || _m===7 || _m===8 || _m===10 || _m===12) {\n nDays= 31;\n } else if ( _m===4 || _m===6 || _m===9 || _m===11) {\n nDays = 30;\n } else if (_m===2) {\n if((_y%400===0) || (_y%4===0 && _y%100!==0)) {\n nDays = 29;\n } else {\n nDays = 28;\n }\n }\n\n return nDays;\n },\n\n\n\n /**\n * Checks if a date is valid\n *\n * @method _isValidDate\n * @param {Number} year Year fragment of your date.\n * @param {Number} month Month fragment of your date.\n * @param {Number} day Day fragment of your date.\n * @return {Boolean} True if valid\n * @private\n * @static\n * @example\n * Ink.requireModules(['Ink.Util.Validator_1'], function( InkValidator ){\n * console.log( InkValidator._isValidDate( 2004, 2, 29 ) ); // Result: true\n * console.log( InkValidator._isValidDate( 2006, 2, 29 ) ); // Result: false\n * });\n */\n _isValidDate: function(year, month, day){\n var yearRegExp = /^\\d{4}$/;\n var validOneOrTwo = /^\\d{1,2}$/;\n if(yearRegExp.test(year) && validOneOrTwo.test(month) && validOneOrTwo.test(day)){\n if(month>=1 && month<=12 && day>=1 && this._daysInMonth(month,year)>=day){\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if an email address is valid\n *\n * @method email\n * @param {String} email String containing the e-mail.\n * @return {Boolean} `true` if it's a valid e-mail address.\n * @public\n * @static\n * @sample Ink_Util_Validator_mail.html \n */\n email: function(email)\n {\n var emailValido = new RegExp(\"^[_a-z0-9-]+((\\\\.|\\\\+)[_a-z0-9-]+)*@([\\\\w]*-?[\\\\w]*\\\\.)+[a-z]{2,4}$\", \"i\");\n return !!emailValido.test(email);\n },\n\n /**\n * Deprecated. Alias for email(). Use it instead.\n *\n * @method mail\n * @public\n * @param {String} mail See `email`\n * @returns {Boolean} See `email`\n * @static\n * @private\n */\n mail: function (mail) { return Validator.email(mail); },\n\n /**\n * Checks if an url is valid\n *\n * @method url\n * @param {String} url URL to be checked\n * @param {Boolean} [full] If true, validates a full URL (one that should start with 'http')\n * @return {Boolean} True if valid\n * @public\n * @static\n * @sample Ink_Util_Validator_url.html \n */\n url: function(url, full)\n {\n if(typeof full === \"undefined\" || full === false) {\n var reHTTP = new RegExp(\"(^(http\\\\:\\\\/\\\\/|https\\\\:\\\\/\\\\/)(.+))\", \"i\");\n if(reHTTP.test(url) === false) {\n url = 'http://'+url;\n }\n }\n\n var reUrl = new RegExp(\"^(http:\\\\/\\\\/|https:\\\\/\\\\/)([\\\\w]*(-?[\\\\w]*)*\\\\.)+[a-z]{2,4}\", \"i\");\n if(reUrl.test(url) === false) {\n return false;\n } else {\n return true;\n }\n },\n\n /**\n * Checks if a phone is valid in Portugal\n *\n * @method isPTPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Portuguese Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isPTPhone.html\n */\n isPTPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosPT) {\n if(typeof(this._indicativosPT[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n\n var re351 = /^(00351|\\+351)/;\n if(re351.test(phone)) {\n phone = phone.replace(re351, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{9}/i;\n if(phone.length === 9 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Alias function for isPTPhone\n *\n * @method isPortuguesePhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Portuguese Phone\n * @public\n * @static\n */\n isPortuguesePhone: function(phone)\n {\n return this.isPTPhone(phone);\n },\n\n /**\n * Checks if a phone is valid in Cabo Verde\n *\n * @method isCVPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Cape Verdean Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isCVPhone.html \n */\n isCVPhone: function(phone)\n {\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosCV) {\n if(typeof(this._indicativosCV[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n\n var re238 = /^(00238|\\+238)/;\n if(re238.test(phone)) {\n phone = phone.replace(re238, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{7}/i;\n if(phone.length === 7 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a phone is valid in Angola\n *\n * @method isAOPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Angolan Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isAOPhone.html \n */\n isAOPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosAO) {\n if(typeof(this._indicativosAO[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n\n var re244 = /^(00244|\\+244)/;\n if(re244.test(phone)) {\n phone = phone.replace(re244, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{9}/i;\n if(phone.length === 9 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a phone is valid in Mozambique\n *\n * @method isMZPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Mozambican Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isMZPhone.html \n */\n isMZPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosMZ) {\n if(typeof(this._indicativosMZ[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n var re258 = /^(00258|\\+258)/;\n if(re258.test(phone)) {\n phone = phone.replace(re258, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{8,9}/i;\n if((phone.length === 9 || phone.length === 8) && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n if(phone.indexOf('2') === 0 && phone.length === 8) {\n return true;\n } else if(phone.indexOf('8') === 0 && phone.length === 9) {\n return true;\n }\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a phone is valid in Timor\n *\n * @method isTLPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid phone from Timor-Leste\n * @public\n * @static\n * @sample Ink_Util_Validator_isTLPhone.html \n */\n isTLPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosTL) {\n if(typeof(this._indicativosTL[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n var re670 = /^(00670|\\+670)/;\n if(re670.test(phone)) {\n phone = phone.replace(re670, \"\");\n }\n\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{7}/i;\n if(phone.length === 7 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a number is a phone number.\n * This method validates the number in all country codes available the ones set in the second param\n *\n * @method isPhone\n * @param {String} phone Phone number to validate\n * @param {String|Array} [countryCode] Country code or array of countries to validate\n * @return {Boolean} True if it's a valid phone in any country available\n * @public\n * @static\n * @sample Ink_Util_Validator_isPhone.html\n */\n isPhone: function(){\n var index;\n\n if(arguments.length===0){\n return false;\n }\n\n var phone = arguments[0];\n\n if(arguments.length>1){\n if(arguments[1].constructor === Array){\n var func;\n for(index=0; index= 0 && match[i-1] <= 100){\n valid = true;\n } else {\n return false;\n }\n }\n // check 0 to 255 values\n if(i===1 || i===3 || i===5 && (typeof match[i+1] === \"undefined\" || match[i+1] === \"\")){\n if(typeof match[i] !== \"undefined\" && match[i] >= 0 && match[i] <= 255){\n valid = true;\n } else {\n return false;\n }\n }\n }\n }\n\n // hsl range check\n if((match = hsl.exec(str)) !== null || (match = hsla.exec(str)) !== null){\n i = match.length;\n while(i--){\n // check percentage values\n if(i===3 || i===5){\n if(typeof match[i-1] !== \"undefined\" && typeof match[i] !== \"undefined\" && match[i] !== \"\" &&\n match[i-1] >= 0 && match[i-1] <= 100){\n valid = true;\n } else {\n return false;\n }\n }\n // check 0 to 360 value\n if(i===1){\n if(typeof match[i] !== \"undefined\" && match[i] >= 0 && match[i] <= 360){\n valid = true;\n } else {\n return false;\n }\n }\n }\n }\n\n return valid;\n },\n\n /**\n * Checks if the value is a valid IP. \n *\n * @method isIP\n * @param {String} value Value to be checked\n * @param {String} ipType Type of IP to be validated. The values are: ipv4, ipv6. By default is ipv4.\n * @return {Boolean} True if the value is a valid IP address. False if not.\n * @sample Ink_Util_Validator_isIP.html \n */\n isIP: function( value, ipType ){\n if( typeof value !== 'string' ){\n return false;\n }\n\n ipType = (ipType || 'ipv4').toLowerCase();\n\n switch( ipType ){\n case 'ipv4':\n return (/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/).test(value);\n case 'ipv6':\n return (/^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/).test(value);\n default:\n return false;\n }\n },\n\n /**\n * Credit Card specifications, to be used in the credit card verification.\n *\n * @property _creditCardSpecs\n * @type {Object}\n * @private\n */\n _creditCardSpecs: {\n 'default': {\n 'length': '13,14,15,16,17,18,19',\n 'prefix': /^.+/,\n 'luhn': true\n },\n\n 'american express': {\n 'length': '15',\n 'prefix': /^3[47]/,\n 'luhn' : true\n },\n\n 'diners club': {\n 'length': '14,16',\n 'prefix': /^36|55|30[0-5]/,\n 'luhn' : true\n },\n\n 'discover': {\n 'length': '16',\n 'prefix': /^6(?:5|011)/,\n 'luhn' : true\n },\n\n 'jcb': {\n 'length': '15,16',\n 'prefix': /^3|1800|2131/,\n 'luhn' : true\n },\n\n 'maestro': {\n 'length': '16,18',\n 'prefix': /^50(?:20|38)|6(?:304|759)/,\n 'luhn' : true\n },\n\n 'mastercard': {\n 'length': '16',\n 'prefix': /^5[1-5]/,\n 'luhn' : true\n },\n\n 'visa': {\n 'length': '13,16',\n 'prefix': /^4/,\n 'luhn' : true\n }\n },\n\n /**\n * Luhn function, to be used when validating credit card numbers\n * @method _luhn\n * @private\n * @param {Number} num Given credit card number\n * @returns {Boolean} Whether the credit card number is valid.\n */\n _luhn: function (num){\n\n num = parseInt(num,10);\n\n if ( (typeof num !== 'number') && (num % 1 !== 0) ){\n // Luhn can only be used on nums!\n return false;\n }\n\n num = num+'';\n // Check num length\n var length = num.length;\n\n // Checksum of the card num\n var i;\n var checksum = 0;\n\n for (i = length - 1; i >= 0; i -= 2)\n {\n // Add up every 2nd digit, starting from the right\n checksum += parseInt(num.substr(i, 1),10);\n }\n\n for (i = length - 2; i >= 0; i -= 2)\n {\n // Add up every 2nd digit doubled, starting from the right\n var dbl = parseInt(num.substr(i, 1) * 2,10);\n\n // Subtract 9 from the dbl where value is greater than 10\n checksum += (dbl >= 10) ? (dbl - 9) : dbl;\n }\n\n // If the checksum is a multiple of 10, the number is valid\n return (checksum % 10 === 0);\n },\n\n /**\n * Checks if a number is of a specific credit card type\n * @method isCreditCard\n * @param {String} num Number to be validates\n * @param {String|Array} creditCardType Credit card type or list of types. See _creditCardSpecs for the list of supported values.\n * @return {Boolean} Whether the number is of that credit card type (or at least one of `creditCardType` if you pass in an array).\n * @sample Ink_Util_Validator_isCreditCard.html \n */\n isCreditCard: function(num, creditCardType){\n\n if ( /\\d+/.test(num) === false ){\n return false;\n }\n\n if ( typeof creditCardType === 'undefined' ){\n creditCardType = 'default';\n }\n else if ( creditCardType instanceof Array ){\n var i, ccLength = creditCardType.length;\n for ( i=0; i < ccLength; i++ ){\n // Test each type for validity\n if (this.isCreditCard(num, creditCardType[i]) ){\n return true;\n }\n }\n\n return false;\n }\n\n // Check card type\n creditCardType = creditCardType.toLowerCase();\n\n if ( typeof this._creditCardSpecs[creditCardType] === 'undefined' ){\n return false;\n }\n\n // Check card number length\n var length = num.length+'';\n\n // Validate the card length by the card type\n if ( this._creditCardSpecs[creditCardType]['length'].split(\",\").indexOf(length) === -1 ){\n return false;\n }\n\n // Check card number prefix\n if ( !this._creditCardSpecs[creditCardType]['prefix'].test(num) ){\n return false;\n }\n\n // No Luhn check required\n if (this._creditCardSpecs[creditCardType]['luhn'] === false){\n return true;\n }\n\n return this._luhn(num);\n }\n };\n\n return Validator;\n\n});\n"]} \ No newline at end of file +{"version":3,"file":"ink-all.min.js","sources":["../../src/js/Ink/1/lib.js","../../src/js/Ink/Net/Ajax/1/lib.js","../../src/js/Ink/Net/JsonP/1/lib.js","../../src/js/Ink/Dom/Browser/1/lib.js","../../src/js/Ink/Dom/Css/1/lib.js","../../src/js/Ink/Dom/Element/1/lib.js","../../src/js/Ink/Dom/Event/1/lib.js","../../src/js/Ink/Dom/FormSerialize/1/lib.js","../../src/js/Ink/Dom/Loaded/1/lib.js","../../src/js/Ink/Dom/Selector/1/lib.js","../../src/js/Ink/UI/Animate/1/lib.js","../../src/js/Ink/UI/Carousel/1/lib.js","../../src/js/Ink/UI/Close/1/lib.js","../../src/js/Ink/UI/Common/1/lib.js","../../src/js/Ink/UI/DatePicker/1/lib.js","../../src/js/Ink/UI/Draggable/1/lib.js","../../src/js/Ink/UI/Drawer/1/lib.js","../../src/js/Ink/UI/Dropdown/1/lib.js","../../src/js/Ink/UI/Droppable/1/lib.js","../../src/js/Ink/UI/FormValidator/1/lib.js","../../src/js/Ink/UI/FormValidator/2/lib.js","../../src/js/Ink/UI/ImageQuery/1/lib.js","../../src/js/Ink/UI/LazyLoad/1/lib.js","../../src/js/Ink/UI/Modal/1/lib.js","../../src/js/Ink/UI/Pagination/1/lib.js","../../src/js/Ink/UI/ProgressBar/1/lib.js","../../src/js/Ink/UI/SmoothScroller/1/lib.js","../../src/js/Ink/UI/SortableList/1/lib.js","../../src/js/Ink/UI/Spy/1/lib.js","../../src/js/Ink/UI/Stacker/1/lib.js","../../src/js/Ink/UI/Sticky/1/lib.js","../../src/js/Ink/UI/Swipe/1/lib.js","../../src/js/Ink/UI/Table/1/lib.js","../../src/js/Ink/UI/Tabs/1/lib.js","../../src/js/Ink/UI/TagField/1/lib.js","../../src/js/Ink/UI/Toggle/1/lib.js","../../src/js/Ink/UI/Tooltip/1/lib.js","../../src/js/Ink/UI/TreeView/1/lib.js","../../src/js/Ink/UI/Upload/1/lib.js","../../src/js/Ink/Util/Array/1/lib.js","../../src/js/Ink/Util/BinPack/1/lib.js","../../src/js/Ink/Util/Cookie/1/lib.js","../../src/js/Ink/Util/Date/1/lib.js","../../src/js/Ink/Util/Dumper/1/lib.js","../../src/js/Ink/Util/I18n/1/lib.js","../../src/js/Ink/Util/Json/1/lib.js","../../src/js/Ink/Util/String/1/lib.js","../../src/js/Ink/Util/Url/1/lib.js","../../src/js/Ink/Util/Validator/1/lib.js"],"names":["window","document","paths","modules","modulesLoadOrder","modulesRequested","pendingRMs","modulesWaitingForDeps","apply","Function","prototype","isEmptyObject","o","k","hasOwnProperty","Ink","VERSION","_checkPendingRequireModules","I","F","dep","mod","cb","pRMs","toApply","length","left","args","remaining","push","i","setTimeout","getPath","key","noLib","split","curKey","root","path","slice","join","test","setPath","rootURI","replace","loadScript","uri","contentType","indexOf","givenUri","this","Error","scriptEl","createElement","setAttribute","onerror","error","head","getElementsByTagName","appendChild","_loadLater","namespace","ns","returnParentAndKey","levels","nsobj","parent","f","getModule","version","createModule","deps","modFn","modAll","Array","call","arguments","moduleContent","_version","isInkModule","t","requireModules","cbFn","undefined","_moduleRenames","warn","Ink.UI.Aux_1","getModulesLoadOrder","getModuleScripts","mlo","unshift","map","m","getModuleURL","createExt","moduleName","dependencies","bind","fn","context","innerArgs","finalArgs","concat","bindMethod","object","methodName","bindEvent","event","id","getElementById","ss","selector","from","Dom","Selector","select","s","extendObj","destination","sources","len","property","Object","log","console","Ajax","url","options","init","globalOptions","parameters","requestHeaders","xMLHttpRequestWithCredentials","XMLHttpRequest","userOptions","asynchronous","cors","validateCors","debug","delay","evalJS","method","postBody","sanitizeJSON","signRequest","timeout","useCredentials","xhrProxy","onComplete","onCreate","onException","onFailure","onHeaders","onInit","onSuccess","onTimeout","globalParameters","paramsObjToStr","safeCall","urlLocation","_locationFromURL","isHTTP","_locationIsHTTP","isCrossDomain","_locationIsCrossDomain","location","requestHasBody","search","transport","getTransport","request","createElementNS","href","match","protocol","widget","split1","split2","protocol1","protocol2","colonOrSlash","host1","host2","usingXDomainReq","XDomainRequest","ActiveXObject","e","setHeaders","headers","Accept","Accept-Language","navigator","language","X-Requested-With","X-Ink-Version","headerReqName","overrideMimeType","userAgent","Connection","headerName","setRequestHeader","optParams","p","a","params","toString","isNaN","encodeURIComponent","pop","setParams","getHeader","name","getResponseHeader","getAllHeaders","getAllResponseHeaders","getResponse","r","headerJSON","responseJSON","timeTaken","Date","startTime","requestedUrl","readyState","responseText","responseXML","status","statusText","abort","clearTimeout","delayTimeout","stoTimeout","ex","finish","runStateChange","rs","getTime","responseContent","response","curStatus","isSuccess","headerContentType","evalJSON","mimeType","xmlDoc","DOMParser","parseFromString","xml","onreadystatechange","destroy","handlerName","value","nodeType","crossDomain","open","withCredentials","onload","send","isJSON","str","strJSON","sanitize","JSON","parse","eval","load","callback","ping","JsonP","failureObj","callbackParam","internalCallback","randVar","parseInt","Math","random","Net","_cleanUp","_addScriptTag","_addParamsToGet","hasQuestionMark","sep","pKey","pValue","parts","_getScriptContainer","body","documentElement","rnd_seed","_scriptEl","type","src","scriptCtn","_removeScriptTag","parentNode","removeChild","Browser","IE","GECKO","OPERA","SAFARI","KONQUEROR","CHROME","model","cssPrefix","domPrefix","detectBrowser","setDimensions","setReferrer","myWidth","myHeight","innerWidth","innerHeight","clientWidth","clientHeight","windowWidth","windowHeight","referrer","escape","_sniffUserAgent","sAgent","toLowerCase","rVersion","re","RegExp","reVersion","alert","getCs","defaultView","getComputedStyle","Css","addRemoveClassName","elm","className","addRemState","addClassName","removeClassName","classList","add","hasClassName","remove","elmClassName","setClassName","all","has","contains","blinkClass","element","negate","Number","toggleClassName","forceAdd","toggle","setOpacity","val","style","opacity","filter","_camelCase","_","$1","toUpperCase","getStyle","currentStyle","charAt","css","parseFloat","setStyle","cssText","prop","styleFloat","cssFloat","show","forceDisplayProperty","display","hide","showHide","forceShow","_getRefTag","firstElementChild","child","firstChild","nextSibling","appendStyleTag","force","styles","oldStyle","l","innerHTML","defStyle","refTag","styleStr","styleSheet","createTextNode","insertBefore","appendStylesheet","media","rel","_loadingCSSFiles","_loadedCSSFiles","appendStylesheetCb","cbs","linkEl","headEl","imgEl","_url","callbacks","decToHex","dec","normalizeTo2","rDec","gDec","g","bDec","b","rgb","hexToDec","hex","substr","getPropertyFromStylesheet","rule","getRuleFromStylesheet","getPropertyFromStylesheet2","rules","getRulesFromStylesheet","x","sheet","ri","rf","styleSheets","si","sf","cssRules","selectorText","res","getPropertiesFromRule","props","steps","pre","pos","substring","borderTopLeftRadius","borderBottomRightRadius","borderTopRightRadius","borderBottomLeftRadius","changeFontSize","delta","op","minVal","maxVal","that","TypeError","el","els","fontSize","rect","elem","dimensions","getBoundingClientRect","top","offsetTop","offsetLeft","createContextualFragmentSupport","createRange","Range","createContextualFragment","deleteThisTbodyToken","browserCreatesTbodies","div","InkElement","isDOMElement","get","create","tag","properties","parEl","scrollTo","scrollIntoView","elmOffset","elmTop","elmLeft","offsetParent","y","offset","positionedOffset","valueTop","valueLeft","tagName","position","doc","ownerDocument","docElem","box","clientTop","clientLeft","scrollTop","pageYOffset","scrollLeft","pageXOffset","scroll","_getPropPx","cs","n","c","getPropertyValue","offset2","hasAttribute","attr","getAttribute","insertAfter","newElm","targetElm","insertTop","insertBottom","textContent","node","text","innerText","lastChild","childNodes","nodeValue","setTextContent","isLink","hasAttributeNS","isAncestorOf","ancestor","compareDocumentPosition","descendantOf","descendant","lastElementChild","previousSibling","nextElementSibling","sibling","previousElementSibling","elementWidth","offsetWidth","elementHeight","offsetHeight","elementLeft","elementTop","elementDimensions","outerDimensions","bbox","right","bottom","inViewport","dims","partial","margin","viewportWidth","viewportHeight","isHidden","w","h","isVisible","clonePosition","cloneTo","cloneFrom","ellipsizeText","overflow","whiteSpace","textOverflow","findUpwardsHaving","boolTest","findUpwardsByClass","tst","cls","findUpwardsByTag","nodeName","findUpwardsById","findUpwardsBySelector","sel","matchesSelector","getChildrenText","removeIt","j","part","nodes","jLen","_trimString","String","data","trim","getSelectValues","selectEl","values","_normalizeData","d","data2","fillSelect","container","skipEmpty","defaultValue","containerEl","optionEl","fillRadios","insertAfterEl","splitEl","inputEl","checked","fillChecks","parentIndexOf","parentEl","childEl","children","nextSiblings","elements","siblings","index","previousSiblings","childElementCount","_wrapElements","TABLE","html","TBODY","THEAD","TFOOT","TR","_getWrapper","wrapper","wrapFunc","tds","tbody","appendHTML","prependHTML","setHTML","wrap","target","nextNode","unwrap","wrapperSelector","replacement","replaceChild","removeTextNodeChildren","prevEl","toRemove","htmlToFragment","range","createDocumentFragment","selectNode","fragment","tempElement","current","InkDomSelector","dataset","attrs","attributes","curAttr","curAttrName","curAttrValue","total","moveCursorTo","setSelectionRange","createTextRange","collapse","moveEnd","moveStart","pageWidth","xScroll","scrollMaxX","scrollWidth","self","pageHeight","yScroll","scrollMaxY","scrollHeight","bean","definition","win","old","namespaceRegex","nameRegex","addEvent","removeEvent","W3C_MODEL","eventSupport","ONE","str2arr","isString","isFunction","standardNativeEvents","w3cNativeEvents","nativeEvents","hash","events","customEvents","isAncestor","check","related","relatedTarget","prefix","mouseenter","base","condition","mouseleave","mousewheel","Event","commonProps","mouseProps","mouseWheelProps","keyProps","textProps","touchProps","messageProps","stateProps","overOutRegex","typeFixers","reg","fix","newEvent","keyCode","which","rightClick","button","pageX","pageY","clientX","clientY","typeFixerMap","isNative","parentWindow","originalEvent","isBean","srcElement","fixer","preventDefault","returnValue","stopPropagation","cancelBubble","stop","stopped","stopImmediatePropagation","isImmediatePropagationStopped","clone","currentTarget","ne","targetElement","RegEntry","wrappedHandler","eargs","findTarget","eventElement","__beanDel","ft","handler","original","namespaces","customType","once","removeListener","eventType","inNamespaces","checkNamespaces","matches","checkElement","checkOriginal","checkHandler","registry","forAll","pfx","list","entries","entry","put","del","splice","removed","selectorEngine","setSelectorEngine","querySelectorAll","rootListener","propertyName","listeners","listener","custom","attachEvent","detachEvent","rm","originalFn","orgType","handlers","delegate","array","fireListener","evt","createEvent","dispatchEvent","fireEvent","createEventObject","off","typeSpec","isTypeStr","on","types","first","delfn","one","fire","names","beanDel","noConflict","cleanup","CollectGarbage","InkEvent","KEY_BACKSPACE","KEY_TAB","KEY_RETURN","KEY_ESC","KEY_SPACE","KEY_LEFT","KEY_UP","KEY_RIGHT","KEY_DOWN","KEY_DELETE","KEY_HOME","KEY_END","KEY_PAGEUP","KEY_PAGEDOWN","KEY_INSERT","throttle","func","wait","throttled","now","timeDiff","lastCall","ev","delegationTarget","fromElement","toElement","findElement","elmTagName","observe","eventName","callBack","useCapture","addEventListener","observeOnce","onceBack","stopObserving","observeMulti","observeDelegated","cursor","Selector_1","removeEventListener","cancel","stopDefault","pointer","pointerX","pointerY","touches","isLeftClick","isRightClick","isMiddleClick","getCharFromKeyboardEvent","changeCasing","fromCharCode","shiftOn","shiftKey","InkArray","isArrayIsh","obj","isArray","toArray","FormSerialize","serialize","form","out","emptyArrayToken","pairs","asPairs","emptyArray","outputUnchecked","forEach","pair","_resultsInArray","emit","serializeEl","elNodeName","elType","multiple","didEmit","thisOption","inputs","_isSerialized","fillIn","map2","_objToPairs","_fillInPairs","groupBy","reduce","_fillInOne","firstOne","firstNodeName","firstType","isSelectMulti","_fillInBoolean","min","checkAttr","input","isChecked","inArray","Loaded","_contexts","run","cbQueue","done","checkState","_checkState","poll","_poll","ael","rem","det","wet","csf","alreadyLoaded","frameElement","doScroll","where","_ready","rnative","createCache","cache","keys","Expr","cacheLength","shift","markFunction","expando","assert","Sizzle","results","seed","groups","nid","newContext","newSelector","preferredDoc","setDocument","documentIsHTML","rquickExpr","exec","support","getElementsByClassName","qsa","rbuggyQSA","tokenize","rescape","toSelector","rsibling","qsaError","removeAttribute","rtrim","siblingCheck","cur","diff","sourceIndex","MAX_NEGATIVE","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","parseOnly","matched","tokens","soFar","preFilters","cached","tokenCache","preFilter","rcomma","rcombinators","matchExpr","addCombinator","matcher","combinator","dir","checkNonElements","doneName","outerCache","dirkey","dirruns","cachedruns","elementMatcher","matchers","condense","unmatched","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","elems","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","relative","implicitRelative","matchContext","matchAnyContext","outermostContext","matcherFromGroupMatchers","elementMatchers","setMatchers","matcherCachedRuns","bySet","byElement","superMatcher","expandContext","setMatched","matchedCount","outermost","contextBackup","find","dirrunsUnique","uniqueSort","contexts","token","runescape","funescape","compile","setFilters","getText","isXML","recompare","sortInput","rbuggyMatches","classCache","compilerCache","hasDuplicate","sortOrder","strundefined","arr","push_native","whitespace","characterEncoding","identifier","operators","pseudos","rpseudo","ridentifier","ID","CLASS","NAME","TAG","ATTR","PSEUDO","CHILD","needsContext","rinputs","rheader","rattributeQuotes","escaped","high","createComment","getByName","pass","getElementsByName","sortDetached","div1","attrHandle","attrId","getAttributeNode","tmp","mozMatchesSelector","webkitMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","adown","bup","compare","aup","ap","bp","expr","ret","specified","msg","duplicates","detectDuplicates","sortStable","sort","selectors","createPseudo",">"," ","+","~","excess","unquoted","pattern","operator","result","what","last","simple","forward","ofType","nodeIndex","start","useCache","pseudo","idx","not","lang","elemLang","focus","activeElement","hasFocus","tabIndex","enabled","disabled","selected","selectedIndex","empty","header","eq","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","group","filters","Common","Animate","BaseUIComponent","animationPrefix","animationEndEventName","animation","webkitAnimation","_name","_optionDefinition","trigger","duration","removeClass","onEnd","_init","_options","animate","_element","_animationPrefix","animationSupported","onAnimationEnd","animationName","elOrSelector","createUIComponent","Pagination","limitRange","max","Carousel","setTransitionProperty","newTransition","transitionProperty","oTransitionProperty","msTransitionProperty","mozTransitionProperty","webkitTransitionProperty","requestAnimationFrame","autoAdvance","axis","initialPage","spaceAfterLastSlide","keyboardSupport","pagination","onChange","swipe","_handlers","paginationChange","windowResize","_isY","ulEl","width","_ulEl","_currentPage","refit","_setUpPagination","_setUpAutoAdvance","size","perpendicular","_liEls","numSlides","contRect","_ctnLength","_elLength","_slidesPerPage","floor","isFinite","numPages","ceil","numPagesChanged","_numPages","_deltaLength","_IE7","_pagination","setSize","setPage","getPage","setOnChange","setCurrent","nextPage","slides","stl","_onTouchStart","_swipeData","ulRect","firstUlPos","inUlX","inUlY","_touchMoveIsFirstTouchMove","_onTouchMove","deltaY","deltaX","aDeltaY","abs","aDeltaX","_scrolling","_onAnimationFrame","pointerDelta","pointerPos","swipeData","elRect","newPos","_onTouchEnd","snapToNext","curPage","progressInPages","_onPaginationChange","pgn","_setPage","getCurrent","getPagination","page","_lengthToGo","isLastPage","_itemsInLastPage","previousPage","getSlidesPerPage","getTotalPages","getStageElm","getSlidesList","getTotalSlides","Close","Url","warnStub","constructor","stub","_componentOptions","elementIsOptional","elsOrSelector","isValidInstance","_validateInstance","registerInstance","_stubInstance","nothing","es6WeakMapSupport","instances","WeakMap","_reg","domRegistry","set","thing","Layouts","TINY","SMALL","MEDIUM","LARGE","XLARGE","isInteger","fieldName","required","fieldId","defaults","overrides","optionValue","lType","defaultVal","invalidThrow","_coerce_funcs","fromDataAttrs","dataAttrs","_coerce_from_string","_options_validate","invalid","quote","invalidStr","paramName","_options_validate_types","number","boolean","string","function","integer","round","stringify","childIndex","ajaxJSON","endpoint","message","currentLayout","v","detectorEl","hashSet","hashParams","getAnchorString","genQueryString","cleanChildren","storeIdAndClasses","fromEl","inObj","_id","classes","_classes","restoreIdAndClasses","toEl","_instanceId","_warnDoubleInstantiation","newInstance","getName","getInstance","nameWithoutVersion","inst","unregisterInstance","UIComponent","givenEl","getInstanceFromSelector","getInstanceIds","getInstances","destroyComponent","instance","err","_validate","_validationError","getOption","setOption","getElement","theConstructor","assertProp","propType","propVal","_oldProto","hideF","InkDate","clamp","dateishFromYMDString","YMD","dateishFromYMD","year","month","day","_year","_month","_day","dateishFromDate","date","getFullYear","getMonth","getDate","DatePicker","autoOpen","cleanText","closeText","pickerField","containerElement","cssClass","dateRange","displayInSelect","dayField","monthField","yearField","format","nextLinkText","ofText","onFocus","onMonthSelected","onSetDate","onYearSelected","prevLinkText","showClean","showClose","shy","startDate","startWeekDay","validDayFn","validMonthFn","validYearFn","nextValidDateFn","prevValidDateFn","yearRange",1,2,3,4,5,6,7,8,9,10,11,12,"wDay","_dateParsers","_hoverPicker","_picker","_setMinMax","setDate","_lang","_render","_listenToContainerObjectEvents","_containerObject","_renderSuperTopBar","calendarTop","_monthDescContainer","_monthPrev","_monthNext","_monthContainer","_monthSelector","_renderMonthSelector","_yearSelector","_appendDatePickerToDom","_renderMonth","_monthChanger","_ofText","_yearChanger","inline","_addOpenCloseEvents","_addDateChangeHandlersToInputs","fields","_updateDate","_showDefaultView","_inline","_hide","opener","cannotBe","ulSelector","mon","_renderMonthButton","liMonth","data-cal-month","appendTarget","parentIsControl","_wrapper","_wrapperIsControl","_superTopBar","_onClick","_onRelativeChangerClick","_onAbsoluteChangerClick","_showMonthSelector","_showYearSelector","_clean","_updateDescription","changeYear","change_year_next","change_year_prev","changeMonth","change_month_next","change_month_prev","_updateCal","elemData","calDay","calMonth","calYear","_changeYear","blur","noLimits","_min","noMinLimit","_max","noMaxLimit","MAX_VALUE","dates","rDate","each","noLim","lim","_daysInMonth","valid","_dateCmp","_fitDateToRange","_isValidDate","_dateWithinRange","_dateAboveMax","_dateBelowMin","oth","_dateCmpUntil","depth","_getPrevMonth","_getNextMonth","dataParsed","_parseDate","_setDate","inc","_incrementViewingYear","firstYear","thisYear","yearUl","prevYearLi","_getYearButton","nextYearLi","_acceptableYear","li","data-cal-year","_addMonthClassNames","dateStr","yearRegExp","validOneOrTwo","_isDate","_acceptableDay","_acceptableDateComponent","_acceptableMonth","userCb","_callUserCallbackBool","_writeDateInFormat","dateString","auxDate","objClicked","dt","_updateMonth","_y","_m","exceptions","incValue","_tryLeap","_getPrevYear","_getNextYear","atomName","directionName","advancer","maxOrMin","boundary","leapUserCb","_callUserCallbackDate","daysInThisMonth","_getNextDecade","decade","_getCurrentDecade","_getPrevDecade","_callUserCallbackBase","yyyy-mm-dd","yyyy/mm/dd","yy-mm-dd","yy/mm/dd","dd-mm-yyyy","dd/mm/yyyy","dd-mm-yy","dd/mm/yy","mm/dd/yyyy","mm-dd-yyyy","_getMonthCalendarHeader","_getDayButtons","_getFirstDayIndex","wDayFirst","getDay","daysInMonth","ul","firstDayIndex","_getDayButton","dayButton","_addMonthButtonClassNames","btn","toDisable","showMonth","isMonthRendered","between","Draggable","constraint","constraintElm","handle","revert","zIndex","fps","droppableProxy","mouseAnchor","dragClass","skipChildren","onStart","onDrag","elmStartPosition","active","dragged","prevCoords","placeholder","zindex","firstDrag","deltaMs","lastRunAt","_onStart","dragFacade","_onDragFacade","drag","_onDrag","end","_onEnd","selectStart","_getCoords","ps","_cloneStyle","dst","borderWidth","padding","height","tgtEl","originalPosition","marginTop","marginBottom","marginLeft","marginRight","visibility","delta2","ad","applyDelta","dragHandlerName","proxy","fs","backgroundColor","firstEl","mouseCoords","mPosX","mPosY","newX","newY","draggableSize","constTop","constBottom","constLeft","constRight","Droppable","updateAll","mouseCoords2","action","pt","Element","pageWideFocusListener","onlyWrapper","_removePageWideFocusListener","mouseIsDown","focusFirstFocusableElementInside","withTabIndex","lowestTabIndex","lowestTabIndexElm","ind","firstFocusable","sFocusableElms","elNotFound","Drawer","transitionSupport","transitions","WebkitTransitionProperty","styleProp","parentSelector","leftDrawer","leftTrigger","rightDrawer","rightTrigger","contentDrawer","mode","sides","validateSide","side","drawer","triggers","atLeastOneSide","errorMsg","drawerOption","triggerOption","_contentDrawers","_leftDrawer","_leftTriggers","_rightDrawer","_rightTriggers","_triggers","_isOpen","_direction","click","afterTransition","_afterTransition","_addEvents","clickedTrigger","_onTriggerClicked","clickedInContent","clickedInLink","close","_getRecentDrawer","direction","drawerEl","_transitionWillOccur","uselessValue","lastFocused","didFocus","insideDrawer","transitioning","Toggle","Dropdown","hoverOpen","dismissOnInsideClick","dismissOnOutsideClick","dismissAfter","onInsideClick","onOutsideClick","onOpen","onDismiss","_toggle","closeOnInsideClick","closeOnClick","onChangeState","newState","_openOrDismiss","_onMouseOver","getState","_openTimeout","_dismissTimeout","_onMouseOut","_onInsideClick","_handlerCall","dismiss","_onOutsideClick","foundElem","needle","foundTarget","callHandler","_doNotInformToggle","setState","hAddClassName","hRemoveClassName","_droppables","_draggables","cleanStyle","draggable","opt","hoverClass","hoverclass","accept","onHover","onDrop","onDropOut","namedEventHandlers","move","droppable","copy","cloneNode","_findDraggable","originalParent","elementData","_update","_findData","elms","update","coords","InkValidator","elementsWithSameName","everything","FormValidator","_flagMap","ink-fv-required","ink-fv-email","ink-fv-url","ink-fv-number","ink-fv-phone_pt","ink-fv-phone_cv","ink-fv-phone_mz","ink-fv-phone_ao","ink-fv-date","ink-fv-confirm","ink-fv-custom","confirmElms","hasConfirm","_errorClassName","_errorValidationClassName","_errorTypeWarningClassName","_errorTypeErrorClassName","validate","_free","onError","customFlag","confirmGroup","fail","_validateElements","_showError","_clearError","_clearCache","_getElements","formElms","curElm","totalElm","flag","flag2","oGroups","_makeConfirmGroups","errors","customErrors","_isValid","_isCustomValid","_validateConfirmGroups","curGroup","totalG","curFlag","tCustom","fieldType","inputType","_trim","aFormRadios","totalRadio","mail","isPTPhone","isCVPhone","isAOPhone","isMZPhone","validFormat","validValues","isDate","formElm","aFail","tFail","_showAnErrorOnElement","controlGroupElm","controlElm","errorClasses","_errorTypeClassName","aErrorLabel","control","aErrorLabel2","I18n","FormElement","validationFunctions","min_length","minSize","max_length","maxSize","exact_length","exactSize","email","fullCheck","ip","ipType","isIP","phone","phoneType","countryCode","credit_card","cardType","isCreditCard","alpha","supportSpaces","ascii","singleLineWhitespace","punctuation","unicode","unicodePunctuation","latin","latin1","latin1Punctuation","alpha_numeric","numbers","alpha_dash","dash","underscore","digit","positive","negative","decimalPlaces","decimal","decimalSeparator","leftDigits","decimalSep","maxDigits","numeric","minValue","maxValue","multipleOf","color","isColor","fieldToCompare","otherField","getFormElements","otherFieldValue","getValue","_rules","validationMessages","en_US","formvalidator.required","formvalidator.min_length","formvalidator.max_length","formvalidator.exact_length","formvalidator.email","formvalidator.url","formvalidator.ip","formvalidator.phone","formvalidator.credit_card","formvalidator.date","formvalidator.alpha","formvalidator.text","formvalidator.latin","formvalidator.alpha_numeric","formvalidator.alpha_dash","formvalidator.digit","formvalidator.integer","formvalidator.decimal","formvalidator.numeric","formvalidator.range","formvalidator.color","formvalidator.matches","formvalidator.validation_function_not_found","pt_PT","label","_errors","_value","_getLabel","_parseRules","rulesLength","paramStartPos","_addError","paramObj","field","i18nKey","getErrors","_formElements","doValidate","eventTrigger","neverSubmit","searchFor","beforeValidation","setRule","errorMessage","getKey","langObj","dictObj","append","getI18n","setI18n","i18n","appendI18n","setLanguage","getRules","_rootElement","_errorMessages","_markedErrorElements","getElements","formElements","formElement","_getOrCreateFormElementInstance","errorElement","errorElements","counter","controlGroupElement","controlElement","paragraph","errorArr","ImageQuery","retina","queries","onLoad","lastIndexOf","_filename","sortMulti","reverse","_onLoad","_onResize","_findCurrentQuery","getQuerySrc","query","devicePixelRatio","LazyLoad","item","source","scrollElement","touchEvents","onInsideViewport","onAfterAttributeChange","autoInit","_aData","_hasEvents","_activate","_getData","_onScrollThrottled","aElms","_onScroll","_removeEvents","_elInViewport","_userCallback","reload","upName","dimension","firstCharacter","maxName","Modal","opacitySupported","openModals","shadeClass","modalClass","triggerEvent","autoDisplay","markup","onShow","closeOnEscape","responsive","_onShadeClick","keyDown","_onKeyDown","resize","_markupMode","_modalDiv","_modalShadow","_contentContainer","setContentMarkup","triggerElements","_reposition","isPercentage","currentViewport","originalStatus","_resizeContainer","_shadeElement","alertsInTheModal","alertsLength","containerHeight","_modalHeader","_modalFooter","isOpen","compatMode","_contentElement","_waitForFade","keyValue","htmlEl","fadeChecks","fadeChecker","getContentElement","contentMarkup","tempHeader","tempFooter","toAdd","genAEl","aEl","wrapText","spanEl","totalItemCount","itemsPerPage","sideButtons","firstLabel","lastLabel","previousLabel","nextLabel","previousPageLabel","nextPageLabel","hashParameter","parentTag","childTag","wrapperClass","paginationClass","activeClass","disabledClass","hideClass","previousClass","previousPageClass","nextClass","nextPageClass","firstClass","lastClass","numberFormatter","autoWrap","_size","_calculateSize","_current","_itemLiEls","_generateMarkup","_updateItems","_observe","count","liEls","isSimpleToggle","liEl","_nextEl","pi","pf","_pageStart","_pageEnd","_page","_prevPageEl","hasPreviousPage","_nextPageEl","hasNextPage","_firstEl","isFirst","_lastEl","isLast","_prevEl","hasPrevious","hasNext","hasUlAlready","isChevron","isDotted","createLiEl","isPrev","isNext","isPrevPage","isNextPage","aElem","nr","sz","setSizeInItems","totalItems","pageNumber","isRelative","next","previous","getSize","ProgressBar","startValue","_elementBar","setValue","newValue","cancelAnimationFrame","SmoothScroller","speed","changeHash","endPos","interval","onDone","onClick","render","link","thisDocument","linkedDocument","activeLiSelector","activeLi","Events","SortableList","hasTouch","maxTouchPoints","msMaxTouchPoints","placeholderClass","draggedClass","draggingClass","dragSelector","handleSelector","moveSelector","swap","cancelMouseOut","down","_onDown","_onMove","up","_onUp","_isMoving","_down","_move","_up","stopMoving","_placeholder","_movePlaceholder","_addMovingClasses","touch","elementFromPoint","validateMove","droppedElement","_removeMovingClasses","target_position","placeholder_position","from_top","from_left","targetIndex","spyTargets","addSpied","spied","observeOnScroll","observingOnScroll","onScroll","onScrollForTarget","activeEl","findActiveElement","toDeactivate","menuLinkSelector","toActivate","closest","Infinity","closestIndex","bBox","Spy","Stacker","column","customBreakPoints","largeMax","largeMin","mediumMax","mediumMin","smallMax","smallMin","largeCols","mediumCols","smallCols","isOrdered","onRunCallback","onResizeCallback","onAPIReloadCallback","_aList","_curLayout","_runFirstTime","_getPageItemsToList","_canApplyLayoutChange","_applyLayoutChange","addItem","reloadItems","_removeDomItems","_setCurLayout","customBreakpoints","_getColumnsToShow","cols","curLayout","_aColumn","totalCols","aItems","aNewList","ii","countCol","Sticky","offsetBottom","topElement","stickyClass","inlineDimensions","inlinePosition","bottomElement","activateInLayouts","_dims","scrollTarget","_isDisabledInLayout","_getDims","unstick","_unstick","bottomOfSticky","maxBottomOfSticky","_stickTo","_inlineDimensions","_getBottomOffset","bottomOfViewport","toBottomOfDocument","oldPosition","oldWidth","dimensionsInStatic","Swipe","onMove","minDist","maxDist","minDuration","maxDuration","storeGesture","stopEvents","_supported","db","_isOn","_isMeOrParent","_pushGesture","_gesture","_time","changedTouches","_target","_t0","_p0","t1","gesture","p1","dr","dist","sqrt","time","overallMovement","overallTime","InkUrl","InkString","Json","maybeTurnIntoNumber","rNumber","cmp","numberishEnabledCmp","aValue","bValue","Table","sameSame","pageSize","caretUpClass","caretDownClass","createEndpointUrl","createEndpointURL","getDataFromEndPoint","getDataFromEndpoint","processJSONRows","rows","processJSONRow","processJSONField","processJSONHeaders","processJSONTotalRows","totalRows","getSortKey","allowResetSorting","visibleFields","tdClassNames","paginationOptions","_thead","tHead","createTHead","_headers","thClick","_originalFields","_sortableFields","_originalData","_data","_totalRows","_resetSortOrder","_addHeadersClasses","_setPagination","headerLabel","classNames","_onThClick","paginated","sortable","_invertSortOrder","_setSortOrderOfColumn","row","_paginate","sortAndReverse","isAscending","_sort","caretHtml","order","firstIndex","lastIndex","_registerFieldNames","_fieldIsVisible","userKey","keyFunction","columnIndex","columnName","trA","trB","elementA","elementB","_createHeadersFromJson","tr","insertRow","th","_createSingleHeaderFromJson","_createRowsFromJSON","trIndex","_createSingleRowFromJson","rowIndex","_createFieldFromJson","fieldData","processor","_elOrFieldData","processed","isNumber","setEndpoint","currentPage","paginationEl","pageNo","_getSortOrder","_getDataViaAjax","_getUrl","urlCreator","parseUrl","sortField","endpointUri","success","JSONData","_onAjaxSuccess","jsonResponse","_rowLength","Tabs","preventUrlChange","onBeforeChange","menuSelector","contentSelector","triggerEventsOnLoad","_menu","_initializeDom","_setFirstActive","contentTabs","activeMenuLink","_findLinkByHref","_changeTab","runCallbacks","activeTabs","_activeMenuTab","_activeSection","_activeMenuLink","_onTabClickedGeneric","doChangeTab","_onTabClicked","tabElm","_dehashify","changeTab","_hashify","links","disable","enable","activeTab","activeSection","TagField","enterKey","backspaceKey","isTruthy","buggySplit","splitFunction","nativeSplit","compliantExecNpcg","separator","limit","output","flags","ignoreCase","multiline","extended","sticky","lastLastIndex","separator2","lastLength","tags","tagQuery","tagQueryAsync","allowRepeated","maxTags","outSeparator","autoSplit","_readInput","_viewElm","_input","_tagsFromMarkup","_tags","_onKeyUp","_onBlur","_refocus","tagname","option","_tagsToMarkup","_addTag","_removeTag","spc","_onEnterKeyDown","_onBackspaceKeyDown","_removeConfirm","_unsetRemovingVisual","_setRemovingVisual","tagIndex","_removeRemovingVisualTimeout","canToggleAnAncestor","isAccordion","initialState","classNameOn","classNameOff","_targets","_accordionContainer","_constructing","_bindEvents","state","_onTriggerEvent","isAncestorOfClickedElement","some","thisOne","_firstTime","_updateAccordion","otherToggle","shades","ancestorOfTargets","shadesLength","_group","Tooltip","EachTooltip","transitionDurationName","transitionPropertyName","transitionTimingFunctionName","bodies","spacing","forever","template","templatefield","fade","tooltips","tooltip","_destroy","_oppositeDirections","_onMouseMove","_delayTimeout","_makeTooltip","mousePosition","_getOpt","_createTooltipElement","_removeTooltip","_fadeInTooltipElement","_placeTooltipElement","_onTooltipMouseOver","_getFloatOpt","outerHTML","_getIntOpt","fadeTime","mPos","_setPos","targetElementPos","tleft","ttop","centerh","centerv","tooltipDims","elementDims","maxX","maxY","_getWhereValueInsideViewport","arrow","tooltipLeft","tooltipTop","toBottom","toRight","toLeft","toTop","viewport","dataAttrVal","instanceOption","_getMousePosition","pageDims","_getPageXY","elmDims","scrollDim","_getScroll","cWidth","cHeight","dd","TreeView","parentClass","openNodeClass","openClass","closedClass","iconTag","isParent","_getIcon","_setNodeOpen","_getChild","beOpen","icon","DirectoryReader","maxDepth","_read","_readDirectories","running","_readEntries","currentEntry","createReader","readEntries","isDirectory","clearArray","fullPath","_stopActivityTimeout","readError","activity","checkActivity","clearInterval","readComplete","setInterval","Queue","lists","items","getItems","parentId","purge","keepList","pid","priority","view","_searchByPid","UI","Upload","_fileButton","fileButton","_dropzone","dropzone","_setDropEvent","_setFileButton","dropzones","ondrop","_dropEventHandler","ondragleave","_onDragLeave","ondragend","_onDragEndEventHandler","ondragdrop","ondragenter","_onDragEnterHandler","ondragover","_onDragOverHandler","publish","btns","_fileChangeHandler","files","FormData","_addFilesToQueue","_events","fileFormName","maxFilesize","INVALID_FILE_NAME","extraData","useChunks","chunkSize","minSizeToUseChunks","endpointChunk","endpointChunkCommit","foldersEnabled","directoryMaxDepth","_queueId","_queueRunning","_folders","_supportChunks","Blob","dataTransfer","_files","webkitGetAsEntry","folders","_addFolderToQueue","invalidFolders","getFiles","isFile","convertToFile","hasParent","getSubDirs","created","fileID","directory","_processQueue","internalUpload","queueLen","canceled","_doRequest","_upload","xhr","forceAbort","showError","lengthComputable","loaded","lastModifiedDate","upload","onprogress","chunk_offset","chunk_upload_id","fd","blob","upload_path","parentID","rootPath","invalidOffset","upload_id","chunk_expires","expires","onabort","abortAll","abortOne","subscribe","arrayProto","testedObject","outKey","latestGroup","initial","aKeys","shuffle","tmp1","rnd","mapFn","filtered","intersect","arr1","arr2","shared","J","convert","unique","newArr","step","insert","rLen","iLen","Packer","fit","blocks","block","findNode","splitNode","used","GrowingPacker","growNode","canGrowDown","canGrowRight","shouldGrowRight","shouldGrowDown","growRight","growDown","sorts","area","msort","maxside","criteria","BinPack","binPack","bl","packer","sorter","dims2","fitted","unfitted","filled","Cookie","cookie","_Cookie","aCookie","aItem","decodeURIComponent","domain","secure","sName","sExpires","sPath","sDomain","sSecure","oDate","sDate","valueOf","nDate","expiresString","toGMTString","hostname","cookieName","expiresDate","_months","_iMonth","janeiro","jan","fevereiro","fev","março","mar","abril","abr","maio","mai","junho","jun","julho","jul","agosto","ago","setembro","outubro","novembro","nov","dezembro","dez","_wDays","_d","_iWeek","week","segunda","seg","terça","ter","quarta","qua","quinta","qui","sexta","sex","sábado","sáb","domingo","dom","nDays","_date","iFormat","escapeChar","jsDate","jsFirstDay","jsThisDay","jsHour","jsDay","suffixes","suffix","UTC","jsYearStart","days","jsMonth","getYear","jsYear","getHours","jsMinute","getMinutes","jsSecond","getSeconds","getTimezoneOffset","jsMinZone","jsMinutes","jsDayName","jsMonthName","str_date","mList","objIndex","dayY","dayW","hour","hourD","sec","msec","ampm","diffM","diffH","pattr","_haveDatetime","_haveYear","_haveYDay","_haveDay","_haveMonth","_haveMonthDay","_haveOnlyDay","_haveWDay","_haveWeek","_haveWeekWDay","_haveOnlyWDay","_validDate","_noDate","_haveHour12","_haveHour24","_haveHour","_haveMin","_haveSec","_haveMSec","_haveMoreM","_haveMoreS","_haveDiffM","_haveDiffH","dList","gmt","aux","Dumper","_tab","_formatParam","param","formated","_outputFormat","_getTabs","numberOfTabs","tabs","_i","indent","_typeof","printDump","write","returnDump","alertDump","windowDump","dumperwindow","pattrText","funcOrVal","dict","testMode","_dicts","_dict","_testMode","_gLang","newTestMode","gLang","langGlobal","_gDict","pars","isObj","$2","$3","ntext","strSin","strPlur","ordinal","num","lastDig","ordDict","byLastDigit","alias","_gDicts","appendGlobal","twoDigits","function_call","cx","dateToISOString","toISOString","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","toFixed","InkJson","_nativeJSON","_convertToUnicode","_escape","theString","\b","\t","\n","\f","\r","\"","\\","charCodeAt","_toUnicode","unicodeString","inInt","theUnicode","_stringifyValue","toJSON","arrayString","objectString","convertToUnicode","reviver","walk","holder","SyntaxError","InkUtilString","_chars","_entities","_accentedChars","_accentedRemovedChars","_htmlUnsafeChars","<","&","'","ucFirst","firstWordOnly","replacer","stripTags","allowed","aAllowed","aNewAllowed","cleanedTag","strAllowed","reAllowed","aFoundTags","htmlEntitiesEncode","htmlEntitiesDecode","$0","utf8Encode","utfstring","shortString","words","resultstr","truncateString","utf8Decode","c2","c3","removeAccentedChars","newString","substrCount","haystack","htmlEscapeUnsafe","chars","normalizeWhitespace","toUnicode","unescape","es","hexNum","escapeText","txt","whiteList","txt2","C","escapedCharRegex","unescapeText","strcmp","str1","str2","packetize","maxLen","_keyStr","getUrl","getQueryString","aParams","queryStr","aQueryStr","pairVar","getAnchor","anchor","anchorStr","aAnchorStr","aURL","scheme","host","re1","re2","re3","regPort","tmpHost1","port","tmpHost2","tmpUserPass","user","urlObj","frag","currentScriptElement","aScripts","curScript","Validator","_countryCodes","_internacionalPT","_indicativosPT",21,22,231,232,233,234,235,236,238,239,241,242,243,244,245,249,251,252,253,254,255,256,258,259,261,262,263,265,266,268,269,271,272,273,274,275,276,277,278,279,281,282,283,284,285,286,289,291,292,295,296,91,93,96,92,707,760,800,808,30,"_internacionalCV","_indicativosCV",95,97,98,99,"_internacionalAO","_indicativosAO","_internacionalMZ","_indicativosMZ",82,84,"_internacionalTL","_indicativosTL","_characterGroups","asciiAlpha","latin1Alpha","unicodeAlpha","space","nicknamePunctuation","newline","asciiPunctuation","createRegExp","checkCharacterGroups","numb","thousandSep","returnNumber","maxExcl","minExcl","_isLeapYear","parser","emailValido","full","reHTTP","reUrl","aInd","strInd","re351","reSpecialChars","reInt","reValid","isPortuguesePhone","re238","re244","re258","isTLPhone","re670","isPhone","codPostal","cp1","cp2","returnBothResults","cPostalSep","cPostal4","cPostal3","parserCPostal","cPostal","yearIndex","monthIndex","dayIndex","dateParser","keyword","hexa","rgba","hsl","hsla","_creditCardSpecs","default","luhn","american express","diners club","discover","jcb","maestro","mastercard","visa","_luhn","checksum","dbl","creditCardType","ccLength"],"mappings":"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","sourcesContent":["/**\n * Ink Core.\n * @module Ink_1\n * This module provides the necessary methods to create and load the modules using Ink.\n */\n\n;(function(window, document) {\n\n 'use strict';\n\n // skip redefinition of Ink core\n if ('Ink' in window) { return; }\n\n\n // internal data\n\n /*\n * NOTE:\n * invoke Ink.setPath('Ink', '/Ink/'); before requiring local modules\n */\n var paths = {};\n var modules = {};\n var modulesLoadOrder = [];\n var modulesRequested = {};\n var pendingRMs = [];\n var modulesWaitingForDeps = {};\n\n var apply = Function.prototype.apply;\n\n // auxiliary fns\n var isEmptyObject = function(o) {\n /*jshint unused:false */\n if (typeof o !== 'object') { return false; }\n for (var k in o) {\n if (o.hasOwnProperty(k)) {\n return false;\n }\n }\n return true;\n };\n\n /**\n * @namespace Ink_1\n */\n\n window.Ink = {\n /**\n * @property {String} VERSION\n **/\n VERSION: '3.1.4',\n _checkPendingRequireModules: function() {\n var I, F, o, dep, mod, cb, pRMs = [];\n var toApply = [];\n for (I = 0, F = pendingRMs.length; I < F; ++I) {\n o = pendingRMs[I];\n\n if (!o) { continue; }\n\n for (dep in o.left) {\n if (o.left.hasOwnProperty(dep)) {\n mod = modules[dep];\n if (mod) {\n o.args[o.left[dep] ] = mod;\n delete o.left[dep];\n --o.remaining;\n }\n }\n }\n\n if (o.remaining > 0) {\n pRMs.push(o);\n } else {\n cb = o.cb;\n if (!cb) { continue; }\n delete o.cb; // to make sure I won't call this more than once!\n toApply.push([cb, o.args]);\n }\n }\n\n pendingRMs = pRMs;\n\n for (var i = 0; i < toApply.length; i++) {\n toApply[i][0].apply(false, toApply[i][1]);\n }\n\n if (pendingRMs.length > 0) {\n setTimeout( function() { Ink._checkPendingRequireModules(); }, 0 );\n }\n },\n\n /**\n * Get the full path of a module.\n * This method looks up the paths given in setPath (and ultimately the default Ink's path).\n *\n * @method getPath\n * @param {String} key Name of the module you want to get the path\n * @param {Boolean} [noLib] Flag to skip appending 'lib.js' to the returned path.\n *\n * @return {String} The URI to the module, according to what you added in setPath for the given `key`.\n */\n getPath: function(key, noLib) {\n var split = key.split(/[._]/g);\n var curKey;\n var i;\n var root;\n var path;\n\n // Look for Ink.Dom.Element.1, Ink.Dom.Element, Ink.Dom, Ink in this order.\n for (i = split.length; i >= 0; i -= 1) {\n curKey = split.slice(0, i + 1).join('.'); // See comment in setPath\n if (paths[curKey]) {\n root = curKey;\n break;\n }\n }\n\n if (root in paths) {\n path = paths[root];\n } else {\n return null;\n }\n\n if (!/\\/$/.test(path)) {\n path += '/';\n }\n if (i < split.length) {\n // Add the rest of the path. For example, if we found\n // paths['Ink.Dom'] to be 'http://example.com/Ink/Dom/',\n // we now add '/Element/' to get the full path.\n path += split.slice(i + 1).join('/') + '/';\n }\n if (!noLib) {\n path += 'lib.js';\n }\n return path;\n },\n\n /**\n * Sets the URL path for a namespace.\n * Use this to customize where requireModules and createModule will load dependencies from.\n * This can be useful to set your own CDN for dynamic module loading or simply to change your module folder structure\n *\n * @method setPath\n *\n * @param {String} key Module or namespace\n * @param {String} rootURI Base URL path and schema to be appended to the module or namespace\n * @return {void}\n *\n * @example\n * Ink.setPath('Ink', 'http://my-cdn/Ink/');\n * Ink.setPath('Lol', 'http://my-cdn/Lol/');\n *\n * // Loads from http://my-cdn/Ink/Dom/Whatever/lib.js\n * Ink.requireModules(['Ink.Dom.Whatever'], function () { ... });\n * // Loads from http://my-cdn/Lol/Whatever/lib.js\n * Ink.requireModules(['Lol.Whatever'], function () { ... });\n */\n setPath: function(key, rootURI) {\n // Replacing version separator with dot because the difference\n // between a submodule and a version doesn't matter here.\n // It would also overcomplicate the implementation of getPath\n paths[key.replace(/_/, '.')] = rootURI;\n },\n\n /**\n * Loads a script URL.\n * This creates a `script` tag in the `head` of the document.\n * Reports errors by listening to 'error' and 'readystatechange' events.\n *\n * @method loadScript\n * @param {String} uri Can be an external URL or a module name\n * @param {String} [contentType]='text/javascript' The `type` attribute of the new script tag.\n * @return {Element} The newly created script element.\n */\n loadScript: function(uri, contentType) {\n /*jshint evil:true */\n\n if (uri.indexOf('/') === -1) {\n var givenUri = uri; // For the error message\n uri = this.getPath(uri);\n if (uri === null) {\n throw new Error('Could not load script \"' + givenUri + '\". ' +\n 'Path not found in the registry. Did you misspell ' +\n 'the name, or forgot to call setPath()?');\n }\n }\n\n var scriptEl = document.createElement('script');\n scriptEl.setAttribute('type', contentType || 'text/javascript');\n scriptEl.setAttribute('src', uri);\n\n if ('onerror' in scriptEl) {\n scriptEl.onerror = function () {\n Ink.error(['Failed to load script from ', uri, '.'].join(''));\n };\n }\n\n var head = document.head ||\n document.getElementsByTagName('head')[0];\n\n if (head) {\n return head.appendChild(scriptEl);\n }\n },\n\n _loadLater: function (dep) {\n setTimeout(function () {\n if (modules[dep] || modulesRequested[dep] ||\n modulesWaitingForDeps[dep]) {\n return;\n }\n modulesRequested[dep] = true;\n Ink.loadScript(dep);\n }, 0);\n },\n\n /**\n * Defines a module namespace.\n *\n * @method namespace\n * @param {String} ns Namespace to define.\n * @param {Boolean} [returnParentAndKey] Flag to change the return value to an array containing the namespace parent and the namespace key\n * @return {Object|Array} Returns the created namespace object\n */\n namespace: function(ns, returnParentAndKey) {\n if (!ns || !ns.length) { return null; }\n\n var levels = ns.split('.');\n var nsobj = window;\n var parent;\n\n for (var i = 0, f = levels.length; i < f; ++i) {\n nsobj[ levels[i] ] = nsobj[ levels[i] ] || {};\n parent = nsobj;\n nsobj = nsobj[ levels[i] ];\n }\n\n if (returnParentAndKey) {\n return [\n parent,\n levels[i-1]\n ];\n }\n\n return nsobj;\n },\n\n /**\n * Loads a module.\n * A synchronous method to get the module from the internal registry.\n * It assumes the module is defined and loaded already!\n *\n * @method getModule\n * @param {String} mod Module name\n * @param {Number} [version] Version number of the module\n * @return {Object|Function} Module object or function, depending how the module is defined\n */\n getModule: function(mod, version) {\n var key = version ? [mod, '_', version].join('') : mod;\n return modules[key];\n },\n\n /**\n * Creates a new module.\n * Use this to wrap your code and benefit from the module loading used throughout the Ink library\n *\n * @method createModule\n * @param {String} mod Module name, separated by dots. Like Ink.Dom.Selector, Ink.UI.Modal\n * @param {Number} version Version number\n * @param {Array} deps Array of module names which are dependencies of the module being created. The order in which they are passed here will define the order they will be passed to the callback function.\n * @param {Function} modFn The callback function to be executed when all the dependencies are resolved. The dependencies are passed as arguments, in the same order they were declared. The function itself should return the module.\n * @return {void}\n * @sample Ink_1_createModule.html\n *\n */\n createModule: function(mod, version, deps, modFn) { // define\n if (typeof mod !== 'string') {\n throw new Error('module name must be a string!');\n }\n\n // validate version correctness\n if (!(typeof version === 'number' || (typeof version === 'string' && version.length > 0))) {\n throw new Error('version number missing!');\n }\n\n var modAll = [mod, '_', version].join('');\n\n modulesWaitingForDeps[modAll] = true;\n\n var cb = function() {\n //console.log(['createModule(', mod, ', ', version, ', [', deps.join(', '), '], ', !!modFn, ')'].join(''));\n\n // make sure module in not loaded twice\n if (modules[modAll]) {\n //console.warn(['Ink.createModule ', modAll, ': module has been defined already.'].join(''));\n return;\n }\n\n\n // delete related pending tasks\n delete modulesRequested[modAll];\n delete modulesRequested[mod];\n\n\n // run module's supplied factory\n var args = Array.prototype.slice.call(arguments);\n var moduleContent = modFn.apply(window, args);\n modulesLoadOrder.push(modAll);\n // console.log('** loaded module ' + modAll + '**');\n\n\n // set version\n if (typeof moduleContent === 'object') { // Dom.Css Dom.Event\n moduleContent._version = version;\n }\n else if (typeof moduleContent === 'function') {\n moduleContent.prototype._version = version; // if constructor\n moduleContent._version = version; // if regular function\n }\n\n\n // add to global namespace...\n var isInkModule = mod.indexOf('Ink.') === 0;\n var t;\n if (isInkModule) {\n t = Ink.namespace(mod, true); // for mod 'Ink.Dom.Css', t[0] gets 'Ink.Dom' object and t[1] 'Css'\n }\n\n\n // versioned\n modules[ modAll ] = moduleContent; // in modules\n delete modulesWaitingForDeps[ modAll ];\n\n if (isInkModule) {\n t[0][ t[1] + '_' + version ] = moduleContent; // in namespace\n }\n\n\n // unversioned\n modules[ mod ] = moduleContent; // in modules\n\n if (isInkModule) {\n if (isEmptyObject( t[0][ t[1] ] )) {\n t[0][ t[1] ] = moduleContent; // in namespace\n }\n // else {\n // console.warn(['Ink.createModule ', modAll, ': module has been defined already with a different version!'].join(''));\n // }\n }\n\n\n if (this) { // there may be pending requires expecting this module, check...\n Ink._checkPendingRequireModules();\n }\n };\n\n this.requireModules(deps, cb);\n },\n\n /**\n * Requires modules asynchronously\n * Use this to get modules, even if they're not loaded yet\n *\n * @method requireModules\n * @param {Array} deps Array of module names. The order in which they are passed here will define the order they will be passed to the callback function.\n * @param {Function} cbFn The callback function to be executed when all the dependencies are resolved. The dependencies are passed as arguments, in the same order they were declared.\n * @return {void}\n * @sample Ink_1_requireModules.html\n */\n requireModules: function(deps, cbFn) { // require\n //console.log(['requireModules([', deps.join(', '), '], ', !!cbFn, ')'].join(''));\n var i, f, o, dep, mod;\n f = deps && deps.length;\n o = {\n args: new Array(f),\n left: {},\n remaining: f,\n cb: cbFn\n };\n\n if (!(typeof deps === 'object' && deps.length !== undefined)) {\n throw new Error('Dependency list should be an array!');\n }\n if (typeof cbFn !== 'function') {\n throw new Error('Callback should be a function!');\n }\n\n for (i = 0; i < f; ++i) {\n if (Ink._moduleRenames[deps[i]]) {\n Ink.warn(deps[i] + ' was renamed to ' + Ink._moduleRenames[deps[i]]);\n dep = Ink._moduleRenames[deps[i]];\n } else {\n dep = deps[i];\n }\n\n // Because trailing commas in oldIE bring us undefined values here\n if (!dep) {\n --o.remaining;\n continue;\n }\n\n mod = modules[dep];\n if (mod) {\n o.args[i] = mod;\n --o.remaining;\n continue;\n }\n else if (!modulesRequested[dep]) {\n Ink._loadLater(dep);\n }\n o.left[dep] = i;\n }\n\n if (o.remaining > 0) {\n pendingRMs.push(o);\n }\n else {\n cbFn.apply(true, o.args);\n }\n },\n\n _moduleRenames: {\n 'Ink.UI.Aux_1': 'Ink.UI.Common_1'\n },\n\n /**\n * Lists loaded module names.\n * The list is ordered by loaded time (oldest module comes first)\n *\n * @method getModulesLoadOrder\n * @return {Array} returns the order in which modules were resolved and correctly loaded\n */\n getModulesLoadOrder: function() {\n return modulesLoadOrder.slice();\n },\n\n /**\n * Builds the markup needed to load the modules.\n * This method builds the script tags needed to load the currently used modules\n *\n * @method getModuleScripts\n * @uses getModulesLoadOrder\n * @return {String} The script markup\n */\n getModuleScripts: function() {\n var mlo = this.getModulesLoadOrder();\n mlo.unshift('Ink_1');\n mlo = mlo.map(function(m) {\n return [''].join('');\n });\n\n return mlo.join('\\n');\n },\n\n /**\n * Creates an Ink.Ext module\n *\n * Does exactly the same as createModule but creates the module in the Ink.Ext namespace\n *\n * @method createExt\n * @uses createModule\n * @param {String} moduleName Extension name\n * @param {String} version Extension version\n * @param {Array} dependencies Extension dependencies\n * @param {Function} modFn Function returning the extension\n * @return {void}\n * @sample Ink_1_createExt.html\n */\n createExt: function (moduleName, version, dependencies, modFn) {\n return Ink.createModule('Ink.Ext.' + moduleName, version, dependencies, modFn);\n },\n\n /**\n * Function.prototype.bind alternative/fallback.\n * Creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called.\n *\n * @method bind\n * @param {Function} fn The function\n * @param {Object} context The value to be passed as the this parameter to the target function when the bound function is called. If used as false, it preserves the original context and just binds the arguments.\n * @param {Mixed} [more...] Additional arguments will be sent to the original function as prefix arguments.\n * @return {Function} A copy of `fn` bound to the given `context`. Calling this function causes a call to `fn` with the new `context` and any `more` arguments.\n * @sample Ink_1_bind.html\n */\n bind: function(fn, context) {\n var args = Array.prototype.slice.call(arguments, 2);\n return function() {\n var innerArgs = Array.prototype.slice.call(arguments);\n var finalArgs = args.concat(innerArgs);\n return fn.apply(context === false ? this : context, finalArgs);\n };\n },\n\n /**\n * Function.prototype.bind alternative for class methods\n * See Ink.bind. The difference between `bindMethod` and `bind` is that `bindMethod` fetches a method from an object. It can be useful, for instance, to bind a function which is a property of an object returned by another function.\n *\n * @method bindMethod\n * @uses bind\n * @param {Object} object The object that contains the method to bind\n * @param {String} methodName The name of the method that will be bound\n * @param {Mixed} [more...] Additional arguments will be sent to the new method as prefix arguments.\n * @return {Function} See Ink.bind.\n * @sample Ink_1_bindMethod.html\n */\n bindMethod: function (object, methodName) {\n return Ink.bind.apply(Ink,\n [object[methodName], object].concat([].slice.call(arguments, 2)));\n },\n\n /**\n * Function.prototype.bind alternative for event handlers.\n * Same as bind but keeps first argument of the call the original event.\n * Set `context` to `false` to preserve the original context of the function and just bind the arguments.\n *\n * @method bindEvent\n * @param {Function} fn The function\n * @param {Object} context The value to be passed as the this parameter to the target\n * @param {Mixed} [more...] Additional arguments will be sent to the original function as prefix arguments\n * @return {Function} A function which will always call `fn` with the given event (or window.event, in IE) as the first argument.\n * @sample Ink_1_bindEvent.html\n */\n bindEvent: function(fn, context) {\n var args = Array.prototype.slice.call(arguments, 2);\n return function(event) {\n var finalArgs = args.slice();\n finalArgs.unshift(event || window.event);\n return fn.apply(context === false ? this : context, finalArgs);\n };\n },\n\n /**\n * Shorter alias to document.getElementById.\n * Just calls `document.getElementById(id)`, unless `id` happens to be an element.\n * If `id` is an element, `Ink.i` just returns it.\n *\n * You can use this in situations where you want to accept an element id, but a raw element is also okay.\n *\n * @method i\n * @param {String} id Element ID\n * @return {DOMElement|null} The element returned by `document.getElementById(id)` if `id` was a string, and `id` otherwise.\n * @sample Ink_1_i.html\n */\n i: function(id) {\n if(typeof(id) === 'string') {\n return document.getElementById(id) || null;\n }\n return id;\n },\n\n /**\n * Alias for Ink.Dom.Selector\n *\n * Using sizzle-specific selectors is NOT encouraged!\n *\n * @method ss\n * @uses Ink.Dom.Selector.select\n * @param {String} selector CSS3 selector string\n * @param {DOMElement} [from=document] Context element. If set to a DOM element, the `selector` will only look for descendants of this DOM Element.\n * @return {Array} array of DOMElements\n * @sample Ink_1_ss.html\n */\n ss: function(selector, from)\n {\n if(typeof(Ink.Dom) === 'undefined' || typeof(Ink.Dom.Selector) === 'undefined') {\n throw new Error('This method requires Ink.Dom.Selector');\n }\n return Ink.Dom.Selector.select(selector, (from || document));\n },\n\n /**\n * Selects elements like `Ink.ss`, but only returns the first element found.\n *\n * Using sizzle-specific selectors is NOT encouraged!\n *\n * @method s\n * @uses Ink.Dom.Selector.select\n * @param {String} selector CSS3 selector string\n * @param {DOMElement} [from=document] Context element. If set to a DOM element, the `selector` will only look for descendants of this DOM Element.\n * @return {DOMElement} The first element found which matches the `selector`, or `null` if nothing is found.\n * @sample Ink_1_s.html\n */\n s: function(selector, from)\n {\n if(typeof(Ink.Dom) === 'undefined' || typeof(Ink.Dom.Selector) === 'undefined') {\n throw new Error('This method requires Ink.Dom.Selector');\n }\n return Ink.Dom.Selector.select(selector, (from || document))[0] || null;\n },\n\n /**\n * Extends an object with another\n * Copy all of the properties in one or more source objects over to the destination object, and return the destination object. It's in-order, so the last source will override properties of the same name in previous arguments.\n *\n * @method extendObj\n * @param {Object} destination The object that will receive the new/updated properties\n * @param {Object} source The object whose properties will be copied over to the destination object\n * @param {Object} [more...] Additional source objects. The last source will override properties of the same name in the previous defined sources\n * @return {Object} destination object, enriched with defaults from the sources\n * @sample Ink_1_extendObj.html\n */\n extendObj: function(destination/*, source... */) {\n var sources = [].slice.call(arguments, 1);\n\n for (var i = 0, len = sources.length; i < len; i++) {\n if (!sources[i]) { continue; }\n for (var property in sources[i]) {\n if(Object.prototype.hasOwnProperty.call(sources[i], property)) {\n destination[property] = sources[i][property];\n }\n }\n }\n\n return destination;\n },\n\n /**\n * Calls native console.log if available.\n *\n * @method log\n * @param {Mixed} [more...] Arguments to be evaluated\n * @return {void}\n * @sample Ink_1_log.html\n **/\n log: function () {\n // IE does not have console.log.apply in IE10 emulated mode\n var console = window.console;\n if (console && console.log) {\n apply.call(console.log, console, arguments);\n }\n },\n\n /**\n * Calls native console.warn if available.\n *\n * @method warn\n * @param {Mixed} [more...] Arguments to be evaluated\n * @return {void}\n * @sample Ink_1_warn.html\n **/\n warn: function () {\n // IE does not have console.log.apply in IE10 emulated mode\n var console = window.console;\n if (console && console.warn) {\n apply.call(console.warn, console, arguments);\n }\n },\n\n /**\n * Calls native console.error if available.\n *\n * @method error\n * @param {Mixed} [more...] Arguments to be evaluated\n * @return {void}\n * @sample Ink_1_error.html\n **/\n error: function () {\n // IE does not have console.log.apply in IE10 emulated mode\n var console = window.console;\n if (console && console.error) {\n apply.call(console.error, console, arguments);\n }\n }\n };\n\n\n // TODO for debug - to detect pending stuff\n /*\n var failCount = {}; // fail count per module name\n var maxFails = 3; // times\n var checkDelta = 0.5; //seconds\n\n var tmpTmr = setInterval(function() {\n var mk = Object.keys(modulesRequested);\n var l = mk.length;\n\n if (l > 0) {\n // console.log('** waiting for modules: ' + mk.join(', ') + ' **');\n\n for (var i = 0, f = mk.length, k, v; i < f; ++i) {\n k = mk[i];\n v = failCount[k];\n failCount[k] = (v === undefined) ? 1 : ++v;\n\n if (v >= maxFails) {\n console.error('** Loading of module ' + k + ' failed! **');\n delete modulesRequested[k];\n }\n }\n }\n else {\n // console.log('** Module loads complete. **');\n clearInterval(tmpTmr);\n }\n }, checkDelta*1000);\n */\n}(window, document));\n","/**\n * Cross Browser Ajax requests\n * @module Ink.Net.Ajax_1\n * @version 1\n */\n\nInk.createModule('Ink.Net.Ajax', '1', [], function() {\n 'use strict';\n\n /**\n * Creates a new XMLHttpRequest object\n *\n * @class Ink.Net.Ajax\n * @constructor\n *\n * @param {String} url Request URL\n * @param {Object} [options] Request options, containing:\n * @param {Boolean} [options.asynchronous=true] If false, the request synchronous.\n * @param {String} [options.contentType] Content-type header to be sent. Defaults to 'application/x-www-form-urlencoded'\n * @param {Boolean} [options.cors] Flag to activate CORS. Set this to true if you're doing a cross-origin request\n * @param {Boolean} [options.validateCors] If this is set to `true`, perform a CORS request automatically based on the URL being cross-domain or not.\n * @param {Number} [options.delay] Artificial delay. If the request is completed faster than this delay, wait the remaining time before executing the callbacks\n * @param {Boolean|String} [options.evalJS=true] If the request Content-type header is application/json, evaluates the response and populates responseJSON. Use 'force' if you want to force the response evaluation, no matter what Content-type it's using.\n * @param {String} [options.method='POST'] HTTP request method. POST by default.\n * @param {Object|String} [options.parameters] Request parameters to be sent with the request\n * @param {String} [options.postBody] POST request body. If not specified, it's filled with the contents from parameters\n * @param {Object} [options.requestHeaders] Key-value pairs for additional request headers\n * @param {Boolean} [options.sanitizeJSON] Flag to sanitize the content of responseText before evaluation\n * @xparam {Boolean} [options.signRequest=false] Send a \"X-Requested-With: XMLHttpRequest\" header in the request.\n * @param {Number} [options.timeout] Request timeout in seconds\n * @param {String} [options.xhrProxy] URI for proxy service hosted on the same server as the web app, that can fetch documents from other domains. The service must pipe all input and output untouched (some input sanitization is allowed, like clearing cookies). e.g., requesting http://example.org/doc can become /proxy/http%3A%2F%2Fexample.org%2Fdoc The proxy service will be used for cross-domain requests, if set, else a network error is returned as exception.\n * @param {Function} [options.onComplete] Callback executed after the request is completed, regardless of what happened during the request.\n * @param {Function} [options.onCreate] Callback executed after object initialization but before the request is made\n * @param {Function} [options.onException] Callback executed if an exception occurs. Receives the exception as a parameter.\n * @param {Function} [options.onFailure] Callback executed if the request fails (requests with status codes different from 2xx)\n * @param {Function} [options.onHeaders] Callback executed when headers of the response arrive.\n * @param {Function} [options.onInit] Callback executed before any initialization\n * @param {Function} [options.onSuccess] Callback executed if the request is successful (requests with 2xx status codes)\n * @param {Function} [options.onTimeout] Callback executed if the request times out\n *\n * @sample Ink_Net_Ajax_1.html \n */\n var Ajax = function(url, options){\n this.init(url, options);\n };\n\n /**\n * Options for all requests. These can then be overriden for individual ones.\n */\n Ajax.globalOptions = {\n parameters: {},\n requestHeaders: {}\n };\n\n\n // IE10 does not need XDomainRequest\n var xMLHttpRequestWithCredentials = 'XMLHttpRequest' in window && 'withCredentials' in (new XMLHttpRequest());\n\n\n\n Ajax.prototype = {\n\n init: function(url, userOptions) {\n if (!url) {\n throw new Error(\"new Ink.Net.Ajax: Pass a url as the first argument!\");\n }\n var options = Ink.extendObj({\n asynchronous: true,\n contentType: 'application/x-www-form-urlencoded',\n cors: false,\n validateCors: false,\n debug: false,\n delay: 0,\n evalJS: true,\n method: 'POST',\n parameters: null,\n postBody: '',\n requestHeaders: null,\n sanitizeJSON: false,\n signRequest: false,\n timeout: 0,\n useCredentials: false,\n xhrProxy: '',\n onComplete: null,\n onCreate: null,\n onException: null,\n onFailure: null,\n onHeaders: null,\n onInit: null,\n onSuccess: null,\n onTimeout: null\n }, Ajax.globalOptions);\n\n if (userOptions && typeof userOptions === 'object') {\n options = Ink.extendObj(options, userOptions);\n\n\n if (typeof userOptions.parameters === 'object') {\n options.parameters = Ink.extendObj(Ink.extendObj({}, Ajax.globalOptions.parameters), userOptions.parameters);\n } else if (userOptions.parameters !== null) {\n var globalParameters = this.paramsObjToStr(Ajax.globalOptions.parameters);\n if (globalParameters) {\n options.parameters = userOptions.parameters + '&' + globalParameters;\n }\n }\n\n options.requestHeaders = Ink.extendObj({}, Ajax.globalOptions.requestHeaders);\n options.requestHeaders = Ink.extendObj(options.requestHeaders, userOptions.requestHeaders);\n }\n\n this.options = options;\n\n this.safeCall('onInit');\n\n this.url = url;\n\n var urlLocation = this._locationFromURL(url);\n this.isHTTP = this._locationIsHTTP(urlLocation);\n this.isCrossDomain = this._locationIsCrossDomain(urlLocation, location);\n\n this.requestHasBody = options.method.search(/^get|head$/i) < 0;\n\n if (this.options.validateCors === true) {\n this.options.cors = this.isCrossDomain;\n }\n\n if(this.options.cors) {\n this.isCrossDomain = false;\n }\n\n this.transport = this.getTransport();\n\n this.request();\n },\n\n /**\n * Returns a location object from an URL\n *\n * @method _locationFromUrl\n * @param {String} url Input url\n * @return {Location} An `` element with `href` set to the given URL.\n * @private\n **/\n _locationFromURL: function (url) {\n var urlLocation = document.createElementNS ?\n document.createElementNS('http://www.w3.org/1999/xhtml', 'a') :\n document.createElement('a');\n urlLocation.setAttribute('href', url);\n return urlLocation;\n },\n\n /**\n * Checks whether a location is HTTP or HTTPS\n *\n * @method locationIsHttp\n * @param {Location} urlLocation Location object or `` element representing the current location.\n * @return {Boolean} `true` if the location is HTTP or HTTPS, `false` otherwise.\n * @private\n */\n _locationIsHTTP: function (urlLocation) {\n return urlLocation.href.match(/^https?:/i) ? true : false;\n },\n\n /**\n * Checks whether a location is cross-domain from ours.\n *\n * @method _locationIsCrossDomain\n * @param {Location} urlLocation A Location object or an `` elemnt.\n * @param {Location} [location=window.location] A location representing this one. This argument only exists for testing. Don't use it.\n * @return {Boolean} `true` if the locations are in different domains (in which case we need to perform a cross-domain request)\n * @private\n */\n _locationIsCrossDomain: function (urlLocation, location) {\n // TODO because of oldIE compatibility, we can only use .href (the full URL), and none of the other useful properties one can find in Location elements. So we should just pass pure strings around. Not only here.\n location = location || window.location;\n if (!Ajax.prototype._locationIsHTTP(urlLocation) || location.protocol === 'widget:' || typeof window.widget === 'object') {\n return false;\n } else {\n var split1 = urlLocation.href.split('//');\n var split2 = location.href.split('//');\n\n if (split1.length === 1 || split2.length === 1) {\n // This occurs when there's no protocol string in either URL\n // Only happens in IE7 because setting the \"href\" of a link doesn't make that link show you the full URL when the URI is relative to this host.\n // So we have our answer.\n // If there's no protocol string\n // We know for sure that our `urlLocation` is relative\n // In which case, they are in the same domain.\n return false;\n }\n\n var protocol1 = split1[0];\n var protocol2 = split2[0];\n\n var colonOrSlash = /:|\\//; // Finds colons or slashes, which are the end of hostnames (without ports)\n\n var host1 = split1[1].split(colonOrSlash)[0];\n var host2 = split2[1].split(colonOrSlash)[0];\n\n return protocol1 !== protocol2 ||\n host1 !== host2;\n }\n },\n\n /**\n * Creates the appropriate XMLHttpRequest object, depending on our browser and whether we're trying to perform a cross-domain request.\n *\n * @method getTransport\n * @return {Object} XMLHttpRequest object\n * @private\n */\n getTransport: function()\n {\n /*global XDomainRequest:false, ActiveXObject:false */\n if (!xMLHttpRequestWithCredentials && this.options.cors && 'XDomainRequest' in window) {\n this.usingXDomainReq = true;\n return new XDomainRequest();\n }\n else if (typeof XMLHttpRequest !== 'undefined') {\n return new XMLHttpRequest();\n }\n else if (typeof ActiveXObject !== 'undefined') {\n try {\n return new ActiveXObject('Msxml2.XMLHTTP');\n } catch (e) {\n return new ActiveXObject('Microsoft.XMLHTTP');\n }\n } else {\n return null;\n }\n },\n\n /**\n * Set the necessary headers for an ajax request.\n *\n * @method setHeaders\n * @return {void}\n */\n setHeaders: function()\n {\n if (this.transport) {\n try {\n var headers = {\n \"Accept\": \"text/javascript,text/xml,application/xml,application/xhtml+xml,text/html,application/json;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1\",\n \"Accept-Language\": navigator.language,\n \"X-Requested-With\": \"XMLHttpRequest\",\n \"X-Ink-Version\": \"3\"\n };\n if (this.options.cors) {\n if (!this.options.signRequest) {\n delete headers['X-Requested-With'];\n }\n delete headers['X-Ink-Version'];\n }\n\n if (this.options.requestHeaders && typeof this.options.requestHeaders === 'object') {\n for(var headerReqName in this.options.requestHeaders) {\n if (this.options.requestHeaders.hasOwnProperty(headerReqName)) {\n headers[headerReqName] = this.options.requestHeaders[headerReqName];\n }\n }\n }\n\n if (this.transport.overrideMimeType && (navigator.userAgent.match(/Gecko\\/(\\d{4})/) || [0,2005])[1] < 2005) {\n headers.Connection = 'close';\n }\n\n for (var headerName in headers) {\n if(headers.hasOwnProperty(headerName)) {\n this.transport.setRequestHeader(headerName, headers[headerName]);\n }\n }\n } catch(e) {}\n }\n },\n\n /**\n * Converts an object with parameters to a querystring\n *\n * @method paramsObjToStr\n * @param {Object} optParams Parameters object, example: `{ a: 2, b: 3 }`\n * @return {String} A query string. Example: `'a=2&b=3'`\n * @private\n */\n paramsObjToStr: function(optParams) {\n var k, m, p, a, params = [];\n if (typeof optParams === 'object') {\n for (p in optParams){\n if (optParams.hasOwnProperty(p)) {\n a = optParams[p];\n if (Object.prototype.toString.call(a) === '[object Array]' && !isNaN(a.length)) {\n for (k = 0, m = a.length; k < m; k++) {\n params = params.concat([\n encodeURIComponent(p), '[]', '=',\n encodeURIComponent(a[k]), '&'\n ]);\n }\n }\n else {\n params = params.concat([\n encodeURIComponent(p), '=',\n encodeURIComponent(a), '&'\n ]);\n }\n }\n }\n if (params.length > 0) {\n params.pop();\n }\n }\n else\n {\n return optParams;\n }\n return params.join('');\n },\n\n /**\n * Set the url parameters for a GET request\n *\n * @method setParams\n * @return {void}\n * @private\n */\n setParams: function()\n {\n var params = null, optParams = this.options.parameters;\n\n if(typeof optParams === \"object\"){\n params = this.paramsObjToStr(optParams);\n } else {\n params = '' + optParams;\n }\n\n if(params){\n if(this.url.indexOf('?') > -1) {\n this.url = this.url.split('#')[0] + '&' + params;\n } else {\n this.url = this.url.split('#')[0] + '?' + params;\n }\n }\n },\n\n /**\n * Gets an HTTP header from the response\n *\n * @method getHeader\n * @param {String} name Header name\n * @return {String} Header content\n * @public\n */\n getHeader: function(name)\n {\n if (this.usingXDomainReq && name === 'Content-Type') {\n return this.transport.contentType;\n }\n try{\n return this.transport.getResponseHeader(name);\n } catch(e) {\n return null;\n }\n },\n\n /**\n * Gets all the HTTP headers from the response\n *\n * @method getAllHeaders\n * @return {String} The headers, each separated by a newline\n * @public\n */\n getAllHeaders: function()\n {\n try {\n return this.transport.getAllResponseHeaders();\n } catch(e) {\n return null;\n }\n },\n\n /**\n * Gets the ajax response object\n *\n * @method getResponse\n * @return {Object} The response object\n * @public\n */\n getResponse: function(){\n // setup our own stuff\n var t = this.transport,\n r = {\n headerJSON: null,\n responseJSON: null,\n getHeader: this.getHeader,\n getAllHeaders: this.getAllHeaders,\n request: this,\n transport: t,\n timeTaken: new Date() - this.startTime,\n requestedUrl: this.url\n };\n\n // setup things expected from the native object\n r.readyState = t.readyState;\n try { r.responseText = t.responseText; } catch(e) {}\n try { r.responseXML = t.responseXML; } catch(e) {}\n try { r.status = t.status; } catch(e) { r.status = 0; }\n try { r.statusText = t.statusText; } catch(e) { r.statusText = ''; }\n\n return r;\n },\n\n /**\n * Aborts the request if still running. No callbacks are called\n *\n * @method abort\n * @return {void}\n * @public\n */\n abort: function(){\n if (this.transport) {\n clearTimeout(this.delayTimeout);\n clearTimeout(this.stoTimeout);\n try { this.transport.abort(); } catch(ex) {}\n this.finish();\n }\n },\n\n /**\n * Executes the state changing phase of an ajax request\n *\n * @method runStateChange\n * @return {void}\n * @public\n */\n runStateChange: function()\n {\n var rs = this.transport.readyState;\n if (rs === 3) {\n if (this.isHTTP) {\n this.safeCall('onHeaders');\n }\n } else if (rs === 4 || this.usingXDomainReq) {\n\n if (this.options.asynchronous && this.options.delay && (this.startTime + this.options.delay > new Date().getTime())) {\n this.delayTimeout = setTimeout(Ink.bind(this.runStateChange, this), this.options.delay + this.startTime - new Date().getTime());\n return;\n }\n\n var responseJSON,\n responseContent = this.transport.responseText,\n response = this.getResponse(),\n curStatus = this.transport.status;\n\n if (this.isHTTP && !this.options.asynchronous) {\n this.safeCall('onHeaders');\n }\n\n clearTimeout(this.stoTimeout);\n\n if (curStatus === 0) {\n // Status 0 indicates network error for http requests.\n // For http less requests, 0 is always returned.\n if (this.isHTTP) {\n this.safeCall('onException', new Error('Ink.Net.Ajax: network error! (HTTP status 0)'));\n } else {\n curStatus = responseContent ? 200 : 404;\n }\n }\n else if (curStatus === 304) {\n curStatus = 200;\n }\n var isSuccess = this.usingXDomainReq || 200 <= curStatus && curStatus < 300;\n\n var headerContentType = this.getHeader('Content-Type') || '';\n if (this.options.evalJS &&\n (headerContentType.indexOf(\"application/json\") >= 0 || this.options.evalJS === 'force')){\n try {\n responseJSON = this.evalJSON(responseContent, this.sanitizeJSON);\n\n if(responseJSON){\n responseContent = response.responseJSON = responseJSON;\n }\n } catch(e){\n if (isSuccess) {\n // If the request failed, then this is perhaps an error page\n // so don't notify error.\n this.safeCall('onException', e);\n }\n }\n }\n\n if (this.usingXDomainReq && headerContentType.indexOf('xml') !== -1 && 'DOMParser' in window) {\n // http://msdn.microsoft.com/en-us/library/ie/ff975278(v=vs.85).aspx\n var mimeType;\n switch (headerContentType) {\n case 'application/xml':\n case 'application/xhtml+xml':\n case 'image/svg+xml':\n mimeType = headerContentType;\n break;\n default:\n mimeType = 'text/xml';\n }\n var xmlDoc = (new DOMParser()).parseFromString( this.transport.responseText, mimeType);\n this.transport.responseXML = xmlDoc;\n response.responseXML = xmlDoc;\n }\n\n if (this.transport.responseXML != null && response.responseJSON == null && this.transport.responseXML.xml !== \"\"){\n responseContent = this.transport.responseXML;\n }\n\n if (curStatus || this.usingXDomainReq) {\n if (isSuccess) {\n this.safeCall('onSuccess', response, responseContent);\n } else {\n this.safeCall('onFailure', response, responseContent);\n }\n this.safeCall('on'+curStatus, response, responseContent);\n }\n this.finish(response, responseContent);\n }\n },\n\n /**\n * Last step after XHR is complete. Call onComplete and cleanup object\n *\n * @method finish\n * @param {Mixed} response Response object as returned from getResponse().\n * @param {Mixed} responseContent Content of the response.\n * @return {void}\n * @private\n */\n finish: function(response, responseContent){\n if (response) {\n this.safeCall('onComplete', response, responseContent);\n }\n clearTimeout(this.stoTimeout);\n\n if (this.transport) {\n // IE6 sometimes barfs on this one\n try{ this.transport.onreadystatechange = null; } catch(e){}\n\n if (typeof this.transport.destroy === 'function') {\n // Stuff for Samsung.\n this.transport.destroy();\n }\n\n // Let XHR be collected.\n this.transport = null;\n }\n },\n\n /**\n * Safely calls a callback function.\n * Verifies that the callback is well defined and traps errors\n *\n * If you pass in an error as the second argument, it gets thrown if there is no default listener.\n *\n * @method safeCall\n * @param {Function} handlerName Name of the handler we wish to call\n * @param {Error} error This error gets reported to the console using Ink.error if there's no listener to `handlerName`.\n * @param {Mixed} [args...] Arguments to get passed to the `handlerName` handler.\n * @return {void}\n * @private\n */\n safeCall: function(handlerName /*[error or rest...]*/) {\n var error = arguments[1] instanceof Error ? arguments[1] : null;\n if (typeof this.options[handlerName] === 'function') {\n try {\n this.options[handlerName].apply(this, [].slice.call(arguments, 1));\n } catch(ex) {\n Ink.error('Ink.Net.Ajax: an error was raised while executing ' + handlerName + '.', ex);\n }\n } else if (error) {\n Ink.error('Ink.Net.Ajax: ' + error);\n }\n },\n\n /**\n * Sets a new request header for the next http request\n *\n * @method setRequestHeader\n * @param {String} name Header name.\n * @param {String} value New header value.\n * @return {void}\n * @public\n */\n setRequestHeader: function(name, value){\n if (!this.options.requestHeaders) {\n this.options.requestHeaders = {};\n }\n this.options.requestHeaders[name] = value;\n },\n\n /**\n * Executes the request\n *\n * @method request\n * @return {void}\n * @private\n */\n request: function()\n {\n if(this.transport) {\n var params = null;\n if(this.requestHasBody) {\n if(this.options.postBody !== null && this.options.postBody !== '') {\n params = this.options.postBody;\n this.setParams();\n } else if (this.options.parameters !== null && this.options.parameters !== ''){\n params = this.options.parameters;\n }\n\n if (typeof params === \"object\" && !params.nodeType) {\n params = this.paramsObjToStr(params);\n } else if (typeof params !== \"object\" && params !== null){\n params = '' + params;\n }\n\n if(this.options.contentType) {\n this.setRequestHeader('Content-Type', this.options.contentType);\n }\n } else {\n this.setParams();\n }\n\n var url = this.url;\n var method = this.options.method;\n var crossDomain = this.isCrossDomain;\n\n if (crossDomain && this.options.xhrProxy) {\n this.setRequestHeader('X-Url', url);\n url = this.options.xhrProxy + encodeURIComponent(url);\n crossDomain = false;\n }\n\n try {\n this.transport.open(method, url, this.options.asynchronous);\n } catch(e) {\n this.safeCall('onException', e);\n return this.finish(this.getResponse(), null);\n }\n\n this.setHeaders();\n\n this.safeCall('onCreate');\n\n if(this.options.timeout && !isNaN(this.options.timeout)) {\n this.stoTimeout = setTimeout(Ink.bind(function() {\n if(this.options.onTimeout) {\n this.safeCall('onTimeout');\n this.abort();\n }\n }, this), (this.options.timeout * 1000));\n }\n\n if(this.options.useCredentials && !this.usingXDomainReq) {\n this.transport.withCredentials = true;\n }\n\n if(this.options.asynchronous && !this.usingXDomainReq) {\n this.transport.onreadystatechange = Ink.bind(this.runStateChange, this);\n }\n else if (this.usingXDomainReq) {\n this.transport.onload = Ink.bind(this.runStateChange, this);\n }\n\n try {\n if (crossDomain) {\n // Need explicit handling because Mozila aborts\n // the script and Chrome fails silently.per the spec\n Ink.error('Ink.Net.Ajax: You are attempting to request a URL which is cross-domain from this one. To do this, you *must* enable the `cors` option!');\n return;\n } else {\n this.startTime = new Date().getTime();\n this.transport.send(params);\n }\n } catch(e) {\n this.safeCall('onException', e);\n return this.finish(this.getResponse(), null);\n }\n\n if(!this.options.asynchronous) {\n this.runStateChange();\n }\n }\n },\n\n /**\n * Checks if a given string is valid JSON\n *\n * @method isJSON\n * @param {String} str String to be evaluated\n * @return {Boolean} True if the string is valid JSON\n * @public\n */\n isJSON: function(str)\n {\n if (typeof str !== \"string\" || !str){ return false; }\n str = str.replace(/\\\\./g, '@').replace(/\"[^\"\\\\\\n\\r]*\"/g, '');\n return (/^[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]*$/).test(str);\n },\n\n /**\n * Evaluates a given string as JSON\n *\n * @method evalJSON\n * @param {String} strJSON String to be evaluated\n * @param {Boolean} sanitize Flag to sanitize the content\n * @return {Object} JSON content as an object\n * @public\n */\n evalJSON: function(strJSON, sanitize)\n {\n if (strJSON && (!sanitize || this.isJSON(strJSON))) {\n try {\n if (typeof JSON !== \"undefined\" && typeof JSON.parse !== 'undefined'){\n return JSON.parse(strJSON);\n }\n /*jshint evil:true */\n return eval('(' + strJSON + ')');\n } catch(e) {\n throw new Error('Ink.Net.Ajax: Bad JSON string. ' + e);\n }\n }\n return null;\n }\n };\n\n /**\n * Loads content from a given url through an XMLHttpRequest.\n *\n * Shortcut function for simple AJAX use cases. Works with JSON, XML and plain text.\n *\n * @method load\n * @param {String} url Request URL\n * @param {Function} callback Callback to be executed if the request is successful\n * @return {Object} XMLHttpRequest object\n * @public\n *\n * @sample Ink_Net_Ajax_load.html \n */\n Ajax.load = function(url, callback){\n var isCrossDomain = Ajax.prototype._locationIsCrossDomain(window.location, Ajax.prototype._locationFromURL(url));\n return new Ajax(url, {\n method: 'GET',\n cors: isCrossDomain,\n onSuccess: function(response){\n callback(response.responseJSON || response.responseText, response);\n }\n });\n };\n\n /**\n * Loads content from a given url through an XMLHttpRequest.\n * Shortcut function for simple AJAX use cases.\n *\n * @method ping\n * @param {String} url Request url\n * @param {Function} callback Callback to be executed if the request is successful\n * @public\n * @return {Object} XMLHttpRequest object\n */\n Ajax.ping = function(url, callback){\n var isCrossDomain = Ajax.prototype._locationIsCrossDomain(window.location, Ajax.prototype._locationFromURL(url));\n return new Ajax(url, {\n method: 'HEAD',\n cors: isCrossDomain,\n onSuccess: function(response){\n if (typeof callback === 'function'){\n callback(response);\n }\n }\n });\n };\n\n\n return Ajax;\n});\n","/**\n * Cross Browser JsonP requests\n * @module Ink.Net.JsonP_1\n * @version 1\n */\n\nInk.createModule('Ink.Net.JsonP', '1', [], function() {\n\n 'use strict';\n\n /**\n * Executes a JSONP request\n *\n * @class Ink.Net.JsonP\n * @constructor\n *\n * @param {String} uri Request URL\n * @param {Object} options Request options\n * @param {Function} options.onSuccess Success callback. Called with the JSONP response.\n * @param {Function} [options.onFailure] Failure callback. Called when there is a timeout.\n * @param {Object} [options.failureObj] Object to be passed as argument to failure callback\n * @param {Number} [options.timeout] Timeout for the request, in seconds. defaults to 10.\n * @param {Object} [options.params] Object with URL parameters.\n * @param {String} [options.callbackParam] URL parameter which gets the name of the JSONP function to call. defaults to 'jsoncallback'.\n * @param {String} [options.randVar] (Advanced, not recommended unless you know what you're doing) A string to append to the callback name. By default, generate a random number. Use an empty string if you already passed the correct name in the internalCallback option.\n * @param {String} [options.internalCallback] (Advanced) Name of the callback function stored in the Ink.Net.JsonP object (before it's prefixed).\n *\n * @sample Ink_Net_JsonP_1.html \n */\n var JsonP = function(uri, options) {\n this.init(uri, options);\n };\n\n JsonP.prototype = {\n\n init: function(uri, options) {\n this.options = Ink.extendObj( {\n onSuccess: undefined,\n onFailure: undefined,\n failureObj: {},\n timeout: 10,\n params: {},\n callbackParam: 'jsoncallback',\n internalCallback: '_cb',\n randVar: false\n }, options || {});\n\n if(this.options.randVar !== false) {\n this.randVar = this.options.randVar;\n } else {\n this.randVar = parseInt(Math.random() * 100000, 10);\n }\n\n this.options.internalCallback += this.randVar;\n\n this.uri = uri;\n\n // prevent SAPO legacy onComplete - make it onSuccess\n if(typeof(this.options.onComplete) === 'function') {\n this.options.onSuccess = this.options.onComplete;\n }\n\n if (typeof this.uri !== 'string') {\n throw new Error('Ink.Net.JsonP: Please define an URI');\n }\n\n if (typeof this.options.onSuccess !== 'function') {\n throw new Error('Ink.Net.JsonP: please define a callback function on option onSuccess!');\n }\n\n Ink.Net.JsonP[this.options.internalCallback] = Ink.bind(function() {\n this.options.onSuccess(arguments[0]);\n this._cleanUp();\n }, this);\n\n this.timeout = setTimeout(Ink.bind(function () {\n this.abort();\n if(typeof this.options.onFailure === 'function'){\n this.options.onFailure(this.options.failureObj);\n }\n }, this),\n this.options.timeout * 1000);\n\n this._addScriptTag();\n },\n\n /**\n * Abort the request, avoiding onSuccess or onFailure being called.\n * @method abort\n * @return {void}\n **/\n abort: function () {\n Ink.Net.JsonP[this.options.internalCallback] = Ink.bindMethod(this, '_cleanUp');\n },\n\n _addParamsToGet: function(uri, params) {\n var hasQuestionMark = uri.indexOf('?') !== -1;\n var sep, pKey, pValue, parts = [uri];\n\n for (pKey in params) {\n if (params.hasOwnProperty(pKey)) {\n if (!hasQuestionMark) { sep = '?'; hasQuestionMark = true; }\n else { sep = '&'; }\n pValue = params[pKey];\n if (typeof pValue !== 'number' && !pValue) { pValue = ''; }\n parts = parts.concat([sep, pKey, '=', encodeURIComponent(pValue)]);\n }\n }\n\n return parts.join('');\n },\n\n _getScriptContainer: function() {\n return document.body ||\n document.getElementsByTagName('body')[0] ||\n document.getElementsByTagName('head')[0] ||\n document.documentElement;\n },\n\n _addScriptTag: function() {\n // enrich options will callback and random seed\n this.options.params[this.options.callbackParam] = 'Ink.Net.JsonP.' + this.options.internalCallback;\n this.options.params.rnd_seed = this.randVar;\n this.uri = this._addParamsToGet(this.uri, this.options.params);\n // create script tag\n this._scriptEl = document.createElement('script');\n this._scriptEl.type = 'text/javascript';\n this._scriptEl.src = this.uri;\n var scriptCtn = this._getScriptContainer();\n scriptCtn.appendChild(this._scriptEl);\n },\n\n _cleanUp: function () {\n if (this.timeout) {\n window.clearTimeout(this.timeout);\n }\n delete this.options.onSuccess;\n delete this.options.onFailure;\n delete Ink.Net.JsonP[this.options.internalCallback];\n this._removeScriptTag();\n },\n\n _removeScriptTag: function() {\n if (!this._scriptEl) { return; /* already removed */ }\n this._scriptEl.parentNode.removeChild(this._scriptEl);\n delete this._scriptEl;\n }\n };\n\n return JsonP;\n\n});\n","/**\n * Browser Detection and User Agent sniffing\n * @module Ink.Dom.Browser_1\n * @version 1\n */\nInk.createModule('Ink.Dom.Browser', '1', [], function() {\n 'use strict'; \n\n /**\n * @namespace Ink.Dom.Browser\n * @version 1\n * @static\n * @example\n * \n */\n var Browser = {\n /**\n * True if the browser is Internet Explorer\n *\n * @property IE\n * @type {Boolean}\n * @public\n * @static\n */\n IE: false,\n\n /**\n * True if the browser is Gecko based\n *\n * @property GECKO\n * @type {Boolean}\n * @public\n * @static\n */\n GECKO: false,\n\n /**\n * True if the browser is Opera\n *\n * @property OPERA\n * @type {Boolean}\n * @public\n * @static\n */\n OPERA: false,\n\n /**\n * True if the browser is Safari\n *\n * @property SAFARI\n * @type {Boolean}\n * @public\n * @static\n */\n SAFARI: false,\n\n /**\n * True if the browser is Konqueror\n *\n * @property KONQUEROR\n * @type {Boolean}\n * @public\n * @static\n */\n KONQUEROR: false,\n\n /**\n * True if browser is Chrome\n *\n * @property CHROME\n * @type {Boolean}\n * @public\n * @static\n */\n CHROME: false,\n\n /**\n * The specific browser model.\n * False if it is unavailable.\n *\n * @property model\n * @type {Boolean|String}\n * @public\n * @static\n */\n model: false,\n\n /**\n * The browser version.\n * False if it is unavailable.\n *\n * @property version\n * @type {Boolean|String}\n * @public\n * @static\n */\n version: false,\n\n /**\n * The user agent string.\n * False if it is unavailable.\n *\n * @property userAgent\n * @type {Boolean|String}\n * @public\n * @static\n */\n userAgent: false,\n\n /**\n * The CSS prefix (-moz-, -webkit-, -ms-, ...)\n * False if it is unavailable \n *\n * @property cssPrefix \n * @type {Boolean|String}\n * @public \n * @static \n */\n cssPrefix: false, \n\n /**\n * The DOM prefix (Moz, Webkit, ms, ...)\n * False if it is unavailable \n * @property domPrefix \n * @type {Boolean|String}\n * @public \n * @static \n */\n domPrefix: false,\n\n /**\n * Initialization function for the Browser object.\n *\n * Is called automatically when this module is loaded, and calls setDimensions, setBrowser and setReferrer.\n *\n * @method init\n * @return {void}\n * @public\n */\n init: function() {\n this.detectBrowser();\n this.setDimensions();\n this.setReferrer();\n },\n\n /**\n * Retrieves and stores window dimensions in this object. Called automatically when this module is loaded.\n *\n * @method setDimensions\n * @return {void}\n * @public\n */\n setDimensions: function() {\n //this.windowWidth=window.innerWidth !== null? window.innerWidth : document.documentElement && document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body !== null ? document.body.clientWidth : null;\n //this.windowHeight=window.innerHeight != null? window.innerHeight : document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body != null? document.body.clientHeight : null;\n var myWidth = 0, myHeight = 0;\n if ( typeof window.innerWidth=== 'number' ) {\n myWidth = window.innerWidth;\n myHeight = window.innerHeight;\n } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {\n myWidth = document.documentElement.clientWidth;\n myHeight = document.documentElement.clientHeight;\n } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {\n myWidth = document.body.clientWidth;\n myHeight = document.body.clientHeight;\n }\n this.windowWidth = myWidth;\n this.windowHeight = myHeight;\n },\n\n /**\n * Stores the referrer. Called automatically when this module is loaded.\n *\n * @method setReferrer\n * @return {void}\n * @public\n */\n setReferrer: function() {\n if (document.referrer && document.referrer.length) {\n this.referrer = window.escape(document.referrer);\n } else {\n this.referrer = false;\n }\n },\n\n /**\n * Detects the browser and stores the found properties. Called automatically when this module is loaded.\n *\n * @method detectBrowser\n * @return {void}\n * @public\n */\n detectBrowser: function() {\n this._sniffUserAgent(navigator.userAgent);\n },\n\n _sniffUserAgent: function (sAgent) {\n this.userAgent = sAgent;\n\n sAgent = sAgent.toLowerCase();\n\n if (/applewebkit\\//.test(sAgent)) {\n this.cssPrefix = '-webkit-';\n this.domPrefix = 'Webkit';\n if(/(chrome|crios)\\//.test(sAgent)) {\n // Chrome\n this.CHROME = true;\n this.model = 'chrome';\n this.version = sAgent.replace(/(.*)chrome\\/([^\\s]+)(.*)/, \"$2\");\n } else {\n // Safari\n this.SAFARI = true;\n this.model = 'safari';\n var rVersion = /version\\/([^) ]+)/;\n if (rVersion.test(sAgent)) {\n this.version = sAgent.match(rVersion)[1];\n } else {\n this.version = sAgent.replace(/(.*)applewebkit\\/([^\\s]+)(.*)/, \"$2\");\n }\n }\n } else if (/opera/.test(sAgent)) {\n // Opera\n this.OPERA = true;\n this.model = 'opera';\n this.version = sAgent.replace(/(.*)opera.([^\\s$]+)(.*)/, \"$2\");\n this.cssPrefix = '-o-';\n this.domPrefix = 'O';\n } else if (/konqueror/.test(sAgent)) {\n // Konqueroh\n this.KONQUEROR = true;\n this.model = 'konqueror';\n this.version = sAgent.replace(/(.*)konqueror\\/([^;]+);(.*)/, \"$2\");\n this.cssPrefix = '-khtml-';\n this.domPrefix = 'Khtml';\n } else if (/(msie|trident)/i.test(sAgent)) {\n // MSIE\n this.IE = true;\n this.model = 'ie';\n if (/rv:((?:\\d|\\.)+)/.test(sAgent)) { // IE 11\n this.version = sAgent.match(/rv:((?:\\d|\\.)+)/)[1];\n } else {\n this.version = sAgent.replace(/(.*)\\smsie\\s([^;]+);(.*)/, \"$2\");\n }\n this.cssPrefix = '-ms-';\n this.domPrefix = 'ms';\n } else if (/gecko/.test(sAgent)) {\n // GECKO\n // Supports only:\n // Camino, Chimera, Epiphany, Minefield (firefox 3), Firefox, Firebird, Phoenix, Galeon,\n // Iceweasel, K-Meleon, SeaMonkey, Netscape, Songbird, Sylera,\n this.cssPrefix = '-moz-';\n this.domPrefix = 'Moz';\n\n this.GECKO = true;\n\n var re = /(camino|chimera|epiphany|minefield|firefox|firebird|phoenix|galeon|iceweasel|k\\-meleon|seamonkey|netscape|songbird|sylera)/;\n if(re.test(sAgent)) {\n this.model = sAgent.match(re)[1];\n this.version = sAgent.replace(new RegExp(\"(.*)\"+this.model+\"\\/([^;\\\\s$]+)(.*)\"), \"$2\");\n } else {\n // probably is mozilla\n this.model = 'mozilla';\n var reVersion = /(.*)rv:([^)]+)(.*)/;\n if(reVersion.test(sAgent)) {\n this.version = sAgent.replace(reVersion, \"$2\");\n }\n }\n }\n },\n\n /**\n * Debug function which displays browser (and Ink.Dom.Browser) information as an alert message.\n *\n * @method debug\n * @return {void}\n * @public\n * @sample Ink_Dom_Browser_1_debug.html\n */\n debug: function() {\n /*global alert:false */\n var str = \"known browsers: (ie, gecko, opera, safari, konqueror) \\n\";\n str += [this.IE, this.GECKO, this.OPERA, this.SAFARI, this.KONQUEROR] +\"\\n\";\n str += \"cssPrefix -> \"+this.cssPrefix+\"\\n\";\n str += \"domPrefix -> \"+this.domPrefix+\"\\n\";\n str += \"model -> \"+this.model+\"\\n\";\n str += \"version -> \"+this.version+\"\\n\";\n str += \"\\n\";\n str += \"original UA -> \"+this.userAgent;\n\n alert(str);\n }\n };\n\n Browser.init();\n\n return Browser;\n});\n","/**\n * CSS Utilities and toolbox\n * @module Ink.Dom.Css_1\n * @version 1\n */\n\nInk.createModule( 'Ink.Dom.Css', 1, [], function() {\n\n 'use strict';\n\n // getComputedStyle feature detection.\n var getCs = (\"defaultView\" in document) && (\"getComputedStyle\" in document.defaultView) ? document.defaultView.getComputedStyle : window.getComputedStyle;\n\n /**\n * @namespace Ink.Dom.Css\n * @static\n */\n\n var Css = {\n /**\n * Adds of removes a class.\n * Depending on addRemState, this method either adds a class if it's true or removes if if false.\n *\n * @method addRemoveClassName\n * @param {DOMElement|string} elm DOM element or element id\n * @param {string} className class name to add or remove.\n * @param {boolean} addRemState Whether to add or remove. `true` to add, `false` to remove.\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_addRemoveClassName.html \n */\n addRemoveClassName: function(elm, className, addRemState) {\n if (addRemState) {\n return this.addClassName(elm, className);\n }\n this.removeClassName(elm, className);\n },\n\n /**\n * Adds a class to a given element\n *\n * @method addClassName\n * @param {Element|String} elm Element or element id\n * @param {String|Array} className Class or classes to add. Examples: 'my-class', ['my-class', 'other-class'], 'my-class other-class'\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_addClassName.html\n */\n addClassName: function(elm, className) {\n elm = Ink.i(elm);\n if (!elm || !className) { return null; }\n className = ('' + className).split(/[, ]+/);\n var i = 0;\n var len = className.length;\n\n for (; i < len; i++) {\n // remove whitespace and ignore on empty string\n if (className[i].replace(/^\\s+|\\s+$/g, '')) {\n if (typeof elm.classList !== \"undefined\") {\n elm.classList.add(className[i]);\n } else if (!Css.hasClassName(elm, className[i])) {\n elm.className += (elm.className ? ' ' : '') + className[i];\n }\n }\n }\n },\n\n /**\n * Removes a class from a given element\n *\n * @method removeClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String|Array} className Class names to remove. You can either use a space separated string of classnames, comma-separated list or an array\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_removeClassName.html \n */\n removeClassName: function(elm, className) {\n elm = Ink.i(elm);\n if (!elm || !className) { return null; }\n \n className = ('' + className).split(/[, ]+/);\n var i = 0;\n var len = className.length;\n\n if (typeof elm.classList !== \"undefined\"){\n for (; i < len; i++) {\n elm.classList.remove(className[i]);\n }\n } else {\n var elmClassName = elm.className || '';\n var re;\n for (; i < len; i++) {\n re = new RegExp(\"(^|\\\\s+)\" + className[i] + \"(\\\\s+|$)\");\n elmClassName = elmClassName.replace(re, ' ');\n }\n elm.className = (elmClassName\n .replace(/^\\s+/, '')\n .replace(/\\s+$/, ''));\n }\n },\n\n /**\n * Alias to addRemoveClassName. \n * Utility function, saves many if/elses.\n *\n * @method setClassName\n * @uses addRemoveClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String|Array} className Class names to add\\remove. Comma separated, space separated or simply an Array\n * @param {Boolean} [add]=false Flag to switch behavior from removal to addition. true to add, false to remove\n * @return {void}\n * @public\n */\n setClassName: function(elm, className, add) {\n this.addRemoveClassName(elm, className, add || false);\n },\n\n /**\n * Checks if an element has a class.\n * This method verifies if an element has ONE of a list of classes. If the last argument is flagged as true, instead checks if the element has ALL the classes\n * \n * @method hasClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String|Array} className Class name(s) to test\n * @param {Boolean} [all=false] Irrelevant if only one `className` is passed. If `true`, check if the element contains ALL the CSS classes. If `false`, check whether the element contains ANY of the given classes.\n * @return {Boolean} `true` if a given class is applied to a given element, `false` if it isn't.\n * @public\n * @sample Ink_Dom_Css_hasClassName.html \n */\n hasClassName: function(elm, className, all) {\n elm = Ink.i(elm);\n if (!elm || !className) { return false; }\n\n className = ('' + className).split(/[, ]+/);\n var i = 0;\n var len = className.length;\n var has;\n var re;\n\n for ( ; i < len; i++) {\n if (typeof elm.classList !== \"undefined\"){\n has = elm.classList.contains(className[i]);\n } else {\n var elmClassName = elm.className;\n if (elmClassName === className[i]) {\n has = true;\n } else {\n re = new RegExp(\"(^|\\\\s)\" + className[i] + \"(\\\\s|$)\");\n has = re.test(elmClassName);\n }\n }\n if (has && !all) { return true; } // return if looking for any class\n if (!has && all) { return false; } // return if looking for all classes\n }\n\n if (all) {\n // if we got here, all classes were found so far\n return true;\n } else {\n // if we got here with all == false, no class was found\n return false;\n }\n },\n\n /**\n * Blinks a class from an element\n * Add and removes the class from the element with a timeout, so it blinks\n *\n * @method blinkClass\n * @uses addRemoveClassName\n * @param {Element|String} element DOM element or element id\n * @param {String|Array} className Class name(s) to blink\n * @param {Number} timeout timeout in ms between adding and removing, default 100 ms\n * @param {Boolean} negate is true, class is removed then added\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_blinkClass.html \n */\n blinkClass: function(element, className, timeout, negate){\n element = Ink.i(element);\n Css.addRemoveClassName(element, className, !negate);\n setTimeout(function() {\n Css.addRemoveClassName(element, className, negate);\n }, Number(timeout) || 100);\n },\n\n /**\n * Toggles a class name from a given element\n *\n * @method toggleClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} className Class name\n * @param {Boolean} [forceAdd] Flag to force adding the the classe names if they don't exist yet.\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_toggleClassName.html \n */\n toggleClassName: function(elm, className, forceAdd) {\n if (!elm || !className) { return false; }\n\n if (typeof forceAdd !== 'undefined') {\n return Css.addRemoveClassName(elm, className, forceAdd);\n } else if (typeof elm.classList !== \"undefined\" && !/[, ]/.test(className)) {\n elm = Ink.i(elm);\n if (elm !== null){\n elm.classList.toggle(className);\n }\n } else {\n if (Css.hasClassName(elm, className)) {\n Css.removeClassName(elm, className);\n } else {\n Css.addClassName(elm, className);\n }\n }\n },\n\n /**\n * Sets the opacity of given element \n *\n * @method setOpacity\n * @param {DOMElement|String} elm DOM element or element id\n * @param {Number} value allows 0 to 1(default mode decimal) or percentage (warning using 0 or 1 will reset to default mode)\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_setOpacity.html \n */\n setOpacity: function(elm, value) {\n elm = Ink.i(elm);\n if (elm !== null){\n var val = 1;\n\n if (!isNaN(Number(value))){\n if (value <= 0) { val = 0; }\n else if (value <= 1) { val = value; }\n else if (value <= 100) { val = value / 100; }\n else { val = 1; }\n }\n\n if (typeof elm.style.opacity !== 'undefined') {\n elm.style.opacity = val;\n }\n else {\n elm.style.filter = \"alpha(opacity:\"+(val*100|0)+\")\";\n }\n }\n },\n\n /**\n * Converts a css property name to a string in camelcase to be used with CSSStyleDeclaration.\n * @method _camelCase\n * @private\n * @param {String} str String to convert\n * @return {String} Converted string\n */\n _camelCase: function(str) {\n return str ? str.replace(/-(\\w)/g, function (_, $1) {\n return $1.toUpperCase();\n }) : str;\n },\n\n\n /**\n * Gets the value for an element's style attribute\n *\n * @method getStyle\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} style Which css attribute to fetch\n * @return {Mixed} Style value\n * @public\n * @sample Ink_Dom_Css_getStyle.html \n */\n getStyle: function(elm, style) {\n elm = Ink.i(elm);\n if (elm !== null && elm.style) {\n style = style === 'float' ? 'cssFloat': this._camelCase(style);\n\n var value = elm.style[style];\n\n if (getCs && (!value || value === 'auto')) {\n var css = getCs(elm, null);\n value = css ? css[style] : null;\n }\n else if (!value && elm.currentStyle) {\n value = elm.currentStyle[style];\n if (value === 'auto' && (style === 'width' || style === 'height')) {\n value = elm[\"offset\" + style.charAt(0).toUpperCase() + style.slice(1)] + \"px\";\n }\n }\n\n if (style === 'opacity') {\n return value ? parseFloat(value, 10) : 1.0;\n }\n else if (style === 'borderTopWidth' || style === 'borderBottomWidth' ||\n style === 'borderRightWidth' || style === 'borderLeftWidth' ) {\n if (value === 'thin') { return '1px'; }\n else if (value === 'medium') { return '3px'; }\n else if (value === 'thick') { return '5px'; }\n }\n\n return value === 'auto' ? null : value;\n }\n },\n\n\n /**\n * Adds CSS rules to an element's style attribute.\n *\n * @method setStyle\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} style Which css attribute to set\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_setStyle.html \n */\n setStyle: function(elm, style) {\n elm = Ink.i(elm);\n if (elm === null) { return; }\n if (typeof style === 'string') {\n elm.style.cssText += '; '+style;\n\n if (style.indexOf('opacity') !== -1) {\n this.setOpacity(elm, style.match(/opacity:\\s*(\\d?\\.?\\d*)/)[1]);\n }\n }\n else {\n for (var prop in style) {\n if (style.hasOwnProperty(prop)){\n if (prop === 'opacity') {\n this.setOpacity(elm, style[prop]);\n }\n else if (prop === 'float' || prop === 'cssFloat') {\n if (typeof elm.style.styleFloat === 'undefined') {\n elm.style.cssFloat = style[prop];\n }\n else {\n elm.style.styleFloat = style[prop];\n }\n } else {\n elm.style[prop] = style[prop];\n }\n }\n }\n }\n },\n\n\n /**\n * Shows an element.\n * Internally it unsets the display property of an element. You can force a specific display property using forceDisplayProperty\n *\n * @method show\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} [forceDisplayProperty] Css display property to apply on show\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_show.html \n */\n show: function(elm, forceDisplayProperty) {\n elm = Ink.i(elm);\n if (elm !== null) {\n elm.style.display = forceDisplayProperty || '';\n }\n },\n\n /**\n * Hides an element.\n *\n * @method hide\n * @param {DOMElement|String} elm DOM element or element id\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_hide.html \n */\n hide: function(elm) {\n elm = Ink.i(elm);\n if (elm !== null) {\n elm.style.display = 'none';\n }\n },\n\n /**\n * Shows or hides an element.\n * If the show parameter is true, it shows the element. Otherwise, hides it.\n *\n * @method showHide\n * @param {DOMElement|String} elm DOM element or element id\n * @param {boolean} [show]=false Whether to show or hide `elm`.\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_showHide.html \n */\n showHide: function(elm, show) {\n elm = Ink.i(elm);\n if (elm) {\n elm.style.display = show ? '' : 'none';\n }\n },\n\n /**\n * Toggles an element visibility.\n * \n * @method toggle\n * @param {DOMElement|String} elm DOM element or element id\n * @param {Boolean} forceShow Forces showing if element is hidden\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_toggle.html \n */\n toggle: function(elm, forceShow) {\n elm = Ink.i(elm);\n if (elm !== null) {\n if (typeof forceShow !== 'undefined') {\n if (forceShow === true) {\n this.show(elm);\n } else {\n this.hide(elm);\n }\n } else {\n if (this.getStyle(elm,'display').toLowerCase() === 'none') {\n this.show(elm);\n }\n else {\n this.hide(elm);\n }\n }\n }\n },\n\n _getRefTag: function(head){\n if (head.firstElementChild) {\n return head.firstElementChild;\n }\n\n for (var child = head.firstChild; child; child = child.nextSibling){\n if (child.nodeType === 1){\n return child;\n }\n }\n return null;\n },\n\n /**\n * Injects style tags with rules to the page.\n *\n * @method appendStyleTag\n * @param {String} selector The css selector for the rule\n * @param {String} style The content of the style rule\n * @param {Object} options Options for the tag\n * @param {String} [options.type]='text/css' File type\n * @param {Boolean} [options.force]=false If true, the style tag will be appended to end of head\n * @return {void}\n * @public\n * \n * @sample Ink_Dom_Css_appendStyleTag.html \n */\n appendStyleTag: function(selector, style, options){\n options = Ink.extendObj({\n type: 'text/css',\n force: false\n }, options || {});\n\n var styles = document.getElementsByTagName(\"style\"),\n oldStyle = false, setStyle = true, i, l;\n\n for (i=0, l=styles.length; i= 0) {\n setStyle = false;\n }\n }\n\n if (setStyle) {\n var defStyle = document.createElement(\"style\"),\n head = document.getElementsByTagName(\"head\")[0],\n refTag = false, styleStr = '';\n\n defStyle.type = options.type;\n\n styleStr += selector +\" {\";\n styleStr += style;\n styleStr += \"} \";\n\n if (typeof defStyle.styleSheet !== \"undefined\") {\n defStyle.styleSheet.cssText = styleStr;\n } else {\n defStyle.appendChild(document.createTextNode(styleStr));\n }\n\n if (options.force){\n head.appendChild(defStyle);\n } else {\n refTag = this._getRefTag(head);\n if (refTag){\n head.insertBefore(defStyle, refTag);\n }\n }\n }\n },\n\n /**\n * Injects an external link tag.\n * This method add a stylesheet to the head of a page\n *\n * @method appendStylesheet\n * @param {String} path File path\n * @param {Object} options Options for the tag\n * @param {String} [options.media='screen'] Media type\n * @param {String} [options.type='text/css'] File type\n * @param {Boolean} [options.force=false] If true, tag will be appended to end of head\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_appendStylesheet.html \n */\n appendStylesheet: function(path, options){\n options = Ink.extendObj({\n media: 'screen',\n type: 'text/css',\n force: false\n }, options || {});\n\n var refTag,\n style = document.createElement(\"link\"),\n head = document.getElementsByTagName(\"head\")[0];\n\n style.media = options.media;\n style.type = options.type;\n style.href = path;\n style.rel = \"Stylesheet\";\n\n if (options.force){\n head.appendChild(style);\n }\n else {\n refTag = this._getRefTag(head);\n if (refTag){\n head.insertBefore(style, refTag);\n }\n }\n },\n\n /**\n * Injects an external link tag.\n * Loads CSS via LINK element inclusion in HEAD (skips append if already there)\n *\n * Works similarly to appendStylesheet but:\n * supports optional callback which gets invoked once the CSS has been applied\n *\n * @method appendStylesheetCb\n * @param {String} cssURI URI of the CSS to load, if empty ignores and just calls back directly\n * @param {Function(cssURI)} [callback] optional callback which will be called once the CSS is loaded\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_appendStylesheetCb.html \n */\n _loadingCSSFiles: {},\n _loadedCSSFiles: {},\n appendStylesheetCb: function(url, callback) {\n if (!url) {\n return callback(url);\n }\n\n if (this._loadedCSSFiles[url]) {\n return callback(url);\n }\n\n var cbs = this._loadingCSSFiles[url];\n if (cbs) {\n return cbs.push(callback);\n }\n\n this._loadingCSSFiles[url] = [callback];\n\n var linkEl = document.createElement('link');\n linkEl.type = 'text/css';\n linkEl.rel = 'stylesheet';\n linkEl.href = url;\n\n var headEl = document.getElementsByTagName('head')[0];\n headEl.appendChild(linkEl);\n\n var imgEl = document.createElement('img');\n /*\n var _self = this;\n (function(_url) {\n imgEl.onerror = function() {\n //var url = this;\n var url = _url;\n _self._loadedCSSFiles[url] = true;\n var callbacks = _self._loadingCSSFiles[url];\n for (var i = 0, f = callbacks.length; i < f; ++i) {\n callbacks[i](url);\n }\n delete _self._loadingCSSFiles[url];\n };\n })(url);\n */\n imgEl.onerror = Ink.bindEvent(function(event, _url) {\n //var url = this;\n var url = _url;\n this._loadedCSSFiles[url] = true;\n var callbacks = this._loadingCSSFiles[url];\n for (var i = 0, f = callbacks.length; i < f; ++i) {\n callbacks[i](url);\n }\n delete this._loadingCSSFiles[url];\n }, this, url);\n imgEl.src = url;\n },\n\n /**\n * Converts decimal to hexadecimal values\n * Useful to convert colors to their hexadecimal representation.\n *\n * @method decToHex\n * @param {String} dec Either a single decimal value, an rgb(r, g, b) string or an Object with r, g and b properties\n * @return {String} Hexadecimal value\n * @sample Ink_Dom_Css_decToHex.html \n */\n decToHex: function(dec) {\n var normalizeTo2 = function(val) {\n if (val.length === 1) {\n val = '0' + val;\n }\n val = val.toUpperCase();\n return val;\n };\n\n if (typeof dec === 'object') {\n var rDec = normalizeTo2(parseInt(dec.r, 10).toString(16));\n var gDec = normalizeTo2(parseInt(dec.g, 10).toString(16));\n var bDec = normalizeTo2(parseInt(dec.b, 10).toString(16));\n return rDec+gDec+bDec;\n }\n else {\n dec += '';\n var rgb = dec.match(/\\((\\d+),\\s?(\\d+),\\s?(\\d+)\\)/);\n if (rgb !== null) {\n return normalizeTo2(parseInt(rgb[1], 10).toString(16)) +\n normalizeTo2(parseInt(rgb[2], 10).toString(16)) +\n normalizeTo2(parseInt(rgb[3], 10).toString(16));\n }\n else {\n return normalizeTo2(parseInt(dec, 10).toString(16));\n }\n }\n },\n\n /**\n * Converts hexadecimal values to decimal\n * Useful to use with CSS colors\n *\n * @method hexToDec\n * @param {String} hex hexadecimal Value with 6, 3, 2 or 1 characters\n * @return {Number} Object with properties r, g, b if length of number is >= 3 or decimal value instead.\n * @sample Ink_Dom_Css_hexToDec.html \n */\n hexToDec: function(hex){\n if (hex.indexOf('#') === 0) {\n hex = hex.substr(1);\n }\n if (hex.length === 6) { // will return object RGB\n return {\n r: parseInt(hex.substr(0,2), 16),\n g: parseInt(hex.substr(2,2), 16),\n b: parseInt(hex.substr(4,2), 16)\n };\n }\n else if (hex.length === 3) { // will return object RGB\n return {\n r: parseInt(hex.charAt(0) + hex.charAt(0), 16),\n g: parseInt(hex.charAt(1) + hex.charAt(1), 16),\n b: parseInt(hex.charAt(2) + hex.charAt(2), 16)\n };\n }\n else if (hex.length <= 2) { // will return int\n return parseInt(hex, 16);\n }\n },\n\n /**\n * Get a single property from a stylesheet.\n * Use this to obtain the value of a CSS property (searched from loaded CSS documents)\n *\n * @method getPropertyFromStylesheet\n * @param {String} selector a CSS rule. must be an exact match\n * @param {String} property a CSS property\n * @return {String} value of the found property, or null if it wasn't matched\n */\n getPropertyFromStylesheet: function(selector, property) {\n var rule = this.getRuleFromStylesheet(selector);\n if (rule) {\n return rule.style[property];\n }\n return null;\n },\n\n getPropertyFromStylesheet2: function(selector, property) {\n var rules = this.getRulesFromStylesheet(selector);\n /*\n rules.forEach(function(rule) {\n var x = rule.style[property];\n if (x !== null && x !== undefined) {\n return x;\n }\n });\n */\n var x;\n for(var i=0, t=rules.length; i < t; i++) {\n x = rules[i].style[property];\n if (x !== null && x !== undefined) {\n return x;\n }\n }\n return null;\n },\n\n getRuleFromStylesheet: function(selector) {\n var sheet, rules, ri, rf, rule;\n var s = document.styleSheets;\n if (!s) {\n return null;\n }\n\n for (var si = 0, sf = document.styleSheets.length; si < sf; ++si) {\n sheet = document.styleSheets[si];\n rules = sheet.rules ? sheet.rules : sheet.cssRules;\n if (!rules) { return null; }\n\n for (ri = 0, rf = rules.length; ri < rf; ++ri) {\n rule = rules[ri];\n if (!rule.selectorText) { continue; }\n if (rule.selectorText === selector) {\n return rule;\n }\n }\n }\n\n return null;\n },\n\n getRulesFromStylesheet: function(selector) {\n var res = [];\n var sheet, rules, ri, rf, rule;\n var s = document.styleSheets;\n if (!s) { return res; }\n\n for (var si = 0, sf = document.styleSheets.length; si < sf; ++si) {\n sheet = document.styleSheets[si];\n rules = sheet.rules ? sheet.rules : sheet.cssRules;\n if (!rules) {\n return null;\n }\n\n for (ri = 0, rf = rules.length; ri < rf; ++ri) {\n rule = rules[ri];\n if (!rule.selectorText) { continue; }\n if (rule.selectorText === selector) {\n res.push(rule);\n }\n }\n }\n\n return res;\n },\n\n getPropertiesFromRule: function(selector) {\n var rule = this.getRuleFromStylesheet(selector);\n var props = {};\n var prop, i, f;\n\n /*if (typeof rule.style.length === 'snumber') {\n for (i = 0, f = rule.style.length; i < f; ++i) {\n prop = this._camelCase( rule.style[i] );\n props[prop] = rule.style[prop];\n }\n }\n else { // HANDLES IE 8, FIREFOX RULE JOINING... */\n rule = rule.style.cssText;\n var parts = rule.split(';');\n var steps, val, pre, pos;\n for (i = 0, f = parts.length; i < f; ++i) {\n if (parts[i].charAt(0) === ' ') {\n parts[i] = parts[i].substring(1);\n }\n steps = parts[i].split(':');\n prop = this._camelCase( steps[0].toLowerCase() );\n val = steps[1];\n if (val) {\n val = val.substring(1);\n\n if (prop === 'padding' || prop === 'margin' || prop === 'borderWidth') {\n\n if (prop === 'borderWidth') { pre = 'border'; pos = 'Width'; }\n else { pre = prop; pos = ''; }\n\n if (val.indexOf(' ') !== -1) {\n val = val.split(' ');\n props[pre + 'Top' + pos] = val[0];\n props[pre + 'Bottom'+ pos] = val[0];\n props[pre + 'Left' + pos] = val[1];\n props[pre + 'Right' + pos] = val[1];\n }\n else {\n props[pre + 'Top' + pos] = val;\n props[pre + 'Bottom'+ pos] = val;\n props[pre + 'Left' + pos] = val;\n props[pre + 'Right' + pos] = val;\n }\n }\n else if (prop === 'borderRadius') {\n if (val.indexOf(' ') !== -1) {\n val = val.split(' ');\n props.borderTopLeftRadius = val[0];\n props.borderBottomRightRadius = val[0];\n props.borderTopRightRadius = val[1];\n props.borderBottomLeftRadius = val[1];\n }\n else {\n props.borderTopLeftRadius = val;\n props.borderTopRightRadius = val;\n props.borderBottomLeftRadius = val;\n props.borderBottomRightRadius = val;\n }\n }\n else {\n props[prop] = val;\n }\n }\n }\n //}\n //console.log(props);\n\n return props;\n },\n\n /**\n * Change the font size of elements.\n * Changes the font size of the elements which match the given CSS rule\n * For this function to work, the CSS file must be in the same domain than the host page, otherwise JS can't access it.\n *\n * @method changeFontSize\n * @param {String} selector CSS selector rule\n * @param {Number} delta Number of pixels to change on font-size\n * @param {String} [op] Supported operations are '+' and '*'. defaults to '+'\n * @param {Number} [minVal] If result gets smaller than minVal, change does not occurr\n * @param {Number} [maxVal] If result gets bigger than maxVal, change does not occurr\n * @return {void}\n * @public\n */\n changeFontSize: function(selector, delta, op, minVal, maxVal) {\n var that = this;\n Ink.requireModules(['Ink.Dom.Selector_1'], function(Selector) {\n var e;\n if (typeof selector !== 'string') { e = '1st argument must be a CSS selector rule.'; }\n else if (typeof delta !== 'number') { e = '2nd argument must be a number.'; }\n else if (op !== undefined && op !== '+' && op !== '*') { e = '3rd argument must be one of \"+\", \"*\".'; }\n else if (minVal !== undefined && (typeof minVal !== 'number' || minVal <= 0)) { e = '4th argument must be a positive number.'; }\n else if (maxVal !== undefined && (typeof maxVal !== 'number' || maxVal < maxVal)) { e = '5th argument must be a positive number greater than minValue.'; }\n if (e) { throw new TypeError(e); }\n\n var val, el, els = Selector.select(selector);\n if (minVal === undefined) { minVal = 1; }\n op = (op === '*') ? function(a,b){return a*b;} : function(a,b){return a+b;};\n for (var i = 0, f = els.length; i < f; ++i) {\n el = els[i];\n val = parseFloat( that.getStyle(el, 'fontSize'));\n val = op(val, delta);\n if (val < minVal) { continue; }\n if (typeof maxVal === 'number' && val > maxVal) { continue; }\n el.style.fontSize = val + 'px';\n }\n });\n }\n\n };\n\n return Css;\n\n});\n","/**\n * DOM Traversal and manipulation\n * @module Ink.Dom.Element_1\n * @version 1\n */\n\nInk.createModule('Ink.Dom.Element', 1, [], function() {\n\n 'use strict';\n\n var createContextualFragmentSupport = (\n typeof document.createRange === 'function' &&\n typeof window.Range.prototype.createContextualFragment === 'function');\n\n var deleteThisTbodyToken = 'Ink.Dom.Element tbody: ' + Math.random();\n var browserCreatesTbodies = (function () {\n var div = document.createElement('div');\n div.innerHTML = '';\n return div.getElementsByTagName('tbody').length !== 0;\n }());\n\n function rect(elem){\n var dimensions = {};\n try {\n dimensions = elem.getBoundingClientRect();\n } catch(e){\n dimensions = { top: elem.offsetTop, left: elem.offsetLeft };\n }\n return dimensions;\n }\n\n /**\n * @namespace Ink.Dom.Element_1\n */\n\n var InkElement = {\n\n /**\n * Checks if something is a DOM Element.\n *\n * @method isDOMElement\n * @static\n * @param {Mixed} o The object to be checked.\n * @return {Boolean} True if it's a valid DOM Element.\n * @public\n * @example\n * var el = Ink.s('#element');\n * if( InkElement.isDOMElement( el ) === true ){\n * // It is a DOM Element.\n * } else {\n * // It is NOT a DOM Element.\n * }\n */\n isDOMElement: function(o) {\n return o !== null && typeof o === 'object' && 'nodeType' in o && o.nodeType === 1;\n },\n\n /**\n * Shortcut for `document.getElementById`\n *\n * @method get\n * @param {String|DOMElement} elm Either an ID of an element, or an element.\n * @return {DOMElement|null} The DOM element with the given id or null when it was not found\n * @public\n * @sample Ink_Dom_Element_1_get.html\n */\n get: function(elm) {\n if(typeof elm !== 'undefined') {\n if(typeof elm === 'string') {\n return document.getElementById(elm);\n }\n return elm;\n }\n return null;\n },\n\n /**\n * Creates a DOM element.\n *\n * Just a shortcut for `document.createElement(tag)`, but with the second argument you can call additional functions present in Ink.Dom.Element.\n *\n * @method create\n * @param {String} tag Tag name\n * @param {Object} properties Object with properties to be set on the element. You can also call other functions in Ink.Dom.Element like this\n * @return {Element} The newly created element.\n * @public\n * @sample Ink_Dom_Element_1_create.html\n */\n create: function(tag, properties) {\n var el = document.createElement(tag);\n //Ink.extendObj(el, properties);\n if (properties) {\n for(var property in properties) {\n if(properties.hasOwnProperty(property)) {\n if (property in InkElement) {\n InkElement[property](el, properties[property]);\n } else {\n if(property === 'className' || property === 'class') {\n el.className = properties.className || properties['class'];\n } else {\n el.setAttribute(property, properties[property]);\n }\n }\n }\n }\n }\n return el;\n },\n\n /**\n * Removes a DOM Element\n *\n * @method remove\n * @param {Element} elm The element to remove\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_remove.html\n */\n remove: function(elm) {\n elm = Ink.i(elm);\n var parEl;\n if (elm && (parEl = elm.parentNode)) {\n parEl.removeChild(elm);\n }\n },\n\n /**\n * Scrolls the window to an element\n *\n * @method scrollTo\n * @param {DOMElement|String} elm Element where to scroll\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_scrollTo.html\n */\n scrollTo: function(elm) {\n elm = InkElement.get(elm);\n if(elm) {\n if (elm.scrollIntoView) {\n return elm.scrollIntoView();\n }\n\n var elmOffset = {},\n elmTop = 0, elmLeft = 0;\n\n do {\n elmTop += elm.offsetTop || 0;\n elmLeft += elm.offsetLeft || 0;\n\n elm = elm.offsetParent;\n } while(elm);\n\n elmOffset = {x: elmLeft, y: elmTop};\n\n window.scrollTo(elmOffset.x, elmOffset.y);\n }\n },\n\n /**\n * Gets the top offset of an element\n *\n * @method offsetTop\n * @uses Ink.Dom.Browser\n *\n * @param {DOMElement|String} elm Target element\n * @return {Number} Offset from the target element to the top of the document.\n * @public\n * @sample Ink_Dom_Element_1_offsetTop.html\n */\n offsetTop: function(elm) {\n return InkElement.offset(elm)[1];\n },\n\n /**\n * Gets the left offset of an element\n *\n * @method offsetLeft\n * @uses Ink.Dom.Browser\n *\n * @param {DOMElement|String} elm Target element\n * @return {Number} Offset from the target element to the left of the document\n * @public\n * @sample Ink_Dom_Element_1_offsetLeft.html\n */\n offsetLeft: function(elm) {\n return InkElement.offset(elm)[0];\n },\n\n /**\n * Gets the relative offset of an element\n *\n * @method positionedOffset\n * @param {Element|String} element Target element\n * @return {Array} Array with the element offsetleft and offsettop relative to the closest positioned ancestor\n * @public\n * @sample Ink_Dom_Element_1_positionedOffset.html\n */\n positionedOffset: function(element) {\n var valueTop = 0, valueLeft = 0;\n element = InkElement.get(element);\n do {\n valueTop += element.offsetTop || 0;\n valueLeft += element.offsetLeft || 0;\n element = element.offsetParent;\n if (element) {\n if (element.tagName.toLowerCase() === 'body') { break; }\n\n var value = element.style.position;\n if (!value && element.currentStyle) {\n value = element.currentStyle.position;\n }\n if ((!value || value === 'auto') && typeof getComputedStyle !== 'undefined') {\n var css = getComputedStyle(element, null);\n value = css ? css.position : null;\n }\n if (value === 'relative' || value === 'absolute') { break; }\n }\n } while (element);\n return [valueLeft, valueTop];\n },\n\n /**\n * Gets the cumulative offset for an element\n *\n * Returns the top left position of the element on the page\n *\n * @method offset\n * @uses Ink.Dom.Browser\n *\n * @method offset\n * @param {DOMElement|String} elm Target element\n * @return {[Number, Number]} Array with pixel distance from the target element to the top left corner of the document\n * @public\n * @sample Ink_Dom_Element_1_offset.html\n */\n offset: function(elm) {\n /*jshint boss:true */\n elm = Ink.i(elm);\n var res = [0, 0];\n var doc = elm.ownerDocument,\n docElem = doc.documentElement,\n box = rect(elm),\n body = doc.body,\n clientTop = docElem.clientTop || body.clientTop || 0,\n clientLeft = docElem.clientLeft || body.clientLeft || 0,\n scrollTop = doc.pageYOffset || docElem.scrollTop || body.scrollTop,\n scrollLeft = doc.pageXOffset || docElem.scrollLeft || body.scrollLeft,\n top = box.top + scrollTop - clientTop,\n left = box.left + scrollLeft - clientLeft;\n res = [left, top];\n return res;\n },\n\n /**\n * Gets the scroll of the element\n *\n * @method scroll\n * @param {DOMElement|String} [elm] Target element or document.body\n * @returns {Array} offset values for x and y scroll\n * @public\n * @sample Ink_Dom_Element_1_scroll.html\n */\n scroll: function(elm) {\n elm = elm ? Ink.i(elm) : document.body;\n return [\n ( ( !window.pageXOffset ) ? elm.scrollLeft : window.pageXOffset ),\n ( ( !window.pageYOffset ) ? elm.scrollTop : window.pageYOffset )\n ];\n },\n\n _getPropPx: function(cs, prop) {\n var n, c;\n var val = cs.getPropertyValue ? cs.getPropertyValue(prop) : cs[prop];\n if (!val) { n = 0; }\n else {\n c = val.indexOf('px');\n if (c === -1) { n = 0; }\n else {\n n = parseFloat(val, 10);\n }\n }\n\n //console.log([prop, ' \"', val, '\" ', n].join(''));\n\n return n;\n },\n\n /**\n * Alias for offset()\n *\n * @method offset2\n * @param {Element} el Element to be passed to `offset()`\n * @return {void}\n * @public\n * @deprecated Kept for historic reasons. Use offset() instead.\n */\n offset2: function(el) {\n return InkElement.offset(el);\n },\n\n /**\n * Checks if an element has an attribute\n *\n * @method hasAttribute\n * @param {Object} elm Target element\n * @param {String} attr Attribute name\n * @return {Boolean} Boolean based on existance of attribute\n * @sample Ink_Dom_Element_1_hasAttribute.html\n */\n hasAttribute: function(elm, attr){\n elm = Ink.i(elm);\n return elm.hasAttribute ? elm.hasAttribute(attr) : !!elm.getAttribute(attr);\n },\n /**\n * Inserts an element right after another\n *\n * @method insertAfter\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertAfter.html\n */\n insertAfter: function(newElm, targetElm) {\n /*jshint boss:true */\n if (targetElm = InkElement.get(targetElm)) {\n if (targetElm.nextSibling !== null) {\n targetElm.parentNode.insertBefore(newElm, targetElm.nextSibling);\n } else {\n targetElm.parentNode.appendChild(newElm);\n }\n }\n },\n\n /**\n * Inserts an element before another\n *\n * @method insertBefore\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertBefore.html\n */\n insertBefore: function (newElm, targetElm) {\n /*jshint boss:true */\n if ( (targetElm = InkElement.get(targetElm)) ) {\n targetElm.parentNode.insertBefore(newElm, targetElm);\n }\n },\n\n /**\n * Inserts an element as the first child of another\n *\n * @method insertTop\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertTop.html\n */\n insertTop: function(newElm,targetElm) {\n /*jshint boss:true */\n if (targetElm = InkElement.get(targetElm)) {\n if (targetElm.firstChild) {\n targetElm.insertBefore(newElm, targetElm.firstChild);\n } else {\n targetElm.appendChild(newElm);\n }\n }\n },\n\n /**\n * Inserts an element as the last child of another\n *\n * @method insertBottom\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertBottom.html\n */\n insertBottom: function(newElm, targetElm) {\n /*jshint boss:true */\n targetElm = Ink.i(targetElm);\n targetElm.appendChild(newElm);\n },\n\n /**\n * Retrieves textContent from node\n *\n * @method textContent\n * @param {DOMNode} node Where to retreive text from. Can be any node type.\n * @return {String} The text\n * @public\n * @sample Ink_Dom_Element_1_textContent.html\n */\n textContent: function(node){\n node = Ink.i(node);\n var text, k, cs, m;\n\n switch(node && node.nodeType) {\n case 9: /*DOCUMENT_NODE*/\n // IE quirks mode does not have documentElement\n return InkElement.textContent(node.documentElement || node.body && node.body.parentNode || node.body);\n\n case 1: /*ELEMENT_NODE*/\n text = ('textContent' in node) ? node.textContent : node.innerText;\n if (typeof text !== 'undefined') {\n return text;\n }\n /* falls through */\n case 11: /*DOCUMENT_FRAGMENT_NODE*/\n text = node.textContent;\n if (typeof text !== 'undefined') {\n return text;\n }\n\n if (node.firstChild === node.lastChild) {\n // Common case: 0 or 1 children\n return InkElement.textContent(node.firstChild);\n }\n\n text = [];\n cs = node.childNodes;\n for (k = 0, m = cs.length; k < m; ++k) {\n text.push( InkElement.textContent( cs[k] ) );\n }\n return text.join('');\n\n case 3: /*TEXT_NODE*/\n case 4: /*CDATA_SECTION_NODE*/\n return node.nodeValue;\n }\n return '';\n },\n\n /**\n * Replaces text content of a DOM Node\n * This method removes any child node previously present\n *\n * @method setTextContent\n * @param {Element} node Target node where the text will be added.\n * @param {String} text Text to be added on the node.\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_setTextContent.html\n */\n setTextContent: function(node, text){\n node = Ink.i(node);\n switch(node && node.nodeType)\n {\n case 1: /*ELEMENT_NODE*/\n if ('innerText' in node) {\n node.innerText = text;\n break;\n }\n /* falls through */\n case 11: /*DOCUMENT_FRAGMENT_NODE*/\n if ('textContent' in node) {\n node.textContent = text;\n break;\n }\n /* falls through */\n case 9: /*DOCUMENT_NODE*/\n while(node.firstChild) {\n node.removeChild(node.firstChild);\n }\n if (text !== '') {\n var doc = node.ownerDocument || node;\n node.appendChild(doc.createTextNode(text));\n }\n break;\n\n case 3: /*TEXT_NODE*/\n case 4: /*CDATA_SECTION_NODE*/\n node.nodeValue = text;\n break;\n }\n },\n\n /**\n * Checks if an element is a link\n *\n * @method isLink\n * @param {Element} element Element to check if it's a link.\n * @return {Boolean} Whether the element is a link.\n * @public\n * @sample Ink_Dom_Element_1_isLink.html\n */\n isLink: function(element){\n var b = element && element.nodeType === 1 && ((/^a|area$/i).test(element.tagName) ||\n element.hasAttributeNS && element.hasAttributeNS('http://www.w3.org/1999/xlink','href'));\n return !!b;\n },\n\n /**\n * Checks if a node is an ancestor of another\n *\n * @method isAncestorOf\n * @param {DOMNode} ancestor Ancestor node\n * @param {DOMNode} node Descendant node\n * @return {Boolean} Whether `ancestor` is an ancestor of `node`\n * @public\n * @sample Ink_Dom_Element_1_isAncestorOf.html\n */\n isAncestorOf: function(ancestor, node){\n /*jshint boss:true */\n if (!node || !ancestor) {\n return false;\n }\n if (node.compareDocumentPosition) {\n return (ancestor.compareDocumentPosition(node) & 0x10) !== 0;/*Node.DOCUMENT_POSITION_CONTAINED_BY*/\n }\n while (node = node.parentNode){\n if (node === ancestor){\n return true;\n }\n }\n return false;\n },\n\n /**\n * Checks if a node is descendant of another\n *\n * @method descendantOf\n * @param {DOMNode} node The ancestor\n * @param {DOMNode} descendant The descendant\n * @return {Boolean} `true` if 'descendant' is descendant of 'node'\n * @public\n * @sample Ink_Dom_Element_1_descendantOf.html\n */\n descendantOf: function(node, descendant){\n return node !== descendant && InkElement.isAncestorOf(node, descendant);\n },\n\n /**\n * Get first child element of another\n * @method firstElementChild\n * @param {DOMElement} elm Parent node\n * @return {DOMElement} the Element child\n * @public\n * @sample Ink_Dom_Element_1_firstElementChild.html\n */\n firstElementChild: function(elm){\n if(!elm) {\n return null;\n }\n if ('firstElementChild' in elm) {\n return elm.firstElementChild;\n }\n var child = elm.firstChild;\n while(child && child.nodeType !== 1) {\n child = child.nextSibling;\n }\n return child;\n },\n\n /**\n * Get the last child element of another\n * @method lastElementChild\n * @param {DOMElement} elm Parent node\n * @return {DOMElement} the Element child\n * @public\n * @sample Ink_Dom_Element_1_lastElementChild.html\n */\n lastElementChild: function(elm){\n if(!elm) {\n return null;\n }\n if ('lastElementChild' in elm) {\n return elm.lastElementChild;\n }\n var child = elm.lastChild;\n while(child && child.nodeType !== 1) {\n child = child.previousSibling;\n }\n return child;\n },\n\n /**\n * Get the first sibling element after the node\n *\n * @method nextElementSibling\n * @param {DOMNode} node The current node\n * @return {DOMElement|Null} The first sibling element after node or null if none is found\n * @public\n * @sample Ink_Dom_Element_1_nextElementSibling.html \n */\n nextElementSibling: function(node){\n var sibling = null;\n\n if(!node){ return sibling; }\n\n if(\"nextElementSibling\" in node){\n return node.nextElementSibling;\n } else {\n sibling = node.nextSibling;\n\n // 1 === Node.ELEMENT_NODE\n while(sibling && sibling.nodeType !== 1){\n sibling = sibling.nextSibling;\n }\n\n return sibling;\n }\n },\n\n /**\n * Get the first sibling element before the node\n *\n * @method previousElementSibling\n * @param {DOMNode} node The current node\n * @return {DOMElement|Null} The first element sibling before node or null if none is found\n * @public\n * @sample Ink_Dom_Element_1_previousElementSibling.html \n */\n previousElementSibling: function(node){\n var sibling = null;\n\n if(!node){ return sibling; }\n\n if(\"previousElementSibling\" in node){\n return node.previousElementSibling;\n } else {\n sibling = node.previousSibling;\n\n // 1 === Node.ELEMENT_NODE\n while(sibling && sibling.nodeType !== 1){\n sibling = sibling.previousSibling;\n }\n\n return sibling;\n }\n },\n\n /**\n * Get an element's width in pixels.\n *\n * @method elementWidth\n * @param {DOMElement|String} element Target DOM element or target ID\n * @return {Number} The element's width\n * @public\n * @sample Ink_Dom_Element_1_elementWidth.html \n */\n elementWidth: function(element) {\n if(typeof element === \"string\") {\n element = document.getElementById(element);\n }\n return element.offsetWidth;\n },\n\n /**\n * Get an element's height in pixels.\n *\n * @method elementHeight\n * @param {DOMElement|String} element DOM element or target ID\n * @return {Number} The element's height\n * @public\n * @sample Ink_Dom_Element_1_elementHeight.html \n */\n elementHeight: function(element) {\n if(typeof element === \"string\") {\n element = document.getElementById(element);\n }\n return element.offsetHeight;\n },\n\n /**\n * Deprecated. Alias for offsetLeft()\n *\n * @method elementLeft\n * @param {DOMElement|String} element DOM element or target ID\n * @return {Number} Element's left position\n */\n elementLeft: function(element) {\n return InkElement.offsetLeft(element);\n },\n\n /**\n * Deprecated. Alias for offsetTop()\n *\n * @method elementTop\n * @param {DOMElement|string} element Target DOM element or target ID\n * @return {Number} element's top position\n */\n elementTop: function(element) {\n return InkElement.offsetTop(element);\n },\n\n /**\n * Get an element's dimensions in pixels.\n *\n * @method elementDimensions\n * @param {DOMElement|string} element DOM element or target ID\n * @return {Array} Array with element's width and height\n * @sample Ink_Dom_Element_1_elementDimensions.html \n */\n elementDimensions: function(element) {\n element = Ink.i(element);\n return [element.offsetWidth, element.offsetHeight];\n },\n\n /**\n * Get the outer dimensions of an element in pixels.\n *\n * @method outerDimensions\n * @uses Ink.Dom.Css\n *\n * @param {DOMElement} element Target element\n * @return {Array} Array with element width and height.\n * @sample Ink_Dom_Element_1_outerDimensions.html \n */\n outerDimensions: function (element) {\n var bbox = rect(element);\n\n var Css = Ink.getModule('Ink.Dom.Css_1');\n var getStyle = Ink.bindMethod(Css, 'getStyle', element);\n\n return [\n bbox.right - bbox.left + parseFloat(getStyle('marginLeft') || 0) + parseFloat(getStyle('marginRight') || 0), // w\n bbox.bottom - bbox.top + parseFloat(getStyle('marginTop') || 0) + parseFloat(getStyle('marginBottom') || 0) // h\n ];\n },\n\n /**\n * Check if an element is inside the viewport\n *\n * @method inViewport\n * @param {DOMElement} element DOM Element\n * @param {Object} [options] Options object. If you pass a Boolean value here, it is interpreted as `options.partial`\n * @param {Boolean} [options.partial]=false Return `true` even if it is only partially visible.\n * @param {Number} [options.margin]=0 Consider a margin all around the viewport with `opts.margin` width a dead zone.\n * @return {Boolean} Whether the element is inside the viewport.\n * @public\n * @sample Ink_Dom_Element_1_inViewport.html \n */\n inViewport: function (element, options) {\n var dims = rect(Ink.i(element));\n if (typeof options === 'boolean') {\n options = {partial: options, margin: 0};\n }\n options = Ink.extendObj({ partial: false, margin: 0}, options || {});\n if (options.partial) {\n return dims.bottom + options.margin > 0 && // from the top\n dims.left - options.margin < InkElement.viewportWidth() && // from the right\n dims.top - options.margin < InkElement.viewportHeight() && // from the bottom\n dims.right + options.margin > 0; // from the left\n } else {\n return dims.top + options.margin > 0 && // from the top\n dims.right - options.margin < InkElement.viewportWidth() && // from the right\n dims.bottom - options.margin < InkElement.viewportHeight() && // from the bottom\n dims.left + options.margin > 0; // from the left\n }\n },\n\n /**\n * Check if an element is hidden.\n * Taken from Mootools Element extras ( https://gist.github.com/cheeaun/73342 )\n * Does not take into account visibility:hidden\n * @method isHidden\n * @param {DOMElement} element Element to check\n * @return {Boolean} Whether the element is hidden\n * @sample Ink_Dom_Element_1_isHidden.html \n */\n isHidden: function (element) {\n var w = element.offsetWidth, \n h = element.offsetHeight,\n force = (element.tagName.toLowerCase() === 'tr');\n\n var Css = Ink.getModule('Ink.Dom.Css_1');\n\n return (w===0 && h===0 && !force) ? true :\n (w!==0 && h!==0 && !force) ? false :\n Css.getStyle(element, 'display').toLowerCase() === 'none';\n },\n\n /**\n * Check if an element is visible \n *\n * @method isVisible\n * @uses isHidden\n * @param {DOMElement} element Element to check\n * @return {Boolean} Whether the element is visible\n * @sample Ink_Dom_Element_1_isVisible.html \n */\n isVisible: function (element) {\n return !this.isHidden(element);\n },\n\n /**\n * Clones an element's position to another\n *\n * @method clonePosition\n * @param {Element} cloneTo element to be position cloned\n * @param {Element} cloneFrom element to get the cloned position\n * @return {Element} The element with positionClone\n * @public\n * @sample Ink_Dom_Element_1_clonePosition.html \n */\n clonePosition: function(cloneTo, cloneFrom){\n var pos = InkElement.offset(cloneFrom);\n cloneTo.style.left = pos[0]+'px';\n cloneTo.style.top = pos[1]+'px';\n\n return cloneTo;\n },\n\n /**\n * Text-overflow: ellipsis emulation\n * Slices off a piece of text at the end of the element and adds the ellipsis so all text fits inside.\n *\n * @method ellipsizeText\n * @param {Element} element Element to modify text content\n * @param {String} [ellipsis='\\u2026'] String to append to the chopped text\n * @return {void}\n * @public\n */\n ellipsizeText: function(element/*, ellipsis*/){\n if ((element = Ink.i(element))) {\n element.style.overflow = 'hidden';\n element.style.whiteSpace = 'nowrap';\n element.style.textOverflow = 'ellipsis';\n }\n },\n\n /**\n * Finds the closest ancestor element matching your test function\n *\n * @method findUpwardsHaving\n * @param {Element} element Element to base the search from\n * @param {Function} boolTest Testing function\n * @return {Element|false} The matched element or false if did not match\n * @public\n * @sample Ink_Dom_Element_1_findUpwardsHaving.html \n */\n findUpwardsHaving: function(element, boolTest) {\n while (element && element.nodeType === 1) {\n if (boolTest(element)) {\n return element;\n }\n element = element.parentNode;\n }\n return false;\n },\n\n /**\n * Finds the closest ancestor by class name\n *\n * @method findUpwardsByClass\n * @uses findUpwardsHaving\n * @param {DOMElement} element Element to base the search from\n * @param {String} className Class name to search\n * @returns {DOMElement|false} The matched element or false if did not match\n * @public\n * @sample Ink_Dom_Element_1_findUpwardsByClass.html \n */\n findUpwardsByClass: function(element, className) {\n var re = new RegExp(\"(^|\\\\s)\" + className + \"(\\\\s|$)\");\n var tst = function(el) {\n var cls = el.className;\n return cls && re.test(cls);\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Finds the closest ancestor by tag name\n *\n * @method findUpwardsByTag\n * @param {DOMElement} element Element to base the search from\n * @param {String} tag Tag to search\n * @returns {DOMElement|false} the matched element or false if did not match\n * @sample Ink_Dom_Element_1_findUpwardsByTag.html \n */\n findUpwardsByTag: function(element, tag) {\n tag = tag.toUpperCase();\n var tst = function(el) {\n return el.nodeName && el.nodeName.toUpperCase() === tag;\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Finds the closest ancestor by id\n *\n * @method findUpwardsById\n * @param {HtmlElement} element Element to base the search from\n * @param {String} id ID to search\n * @returns {HtmlElement|false} The matched element or false if did not match\n * @sample Ink_Dom_Element_1_findUpwardsById.html \n */\n findUpwardsById: function(element, id) {\n var tst = function(el) {\n return el.id === id;\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Finds the closest ancestor by CSS selector\n *\n * @method findUpwardsBySelector\n * @param {HtmlElement} element Element to base the search from\n * @param {String} sel CSS selector\n * @returns {HtmlElement|false} The matched element or false if did not match\n * @sample Ink_Dom_Element_1_findUpwardsBySelector.html \n */\n findUpwardsBySelector: function(element, sel) {\n var Selector = Ink.getModule('Ink.Dom.Selector', '1');\n if (!Selector) {\n throw new Error('This method requires Ink.Dom.Selector');\n }\n var tst = function(el) {\n return Selector.matchesSelector(el, sel);\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Gets the trimmed text of an element\n *\n * @method getChildrenText\n * @param {DOMElement} el Element to base the search from\n * @param {Boolean} [removeIt] Flag to remove the text from the element\n * @return {String} Text found\n * @sample Ink_Dom_Element_1_getChildrenText.html \n */\n getChildrenText: function(el, removeIt) {\n var node,\n j,\n part,\n nodes = el.childNodes,\n jLen = nodes.length,\n text = '';\n\n if (!el) {\n return text;\n }\n\n for (j = 0; j < jLen; ++j) {\n node = nodes[j];\n if (!node) { continue; }\n if (node.nodeType === 3) { // TEXT NODE\n part = InkElement._trimString( String(node.data) );\n if (part.length > 0) {\n text += part;\n if (removeIt) { el.removeChild(node); }\n }\n else { el.removeChild(node); }\n }\n }\n\n return text;\n },\n\n /**\n * String trim implementation\n * Used by getChildrenText\n *\n * function _trimString\n * param {String} text\n * return {String} trimmed text\n */\n _trimString: function(text) {\n return (String.prototype.trim) ? text.trim() : text.replace(/^\\s*/, '').replace(/\\s*$/, '');\n },\n\n /**\n * Gets value of a select element\n *\n * @method getSelectValues\n * @param {DOMElement|String} select element\n * @return {Array} The selected values\n * @sample Ink_Dom_Element_1_getSelectValues.html \n */\n getSelectValues: function (select) {\n var selectEl = Ink.i(select);\n var values = [];\n for (var i = 0; i < selectEl.options.length; ++i) {\n values.push( selectEl.options[i].value );\n }\n return values;\n },\n\n\n /* used by fills */\n _normalizeData: function(data) {\n var d, data2 = [];\n for (var i = 0, f = data.length; i < f; ++i) {\n d = data[i];\n\n if (!(d instanceof Array)) { // if not array, wraps primitive twice: val -> [val, val]\n d = [d, d];\n }\n else if (d.length === 1) { // if 1 element array: [val] -> [val, val]\n d.push(d[0]);\n }\n data2.push(d);\n }\n return data2;\n },\n\n\n /**\n * Fills a select element with options\n *\n * @method fillSelect\n * @param {DOMElement|String} container Select element which will get filled\n * @param {Array} data Data to populate the component\n * @param {Boolean} [skipEmpty] Flag to skip empty option\n * @param {String|Number} [defaultValue] Initial selected value\n * @return {void}\n * @public\n *\n * @sample Ink_Dom_Element_1_fillSelect.html \n */\n fillSelect: function(container, data, skipEmpty, defaultValue) {\n var containerEl = Ink.i(container);\n if (!containerEl) { return; }\n\n containerEl.innerHTML = '';\n var d, optionEl;\n\n if (!skipEmpty) {\n // add initial empty option\n optionEl = document.createElement('option');\n optionEl.setAttribute('value', '');\n containerEl.appendChild(optionEl);\n }\n\n data = InkElement._normalizeData(data);\n\n for (var i = 0, f = data.length; i < f; ++i) {\n d = data[i];\n\n optionEl = document.createElement('option');\n optionEl.setAttribute('value', d[0]);\n if (d.length > 2) {\n optionEl.setAttribute('extra', d[2]);\n }\n optionEl.appendChild( document.createTextNode(d[1]) );\n\n if (d[0] === defaultValue) {\n optionEl.setAttribute('selected', 'selected');\n }\n\n containerEl.appendChild(optionEl);\n }\n },\n\n\n /**\n * Creates a set of radio buttons from an array of data\n *\n * @method fillRadios\n * @param {Element|String} insertAfterEl Element after which the input elements will be created\n * @param {String} name Name for the form field ([] is added if not present as a suffix)\n * @param {Array} data Data to populate the component\n * @param {Boolean} [skipEmpty] Flag to skip creation of empty options\n * @param {String|Number} [defaultValue] Initial selected value\n * @param {String} [splitEl] Name of element to add after each input element (example: 'br')\n * @return {DOMElement} Wrapper element around the radio buttons\n */\n fillRadios: function(insertAfterEl, name, data, skipEmpty, defaultValue, splitEl) {\n insertAfterEl = Ink.i(insertAfterEl);\n var containerEl = document.createElement('span');\n InkElement.insertAfter(containerEl, insertAfterEl);\n\n data = InkElement._normalizeData(data);\n\n /*\n if (name.substring(name.length - 1) !== ']') {\n name += '[]';\n }\n */\n\n var d, inputEl;\n\n if (!skipEmpty) {\n // add initial empty option\n inputEl = document.createElement('input');\n inputEl.setAttribute('type', 'radio');\n inputEl.setAttribute('name', name);\n inputEl.setAttribute('value', '');\n containerEl.appendChild(inputEl);\n if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); }\n }\n\n for (var i = 0; i < data.length; ++i) {\n d = data[i];\n\n inputEl = document.createElement('input');\n inputEl.setAttribute('type', 'radio');\n inputEl.setAttribute('name', name);\n inputEl.setAttribute('value', d[0]);\n containerEl.appendChild(inputEl);\n containerEl.appendChild( document.createTextNode(d[1]) );\n if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); }\n\n if (d[0] === defaultValue) {\n inputEl.checked = true;\n }\n }\n\n return containerEl;\n },\n\n\n /**\n * Creates set of checkbox buttons\n *\n * @method fillChecks\n * @param {Element|String} insertAfterEl Element after which the input elements will be created\n * @param {String} name Name for the form field ([] is added if not present as a suffix)\n * @param {Array} data Data to populate the component\n * @param {String|Number} [defaultValue] Initial selected value\n * @param {String} [splitEl] Name of element to add after each input element (example: 'br')\n * @return {Element} Wrapper element around the checkboxes\n * @public\n */\n fillChecks: function(insertAfterEl, name, data, defaultValue, splitEl) {\n insertAfterEl = Ink.i(insertAfterEl);\n var containerEl = document.createElement('span');\n InkElement.insertAfter(containerEl, insertAfterEl);\n\n data = InkElement._normalizeData(data);\n\n if (name.substring(name.length - 1) !== ']') {\n name += '[]';\n }\n\n var d, inputEl;\n\n for (var i = 0; i < data.length; ++i) {\n d = data[i];\n\n inputEl = document.createElement('input');\n inputEl.setAttribute('type', 'checkbox');\n inputEl.setAttribute('name', name);\n inputEl.setAttribute('value', d[0]);\n containerEl.appendChild(inputEl);\n containerEl.appendChild( document.createTextNode(d[1]) );\n if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); }\n\n if (d[0] === defaultValue) {\n inputEl.checked = true;\n }\n }\n\n return containerEl;\n },\n\n\n /**\n * Gets the index of an element relative to a parent\n *\n * @method parentIndexOf\n * @param {Element} [parentEl] childEl's parent. Deprecated.\n * @param {Element} childEl Child Element to look for\n * @return {Number} The index of the childEl inside parentEl. Returns -1 if it's not a direct child\n * @public\n * @sample Ink_Dom_Element_1_parentIndexOf.html \n */\n parentIndexOf: function(parentEl, childEl) {\n if (!childEl) {\n // one argument form\n childEl = parentEl;\n parentEl = parentEl.parentNode;\n }\n if (!parentEl) { return false; }\n for (var i = 0, f = parentEl.children.length; i < f; ++i) {\n if (parentEl.children[i] === childEl) {\n return i;\n }\n }\n return false;\n },\n\n\n /**\n * Gets the next siblings of an element\n *\n * @method nextSiblings\n * @param {String|DOMElement} elm Element\n * @return {Array} Array of next sibling elements\n * @sample Ink_Dom_Element_1_nextSiblings.html \n */\n nextSiblings: function(elm) {\n elm = Ink.i(elm);\n if(typeof(elm) === 'object' && elm !== null && elm.nodeType && elm.nodeType === 1) {\n var elements = [],\n siblings = elm.parentNode.children,\n index = InkElement.parentIndexOf(elm.parentNode, elm);\n\n for(var i = ++index, len = siblings.length; i\" + html + \"
            \" + deleteThisTbodyToken + \"
            \";\n } else {\n div.innerHTML = \"\" + html + \"
            \";\n }\n return div.firstChild;\n },\n TBODY: function (div, html) {\n div.innerHTML = '' + html + '
            ';\n return div.firstChild.getElementsByTagName('tbody')[0];\n },\n THEAD: function (div, html) {\n div.innerHTML = '' + html + '
            ';\n return div.firstChild.getElementsByTagName('thead')[0];\n },\n TFOOT: function (div, html) {\n div.innerHTML = '' + html + '
            ';\n return div.firstChild.getElementsByTagName('tfoot')[0];\n },\n TR: function (div, html) {\n div.innerHTML = '' + html + '
            ';\n return div.firstChild.firstChild.firstChild;\n }\n },\n\n /**\n * Gets a wrapper DIV with a certain HTML content to be inserted inside another element.\n * This is necessary for appendHTML,prependHTML functions, because they need a container element to copy the children from.\n *\n * Works around IE table quirks\n * @method _getWrapper\n * @private\n * @param elm\n * @param html\n */\n _getWrapper: function (elm, html) {\n var nodeName = elm.nodeName && elm.nodeName.toUpperCase();\n var wrapper = document.createElement('div');\n var wrapFunc = InkElement._wrapElements[nodeName];\n\n if ( !wrapFunc ) {\n wrapper.innerHTML = html;\n return wrapper;\n }\n // special cases\n wrapper = wrapFunc(wrapper, html);\n // worst case: tbody auto-creation even when our HTML has a tbody.\n if (browserCreatesTbodies && nodeName === 'TABLE') {\n // terrible case. Deal with tbody creation too.\n var tds = wrapper.getElementsByTagName('td');\n for (var i = 0, len = tds.length; i < len; i++) {\n if (tds[i].innerHTML === deleteThisTbodyToken) {\n var tbody = tds[i].parentNode.parentNode;\n tbody.parentNode.removeChild(tbody);\n }\n }\n }\n return wrapper;\n },\n\n /**\n * Appends HTML to an element.\n * This method parses the html string and doesn't modify its contents\n *\n * @method appendHTML\n * @param {String|DOMElement} elm Element\n * @param {String} html Markup string\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_appendHTML.html \n */\n appendHTML: function(elm, html){\n elm = Ink.i(elm);\n if(elm !== null) {\n var wrapper = InkElement._getWrapper(elm, html);\n while (wrapper.firstChild) {\n elm.appendChild(wrapper.firstChild);\n }\n }\n },\n\n /**\n * Prepends HTML to an element.\n * This method parses the html string and doesn't modify its contents\n *\n * @method prependHTML\n * @param {String|Element} elm Element\n * @param {String} html Markup string to prepend\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_prependHTML.html \n */\n prependHTML: function(elm, html){\n elm = Ink.i(elm);\n if(elm !== null) {\n var wrapper = InkElement._getWrapper(elm, html);\n while (wrapper.lastChild) {\n elm.insertBefore(wrapper.lastChild, elm.firstChild);\n }\n }\n },\n\n /**\n * Sets the inner HTML of an element.\n *\n * @method setHTML\n * @param {String|DOMElement} elm Element\n * @param {String} html Markup string\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_setHTML.html \n */\n setHTML: function (elm, html) {\n elm = Ink.i(elm);\n if(elm !== null) {\n try {\n elm.innerHTML = html;\n } catch (e) {\n // Tables in IE7\n while (elm.firstChild) {\n elm.removeChild(elm.firstChild);\n }\n InkElement.appendHTML(elm, html);\n }\n }\n },\n\n /**\n * Wraps an element inside a container.\n *\n * The container may or may not be in the document yet.\n *\n * @method wrap\n * @param {String|Element} target Element to be wrapped\n * @param {String|Element} container Element to wrap the target\n * @return {Element} Container element\n * @public\n * @sample Ink_Dom_Element_1_wrap.html \n *\n * @example\n * before:\n *\n *
            \n *\n * call this function to wrap #target with a wrapper div.\n *\n * InkElement.wrap('target', InkElement.create('div', {id: 'container'});\n * \n * after: \n *\n *
            \n */\n wrap: function (target, container) {\n target = Ink.i(target);\n container = Ink.i(container);\n \n var nextNode = target.nextSibling;\n var parent = target.parentNode;\n\n container.appendChild(target);\n\n if (nextNode !== null) {\n parent.insertBefore(container, nextNode);\n } else {\n parent.appendChild(container);\n }\n\n return container;\n },\n\n /**\n * Places an element outside a wrapper.\n *\n * @method unwrap\n * @param {DOMElement} elem The element you're trying to unwrap. This should be an ancestor of the wrapper.\n * @param {String} [wrapperSelector] CSS Selector for the ancestor. Use this if your wrapper is not the direct parent of elem.\n * @return {void}\n * @sample Ink_Dom_Element_1_unwrap.html \n *\n * @example\n *\n * When you have this:\n *\n *
            \n *
            \n *
            \n *\n * If you do this:\n *\n * InkElement.unwrap('unwrapMe');\n *\n * You get this:\n *\n *
            \n *
            \n * \n **/\n unwrap: function (elem, wrapperSelector) {\n elem = Ink.i(elem);\n var wrapper;\n if (typeof wrapperSelector === 'string') {\n wrapper = InkElement.findUpwardsBySelector(elem, wrapperSelector);\n } else if (typeof wrapperSelector === 'object' && wrapperSelector.tagName) {\n wrapper = InkElement.findUpwardsHaving(elem, function (ancestor) {\n return ancestor === wrapperSelector;\n });\n } else {\n wrapper = elem.parentNode;\n }\n if (!wrapper || !wrapper.parentNode) { return; }\n\n InkElement.insertBefore(elem, wrapper);\n },\n\n /**\n * Replaces an element with another.\n *\n * @method replace\n * @param {Element} element The element to be replaced.\n * @param {Element} replacement The new element.\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_replace.html \n *\n * @example\n * var newelement1 = InkElement.create('div');\n * // ...\n * replace(Ink.i('element1'), newelement1);\n */\n replace: function (element, replacement) {\n element = Ink.i(element);\n if(element !== null) {\n element.parentNode.replaceChild(replacement, element);\n }\n },\n\n /**\n * Removes direct text children.\n * Useful to remove nasty layout gaps generated by whitespace on the markup.\n *\n * @method removeTextNodeChildren\n * @param {Element} el Element to remove text from\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_removeTextNodeChildren.html \n */\n removeTextNodeChildren: function(el) {\n el = Ink.i(el);\n if(el !== null) {\n var prevEl, toRemove, parent = el;\n el = el.firstChild;\n while (el) {\n toRemove = (el.nodeType === 3);\n prevEl = el;\n el = el.nextSibling;\n if (toRemove) {\n parent.removeChild(prevEl);\n }\n }\n }\n },\n\n /**\n * Creates a documentFragment from an HTML string.\n *\n * @method htmlToFragment\n * @param {String} html HTML string\n * @return {DocumentFragment} DocumentFragment containing all of the elements from the html string\n * @sample Ink_Dom_Element_1_htmlToFragment.html \n */\n htmlToFragment: (createContextualFragmentSupport ?\n function(html){\n var range;\n\n if(typeof html !== 'string'){ return document.createDocumentFragment(); }\n\n range = document.createRange();\n\n // set the context to document.body (firefox does this already, webkit doesn't)\n range.selectNode(document.body);\n\n return range.createContextualFragment(html);\n } : function (html) {\n var fragment = document.createDocumentFragment(),\n tempElement,\n current;\n\n if(typeof html !== 'string'){ return fragment; }\n\n tempElement = document.createElement('div');\n tempElement.innerHTML = html;\n\n // append child removes elements from the original parent\n while( (current = tempElement.firstChild) ){ // intentional assignment\n fragment.appendChild(current);\n }\n\n return fragment;\n }),\n\n _camelCase: function(str)\n {\n return str ? str.replace(/-(\\w)/g, function (_, $1){\n return $1.toUpperCase();\n }) : str;\n },\n\n /**\n * Gets data attributes from an element\n *\n * @method data\n * @param {String|DOMElement} selector Element or CSS selector\n * @return {Object} Object with the data-* properties. If no data-attributes are present, an empty object is returned.\n * @sample Ink_Dom_Element_1_data.html \n */\n data: function(selector) {\n var el;\n if (typeof selector !== 'object' && typeof selector !== 'string') {\n throw '[Ink.Dom.Element.data] :: Invalid selector defined';\n }\n\n if (typeof selector === 'object') {\n el = selector;\n }\n else {\n var InkDomSelector = Ink.getModule('Ink.Dom.Selector', 1);\n if (!InkDomSelector) {\n throw \"[Ink.Dom.Element.data] :: this method requires Ink.Dom.Selector - v1\";\n }\n el = InkDomSelector.select(selector);\n if (el.length <= 0) {\n throw \"[Ink.Dom.Element.data] :: Can't find any element with the specified selector\";\n }\n el = el[0];\n }\n\n var dataset = {};\n var attrs = el.attributes || [];\n\n var curAttr, curAttrName, curAttrValue;\n if (attrs) {\n for (var i = 0, total = attrs.length; i < total; ++i) {\n curAttr = attrs[i];\n curAttrName = curAttr.name;\n curAttrValue = curAttr.value;\n if (curAttrName && curAttrName.indexOf('data-') === 0) {\n dataset[InkElement._camelCase(curAttrName.replace('data-', ''))] = curAttrValue;\n }\n }\n }\n\n return dataset;\n },\n\n /**\n * Move the cursor on an input or textarea element.\n * @method moveCursorTo\n * @param {Element} el Input or Textarea element\n * @param {Number} t Index of the character to move the cursor to\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_moveCursorTo.html \n */\n moveCursorTo: function(el, t) {\n el = Ink.i(el);\n if(el !== null) {\n if (el.setSelectionRange) {\n el.setSelectionRange(t, t);\n //el.focus();\n }\n else {\n var range = el.createTextRange();\n range.collapse(true);\n range.moveEnd( 'character', t);\n range.moveStart('character', t);\n range.select();\n }\n }\n },\n\n /**\n * Get the page's width.\n * @method pageWidth\n * @return {Number} Page width in pixels\n * @sample Ink_Dom_Element_1_pageWidth.html \n */\n pageWidth: function() {\n var xScroll;\n\n if (window.innerWidth && window.scrollMaxX) {\n xScroll = window.innerWidth + window.scrollMaxX;\n } else if (document.body.scrollWidth > document.body.offsetWidth){\n xScroll = document.body.scrollWidth;\n } else {\n xScroll = document.body.offsetWidth;\n }\n\n var windowWidth;\n\n if (window.self.innerWidth) {\n if(document.documentElement.clientWidth){\n windowWidth = document.documentElement.clientWidth;\n } else {\n windowWidth = window.self.innerWidth;\n }\n } else if (document.documentElement && document.documentElement.clientWidth) {\n windowWidth = document.documentElement.clientWidth;\n } else if (document.body) {\n windowWidth = document.body.clientWidth;\n }\n\n if(xScroll < windowWidth){\n return xScroll;\n } else {\n return windowWidth;\n }\n },\n\n /**\n * Get the page's height.\n * @method pageHeight\n * @return {Number} Page height in pixels\n * @sample Ink_Dom_Element_1_pageHeight.html \n */\n pageHeight: function() {\n var yScroll;\n\n if (window.innerHeight && window.scrollMaxY) {\n yScroll = window.innerHeight + window.scrollMaxY;\n } else if (document.body.scrollHeight > document.body.offsetHeight){\n yScroll = document.body.scrollHeight;\n } else {\n yScroll = document.body.offsetHeight;\n }\n\n var windowHeight;\n\n if (window.self.innerHeight) {\n windowHeight = window.self.innerHeight;\n } else if (document.documentElement && document.documentElement.clientHeight) {\n windowHeight = document.documentElement.clientHeight;\n } else if (document.body) {\n windowHeight = document.body.clientHeight;\n }\n\n if(yScroll < windowHeight){\n return windowHeight;\n } else {\n return yScroll;\n }\n },\n\n /**\n * Get the viewport's width.\n * @method viewportWidth\n * @return {Number} Viewport width in pixels\n * @sample Ink_Dom_Element_1_viewportWidth.html \n */\n viewportWidth: function() {\n if(typeof window.innerWidth !== \"undefined\") {\n return window.innerWidth;\n }\n if (document.documentElement && typeof document.documentElement.offsetWidth !== \"undefined\") {\n return document.documentElement.offsetWidth;\n }\n },\n\n /**\n * Get the viewport's height.\n * @method viewportHeight\n * @return {Number} Viewport height in pixels\n * @sample Ink_Dom_Element_1_viewportHeight.html \n */\n viewportHeight: function() {\n if (typeof window.innerHeight !== \"undefined\") {\n return window.innerHeight;\n }\n if (document.documentElement && typeof document.documentElement.offsetHeight !== \"undefined\") {\n return document.documentElement.offsetHeight;\n }\n },\n\n /**\n * Get the scroll's width.\n * @method scrollWidth\n * @return {Number} Scroll width\n */\n scrollWidth: function() {\n if (typeof window.self.pageXOffset !== 'undefined') {\n return window.self.pageXOffset;\n }\n if (typeof document.documentElement !== 'undefined' && typeof document.documentElement.scrollLeft !== 'undefined') {\n return document.documentElement.scrollLeft;\n }\n return document.body.scrollLeft;\n },\n\n /**\n * Get the scroll's height.\n * @method scrollHeight\n * @return {Number} Scroll height\n */\n scrollHeight: function() {\n if (typeof window.self.pageYOffset !== 'undefined') {\n return window.self.pageYOffset;\n }\n if (typeof document.documentElement !== 'undefined' && typeof document.documentElement.scrollTop !== 'undefined') {\n return document.documentElement.scrollTop;\n }\n return document.body.scrollTop;\n }\n };\n\n return InkElement;\n\n});\n","/**\n * Event management\n * @module Ink.Dom.Event_1\n * @version 1\n */\n\nInk.createModule('Ink.Dom.Event', 1, [], function() {\n /* jshint\n asi:true,\n strict:false,\n laxcomma:true,\n eqeqeq:false,\n laxbreak:true,\n boss:true,\n curly:false,\n expr:true\n */\n\n /**\n * @namespace Ink.Dom.Event_1\n * @static\n */\n\n /*!\n * Bean - copyright (c) Jacob Thornton 2011-2012\n * https://github.com/fat/bean\n * MIT license\n */\n var bean = (function (name, context, definition) {\n return definition()\n })('bean', this, function (name, context) {\n name = name || 'bean'\n context = context || this\n\n var win = window\n , old = context[name]\n , namespaceRegex = /[^\\.]*(?=\\..*)\\.|.*/\n , nameRegex = /\\..*/\n , addEvent = 'addEventListener'\n , removeEvent = 'removeEventListener'\n , doc = document || {}\n , root = doc.documentElement || {}\n , W3C_MODEL = root[addEvent]\n , eventSupport = W3C_MODEL ? addEvent : 'attachEvent'\n , ONE = {} // singleton for quick matching making add() do one()\n\n , slice = Array.prototype.slice\n , str2arr = function (s, d) { return s.split(d || ' ') }\n , isString = function (o) { return typeof o == 'string' }\n , isFunction = function (o) { return typeof o == 'function' }\n\n // events that we consider to be 'native', anything not in this list will\n // be treated as a custom event\n , standardNativeEvents =\n 'click dblclick mouseup mousedown contextmenu ' + // mouse buttons\n 'mousewheel mousemultiwheel DOMMouseScroll ' + // mouse wheel\n 'mouseover mouseout mousemove selectstart selectend ' + // mouse movement\n 'keydown keypress keyup ' + // keyboard\n 'orientationchange ' + // mobile\n 'focus blur change reset select submit ' + // form elements\n 'load unload beforeunload resize move DOMContentLoaded ' + // window\n 'readystatechange message ' + // window\n 'error abort scroll ' // misc\n // element.fireEvent('onXYZ'... is not forgiving if we try to fire an event\n // that doesn't actually exist, so make sure we only do these on newer browsers\n , w3cNativeEvents =\n 'show ' + // mouse buttons\n 'input invalid ' + // form elements\n 'touchstart touchmove touchend touchcancel ' + // touch\n 'gesturestart gesturechange gestureend ' + // gesture\n 'textinput' + // TextEvent\n 'readystatechange pageshow pagehide popstate ' + // window\n 'hashchange offline online ' + // window\n 'afterprint beforeprint ' + // printing\n 'dragstart dragenter dragover dragleave drag drop dragend ' + // dnd\n 'loadstart progress suspend emptied stalled loadmetadata ' + // media\n 'loadeddata canplay canplaythrough playing waiting seeking ' + // media\n 'seeked ended durationchange timeupdate play pause ratechange ' + // media\n 'volumechange cuechange ' + // media\n 'checking noupdate downloading cached updateready obsolete ' // appcache\n\n // convert to a hash for quick lookups\n , nativeEvents = (function (hash, events, i) {\n for (i = 0; i < events.length; i++) events[i] && (hash[events[i]] = 1)\n return hash\n }({}, str2arr(standardNativeEvents + (W3C_MODEL ? w3cNativeEvents : ''))))\n\n // custom events are events that we *fake*, they are not provided natively but\n // we can use native events to generate them\n , customEvents = (function () {\n var isAncestor = 'compareDocumentPosition' in root\n ? function (element, container) {\n return container.compareDocumentPosition && (container.compareDocumentPosition(element) & 16) === 16\n }\n : 'contains' in root\n ? function (element, container) {\n container = container.nodeType === 9 || container === window ? root : container\n return container !== element && container.contains(element)\n }\n : function (element, container) {\n while (element = element.parentNode) if (element === container) return 1\n return 0\n }\n , check = function (event) {\n var related = event.relatedTarget\n return !related\n ? related == null\n : (related !== this && related.prefix !== 'xul' && !/document/.test(this.toString())\n && !isAncestor(related, this))\n }\n\n return {\n mouseenter: { base: 'mouseover', condition: check }\n , mouseleave: { base: 'mouseout', condition: check }\n , mousewheel: { base: /Firefox/.test(navigator.userAgent) ? 'DOMMouseScroll' : 'mousewheel' }\n }\n }())\n\n // we provide a consistent Event object across browsers by taking the actual DOM\n // event object and generating a new one from its properties.\n , Event = (function () {\n // a whitelist of properties (for different event types) tells us what to check for and copy\n var commonProps = str2arr('altKey attrChange attrName bubbles cancelable ctrlKey currentTarget ' +\n 'detail eventPhase getModifierState isTrusted metaKey relatedNode relatedTarget shiftKey ' +\n 'srcElement target timeStamp type view which propertyName path')\n , mouseProps = commonProps.concat(str2arr('button buttons clientX clientY dataTransfer ' +\n 'fromElement offsetX offsetY pageX pageY screenX screenY toElement movementX movementY region'))\n , mouseWheelProps = mouseProps.concat(str2arr('wheelDelta wheelDeltaX wheelDeltaY wheelDeltaZ ' +\n 'axis')) // 'axis' is FF specific\n , keyProps = commonProps.concat(str2arr('char charCode key keyCode keyIdentifier ' +\n 'keyLocation location isComposing code'))\n , textProps = commonProps.concat(str2arr('data'))\n , touchProps = commonProps.concat(str2arr('touches targetTouches changedTouches scale rotation'))\n , messageProps = commonProps.concat(str2arr('data origin source'))\n , stateProps = commonProps.concat(str2arr('state'))\n , overOutRegex = /over|out/\n // some event types need special handling and some need special properties, do that all here\n , typeFixers = [\n { // key events\n reg: /key/i\n , fix: function (event, newEvent) {\n newEvent.keyCode = event.keyCode || event.which\n return keyProps\n }\n }\n , { // mouse events\n reg: /click|mouse(?!(.*wheel|scroll))|menu|drag|drop/i\n , fix: function (event, newEvent, type) {\n newEvent.rightClick = event.which === 3 || event.button === 2\n newEvent.pos = { x: 0, y: 0 }\n if (event.pageX || event.pageY) {\n newEvent.clientX = event.pageX\n newEvent.clientY = event.pageY\n } else if (event.clientX || event.clientY) {\n newEvent.clientX = event.clientX + doc.body.scrollLeft + root.scrollLeft\n newEvent.clientY = event.clientY + doc.body.scrollTop + root.scrollTop\n }\n if (overOutRegex.test(type)) {\n newEvent.relatedTarget = event.relatedTarget\n || event[(type == 'mouseover' ? 'from' : 'to') + 'Element']\n }\n return mouseProps\n }\n }\n , { // mouse wheel events\n reg: /mouse.*(wheel|scroll)/i\n , fix: function () { return mouseWheelProps }\n }\n , { // TextEvent\n reg: /^text/i\n , fix: function () { return textProps }\n }\n , { // touch and gesture events\n reg: /^touch|^gesture/i\n , fix: function () { return touchProps }\n }\n , { // message events\n reg: /^message$/i\n , fix: function () { return messageProps }\n }\n , { // popstate events\n reg: /^popstate$/i\n , fix: function () { return stateProps }\n }\n , { // everything else\n reg: /.*/\n , fix: function () { return commonProps }\n }\n ]\n , typeFixerMap = {} // used to map event types to fixer functions (above), a basic cache mechanism\n\n , Event = function (event, element, isNative) {\n if (!arguments.length) return\n event = event || ((element.ownerDocument || element.document || element).parentWindow || win).event\n this.originalEvent = event\n this.isNative = isNative\n this.isBean = true\n\n if (!event) return\n\n var type = event.type\n , target = event.target || event.srcElement\n , i, l, p, props, fixer\n\n this.target = target && target.nodeType === 3 ? target.parentNode : target\n\n if (isNative) { // we only need basic augmentation on custom events, the rest expensive & pointless\n fixer = typeFixerMap[type]\n if (!fixer) { // haven't encountered this event type before, map a fixer function for it\n for (i = 0, l = typeFixers.length; i < l; i++) {\n if (typeFixers[i].reg.test(type)) { // guaranteed to match at least one, last is .*\n typeFixerMap[type] = fixer = typeFixers[i].fix\n break\n }\n }\n }\n\n props = fixer(event, this, type)\n for (i = props.length; i--;) {\n if (!((p = props[i]) in this) && p in event) this[p] = event[p]\n }\n }\n }\n\n // preventDefault() and stopPropagation() are a consistent interface to those functions\n // on the DOM, stop() is an alias for both of them together\n Event.prototype.preventDefault = function () {\n if (this.originalEvent.preventDefault) this.originalEvent.preventDefault()\n else this.originalEvent.returnValue = false\n }\n Event.prototype.stopPropagation = function () {\n if (this.originalEvent.stopPropagation) this.originalEvent.stopPropagation()\n else this.originalEvent.cancelBubble = true\n }\n Event.prototype.stop = function () {\n this.preventDefault()\n this.stopPropagation()\n this.stopped = true\n }\n // stopImmediatePropagation() has to be handled internally because we manage the event list for\n // each element\n // note that originalElement may be a Bean#Event object in some situations\n Event.prototype.stopImmediatePropagation = function () {\n if (this.originalEvent.stopImmediatePropagation) this.originalEvent.stopImmediatePropagation()\n this.isImmediatePropagationStopped = function () { return true }\n }\n Event.prototype.isImmediatePropagationStopped = function () {\n return this.originalEvent.isImmediatePropagationStopped && this.originalEvent.isImmediatePropagationStopped()\n }\n Event.prototype.clone = function (currentTarget) {\n //TODO: this is ripe for optimisation, new events are *expensive*\n // improving this will speed up delegated events\n var ne = new Event(this, this.element, this.isNative)\n ne.currentTarget = currentTarget\n return ne\n }\n\n return Event\n }())\n\n // if we're in old IE we can't do onpropertychange on doc or win so we use doc.documentElement for both\n , targetElement = function (element, isNative) {\n return !W3C_MODEL && !isNative && (element === doc || element === win) ? root : element\n }\n\n /**\n * Bean maintains an internal registry for event listeners. We don't touch elements, objects\n * or functions to identify them, instead we store everything in the registry.\n * Each event listener has a RegEntry object, we have one 'registry' for the whole instance.\n */\n , RegEntry = (function () {\n // each handler is wrapped so we can handle delegation and custom events\n var wrappedHandler = function (element, fn, condition, args) {\n var call = function (event, eargs) {\n return fn.apply(element, args ? slice.call(eargs, event ? 0 : 1).concat(args) : eargs)\n }\n , findTarget = function (event, eventElement) {\n return fn.__beanDel ? fn.__beanDel.ft(event.target, element) : eventElement\n }\n , handler = condition\n ? function (event) {\n var target = findTarget(event, this) // deleated event\n if (condition.apply(target, arguments)) {\n if (event) event.currentTarget = target\n return call(event, arguments)\n }\n }\n : function (event) {\n if (fn.__beanDel) event = event.clone(findTarget(event)) // delegated event, fix the fix\n return call(event, arguments)\n }\n handler.__beanDel = fn.__beanDel\n return handler\n }\n\n , RegEntry = function (element, type, handler, original, namespaces, args, root) {\n var customType = customEvents[type]\n , isNative\n\n if (type == 'unload') {\n // self clean-up\n handler = once(removeListener, element, type, handler, original)\n }\n\n if (customType) {\n if (customType.condition) {\n handler = wrappedHandler(element, handler, customType.condition, args)\n }\n type = customType.base || type\n }\n\n this.isNative = isNative = nativeEvents[type] && !!element[eventSupport]\n this.customType = !W3C_MODEL && !isNative && type\n this.element = element\n this.type = type\n this.original = original\n this.namespaces = namespaces\n this.eventType = W3C_MODEL || isNative ? type : 'propertychange'\n this.target = targetElement(element, isNative)\n this[eventSupport] = !!this.target[eventSupport]\n this.root = root\n this.handler = wrappedHandler(element, handler, null, args)\n }\n\n // given a list of namespaces, is our entry in any of them?\n RegEntry.prototype.inNamespaces = function (checkNamespaces) {\n var i, j, c = 0\n if (!checkNamespaces) return true\n if (!this.namespaces) return false\n for (i = checkNamespaces.length; i--;) {\n for (j = this.namespaces.length; j--;) {\n if (checkNamespaces[i] == this.namespaces[j]) c++\n }\n }\n return checkNamespaces.length === c\n }\n\n // match by element, original fn (opt), handler fn (opt)\n RegEntry.prototype.matches = function (checkElement, checkOriginal, checkHandler) {\n return this.element === checkElement &&\n (!checkOriginal || this.original === checkOriginal) &&\n (!checkHandler || this.handler === checkHandler)\n }\n\n return RegEntry\n }())\n\n , registry = (function () {\n // our map stores arrays by event type, just because it's better than storing\n // everything in a single array.\n // uses '$' as a prefix for the keys for safety and 'r' as a special prefix for\n // rootListeners so we can look them up fast\n var map = {}\n\n // generic functional search of our registry for matching listeners,\n // `fn` returns false to break out of the loop\n , forAll = function (element, type, original, handler, root, fn) {\n var pfx = root ? 'r' : '$'\n if (!type || type == '*') {\n // search the whole registry\n for (var t in map) {\n if (t.charAt(0) == pfx) {\n forAll(element, t.substr(1), original, handler, root, fn)\n }\n }\n } else {\n var i = 0, l, list = map[pfx + type], all = element == '*'\n if (!list) return\n for (l = list.length; i < l; i++) {\n if ((all || list[i].matches(element, original, handler)) && !fn(list[i], list, i, type)) return\n }\n }\n }\n\n , has = function (element, type, original, root) {\n // we're not using forAll here simply because it's a bit slower and this\n // needs to be fast\n var i, list = map[(root ? 'r' : '$') + type]\n if (list) {\n for (i = list.length; i--;) {\n if (!list[i].root && list[i].matches(element, original, null)) return true\n }\n }\n return false\n }\n\n , get = function (element, type, original, root) {\n var entries = []\n forAll(element, type, original, null, root, function (entry) {\n return entries.push(entry)\n })\n return entries\n }\n\n , put = function (entry) {\n var has = !entry.root && !this.has(entry.element, entry.type, null, false)\n , key = (entry.root ? 'r' : '$') + entry.type\n ;(map[key] || (map[key] = [])).push(entry)\n return has\n }\n\n , del = function (entry) {\n forAll(entry.element, entry.type, null, entry.handler, entry.root, function (entry, list, i) {\n list.splice(i, 1)\n entry.removed = true\n if (list.length === 0) delete map[(entry.root ? 'r' : '$') + entry.type]\n return false\n })\n }\n\n // dump all entries, used for onunload\n , entries = function () {\n var t, entries = []\n for (t in map) {\n if (t.charAt(0) == '$') entries = entries.concat(map[t])\n }\n return entries\n }\n\n return { has: has, get: get, put: put, del: del, entries: entries }\n }())\n\n // we need a selector engine for delegated events, use querySelectorAll if it exists\n // but for older browsers we need Qwery, Sizzle or similar\n , selectorEngine\n , setSelectorEngine = function (e) {\n if (!arguments.length) {\n selectorEngine = doc.querySelectorAll\n ? function (s, r) {\n return r.querySelectorAll(s)\n }\n : function () {\n throw new Error('Bean: No selector engine installed') // eeek\n }\n } else {\n selectorEngine = e\n }\n }\n\n // we attach this listener to each DOM event that we need to listen to, only once\n // per event type per DOM element\n , rootListener = function (event, type) {\n if (!W3C_MODEL && type && event && event.propertyName != '_on' + type) return\n\n var listeners = registry.get(this, type || event.type, null, false)\n , l = listeners.length\n , i = 0\n\n event = new Event(event, this, true)\n if (type) event.type = type\n\n // iterate through all handlers registered for this type, calling them unless they have\n // been removed by a previous handler or stopImmediatePropagation() has been called\n for (; i < l && !event.isImmediatePropagationStopped(); i++) {\n if (!listeners[i].removed) listeners[i].handler.call(this, event)\n }\n }\n\n // add and remove listeners to DOM elements\n , listener = W3C_MODEL\n ? function (element, type, add) {\n // new browsers\n element[add ? addEvent : removeEvent](type, rootListener, false)\n }\n : function (element, type, add, custom) {\n // IE8 and below, use attachEvent/detachEvent and we have to piggy-back propertychange events\n // to simulate event bubbling etc.\n var entry\n if (add) {\n registry.put(entry = new RegEntry(\n element\n , custom || type\n , function (event) { // handler\n rootListener.call(element, event, custom)\n }\n , rootListener\n , null\n , null\n , true // is root\n ))\n if (custom && element['_on' + custom] == null) element['_on' + custom] = 0\n entry.target.attachEvent('on' + entry.eventType, entry.handler)\n } else {\n entry = registry.get(element, custom || type, rootListener, true)[0]\n if (entry) {\n entry.target.detachEvent('on' + entry.eventType, entry.handler)\n registry.del(entry)\n }\n }\n }\n\n , once = function (rm, element, type, fn, originalFn) {\n // wrap the handler in a handler that does a remove as well\n return function () {\n fn.apply(this, arguments)\n rm(element, type, originalFn)\n }\n }\n\n , removeListener = function (element, orgType, handler, namespaces) {\n var type = orgType && orgType.replace(nameRegex, '')\n , handlers = registry.get(element, type, null, false)\n , removed = {}\n , i, l\n\n for (i = 0, l = handlers.length; i < l; i++) {\n if ((!handler || handlers[i].original === handler) && handlers[i].inNamespaces(namespaces)) {\n // TODO: this is problematic, we have a registry.get() and registry.del() that\n // both do registry searches so we waste cycles doing this. Needs to be rolled into\n // a single registry.forAll(fn) that removes while finding, but the catch is that\n // we'll be splicing the arrays that we're iterating over. Needs extra tests to\n // make sure we don't screw it up. @rvagg\n registry.del(handlers[i])\n if (!removed[handlers[i].eventType] && handlers[i][eventSupport])\n removed[handlers[i].eventType] = { t: handlers[i].eventType, c: handlers[i].type }\n }\n }\n // check each type/element for removed listeners and remove the rootListener where it's no longer needed\n for (i in removed) {\n if (removed.hasOwnProperty(i)) {\n if (!registry.has(element, removed[i].t, null, false)) {\n // last listener of this type, remove the rootListener\n listener(element, removed[i].t, false, removed[i].c)\n }\n }\n }\n }\n\n // set up a delegate helper using the given selector, wrap the handler function\n , delegate = function (selector, fn) {\n //TODO: findTarget (therefore $) is called twice, once for match and once for\n // setting e.currentTarget, fix this so it's only needed once\n var findTarget = function (target, root) {\n var i, array = isString(selector) ? selectorEngine(selector, root) : selector\n for (; target && target !== root; target = target.parentNode) {\n for (i = array.length; i--;) {\n if (array[i] === target) return target\n }\n }\n }\n , handler = function (e) {\n var match = findTarget(e.target, this)\n if (match) fn.apply(match, arguments)\n }\n\n // __beanDel isn't pleasant but it's a private function, not exposed outside of Bean\n handler.__beanDel = {\n ft : findTarget // attach it here for customEvents to use too\n , selector : selector\n }\n return handler\n }\n\n , fireListener = W3C_MODEL ? function (isNative, type, element) {\n // modern browsers, do a proper dispatchEvent()\n var evt = doc.createEvent(isNative ? 'HTMLEvents' : 'UIEvents')\n evt[isNative ? 'initEvent' : 'initUIEvent'](type, true, true, win, 1)\n element.dispatchEvent(evt)\n } : function (isNative, type, element) {\n // old browser use onpropertychange, just increment a custom property to trigger the event\n element = targetElement(element, isNative)\n isNative ? element.fireEvent('on' + type, doc.createEventObject()) : element['_on' + type]++\n }\n\n /**\n * Public API: off(), on(), add(), (remove()), one(), fire(), clone()\n */\n\n /**\n * off(element[, eventType(s)[, handler ]])\n */\n , off = function (element, typeSpec, fn) {\n var isTypeStr = isString(typeSpec)\n , k, type, namespaces, i\n\n if (isTypeStr && typeSpec.indexOf(' ') > 0) {\n // off(el, 't1 t2 t3', fn) or off(el, 't1 t2 t3')\n typeSpec = str2arr(typeSpec)\n for (i = typeSpec.length; i--;)\n off(element, typeSpec[i], fn)\n return element\n }\n\n type = isTypeStr && typeSpec.replace(nameRegex, '')\n if (type && customEvents[type]) type = customEvents[type].base\n\n if (!typeSpec || isTypeStr) {\n // off(el) or off(el, t1.ns) or off(el, .ns) or off(el, .ns1.ns2.ns3)\n if (namespaces = isTypeStr && typeSpec.replace(namespaceRegex, '')) namespaces = str2arr(namespaces, '.')\n removeListener(element, type, fn, namespaces)\n } else if (isFunction(typeSpec)) {\n // off(el, fn)\n removeListener(element, null, typeSpec)\n } else {\n // off(el, { t1: fn1, t2, fn2 })\n for (k in typeSpec) {\n if (typeSpec.hasOwnProperty(k)) off(element, k, typeSpec[k])\n }\n }\n\n return element\n }\n\n /**\n * on(element, eventType(s)[, selector], handler[, args ])\n */\n , on = function(element, events, selector, fn) {\n var originalFn, type, types, i, args, entry, first\n\n //TODO: the undefined check means you can't pass an 'args' argument, fix this perhaps?\n if (selector === undefined && typeof events == 'object') {\n //TODO: this can't handle delegated events\n for (type in events) {\n if (events.hasOwnProperty(type)) {\n on.call(this, element, type, events[type])\n }\n }\n return\n }\n\n if (!isFunction(selector)) {\n // delegated event\n originalFn = fn\n args = slice.call(arguments, 4)\n fn = delegate(selector, originalFn, selectorEngine)\n } else {\n args = slice.call(arguments, 3)\n fn = originalFn = selector\n }\n\n types = str2arr(events)\n\n // special case for one(), wrap in a self-removing handler\n if (this === ONE) {\n fn = once(off, element, events, fn, originalFn)\n }\n\n for (i = types.length; i--;) {\n // add new handler to the registry and check if it's the first for this element/type\n first = registry.put(entry = new RegEntry(\n element\n , types[i].replace(nameRegex, '') // event type\n , fn\n , originalFn\n , str2arr(types[i].replace(namespaceRegex, ''), '.') // namespaces\n , args\n , false // not root\n ))\n if (entry[eventSupport] && first) {\n // first event of this type on this element, add root listener\n listener(element, entry.eventType, true, entry.customType)\n }\n }\n\n return element\n }\n\n /**\n * add(element[, selector], eventType(s), handler[, args ])\n *\n * Deprecated: kept (for now) for backward-compatibility\n */\n , add = function (element, events, fn, delfn) {\n return on.apply(\n null\n , !isString(fn)\n ? slice.call(arguments)\n : [ element, fn, events, delfn ].concat(arguments.length > 3 ? slice.call(arguments, 5) : [])\n )\n }\n\n /**\n * one(element, eventType(s)[, selector], handler[, args ])\n */\n , one = function () {\n return on.apply(ONE, arguments)\n }\n\n /**\n * fire(element, eventType(s)[, args ])\n *\n * The optional 'args' argument must be an array, if no 'args' argument is provided\n * then we can use the browser's DOM event system, otherwise we trigger handlers manually\n */\n , fire = function (element, type, args) {\n var types = str2arr(type)\n , i, j, l, names, handlers\n\n for (i = types.length; i--;) {\n type = types[i].replace(nameRegex, '')\n if (names = types[i].replace(namespaceRegex, '')) names = str2arr(names, '.')\n if (!names && !args && element[eventSupport]) {\n fireListener(nativeEvents[type], type, element)\n } else {\n // non-native event, either because of a namespace, arguments or a non DOM element\n // iterate over all listeners and manually 'fire'\n handlers = registry.get(element, type, null, false)\n args = [false].concat(args)\n for (j = 0, l = handlers.length; j < l; j++) {\n if (handlers[j].inNamespaces(names)) {\n handlers[j].handler.apply(element, args)\n }\n }\n }\n }\n return element\n }\n\n /**\n * clone(dstElement, srcElement[, eventType ])\n *\n * TODO: perhaps for consistency we should allow the same flexibility in type specifiers?\n */\n , clone = function (element, from, type) {\n var handlers = registry.get(from, type, null, false)\n , l = handlers.length\n , i = 0\n , args, beanDel\n\n for (; i < l; i++) {\n if (handlers[i].original) {\n args = [ element, handlers[i].type ]\n if (beanDel = handlers[i].handler.__beanDel) args.push(beanDel.selector)\n args.push(handlers[i].original)\n on.apply(null, args)\n }\n }\n return element\n }\n\n , bean = {\n 'on' : on\n , 'add' : add\n , 'one' : one\n , 'off' : off\n , 'remove' : off\n , 'clone' : clone\n , 'fire' : fire\n , 'Event' : Event\n , 'setSelectorEngine' : setSelectorEngine\n , 'noConflict' : function () {\n context[name] = old\n return this\n }\n }\n\n // for IE, clean up on unload to avoid leaks\n if (win.attachEvent) {\n var cleanup = function () {\n var i, entries = registry.entries()\n for (i in entries) {\n if (entries[i].type && entries[i].type !== 'unload') off(entries[i].element, entries[i].type)\n }\n win.detachEvent('onunload', cleanup)\n win.CollectGarbage && win.CollectGarbage()\n }\n win.attachEvent('onunload', cleanup)\n }\n\n // initialize selector engine to internal default (qSA or throw Error)\n setSelectorEngine(Ink.ss)\n\n return bean\n });\n\n /**\n * Keep this declaration here and off Bean as it extends the Event\n * object and some properties are readonly in strict mode\n */\n 'use strict';\n\n var InkEvent = {\n\n KEY_BACKSPACE: 8,\n KEY_TAB: 9,\n KEY_RETURN: 13,\n KEY_ESC: 27,\n KEY_SPACE: 32,\n KEY_LEFT: 37,\n KEY_UP: 38,\n KEY_RIGHT: 39,\n KEY_DOWN: 40,\n KEY_DELETE: 46,\n KEY_HOME: 36,\n KEY_END: 35,\n KEY_PAGEUP: 33,\n KEY_PAGEDOWN: 34,\n KEY_INSERT: 45,\n \n /**\n * Creates a throttled version of a function.\n * Returns a function which calls `func`, waiting at least `wait` milliseconds between calls. This is useful for events such as `scroll` or `resize`, which can be triggered too many times per second, slowing down the browser with needless function calls.\n *\n * *note:* This does not delay the first function call to the function.\n *\n * @method throttle\n * @param {Function} func Function to call. Arguments and context are both passed.\n * @param {Number} [wait]=0 Milliseconds to wait between calls.\n * @return {Function} A function throttled which will only be called at most every `wait` milliseconds.\n * @sample Ink_Dom_Event_1_throttle.html \n **/\n throttle: function (func, wait) {\n wait = wait || 0;\n var lastCall = 0; // Warning: This breaks on Jan 1st 1970 0:00\n var timeout;\n function throttled() {\n var now = +new Date();\n var timeDiff = now - lastCall;\n if (timeDiff >= wait) {\n lastCall = now;\n return func.apply(this, [].slice.call(arguments));\n } else {\n var that = this;\n var args = [].slice.call(arguments);\n\n if (timeout) {\n // Clear the old timeout because that one has old arguments\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(function () {\n timeout = null;\n return throttled.apply(that, args);\n }, wait - timeDiff);\n }\n }\n return throttled;\n },\n\n /**\n * Gets the event's target element.\n *\n * @method element\n * @param {Object} ev Event object\n * @return {Element} The target\n * @public\n * @sample Ink_Dom_Event_1_element.html \n */\n element: function(ev) {\n var node = ev.delegationTarget ||\n ev.target ||\n // IE stuff\n (ev.type === 'mouseout' && ev.fromElement) ||\n (ev.type === 'mouseleave' && ev.fromElement) ||\n (ev.type === 'mouseover' && ev.toElement) ||\n (ev.type === 'mouseenter' && ev.toElement) ||\n ev.srcElement ||\n null;\n return node && (node.nodeType === 3 || node.nodeType === 4) ? node.parentNode : node;\n },\n\n /**\n * Gets the event's related target element.\n *\n * @method relatedTarget\n * @param {Object} ev event object\n * @return {DOMNode} The related target\n * @sample Ink_Dom_Event_1_relatedTarget.html \n */\n relatedTarget: function(ev){\n var node = ev.relatedTarget ||\n // IE stuff\n (ev.type === 'mouseout' && ev.toElement) ||\n (ev.type === 'mouseleave' && ev.toElement) ||\n (ev.type === 'mouseover' && ev.fromElement) ||\n (ev.type === 'mouseenter' && ev.fromElement) ||\n null;\n return node && (node.nodeType === 3 || node.nodeType === 4) ? node.parentNode : node;\n },\n\n /**\n * Find closest ancestor element by tag name related to the event target.\n * Navigate up the DOM tree, looking for a tag with the name `elmTagName`.\n *\n * If such tag is not found, `document` is returned.\n *\n * @method findElement\n * @param {Object} ev Event object\n * @param {String} elmTagName Tag name to find\n * @param {Boolean} [force]=false Flag to skip returning `document` and to return `false` instead.\n * @return {DOMElement} the first element which matches given tag name or the document element if the wanted tag is not found\n * @sample Ink_Dom_Event_1_findElement.html \n */\n findElement: function(ev, elmTagName, force)\n {\n var node = this.element(ev);\n while(true) {\n if(node.nodeName.toLowerCase() === elmTagName.toLowerCase()) {\n return node;\n } else {\n node = node.parentNode;\n if(!node) {\n if(force) {\n return false;\n }\n return document;\n }\n if(!node.parentNode){\n if(force){ return false; }\n return document;\n }\n }\n }\n },\n\n /**\n * Attaches an event to element\n *\n * @method observe\n * @param {DOMElement|String} element Element id or element\n * @param {String} eventName Event name\n * @param {Function} callBack Receives the event object as a parameter. If you're manually firing custom events, check it's eventName property to make sure you're handling the right event.\n * @param {Boolean} [useCapture] Flag to change event listening from bubbling to capture.\n * @return {Function} The event handler used. Hang on to this if you want to `stopObserving` later.\n * @sample Ink_Dom_Event_1_observe.html \n */\n observe: function(element, eventName, callBack, useCapture) {\n element = Ink.i(element);\n if(element) {\n if(element.addEventListener) {\n element.addEventListener(eventName, callBack, !!useCapture);\n } else {\n element.attachEvent('on' + eventName, (callBack = Ink.bind(callBack, element)));\n }\n return callBack;\n }\n },\n\n /**\n * Like observe, but listen to the event only once.\n *\n * @method observeOnce\n * @param {DOMElement|String} element Element id or element\n * @param {String} eventName Event name\n * @param {Function} callBack Receives the event object as a parameter. If you're manually firing custom events, check it's eventName property to make sure you're handling the right event.\n * @param {Boolean} [useCapture] Flag to change event listening from bubbling to capture.\n * @return {Function} The event handler used. Hang on to this if you want to `stopObserving` later.\n * @sample Ink_Dom_Event_1_observeOnce.html \n */\n observeOnce: function (element, eventName, callBack, useCapture) {\n var onceBack = function () {\n InkEvent.stopObserving(element, eventName, handler);\n return callBack.apply(this, arguments);\n };\n var handler = InkEvent.observe(element, eventName, onceBack, useCapture);\n return handler;\n },\n\n /**\n * Attaches an event to a selector or array of elements.\n *\n * @method observeMulti\n * @param {Array|String} elements Array of elements which are going to be observed. A selector is acceptable too.\n * @param {String} eventName Event name\n * @param {Function} callBack Receives the event object as a parameter. If you're manually firing custom events, check it's eventName property to make sure you're handling the right event.\n * @param {Boolean} [useCapture] Flag change event listening from bubbling to capture.\n * @return {Function} The used callback.\n * @sample Ink_Dom_Event_1_observeMulti.html \n */\n observeMulti: function (elements, eventName, callBack, useCapture) {\n if (typeof elements === 'string') {\n elements = Ink.ss(elements);\n } else if ( /* is an element */ elements && elements.nodeType === 1) {\n elements = [elements];\n }\n if (!elements[0]) { return false; }\n\n for (var i = 0, len = elements.length; i < len; i++) {\n this.observe(elements[i], eventName, callBack, useCapture);\n }\n return callBack;\n },\n\n /**\n * Observes an event on an element and its descendants matching the selector.\n *\n * Requires Ink.Dom.Selector if you need to use a selector.\n *\n * @method observeDelegated\n * @param {Element|String} element Element to observe.\n * @param {String} eventName Event name to observe.\n * @param {String} selector Child element selector. When null, finds any element.\n * @param {Function} callback Callback to be called when the event is fired\n * @return {Function} The used callback, for ceasing to listen to the event later.\n * @public\n * @sample Ink_Dom_Event_1_observeDelegated.html \n **/\n observeDelegated: function (element, eventName, selector, callback) {\n return InkEvent.observe(element, eventName, function (event) {\n var fromElement = InkEvent.element(event);\n if (!fromElement || fromElement === element) { return; }\n\n var cursor = fromElement;\n\n // Go up the document tree until we hit the element itself.\n while (cursor !== element && cursor !== document && cursor) {\n if (Ink.Dom.Selector_1.matchesSelector(cursor, selector)) {\n event.delegationTarget = cursor;\n return callback(event);\n }\n cursor = cursor.parentNode;\n }\n });\n },\n\n /**\n * Removes an event attached to an element.\n *\n * @method stopObserving\n * @param {DOMElement|String} element Element id or element\n * @param {String} eventName Event name\n * @param {Function} callBack Callback function\n * @param {Boolean} [useCapture] Set to true if the event was being observed with useCapture set to true as well.\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stopObserving.html \n */\n stopObserving: function(element, eventName, callBack, useCapture) {\n element = Ink.i(element);\n\n if(element) {\n if(element.removeEventListener) {\n element.removeEventListener(eventName, callBack, !!useCapture);\n } else {\n element.detachEvent('on' + eventName, callBack);\n }\n }\n },\n\n /**\n * Stops event propagation and bubbling.\n *\n * @method stop\n * @param {Object} event Event handle\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stop.html \n */\n stop: function(event)\n {\n if(event.cancelBubble !== null) {\n event.cancelBubble = true;\n }\n if(event.stopPropagation) {\n event.stopPropagation();\n }\n if(event.preventDefault) {\n event.preventDefault();\n }\n if(window.attachEvent) {\n event.returnValue = false;\n }\n if(event.cancel !== null) {\n event.cancel = true;\n }\n },\n\n /**\n * Stops event propagation.\n *\n * @method stopPropagation\n * @param {Object} event Event handle\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stopPropagation.html \n */\n stopPropagation: function(event) {\n if(event.cancelBubble !== null) {\n event.cancelBubble = true;\n }\n if(event.stopPropagation) {\n event.stopPropagation();\n }\n },\n\n /**\n * Stops event default behaviour.\n *\n * @method stopDefault\n * @param {Object} event Event handle\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stopDefault.html \n */\n stopDefault: function(event)\n {\n if(event.preventDefault) {\n event.preventDefault();\n }\n if(window.attachEvent) {\n event.returnValue = false;\n }\n if(event.cancel !== null) {\n event.cancel = true;\n }\n },\n\n /**\n * Gets the pointer's coordinates from the event object.\n *\n * @method pointer\n * @param {Object} ev Event object\n * @return {Object} An object with the mouse X and Y position\n * @public\n * @sample Ink_Dom_Event_1_pointer.html \n */\n pointer: function(ev)\n {\n return {\n x: this.pointerX(ev),\n y: this.pointerY(ev)\n };\n },\n\n /**\n * Gets the pointer's X coordinate.\n *\n * @method pointerX\n * @param {Object} ev Event object\n * @return {Number} Mouse X position\n * @public\n */\n pointerX: function(ev)\n {\n return (ev.touches && ev.touches[0] && ev.touches[0].clientX) ||\n (ev.pageX) ||\n (ev.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));\n },\n\n /**\n * Gets the pointer's Y coordinate.\n *\n * @method pointerY\n * @param {Object} ev Event object\n * @return {Number} Mouse Y position\n * @public\n */\n pointerY: function(ev)\n {\n return (ev.touches && ev.touches[0] && ev.touches[0].clientY) ||\n (ev.pageY) ||\n (ev.clientY + (document.documentElement.scrollTop || document.body.scrollTop));\n },\n\n /**\n * Checks if an event is a left click.\n *\n * @method isLeftClick\n * @param {Object} ev Event object\n * @return {Boolean} True if the event is a left click\n * @public\n * @sample Ink_Dom_Event_1_isLeftClick.html \n */\n isLeftClick: function(ev) {\n if (window.addEventListener) {\n if(ev.button === 0){\n return true;\n } else if(ev.type === 'touchend' && ev.button === null){\n // [todo] do the above check for pointerEvents too\n return true;\n }\n }\n else {\n if(ev.button === 1){ return true; }\n }\n return false;\n },\n\n /**\n * Checks if an event is a right click.\n *\n * @method isRightClick\n * @param {Object} ev Event object\n * @return {Boolean} True if the event is a right click\n * @public\n * @sample Ink_Dom_Event_1_isRightClick.html \n */\n isRightClick: function(ev) {\n return (ev.button === 2);\n },\n\n /**\n * Checks if an event is a middle click.\n *\n * @method isMiddleClick\n * @param {Object} ev Event object\n * @return {Boolean} True if the event is a middle click\n * @public\n * @sample Ink_Dom_Event_1_isMiddleClick.html \n */\n isMiddleClick: function(ev) {\n if (window.addEventListener) {\n return (ev.button === 1);\n }\n else {\n return (ev.button === 4);\n }\n return false;\n },\n\n /**\n * Gets character from an event.\n *\n * @method getCharFromKeyboardEvent\n * @param {Object} event Keyboard event\n * @param {Boolean} [changeCasing] If true uppercases, if false lowercases, otherwise keeps casing\n * @return {String} Character representation of pressed key combination\n * @public\n * @sample Ink_Dom_Event_1_getCharFromKeyboardEvent.html \n */\n getCharFromKeyboardEvent: function(event, changeCasing) {\n var k = event.keyCode;\n var c = String.fromCharCode(k);\n\n var shiftOn = event.shiftKey;\n if (k >= 65 && k <= 90) { // A-Z\n if (typeof changeCasing === 'boolean') {\n shiftOn = changeCasing;\n }\n return (shiftOn) ? c : c.toLowerCase();\n }\n else if (k >= 96 && k <= 105) { // numpad digits\n return String.fromCharCode( 48 + (k-96) );\n }\n switch (k) {\n case 109: case 189: return '-';\n case 107: case 187: return '+';\n }\n return c;\n },\n\n debug: function(){}\n};\n\n/**\n * Lets you attach event listeners to both elements and objects.\n * http://github.com/fat/bean#on\n *\n * @method on\n * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object\n * @param {String} eventType An Event (or multiple events, space separated) to listen to\n * @param {String} [selector] A CSS DOM Element selector string to bind the listener to child elements matching the selector\n * @param {Function} [handler] The callback function\n * @param {Object} [args...] Additional arguments to pass to the callback function when triggered\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_on.html \n */\n\n/**\n * Alias for `on` but will only be executed once.\n * bean.one() is an alias for bean.on() except that the handler will only be executed once and then removed for the event type(s).\n * http://github.com/fat/bean#one\n *\n * @method one\n * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object\n * @param {String} eventType An Event (or multiple events, space separated) to listen to\n * @param {String} [selector] A CSS DOM Element selector string to bind the listener to child elements matching the selector\n * @param {Function} [handler] The callback function\n * @param [args...] Additional arguments to pass to the callback function when triggered\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_one.html \n */\n\n/**\n * Removes event handlers.\n * bean.off() is how you get rid of handlers once you no longer want them active. It's also a good idea to call off on elements before you remove them from your DOM; this gives Bean a chance to clean up some things and prevents memory leaks.\n * http://github.com/fat/bean#off\n *\n * @method off\n * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object\n * @param {String} eventType An Event (or multiple events, space separated) to remove\n * @param {Function} [handler] The specific callback function to remove\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_off.html \n */\n\n/**\n * Clones events from one object to another\n * bean.clone() is a method for cloning events from one DOM element or object to another.\n * http://github.com/fat/bean#clone\n *\n * @method clone\n * @param {DOMElement|Object} destElement An HTML DOM element or any JavaScript Object to copy events to\n * @param {String} srcElement An HTML DOM element or any JavaScript Object to copy events from\n * @param {String} [eventType] An Event (or multiple events, space separated) to clone\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_clone.html \n */\n\n/**\n * Triggers events.\n * http://github.com/fat/bean#fire\n *\n * @method fire\n * @param {DOMElement|Object} destElement An HTML DOM element or any JavaScript Object fire the event on\n * @param {String} eventType An Event (or multiple events, space separated) to fire\n * @param [args...] Additional arguments to pass to the callback function when triggered\n *\n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_fire.html \n */\n\nreturn Ink.extendObj(InkEvent, bean);\n\n});\n","/**\n * @module Ink.Dom.FormSerialize_1\n * Two way serialization of form data and javascript objects.\n * Valid applications are ad hoc AJAX/syndicated submission of forms, restoring form values from server side state, etc.\n */\n\nInk.createModule('Ink.Dom.FormSerialize', 1, ['Ink.Util.Array_1', 'Ink.Dom.Element_1', 'Ink.Dom.Selector_1'], function (InkArray, InkElement, Selector) {\n 'use strict';\n\n // Check whether something is not a string or a DOM element, but still has length.\n function isArrayIsh(obj) {\n return obj != null &&\n (!InkElement.isDOMElement(obj)) &&\n (InkArray.isArray(obj) || (typeof obj !== 'string' && typeof obj.length === 'number'));\n }\n\n function toArray(obj) {\n if (isArrayIsh(obj)) { return obj; }\n else { return [obj]; }\n }\n\n /**\n * @namespace Ink.Dom.FormSerialize\n * @static\n **/\n var FormSerialize = {\n\n /**\n * Serializes a form element into a JS object\n * It turns field *names* (not IDs!) into keys and field values into values.\n *\n * note: Multi-select and checkboxes with multiple values will result in arrays\n *\n * @method serialize\n * @param {DOMElement|String} form Form element to extract data\n * @param {Object} [options] Options object, containing:\n * @param {Boolean} [options.outputUnchecked=false] Whether to emit unchecked checkboxes and unselected radio buttons.\n * @return {Object} Map of fieldName -> String|String[]|Boolean\n * @sample Ink_Dom_FormSerialize_serialize.html \n */\n serialize: function(form, options) {\n options = options || {};\n var out = {};\n var emptyArrayToken = {}; // A hack so that empty select[multiple] elements appear although empty.\n\n var pairs = this.asPairs(form, { elements: true, emptyArray: emptyArrayToken, outputUnchecked: options.outputUnchecked });\n if (pairs == null) { return pairs; }\n InkArray.forEach(pairs, function (pair) {\n var name = pair[0].replace(/\\[\\]$/, '');\n var value = pair[1];\n var el = pair[2];\n\n if (value === emptyArrayToken) {\n out[name] = []; // It's an empty select[multiple]\n } else if (!(FormSerialize._resultsInArray(el) || /\\[\\]$/.test(pair[0]))) {\n out[name] = value;\n } else {\n out[name] = out[name] || [];\n out[name].push(value);\n }\n });\n\n return out;\n },\n\n /**\n * Like `serialize`, but returns an array of [fieldName, value] pairs.\n *\n * @method asPairs\n * @param {DOMElement|String} form Form element\n * @param {Object} [options] Options object, containing:\n * @param {Boolean} [options.elements] Instead of returning an array of [fieldName, value] pairs, return an array of [fieldName, value, fieldElement] triples.\n * @param {Boolean} [options.emptyArray] What to emit as the value of an empty select[multiple]. If you don't pass this option, nothing comes out.\n * @param {Boolean} [options.outputUnchecked=false] Whether to emit unchecked checkboxes and unselected radio buttons.\n * @return {Array} Array of [fieldName, value] pairs.\n **/\n asPairs: function (form, options) {\n var out = [];\n options = options || {};\n\n function emit(name, val, el) {\n if (options.elements) {\n out.push([name, val, el]);\n } else {\n out.push([name, val]);\n }\n }\n\n function serializeEl(el) {\n var elNodeName = el.nodeName.toLowerCase();\n var elType = (el.type + '').toLowerCase();\n\n if (elNodeName === 'select' && el.multiple) {\n var didEmit = false;\n InkArray.forEach(Selector.select('option:checked', el), function (thisOption) {\n emit(el.name, thisOption.value, el);\n didEmit = true;\n });\n if (!didEmit && 'emptyArray' in options) {\n emit(el.name, options.emptyArray, el);\n }\n } else if (elNodeName === 'input' && (elType === 'checkbox' || elType === 'radio') && options.outputUnchecked) {\n // It's an empty checkbox and we wouldn't emit it otherwise but the user asked for it using outputUnchecked\n emit(el.name, null, el);\n } else {\n emit(el.name, el.value, el);\n }\n }\n\n if ((form = Ink.i(form))) {\n var inputs = InkArray.filter(form.elements, function (elm) {\n return FormSerialize._isSerialized(elm, options);\n });\n for (var i = 0, len = inputs.length; i < len; i++) {\n serializeEl(inputs[i]);\n }\n return out;\n }\n\n return null;\n },\n\n /**\n * Sets form elements' values with values from an object\n *\n * Note: You can't set the values of an input with `type=\"file\"` (browser prohibits it)\n *\n * @method fillIn \n * @param {Element|String} form Form element to be populated\n * @param {Object|Array} map2 Mapping of fields to values contained in fields. Can be a hash (keys as names, strings or arrays for values), or an array of [name, value] pairs.\n * @return {void}\n * @sample Ink_Dom_FormSerialize_fillIn.html \n */\n fillIn: function(form, map2) {\n if (!(form = Ink.i(form))) { return null; }\n\n var pairs;\n\n if (typeof map2 === 'object' && !isArrayIsh(map2)) {\n pairs = FormSerialize._objToPairs(map2);\n } else if (isArrayIsh(map2)) {\n pairs = map2;\n } else {\n return null;\n }\n\n return FormSerialize._fillInPairs(form, pairs);\n },\n\n _objToPairs: function (obj) {\n var pairs = [];\n var val;\n for (var name in obj) if (obj.hasOwnProperty(name)) {\n val = toArray(obj[name]);\n for (var i = 0, len = val.length; i < len; i++) {\n pairs.push([name, val[i]]);\n }\n if (len === 0) {\n pairs.push([name, []]);\n }\n }\n return pairs;\n },\n\n _fillInPairs: function (form, pairs) {\n pairs = InkArray.groupBy(pairs, {\n key: function (pair) { return pair[0].replace(/\\[\\]$/, ''); }\n });\n\n // For each chunk...\n pairs = InkArray.map(pairs, function (pair) {\n // Join the items in the chunk by concatenating the values together and leaving the names alone\n var values = InkArray.reduce(pair, function (left, right) {\n return [null, left[1].concat([right[1]])];\n }, [null, []])[1];\n return [pair[0][0], values];\n });\n\n var name;\n var inputs;\n var values;\n for (var i = 0, len = pairs.length; i < len; i++) {\n name = pairs[i][0];\n\n if (name in form) {\n inputs = form[name];\n } else if ((name + '[]') in form) {\n inputs = form[name + '[]'];\n name = name + '[]';\n } else {\n continue;\n }\n\n inputs = toArray(inputs);\n values = pairs[i][1];\n\n FormSerialize._fillInOne(name, inputs, values);\n }\n },\n\n _fillInOne: function (name, inputs, values) {\n var firstOne = inputs[0];\n var firstNodeName = firstOne.nodeName.toLowerCase();\n var firstType = firstOne.getAttribute('type');\n firstType = firstType && firstType.toLowerCase();\n var isSelectMulti = firstNodeName === 'select' && InkElement.hasAttribute(firstOne, 'multiple');\n\n if (firstType === 'checkbox' || firstType === 'radio') {\n FormSerialize._fillInBoolean(inputs, values, 'checked');\n } else if (isSelectMulti) {\n FormSerialize._fillInBoolean(inputs[0].options, values, 'selected');\n } else {\n if (inputs.length !== values.length) {\n Ink.warn('Form had ' + inputs.length + ' inputs named \"' + name + '\", but received ' + values.length + ' values.');\n }\n\n for (var i = 0, len = Math.min(inputs.length, values.length); i < len; i += 1) {\n inputs[i].value = values[i];\n }\n }\n },\n\n _fillInBoolean: function (inputs, values, checkAttr /* 'selected' or 'checked' */) {\n InkArray.forEach(inputs, function (input) {\n var isChecked = InkArray.inArray(input.value, values);\n input[checkAttr] = isChecked;\n });\n },\n\n /**\n * Whether FormSerialize.serialize() should produce an array when looking at this element.\n * @method _resultsInArray\n * @private\n * @param element\n **/\n _resultsInArray: function (element) {\n var type = element.getAttribute('type');\n var nodeName = element.nodeName.toLowerCase();\n\n return type === 'checkbox' ||\n (nodeName === 'select' && InkElement.hasAttribute(element, 'multiple'));\n },\n\n _isSerialized: function (element, options) {\n options = options || {};\n if (!InkElement.isDOMElement(element)) { return false; }\n if (!InkElement.hasAttribute(element, 'name')) { return false; }\n\n var nodeName = element.nodeName.toLowerCase();\n\n if (!nodeName || nodeName === 'fieldset') { return false; }\n\n if (element.type === 'checkbox' || element.type === 'radio') {\n if (options.outputUnchecked) { return true; }\n return !!element.checked;\n }\n\n return true;\n }\n };\n\n return FormSerialize;\n});\n","/**\n * Execute code only when the DOM is loaded.\n * @module Ink.Dom.Loaded_1\n * @version 1\n */\n \nInk.createModule('Ink.Dom.Loaded', 1, [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Dom.Loaded_1\n **/\n var Loaded = {\n\n /**\n * Callbacks and their contexts. Array of 2-arrays.\n *\n * []\n *\n * @attribute _contexts Array\n * @private\n * \n */\n _contexts: [], // Callbacks' queue\n\n /**\n * Specify a function to execute when the DOM is fully loaded.\n *\n * @method run\n * @param {Object} [win]=window Window object to attach/add the event\n * @param {Function} fn Callback function to be executed after the DOM is ready\n * @return {void}\n * @public\n * @sample Ink_Dom_Loaded_run.html \n */\n run: function(win, fn) {\n if (!fn) {\n fn = win;\n win = window;\n }\n\n var context;\n\n for (var i = 0, len = this._contexts.length; i < len; i++) {\n if (this._contexts[i][0] === win) {\n context = this._contexts[i][1];\n break;\n }\n }\n if (!context) {\n context = {\n cbQueue: [],\n win: win,\n doc: win.document,\n root: win.document.documentElement,\n done: false,\n top: true\n };\n context.handlers = {\n checkState: Ink.bindEvent(this._checkState, this, context),\n poll: Ink.bind(this._poll, this, context)\n };\n this._contexts.push(\n [win, context] // Javascript Objects cannot map different windows to\n // different values.\n );\n }\n\n var ael = context.doc.addEventListener;\n context.add = ael ? 'addEventListener' : 'attachEvent';\n context.rem = ael ? 'removeEventListener' : 'detachEvent';\n context.pre = ael ? '' : 'on';\n context.det = ael ? 'DOMContentLoaded' : 'onreadystatechange';\n context.wet = context.pre + 'load';\n\n var csf = context.handlers.checkState;\n var alreadyLoaded = (\n /complete|loaded/.test(context.doc.readyState) &&\n context.win.location.toString() !== 'about:blank'); // https://code.google.com/p/chromium/issues/detail?id=32357\n\n if (alreadyLoaded){\n setTimeout(Ink.bind(function () {\n fn.call(context.win, 'lazy');\n }, this), 0);\n } else {\n context.cbQueue.push(fn);\n\n context.doc[context.add]( context.det , csf );\n context.win[context.add]( context.wet , csf );\n\n var frameElement = 1;\n try{\n frameElement = context.win.frameElement;\n } catch(e) {}\n if ( !ael && context.root && context.root.doScroll ) { // IE HACK\n try {\n context.top = !frameElement;\n } catch(e) { }\n if (context.top) {\n this._poll(context);\n }\n }\n }\n },\n\n /**\n * Function that will be running the callbacks after the page is loaded\n *\n * @method _checkState\n * @param {Event} event Triggered event\n * @private\n */\n _checkState: function(event, context) {\n if ( !event || (event.type === 'readystatechange' && !/complete|loaded/.test(context.doc.readyState))) {\n return;\n }\n var where = (event.type === 'load') ? context.win : context.doc;\n where[context.rem](context.pre+event.type, context.handlers.checkState, false);\n this._ready(context);\n },\n\n /**\n * Polls the load progress of the page to see if it has already loaded or not\n *\n * @method _poll\n * @private\n */\n\n /**\n * (old IE only) wait until a doScroll() call does not throw an error\n *\n * @method _poll\n * @private\n */\n _poll: function(context) {\n try {\n context.root.doScroll('left');\n } catch(e) {\n return setTimeout(context.handlers.poll, 50);\n }\n this._ready(context);\n },\n\n /**\n * Function that runs the callbacks from the queue when the document is ready.\n *\n * @method _ready\n * @private\n */\n _ready: function(context) {\n if (!context.done) {\n context.done = true;\n for (var i = 0; i < context.cbQueue.length; ++i) {\n context.cbQueue[i].call(context.win);\n }\n context.cbQueue = [];\n }\n }\n };\n\n return Loaded;\n\n});\n","/**\n * CSS selector engine\n * @module Ink.Dom.Selector_1\n * @version 1\n */\n \nInk.createModule('Ink.Dom.Selector', 1, [], function() {\n /*jshint forin:false, eqnull:true, noempty:false, expr:true, boss:true, maxdepth:false*/\n\t'use strict';\n\n/*!\n * Sizzle CSS Selector Engine\n * Copyright 2013 jQuery Foundation and other contributors\n * Released under the MIT license\n * http://sizzlejs.com/\n */\n\nvar i,\n\tcachedruns,\n\tExpr,\n\tgetText,\n\tisXML,\n\tcompile,\n\toutermostContext,\n\trecompare,\n\tsortInput,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + -(new Date()),\n\tpreferredDoc = window.document,\n\tsupport = {},\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\thasDuplicate = false,\n\tsortOrder = function() { return 0; },\n\n\t// General-purpose constants\n\tstrundefined = typeof undefined,\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Array methods\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf if we can't use a native one\n\tindexOf = arr.indexOf || function( elem ) {\n\t\tvar i = 0,\n\t\t\tlen = this.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( this[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\toperators = \"([*^$|!~]?=)\",\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:\" + operators + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\n\t// Prefer arguments quoted,\n\t// then not containing pseudos/brackets,\n\t// then attribute selectors/non-parenthetical expressions,\n\t// then anything else\n\t// These preferences are here to reduce the number of selectors\n\t// needing tokenize in the PSEUDO preFilter\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes.replace( 3, 8 ) + \")*)|.*)\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([\\\\x20\\\\t\\\\r\\\\n\\\\f>+~])\" + whitespace + \"*\" ),\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"NAME\": new RegExp( \"^\\\\[name=['\\\"]?(\" + characterEncoding + \")['\\\"]?\\\\]\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trsibling = /[\\x20\\t\\r\\n\\f]*[+~]/,\n\n\trnative = /^[^{]+\\{\\s*\\[native code/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trescape = /'|\\\\/g,\n\trattributeQuotes = /\\=[\\x20\\t\\r\\n\\f]*([^'\"\\]]*)[\\x20\\t\\r\\n\\f]*\\]/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = /\\\\([\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|.)/g,\n\tfunescape = function( _, escaped ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\treturn high !== high ?\n\t\t\tescaped :\n\t\t\t// BMP codepoint\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\n/*\n * For feature detection\n * @param {Function} fn The function to test for native support\n */\nfunction isNative( fn ) {\n\treturn rnative.test( fn + \"\" );\n}\n\n/*\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar cache,\n\t\tkeys = [];\n\n\treturn (cache = function( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key += \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key ] = value);\n\t});\n}\n\n/*\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/*\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( documentIsHTML && !seed ) {\n\n\t\t// Shortcuts\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && !rbuggyQSA.test(selector) ) {\n\t\t\told = true;\n\t\t\tnid = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType === 9 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/*\n * Detect xml\n * @param {Element|Object} elem An element or a document\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/*\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar doc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\n\t// Support tests\n\tdocumentIsHTML = !isXML( doc );\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Check if attributes should be retrieved by attribute nodes\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.innerHTML = \"\";\n\t\tvar type = typeof div.lastChild.getAttribute(\"multiple\");\n\t\t// IE8 returns a string for some attributes even when not present\n\t\treturn type !== \"boolean\" && type !== \"string\";\n\t});\n\n\t// Check if getElementsByClassName can be trusted\n\tsupport.getElementsByClassName = assert(function( div ) {\n\t\t// Opera can't find a second classname (in 9.6)\n\t\tdiv.innerHTML = \"\";\n\t\tif ( !div.getElementsByClassName || !div.getElementsByClassName(\"e\").length ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Safari 3.2 caches class attributes and doesn't catch changes\n\t\tdiv.lastChild.className = \"e\";\n\t\treturn div.getElementsByClassName(\"e\").length === 2;\n\t});\n\n\t// Check if getElementsByName privileges form controls or returns elements by ID\n\t// If so, assume (for broader support) that getElementById returns elements by name\n\tsupport.getByName = assert(function( div ) {\n\t\t// Inject content\n\t\tdiv.id = expando + 0;\n\t\t// Support: Windows 8 Native Apps\n\t\t// Assigning innerHTML with \"name\" attributes throws uncatchable exceptions\n\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx\n\t\tdiv.appendChild( document.createElement(\"a\") ).setAttribute( \"name\", expando );\n\t\tdiv.appendChild( document.createElement(\"i\") ).setAttribute( \"name\", expando );\n\t\tdocElem.appendChild( div );\n\n\t\t// Test\n\t\tvar pass = doc.getElementsByName &&\n\t\t\t// buggy browsers will return fewer than the correct 2\n\t\t\tdoc.getElementsByName( expando ).length === 2 +\n\t\t\t// buggy browsers will return more than the correct 0\n\t\t\tdoc.getElementsByName( expando + 0 ).length;\n\n\t\t// Cleanup\n\t\tdocElem.removeChild( div );\n\n\t\treturn pass;\n\t});\n\n\t// Support: Webkit<537.32\n\t// Detached nodes confoundingly follow *each other*\n\tsupport.sortDetached = assert(function( div1 ) {\n\t\treturn div1.compareDocumentPosition &&\n\t\t\t// Should return 1, but Webkit returns 4 (following)\n\t\t\t(div1.compareDocumentPosition( document.createElement(\"div\") ) & 1);\n\t});\n\n\t// IE6/7 return modified attributes\n\tExpr.attrHandle = assert(function( div ) {\n\t\tdiv.innerHTML = \"
            \";\n\t\treturn div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&\n\t\t\tdiv.firstChild.getAttribute(\"href\") === \"#\";\n\t}) ?\n\t\t{} :\n\t\t{\n\t\t\t\"href\": function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"href\", 2 );\n\t\t\t},\n\t\t\t\"type\": function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"type\");\n\t\t\t}\n\t\t};\n\n\t// ID find and filter\n\tif ( support.getByName ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\n\t\t\t\treturn m ?\n\t\t\t\t\tm.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode(\"id\").value === id ?\n\t\t\t\t\t\t[m] :\n\t\t\t\t\t\tundefined :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t}\n\t\t} :\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Name\n\tExpr.find[\"NAME\"] = support.getByName && function( tag, context ) {\n\t\tif ( typeof context.getElementsByName !== strundefined ) {\n\t\t\treturn context.getElementsByName( name );\n\t\t}\n\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21),\n\t// no need to also add to buggyMatches since matches checks buggyQSA\n\t// A support test would require too much code (would include document ready)\n\trbuggyQSA = [ \":focus\" ];\n\n\tif ( (support.qsa = isNative(doc.querySelectorAll)) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdiv.innerHTML = \"\";\n\n\t\t\t// IE8 - Some boolean attributes are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:checked|disabled|ismap|multiple|readonly|selected|value)\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Opera 10-12/IE8 - ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tif ( div.querySelectorAll(\"[i^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:\\\"\\\"|'')\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = isNative(docElem.contains) || docElem.compareDocumentPosition ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t// Document order sorting\n\tsortOrder = docElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );\n\n\t\tif ( compare ) {\n\t\t\t// Disconnected nodes\n\t\t\tif ( compare & 1 ||\n\t\t\t\t(recompare && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t\tif ( a === doc || contains(preferredDoc, a) ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( b === doc || contains(preferredDoc, b) ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\t// Maintain original order\n\t\t\t\treturn sortInput ?\n\t\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t\t0;\n\t\t\t}\n\n\t\t\treturn compare & 4 ? -1 : 1;\n\t\t}\n\n\t\t// Not directly comparable, sort on existence of method\n\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\t} else if ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\t// rbuggyQSA always contains :focus, so no need for an existence check\n\tif ( support.matchesSelector && documentIsHTML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) {\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch(e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [elem] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\tvar val;\n\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tif ( documentIsHTML ) {\n\t\tname = name.toLowerCase();\n\t}\n\tif ( (val = Expr.attrHandle[ name ]) ) {\n\t\treturn val( elem );\n\t}\n\tif ( !documentIsHTML || support.attributes ) {\n\t\treturn elem.getAttribute( name );\n\t}\n\treturn ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?\n\t\tname :\n\t\tval && val.specified ? val.value : null;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n// Document sorting and removing duplicates\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\t// Compensate for sort limitations\n\trecompare = !support.sortDetached;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\treturn results;\n};\n\n/*\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns Returns -1 if a precedes b, 1 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n// Returns a function to use in pseudos for input types\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n// Returns a function to use in pseudos for buttons\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n// Returns a function to use in pseudos for positionals\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/*\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( ; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (see #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[5] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[4] ) {\n\t\t\t\tmatch[2] = match[4];\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeName ) {\n\t\t\tif ( nodeName === \"*\" ) {\n\t\t\t\treturn function() { return true; };\n\t\t\t}\n\n\t\t\tnodeName = nodeName.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\")) || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\n\t\t\t// not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t// Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === elem.type );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( tokens = [] );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar data, cache, outerCache,\n\t\t\t\tdirkey = dirruns + \" \" + doneName;\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {\n\t\t\t\t\t\t\tif ( (data = cache[1]) === true || data === cachedruns ) {\n\t\t\t\t\t\t\t\treturn data === true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcache = outerCache[ dir ] = [ dirkey ];\n\t\t\t\t\t\t\tcache[1] = matcher( elem, context, xml ) || cachedruns;\n\t\t\t\t\t\t\tif ( cache[1] === true ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\t// A counter to specify which element is currently being matched\n\tvar matcherCachedRuns = 0,\n\t\tbySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, expandContext ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tsetMatched = [],\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\toutermost = expandContext != null,\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", expandContext && context.parentNode || context ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t\tcachedruns = matcherCachedRuns;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t\tcachedruns = ++matcherCachedRuns;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !group ) {\n\t\t\tgroup = tokenize( selector );\n\t\t}\n\t\ti = group.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( group[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\t}\n\treturn cached;\n};\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tmatch = tokenize( selector );\n\n\tif ( !seed ) {\n\t\t// Try to minimize operations if there is only one group\n\t\tif ( match.length === 1 ) {\n\n\t\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t\ttokens = match[0] = match[0].slice( 0 );\n\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\t\tcontext.nodeType === 9 && documentIsHTML &&\n\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\t\tif ( !context ) {\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\n\t\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t\t}\n\n\t\t\t// Fetch a seed set for right-to-left matching\n\t\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\ttoken = tokens[i];\n\n\t\t\t\t// Abort if we hit a combinator\n\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\t\tif ( (seed = find(\n\t\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\t\trsibling.test( tokens[0].type ) && context.parentNode || context\n\t\t\t\t\t)) ) {\n\n\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\tcompile( selector, match )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector )\n\t);\n\treturn results;\n}\n\n// Deprecated\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\n// Check sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Initialize with the default document\nsetDocument();\n\n// Always assume the presence of duplicates if sort doesn't\n// pass them to our comparison function (as in Google Chrome).\n[0, 0].sort( sortOrder );\nsupport.detectDuplicates = hasDuplicate;\n\n// EXPOSE\n/*if ( typeof define === \"function\" && define.amd ) {\n\tdefine(function() { return Sizzle; });\n} else {\n\twindow.Sizzle = Sizzle;\n}*/\n// EXPOSE\n\n/**\n * @namespace Ink.Dom.Selector\n * @static\n */\n\n/**\n * Alias for the Sizzle selector engine\n *\n * @method select\n * @param {String} selector CSS selector to search for elements\n * @param {DOMElement} [context] By default the search is done in the document element. However, you can specify an element as search context\n * @param {Array} [results] By default this is considered an empty array. But if you want to merge it with other searches you did, pass their result array through here.\n * @return {Array} Array of resulting DOM Elements\n * @sample Ink_Dom_Selector_select.html\n */\n\n/**\n * Filters elements that match a CSS selector.\n *\n * @method matches\n * @param {String} selector CSS selector to search for elements\n * @param {Array} matches Elements to be 'matched' with\n * @return {Array} Elements that matched\n * @sample Ink_Dom_Selector_matches.html\n */\n\n/**\n * Checks if an element matches a given selector\n *\n * @method matchesSelector\n * @param {DOMElement} element Element to test\n * @param {String} selector CSS selector to test the element with\n * @return {Boolean} True if element matches the CSS selector\n * @sample Ink_Dom_Selector_matchesSelector.html \n */\n\nreturn {\n select: Sizzle,\n matches: Sizzle.matches,\n matchesSelector: Sizzle.matchesSelector\n};\n\n\n}); //( window );\n","/**\n * Animate.css Utility\n *\n * This module is a wrapper around animate.css's CSS classes to produce animation.\n * It contains options to ease common tasks, like listen to the \"animationend\" event with all necessary prefixes, remove the necessary class names when the animation finishes, or configure the duration of your animation with the necessary browser prefix.\n *\n * @module Ink.UI.Animate_1\n * @version 1\n */\n\nInk.createModule('Ink.UI.Animate', 1, ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Css_1'], function (Common, InkEvent, Css) {\n 'use strict';\n\n var animationPrefix = (function (el) {\n return ('animationName' in el.style) ? 'animation' :\n ('webkitAnimationName' in el.style) ? 'webkitAnimation' : null;\n }(document.createElement('div')));\n\n var animationEndEventName = {\n animation: 'animationend',\n webkitAnimation: 'webkitAnimationEnd'\n }[animationPrefix];\n\n /**\n * @class Ink.UI.Animate_1\n * @constructor\n *\n * @param {Element} element Animated element\n * @param {Object} options Options object\n * @param {String} options.animation Animation name\n * @param {String|Number} [options.duration] Duration name (fast|medium|slow) or duration in milliseconds. Defaults to 'medium'.\n * @param {Boolean} [options.removeClass] Flag to remove the CSS class when finished animating. Defaults to false.\n * @param {Function} [options.onEnd] Callback for the animation end\n *\n * @sample Ink_UI_Animate_1.html\n *\n **/\n function Animate() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n Animate._name = 'Animate_1';\n\n Animate._optionDefinition = {\n trigger: ['Element', null],\n duration: ['String', 'slow'], // Actually a string with a duration name, or a number of ms\n animation: ['String'],\n removeClass: ['Boolean', true],\n onEnd: ['Function', function () {}]\n };\n\n Animate.prototype._init = function () {\n if (!isNaN(parseInt(this._options.duration, 10))) {\n this._options.duration = parseInt(this._options.duration, 10);\n }\n\n if (this._options.trigger) {\n InkEvent.observe(this._options.trigger, 'click', Ink.bind(function () {\n this.animate();\n }, this)); // later\n } else {\n this.animate();\n }\n };\n\n Animate.prototype.animate = function () {\n Animate.animate(this._element, this._options.animation, this._options);\n };\n\n Ink.extendObj(Animate, {\n /**\n * Browser prefix for the CSS animations.\n *\n * @property _animationPrefix\n * @private\n **/\n _animationPrefix: animationPrefix,\n\n /**\n * Boolean which says whether this browser has CSS3 animation support.\n *\n * @property animationSupported\n **/\n animationSupported: !!animationPrefix,\n\n /**\n * Prefixed 'animationend' event name.\n *\n * @property animationEndEventName\n **/\n animationEndEventName: animationEndEventName,\n\n /**\n * Animate an element using one of the animate.css classes\n *\n * **Note: This is a utility method inside the `Animate` class, which you can access through `Animate.animate()`. Do not mix these up.**\n *\n * @static\n * @method animate\n * @param {Element} element Animated element\n * @param {String} animation Animation name\n * @param {Object} [options] Options object, containing:\n * @param {Function} [options.onEnd=null] Callback for animation end.\n * @param {Boolean} [options.removeClass=false] Whether to remove the Css class when finished.\n * @param {String|Number} [options.duration=medium] Duration name (the fast|medium|slow strings) or, duration in milliseconds.\n *\n * @return {void}\n * @public\n *\n * @sample Ink_UI_Animate_1_animate.html\n **/\n animate: function (element, animation, options) {\n element = Common.elOrSelector(element);\n\n if (typeof options === 'number' || typeof options === 'string') {\n options = { duration: options };\n } else if (!options) {\n options = {};\n }\n\n if (typeof arguments[3] === 'function') {\n options.onEnd = arguments[3];\n }\n\n if (typeof options.duration !== 'number' && typeof options.duration !== 'string') {\n options.duration = 400;\n }\n\n if (!Animate.animationSupported) {\n if (options.onEnd) {\n setTimeout(function () {\n options.onEnd(null);\n }, 0);\n }\n return;\n }\n\n if (typeof options.duration === 'number') {\n element.style[animationPrefix + 'Duration'] = options.duration + 'ms';\n } else if (typeof options.duration === 'string') {\n Css.addClassName(element, options.duration);\n }\n\n Css.addClassName(element, ['animated', animation]);\n\n function onAnimationEnd(event) {\n if (event.target !== element) { return; }\n if (event.animationName !== animation) { return; }\n if (options.onEnd) { options.onEnd(event); }\n if (options.removeClass) {\n Css.removeClassName(element, animation);\n }\n if (typeof options.duration === 'string') {\n Css.removeClassName(element, options.duration);\n }\n element.removeEventListener(animationEndEventName, onAnimationEnd, false);\n }\n\n element.addEventListener(animationEndEventName, onAnimationEnd, false);\n }\n });\n\n Common.createUIComponent(Animate);\n\n return Animate;\n});\n","/**\n * Flexible Carousel\n * @module Ink.UI.Carousel_1\n * @version 1\n */\n\nInk.createModule('Ink.UI.Carousel', '1',\n ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Css_1', 'Ink.Dom.Element_1', 'Ink.UI.Pagination_1', 'Ink.Dom.Browser_1', 'Ink.Dom.Selector_1'],\n function(Common, InkEvent, Css, InkElement, Pagination, Browser/*, Selector*/) {\n 'use strict';\n\n /*\n * TODO:\n * keyboardSupport\n */\n\n function limitRange(n, min, max) {\n return Math.min(max, Math.max(min, n));\n }\n\n var requestAnimationFrame = window.requestAnimationFrame ||\n function (cb) { return setTimeout(cb, 1000 / 30); };\n\n /**\n * @class Ink.UI.Carousel_1\n * @constructor\n *\n * @param {String|Element} selector DOM element or element id\n * @param {Object} [options] Carousel Options\n * @param {Integer} [options.autoAdvance] Milliseconds to wait before auto-advancing pages. Set to 0 to disable auto-advance. Defaults to 0.\n * @param {String} [options.axis] Axis of the carousel. Set to 'y' for a vertical carousel. Defaults to 'x'.\n * @param {Number} [options.initialPage] Initial index page of the carousel. Defaults to 0.\n * @param {Boolean} [options.spaceAfterLastSlide=true] If there are not enough slides to fill the full width of the last page, leave white space. Defaults to `true`.\n * @param {Boolean} [options.swipe] Enable swipe support if available. Defaults to true.\n * @param {Mixed} [options.pagination] Either an ul element to add pagination markup to or an `Ink.UI.Pagination` instance to use.\n * @param {Function} [options.onChange] Callback to be called when the page changes.\n *\n * @sample Ink_UI_Carousel_1.html\n */\n function Carousel() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n Carousel._name = 'Carousel_1';\n\n Carousel._optionDefinition = {\n autoAdvance: ['Integer', 0],\n axis: ['String', 'x'],\n initialPage: ['Integer', 0],\n spaceAfterLastSlide: ['Boolean', true],\n keyboardSupport:['Boolean', false],\n pagination: ['String', null],\n onChange: ['Function', null],\n onInit: ['Function', function () {}],\n swipe: ['Boolean', true]\n // TODO exponential swipe\n // TODO specify break point for next page when moving finger\n };\n\n Carousel.prototype = {\n _init: function () {\n this._handlers = {\n paginationChange: Ink.bindMethod(this, '_onPaginationChange'),\n windowResize: InkEvent.throttle(Ink.bindMethod(this, 'refit'), 200)\n };\n\n InkEvent.observe(window, 'resize', this._handlers.windowResize);\n\n this._isY = (this._options.axis === 'y');\n\n var ulEl = Ink.s('ul.stage', this._element);\n ulEl.style.width = '100%';\n this._ulEl = ulEl;\n\n InkElement.removeTextNodeChildren(ulEl);\n\n if (this._options.pagination == null) {\n this._currentPage = this._options.initialPage;\n }\n\n this.refit(); // recalculate this._numPages\n\n if (this._isY) {\n // Override white-space: no-wrap which is only necessary to make sure horizontal stuff stays horizontal, but breaks stuff intended to be vertical.\n this._ulEl.style.whiteSpace = 'normal';\n }\n\n if (this._options.swipe) {\n InkEvent.observe(this._element, 'touchstart', Ink.bindMethod(this, '_onTouchStart'));\n InkEvent.observe(this._element, 'touchmove', Ink.bindMethod(this, '_onTouchMove'));\n InkEvent.observe(this._element, 'touchend', Ink.bindMethod(this, '_onTouchEnd'));\n }\n\n this._setUpPagination();\n this._setUpAutoAdvance();\n\n this._options.onInit.call(this, this);\n },\n\n /**\n * Repositions elements around.\n * Measure the carousel once again, adjusting the involved elements' sizes. This is called automatically when the window resizes, in order to cater for changes from responsive media queries, for instance.\n *\n * @method refit\n * @return {void}\n * @public\n */\n refit: function() {\n var _isY = this._isY;\n\n var size = function (elm, perpendicular) {\n if (!elm) { return 0; }\n\n if (!perpendicular) {\n return InkElement.outerDimensions(elm)[_isY ? 1 : 0];\n } else {\n return InkElement.outerDimensions(elm)[_isY ? 0 : 1];\n }\n };\n\n this._liEls = Ink.ss('li.slide', this._ulEl);\n var numSlides = this._liEls.length;\n\n var contRect = this._ulEl.getBoundingClientRect();\n this._ctnLength = _isY ? contRect.bottom - contRect.top : contRect.right - contRect.left;\n this._elLength = size(this._liEls[0]);\n this._slidesPerPage = Math.floor( this._ctnLength / this._elLength ) || 1;\n if (!isFinite(this._slidesPerPage)) { this._slidesPerPage = 1; }\n\n var numPages = Math.ceil( numSlides / this._slidesPerPage );\n var numPagesChanged = this._numPages !== numPages;\n this._numPages = numPages;\n this._deltaLength = this._slidesPerPage * this._elLength;\n \n this._IE7();\n\n if (this._pagination && numPagesChanged) {\n this._pagination.setSize(this._numPages);\n }\n this.setPage(limitRange(this.getPage(), 0, this._numPages - 1));\n },\n\n _setUpPagination: function () {\n if (this._options.pagination) {\n if (Common.isDOMElement(this._options.pagination) ||\n typeof this._options.pagination === 'string') {\n // if dom element or css selector string...\n this._pagination = new Pagination(this._options.pagination, {\n size: this._numPages,\n onChange: this._handlers.paginationChange\n });\n } else {\n // assumes instantiated pagination\n this._pagination = this._options.pagination;\n this._pagination.setOnChange(this._handlers.paginationChange);\n this._pagination.setSize(this._numPages);\n }\n this._pagination.setCurrent(this._options.initialPage || 0);\n } else {\n this._currentPage = this._options.initialPage || 0;\n }\n },\n\n _setUpAutoAdvance: function () {\n if (!this._options.autoAdvance) { return; }\n var self = this;\n\n setTimeout(function autoAdvance() {\n self.nextPage(true /* wrap */);\n setTimeout(autoAdvance, self._options.autoAdvance);\n }, this._options.autoAdvance);\n },\n\n /**\n * Refits elements for IE7 because it doesn't support inline-block.\n *\n * @method _IE7\n * @private\n */\n _IE7: function () {\n if (Browser.IE && '' + Browser.version.split('.')[0] === '7') {\n // var numPages = this._numPages;\n var slides = Ink.ss('li.slide', this._ulEl);\n var stl = function (prop, val) {slides[i].style[prop] = val; };\n for (var i = 0, len = slides.length; i < len; i++) {\n stl('position', 'absolute');\n stl(this._isY ? 'top' : 'left', (i * this._elLength) + 'px');\n }\n }\n },\n\n _onTouchStart: function (event) {\n if (event.touches.length > 1) { return; }\n\n this._swipeData = {\n x: InkEvent.pointerX(event),\n y: InkEvent.pointerY(event)\n };\n\n var ulRect = this._ulEl.getBoundingClientRect();\n\n this._swipeData.firstUlPos = ulRect[this._isY ? 'top' : 'left'];\n\n this._swipeData.inUlX = this._swipeData.x - ulRect.left;\n this._swipeData.inUlY = this._swipeData.y - ulRect.top;\n\n setTransitionProperty(this._ulEl, 'none');\n\n this._touchMoveIsFirstTouchMove = true;\n },\n\n _onTouchMove: function (event) {\n if (event.touches.length > 1) { return; /* multitouch event, not my problem. */ }\n\n var pointerX = InkEvent.pointerX(event);\n var pointerY = InkEvent.pointerY(event);\n\n var deltaY = this._swipeData.y - pointerY;\n var deltaX = this._swipeData.x - pointerX;\n\n if (this._touchMoveIsFirstTouchMove) {\n var aDeltaY = Math.abs(deltaY);\n var aDeltaX = Math.abs(deltaX);\n\n this._touchMoveIsFirstTouchMove = undefined;\n this._scrolling = this._isY ?\n aDeltaX > aDeltaY :\n aDeltaY > aDeltaX ;\n\n if (!this._scrolling) {\n this._onAnimationFrame();\n }\n }\n\n if (!this._scrolling && this._swipeData) {\n InkEvent.stopDefault(event);\n\n this._swipeData.pointerDelta = this._isY ? deltaY : deltaX;\n this._swipeData.pointerPos = this._isY ? pointerY : pointerX;\n }\n },\n\n _onAnimationFrame: function () {\n var swipeData = this._swipeData;\n\n if (!swipeData || this._scrolling || this._touchMoveIsFirstTouchMove) { return; }\n\n var elRect = this._element.getBoundingClientRect();\n\n var newPos;\n\n if (!this._isY) {\n newPos = swipeData.pointerPos - swipeData.inUlX - elRect.left;\n } else {\n newPos = swipeData.pointerPos - swipeData.inUlY - elRect.top;\n }\n\n this._ulEl.style[this._isY ? 'top' : 'left'] = newPos + 'px';\n\n requestAnimationFrame(Ink.bindMethod(this, '_onAnimationFrame'));\n },\n\n _onTouchEnd: function (event) {\n if (this._swipeData && this._swipeData.pointerPos && !this._scrolling && !this._touchMoveIsFirstTouchMove) {\n var snapToNext = 0.1; // swipe 10% of the way to change page\n\n var pointerDelta = this._swipeData.pointerDelta;\n\n var curPage = this.getPage();\n\n // How many pages were advanced? May be fractional.\n var progressInPages = pointerDelta / this._elLength / this._slidesPerPage;\n\n // Have we advanced enough to change page?\n if (Math.abs(progressInPages) > snapToNext) {\n curPage += Math[ pointerDelta < 0 ? 'floor' : 'ceil' ](progressInPages);\n }\n\n curPage = limitRange(curPage, 0, this._numPages - 1);\n\n // If something used to calculate progressInPages was zero, we get NaN here.\n if (!isNaN(curPage)) {\n this.setPage(curPage);\n }\n\n InkEvent.stopDefault(event);\n }\n\n setTransitionProperty(this._ulEl, null /* transition: left, top */);\n this._swipeData = null;\n this._touchMoveIsFirstTouchMove = undefined;\n this._scrolling = undefined;\n },\n\n _onPaginationChange: function(pgn) {\n this._setPage(pgn.getCurrent());\n },\n\n /**\n * Gets the current page index\n * @method getPage\n * @return {Number} The current page number\n * @public\n **/\n getPage: function () {\n if (this._pagination) {\n return this._pagination.getCurrent();\n } else {\n return this._currentPage || 0;\n }\n },\n\n /**\n * Gets the Ink Pagination element this carousel is using.\n * @method getPagination\n * @return {Pagination} The pagination instance, if any. Otherwise, `null`.\n * @public\n **/\n getPagination: function () {\n return this._pagination || null;\n },\n\n /**\n * Sets the current page index\n * @method setPage\n * @param {Number} page Index of the destination page.\n * @param {Boolean} [wrap=false] Flag to activate circular counting (for example, if you set the page to `5` and there are only 4 pages, you're actually going to the first page).\n * @return {void}\n * @public\n **/\n setPage: function (page, wrap) {\n if (wrap) {\n // Pages outside the range [0..this._numPages] are wrapped.\n page = page % this._numPages;\n if (page < 0) { page = this._numPages - page; }\n }\n page = limitRange(page, 0, this._numPages - 1);\n\n if (page === this._currentPage) {\n if (this._swipeData) {\n this._setPage(page); // Just advance the view.\n }\n return;\n }\n\n if (this._pagination) {\n this._pagination.setCurrent(page); // _setPage is called by pagination because it listens to its Change event.\n } else {\n this._setPage(page);\n }\n },\n\n _setPage: function (page) {\n var _lengthToGo = page * this._deltaLength;\n var isLastPage = page === (this._numPages - 1);\n\n if (!this._options.spaceAfterLastSlide && isLastPage && page > 0) { \n var _itemsInLastPage = this._liEls.length - (page * this._slidesPerPage);\n if(_itemsInLastPage < this._slidesPerPage) {\n _lengthToGo = ((page - 1) * this._deltaLength) + (_itemsInLastPage * this._elLength);\n }\n }\n\n this._ulEl.style[ this._isY ? 'top' : 'left'] =\n ['-', (_lengthToGo / this._ctnLength) * 100, '%'].join('');\n\n if (this._options.onChange) {\n this._options.onChange.call(this, page);\n }\n\n this._currentPage = page;\n },\n\n /**\n * Goes to the next page\n * @method nextPage\n * @param {Boolean} [wrap=false] Flag to loop from last page to first page.\n * @return {void}\n * @public\n **/\n nextPage: function (wrap) {\n this.setPage(this.getPage() + 1, wrap);\n },\n\n /**\n * Goes to the previous page\n * @method previousPage\n * @param {Boolean} [wrap=false] Flag to loop from first page to last page.\n * @return {void}\n * @public\n **/\n previousPage: function (wrap) { this.setPage(this.getPage() - 1, wrap); },\n\n /**\n * Returns how many slides fit into a page\n * @method getSlidesPerPage\n * @return {Number} The number of slides per page\n * @public\n */\n getSlidesPerPage: function() {\n return this._slidesPerPage;\n },\n\n /**\n * Get the amount of pages in the carousel.\n * @method getTotalPages\n * @return {Number} The number of pages\n * @public\n */\n getTotalPages: function() {\n return this._numPages;\n },\n\n /**\n * Get the stage element (your UL with the class \".stage\").\n * @method getStageElm\n * @public\n * @return {Element} Stage element\n **/\n getStageElm: function() {\n return this._ulEl;\n },\n\n /**\n * Get a list of your slides (elements with the \".slide\" class inside your stage)\n * @method getSlidesList\n * @return {Element[]} Array containing the slides.\n * @public\n */\n getSlidesList: function() {\n return this._liEls;\n },\n\n /**\n * Get the total number of slides\n * @method getTotalSlides\n * @return {Number} The number of slides\n * @public\n */\n getTotalSlides: function() {\n return this.getSlidesList().length;\n }\n };\n\n function setTransitionProperty(el, newTransition) {\n el.style.transitionProperty =\n el.style.oTransitionProperty =\n el.style.msTransitionProperty =\n el.style.mozTransitionProperty =\n el.style.webkitTransitionProperty = newTransition;\n }\n\n Common.createUIComponent(Carousel);\n\n return Carousel;\n\n});\n","/**\n * Closing utilities\n * @module Ink.UI.Close_1\n * @version 1\n */\nInk.createModule('Ink.UI.Close', '1', ['Ink.Dom.Event_1','Ink.Dom.Element_1'], function(InkEvent, InkElement) {\n 'use strict';\n\n /**\n * Subscribes clicks on the document.body.\n * Whenever an element with the classes \".ink-close\" or \".ink-dismiss\" is clicked, this module finds an ancestor \".ink-alert\" or \".ink-alert-block\" element and removes it from the DOM.\n * This module should be created only once per page.\n * \n * @class Ink.UI.Close\n * @constructor\n * @example\n * \n *\n * @sample Ink_UI_Close_1.html\n */\n function Close() {\n InkEvent.observe(document.body, 'click', function(ev) {\n var el = InkEvent.element(ev);\n\n el = InkElement.findUpwardsByClass(el, 'ink-close') ||\n InkElement.findUpwardsByClass(el, 'ink-dismiss');\n\n if (!el) {\n return; // ink-close or ink-dismiss class not found\n }\n\n var toRemove = InkElement.findUpwardsByClass(el, 'ink-alert') ||\n InkElement.findUpwardsByClass(el, 'ink-alert-block') ||\n el;\n\n if (toRemove) {\n InkEvent.stop(ev);\n InkElement.remove(toRemove);\n }\n });\n }\n\n Close._name = 'Close_1';\n\n return Close;\n});\n","/**\n * Auxiliar utilities for UI Modules\n * @module Ink.UI.Common_1\n * @version 1\n */\n \nInk.createModule('Ink.UI.Common', '1', ['Ink.Dom.Element_1', 'Ink.Net.Ajax_1','Ink.Dom.Css_1','Ink.Dom.Selector_1','Ink.Util.Url_1'], function(InkElement, Ajax,Css,Selector,Url) {\n\n 'use strict';\n\n var nothing = {} /* a marker, for reference comparison. */;\n\n var keys = Object.keys || function (obj) {\n var ret = [];\n for (var k in obj) if (obj.hasOwnProperty(k)) {\n ret.push(k);\n }\n return ret;\n };\n\n var es6WeakMapSupport = 'WeakMap' in window;\n var instances = es6WeakMapSupport ? new WeakMap() : null;\n // Old Registry\n var _reg = [];\n var domRegistry = {\n get: function get(el) {\n return es6WeakMapSupport ?\n instances.get(el) :\n _reg[el.getAttribute('__InkInstance')];\n },\n set: function set(el, thing) {\n if (es6WeakMapSupport) {\n instances.set(el, thing);\n } else {\n el.setAttribute('__InkInstance', _reg.push(thing) - 1);\n }\n }\n };\n\n /**\n * @namespace Ink.UI.Common_1\n */\n\n var Common = {\n\n /**\n * Supported Ink Layouts\n *\n * @property Layouts\n * @type Object\n * @readOnly\n */\n Layouts: {\n TINY: 'tiny',\n SMALL: 'small',\n MEDIUM: 'medium',\n LARGE: 'large',\n XLARGE: 'xlarge'\n },\n\n /**\n * Checks if an item is a valid DOM Element.\n *\n * @method isDOMElement\n * @static\n * @param {Mixed} o The object to be checked.\n * @return {Boolean} True if it's a valid DOM Element.\n * @example\n * var el = Ink.s('#element');\n * if( Ink.UI.Common.isDOMElement( el ) === true ){\n * // It is a DOM Element.\n * } else {\n * // It is NOT a DOM Element.\n * }\n */\n isDOMElement: InkElement.isDOMElement,\n\n /**\n * Checks if an item is a valid integer.\n *\n * @method isInteger\n * @static\n * @param {Mixed} n The value to be checked.\n * @return {Boolean} True if it's a valid integer.\n * @example\n * var value = 1;\n * if( Ink.UI.Common.isInteger( value ) === true ){\n * // It is an integer.\n * } else {\n * // It is NOT an integer.\n * }\n */\n isInteger: function(n) {\n return (typeof n === 'number' && n % 1 === 0);\n },\n\n /**\n * Gets a DOM Element. \n *\n * @method elOrSelector\n * @static\n * @param {Element|String} elOrSelector DOM Element or CSS Selector\n * @param {String} fieldName The name of the field. Commonly used for debugging.\n * @return {Element} Returns the Element passed or the first result of the CSS Selector. Otherwise it throws an exception.\n * @example\n * // In case there are several .myInput, it will retrieve the first found\n * var el = Ink.UI.Common.elOrSelector('.myInput','My Input');\n */\n elOrSelector: function(elOrSelector, fieldName) {\n if (!Common.isDOMElement(elOrSelector)) {\n var t = Selector.select(elOrSelector);\n if (t.length === 0) {\n Ink.warn(fieldName + ' must either be a DOM Element or a selector expression!\\nThe script element must also be after the DOM Element itself.');\n return null;\n }\n return t[0];\n }\n return elOrSelector;\n },\n\n /**\n * Like `elOrSelector` but returns an array of elements.\n *\n * @method elsOrSelector\n *\n * @static\n * @param {Element|Array|String} elsOrSelector DOM Element, array of DOM Elements, or CSS Selector\n * @param {String} [fieldName] The name of the field. Used for the error shown when no elements are found.\n * @param {Boolean} required If this is true, throw an error instead of returning an empty array.\n * @return {Array} The selected Elements, or the given Elements\n * @example\n * var elements = Ink.UI.Common.elsOrSelector('input.my-inputs', 'My Input');\n */\n elsOrSelector: function(elsOrSelector, fieldName, required) {\n var ret;\n if (typeof elsOrSelector === 'string') {\n ret = Selector.select(elsOrSelector);\n } else if (Common.isDOMElement(elsOrSelector)) {\n ret = [elsOrSelector];\n } else if (elsOrSelector && typeof elsOrSelector === 'object' && typeof elsOrSelector.length === 'number') {\n ret = elsOrSelector;\n }\n\n if (ret && ret.length) {\n return ret;\n } else {\n if (required) {\n throw new TypeError(fieldName + ' must either be a DOM Element, an Array of elements, or a selector expression!\\nThe script element must also be after the DOM Element itself.');\n } else {\n return [];\n }\n }\n },\n\n /**\n * Gets options an object and element's metadata.\n *\n * The element's data attributes take precedence. Values from the element's data-atrributes are coerced into the required type.\n *\n * @method options\n *\n * @param {Object} [fieldId] Name to be used in error reports.\n * @param {Object} defaults Object with the options' types and defaults.\n * @param {Object} overrides Options to override the defaults. Usually passed when instantiating an UI module.\n * @param {Element} [element] Element with data-attributes\n * @return {Object} An object containing all the option values.\n *\n * @example\n *\n * this._options = Ink.UI.Common.options('MyComponent', {\n * 'anobject': ['Object', null], // Defaults to null\n * 'target': ['Element', null],\n * 'stuff': ['Number', 0.1],\n * 'stuff2': ['Integer', 0],\n * 'doKickFlip': ['Boolean', false],\n * 'targets': ['Elements'], // Required option since no default was given\n * 'onClick': ['Function', null]\n * }, options || {}, elm)\n *\n * @example\n *\n * ### Note about booleans\n *\n * Here is how options are read from the markup\n * data-attributes, for several values`data-a-boolean`.\n *\n * Options considered true:\n *\n * - `data-a-boolean=\"true\"`\n * - (Every other value which is not on the list below.)\n * \n * Options considered false:\n *\n * - `data-a-boolean=\"false\"`\n * - `data-a-boolean=\"\"`\n * - `data-a-boolean`\n *\n * Options which go to default:\n *\n * - (no attribute). When `data-a-boolean` is ommitted, the\n * option is not considered true nor false, and as such\n * defaults to what is in the `defaults` argument.\n *\n **/\n options: function (fieldId, defaults, overrides, element) {\n // TODO Change Common.options's signature? the below looks better, more manageable\n // var options = Common.options({\n // element: this._element,\n // modName: constructor._name,\n // options: constructor._optionDefinition,\n // defaults: constructor._globalDefaults\n // });\n\n if (typeof fieldId !== 'string') {\n element = overrides;\n overrides = defaults;\n defaults = fieldId;\n fieldId = '';\n }\n overrides = overrides || {};\n var out = {};\n var dataAttrs = element ? InkElement.data(element) : {};\n var fromDataAttrs;\n var type;\n var lType;\n var defaultVal;\n\n var invalidStr = function (str) {\n if (fieldId) { str = fieldId + ': \"' + ('' + str).replace(/\"/, '\\\\\"') + '\"'; }\n return str;\n };\n\n var quote = function (str) {\n return '\"' + ('' + str).replace(/\"/, '\\\\\"') + '\"';\n };\n\n var invalidThrow = function (str) {\n throw new Error(invalidStr(str));\n };\n\n var invalid = function (str) {\n Ink.error(invalidStr(str) + '. Ignoring option.');\n };\n\n function optionValue(key) {\n type = defaults[key][0];\n lType = type.toLowerCase();\n defaultVal = defaults[key].length === 2 ? defaults[key][1] : nothing;\n\n if (!type) {\n invalidThrow('Ink.UI.Common.options: Always specify a type!');\n }\n if (!(lType in Common._coerce_funcs)) {\n invalidThrow('Ink.UI.Common.options: ' + defaults[key][0] + ' is not a valid type. Use one of ' + keys(Common._coerce_funcs).join(', '));\n\n }\n if (!defaults[key].length || defaults[key].length > 2) {\n invalidThrow('the \"defaults\" argument must be an object mapping option names to [typestring, optional] arrays.');\n }\n\n if (key in dataAttrs) {\n fromDataAttrs = Common._coerce_from_string(lType, dataAttrs[key], key, fieldId);\n // (above can return `nothing`)\n } else {\n fromDataAttrs = nothing;\n }\n\n if (fromDataAttrs !== nothing) {\n if (!Common._options_validate(fromDataAttrs, lType)) {\n invalid('(' + key + ' option) Invalid ' + lType + ' ' + quote(fromDataAttrs));\n return defaultVal;\n } else {\n return fromDataAttrs;\n }\n } else if (key in overrides) {\n return overrides[key];\n } else if (defaultVal !== nothing) {\n return defaultVal;\n } else {\n invalidThrow('Option ' + key + ' is required!');\n }\n }\n\n for (var key in defaults) {\n if (defaults.hasOwnProperty(key)) {\n out[key] = optionValue(key);\n }\n }\n\n return out;\n },\n\n _coerce_from_string: function (type, val, paramName, fieldId) {\n if (type in Common._coerce_funcs) {\n return Common._coerce_funcs[type](val, paramName, fieldId);\n } else {\n return val;\n }\n },\n\n _options_validate: function (val, type) {\n if (type in Common._options_validate_types) {\n return Common._options_validate_types[type].call(Common, val);\n } else {\n // 'object' options cannot be passed through data-attributes.\n // Json you say? Not any good to embed in HTML.\n return false;\n }\n },\n\n _coerce_funcs: (function () {\n var ret = {\n element: function (val) {\n return Common.elOrSelector(val, '');\n },\n elements: function (val) {\n return Common.elsOrSelector(val, '', false /*not required, so don't throw an exception now*/);\n },\n object: function (val) { return val; },\n number: function (val) { return parseFloat(val); },\n 'boolean': function (val) {\n return !(val === 'false' || val === '' || val === null);\n },\n string: function (val) { return val; },\n 'function': function (val, paramName, fieldId) {\n Ink.error(fieldId + ': You cannot specify the option \"' + paramName + '\" through data-attributes because it\\'s a function');\n return nothing;\n }\n };\n ret['float'] = ret.integer = ret.number;\n return ret;\n }()),\n\n _options_validate_types: (function () {\n var types = {\n string: function (val) {\n return typeof val === 'string';\n },\n number: function (val) {\n return typeof val === 'number' && !isNaN(val) && isFinite(val);\n },\n integer: function (val) {\n return val === Math.round(val);\n },\n element: function (val) {\n return Common.isDOMElement(val);\n },\n elements: function (val) {\n return val && typeof val === 'object' && typeof val.length === 'number' && val.length;\n },\n 'boolean': function (val) {\n return typeof val === 'boolean';\n },\n object: function () { return true; }\n };\n types['float'] = types.number;\n return types;\n }()),\n\n /**\n * Deep copy (clone) an object.\n * Note: The object cannot have referece loops.\n *\n * @method clone\n * @static\n * @deprecated\n * @param {Object} o The object to be cloned/copied.\n * @return {Object} Returns the result of the clone/copy.\n * @example\n * var originalObj = {\n * key1: 'value1',\n * key2: 'value2',\n * key3: 'value3'\n * };\n * var cloneObj = Ink.UI.Common.clone( originalObj );\n */\n clone: function(o) {\n try {\n return JSON.parse( JSON.stringify(o) );\n } catch (ex) {\n throw new Error('Given object cannot have loops!');\n }\n },\n\n\n /**\n * Gets an element's one-base index relative to its parent.\n *\n * Deprecated. Use Ink.Dom.Element.parentIndexOf instead.\n *\n * @method childIndex\n * @deprecated\n * @static\n * @param {Element} childEl Valid DOM Element.\n * @return {Number} Numerical position of an element relatively to its parent.\n * @example\n * \n *
              \n *
            • One
            • \n *
            • Two
            • \n *
            • Three
            • \n *
            • Four
            • \n *
            \n *\n * \n */\n childIndex: InkElement.parentIndexOf,\n\n /**\n * AJAX JSON request shortcut method\n * It provides a more convenient way to do an AJAX request and expect a JSON response.It also offers a callback option, as third parameter, for better async handling.\n *\n * @method ajaxJSON\n * @static\n * @async\n * @param {String} endpoint Valid URL to be used as target by the request.\n * @param {Object} params This field is used in the thrown Exception to identify the parameter.\n * @param {Function} cb Callback for the request.\n * @return {void}\n * @public\n * @example\n * // In case there are several .myInput, it will retrieve the first found\n * var el = Ink.UI.Common.elOrSelector('.myInput','My Input');\n */\n ajaxJSON: function(endpoint, params, cb) {\n new Ajax(\n endpoint,\n {\n evalJS: 'force',\n method: 'POST',\n parameters: params,\n\n onSuccess: function( r) {\n try {\n r = r.responseJSON;\n if (r.status !== 'ok') {\n throw 'server error: ' + r.message;\n }\n cb(null, r);\n } catch (ex) {\n cb(ex);\n }\n },\n\n onFailure: function() {\n cb('communication failure');\n }\n }\n );\n },\n\n\n /**\n * Gets the current Ink layout.\n *\n * @method currentLayout\n * @static\n * @return {String} A string representation of the current layout name.\n * @public\n * @example\n * var inkLayout = Ink.UI.Common.currentLayout();\n * if (inkLayout === 'small') {\n * // ...\n * }\n */\n currentLayout: function() {\n var i, f, k, v, el, detectorEl = Selector.select('#ink-layout-detector')[0];\n if (!detectorEl) {\n detectorEl = document.createElement('div');\n detectorEl.id = 'ink-layout-detector';\n for (k in Common.Layouts) {\n if (Common.Layouts.hasOwnProperty(k)) {\n v = Common.Layouts[k];\n el = document.createElement('div');\n el.className = 'show-' + v + ' hide-all';\n el.setAttribute('data-ink-layout', v);\n detectorEl.appendChild(el);\n }\n }\n document.body.appendChild(detectorEl);\n }\n\n for (i = 0, f = detectorEl.children.length; i < f; ++i) {\n el = detectorEl.children[i];\n if (Css.getStyle(el, 'display') === 'block') {\n return el.getAttribute('data-ink-layout');\n }\n }\n\n return 'large';\n },\n\n\n /**\n * Sets the location's hash (window.location.hash).\n *\n * @method hashSet\n * @static\n * @param {Object} o Object with the info to be placed in the location's hash.\n * @return {void}\n * @example\n * // It will set the location's hash like: #key1=value1&key2=value2&key3=value3\n * Ink.UI.Common.hashSet({\n * key1: 'value1',\n * key2: 'value2',\n * key3: 'value3'\n * });\n */\n hashSet: function(o) {\n if (typeof o !== 'object') { throw new TypeError('o should be an object!'); }\n var hashParams = Url.getAnchorString();\n hashParams = Ink.extendObj(hashParams, o);\n window.location.hash = Url.genQueryString('', hashParams).substring(1);\n },\n\n /**\n * Removes children nodes from a given object.\n * This method was initially created to help solve a problem in Internet Explorer(s) that occurred when trying to set the innerHTML of some specific elements like 'table'.\n *\n * @method cleanChildren\n * @static\n * @param {Element} parentEl Valid DOM Element\n * @return {void}\n * @public\n * @example\n * \n *
              \n *
            • One
            • \n *
            • Two
            • \n *
            • Three
            • \n *
            • Four
            • \n *
            \n *\n * \n *\n * \n *
              \n */\n cleanChildren: function(parentEl) {\n if( !Common.isDOMElement(parentEl) ){\n throw new Error('Please provide a valid DOMElement');\n }\n InkElement.setHTML(parentEl, '');\n },\n\n /**\n * Stores the id and/or classes of an element in an object.\n *\n * @method storeIdAndClasses\n * @static\n * @param {Element} fromEl Valid DOM Element to get the id and classes from.\n * @param {Object} inObj Object where the id and classes will be saved.\n * @return {void}\n * @public\n * @example\n *
              \n *\n * \n */\n storeIdAndClasses: function(fromEl, inObj) {\n if( !Common.isDOMElement(fromEl) ){\n throw 'Please provide a valid Element as first parameter';\n }\n\n var id = fromEl.id;\n if (id) {\n inObj._id = id;\n }\n\n var classes = fromEl.className;\n if (classes) {\n inObj._classes = classes;\n }\n },\n\n /**\n * Sets the id and className properties of an element based \n *\n * @method restoreIdAndClasses\n * @static\n * @param {Element} toEl Valid DOM Element to set the id and classes on.\n * @param {Object} inObj Object where the id and classes to be set are. This method uses the same format as the one given in `storeIdAndClasses`\n * @return {void}\n * @public\n * @example\n *
              \n *\n * \n *\n * \n *
              \n */\n restoreIdAndClasses: function(toEl, inObj) {\n\n if( !Common.isDOMElement(toEl) ){\n throw 'Please provide a valid Element as first parameter';\n }\n\n if (inObj._id && toEl.id !== inObj._id) {\n toEl.id = inObj._id;\n }\n\n if (inObj._classes && toEl.className.indexOf(inObj._classes) === -1) {\n if (toEl.className) { toEl.className += ' ' + inObj._classes; }\n else { toEl.className = inObj._classes; }\n }\n\n if (inObj._instanceId && !toEl.getAttribute('data-instance')) {\n toEl.setAttribute('data-instance', inObj._instanceId);\n }\n },\n\n _warnDoubleInstantiation: function (elm, newInstance) {\n var instances = Common.getInstance(elm);\n\n if (getName(newInstance) === '') { return; }\n if (!instances) { return; }\n\n var nameWithoutVersion = getName(newInstance);\n\n if (!nameWithoutVersion) { return; }\n\n for (var i = 0, len = instances.length; i < len; i++) {\n if (nameWithoutVersion === getName(instances[i])) {\n // Yes, I am using + to concatenate and , to split\n // arguments.\n //\n // Elements can't be concatenated with strings, but if\n // they are passed in an argument, modern debuggers will\n // pretty-print them and make it easy to find them in the\n // element inspector.\n //\n // On the other hand, if strings are passed as different\n // arguments, they get pretty printed. And the pretty\n // print of a string has quotes around it.\n //\n // If some day people find out that strings are not\n // just text and they start preserving contextual\n // information, then by all means change this to a\n // regular concatenation.\n //\n // But they won't. So don't change this.\n Ink.warn('Creating more than one ' + nameWithoutVersion + 'for the same element.',\n '(Was creating a ' + nameWithoutVersion + ' on:', elm, ').');\n return false;\n }\n }\n\n function getName(thing) {\n return ((thing.constructor && (thing.constructor._name)) ||\n thing._name ||\n '').replace(/_.*?$/, '');\n }\n\n return true;\n },\n\n /**\n * Saves an object (which should inherit BaseUIComponent) in the registry, associated with an element. You can retrieve it later by calling getInstance.\n *\n * This won't allow two instances of the same class to be created on a single element. It will fail and print a warning to the console if you try to do it. That is a common error when using Ink.\n *\n * @method registerInstance\n * @static\n * @param {Object} inst Object to be registered\n * @param {Element} [el=inst._element] Element to associate with `inst`. Defaults to `_element` property of `inst`.\n * @return {Boolean} `true` if we could create the instance, `false` otherwise.\n */\n registerInstance: function(inst, el) {\n if (!inst) { return; }\n\n if (!el) { el = inst._element; }\n\n if (!Common.isDOMElement(el)) { throw new TypeError('Ink.UI.Common.registerInstance: The element passed in is not a DOM element!'); }\n\n // [todo] this belongs in the BaseUIComponent's initialization\n if (Common._warnDoubleInstantiation(el, inst) === false) {\n return false;\n }\n\n var instances = domRegistry.get(el);\n\n if (!instances) {\n instances = [];\n domRegistry.set(el, instances);\n }\n\n instances.push(inst);\n\n return true;\n },\n\n /**\n * Unregisters (removes from the registry) a UI component instance from whatever element it's on.\n *\n * @method unregisterInstance\n * @static\n * @param {String} inst Instance to be unregistered.\n * @return {void}\n * @public\n */\n unregisterInstance: function(inst) {\n if (!inst || !inst._element) { return; }\n var instances = domRegistry.get(inst._element);\n for (var i = 0, len = instances.length; i < len; i++) {\n if (instances[i] === inst) {\n instances.splice(i, 1);\n }\n }\n },\n\n /**\n * Gets an UI component instance from an element.\n *\n * This function is already available in the UI components' classes themselves. You can call Modal.getInstance() and retrieve a modal.\n *\n * @method getInstance\n * @static\n * @param {String|Element} el Element from which we want the instances. A selector is okay.\n * @param {BaseUIComponent} [UIComponent] If you pass an Ink UI component class (Like Ink.UI.Modal or Ink.UI.Carousel), this won't return an array of all instances associated with the element. Instead it will return only the object which is an instance of that class.\n * @return {Object|Array} Returns an array containing all the instances in that element.\n * @public\n */\n getInstance: function(el, UIComponent) {\n var givenEl = el; // So we can warn it later.\n\n el = Common.elOrSelector(el);\n\n if (!Common.isDOMElement(el)) {\n Ink.warn('Ink.UI.Common: getInstance called on non-element (' + givenEl + ')');\n return [];\n }\n\n var instances = domRegistry.get(el);\n\n if (!instances) {\n instances = [];\n }\n\n if (typeof UIComponent !== 'function') {\n return instances;\n }\n\n for (var i = 0, len = instances.length; i < len; i++) {\n if (instances[i] instanceof UIComponent) {\n return instances[i];\n }\n }\n\n return null;\n },\n\n /**\n * Gets an instance based on a selector.\n *\n * @method getInstanceFromSelector\n * @static\n * @param {String} selector CSS selector to get the instances from. This function will only use the *first* element.\n * @return {Object|Array} Returns an array of the instances in the selected element.\n * @public\n */\n getInstanceFromSelector: function(selector) {\n return Common.getInstance(selector);\n },\n\n /**\n * Gets all the instance ids\n *\n * @method getInstanceIds\n * @static\n * @return {Array} Collection of instance ids\n */\n getInstanceIds: function() {\n if( _reg.length > 0 ) return _reg;\n var res = [];\n for (var id in instances) {\n if (instances.hasOwnProperty(id)) {\n res.push( id );\n }\n }\n return res;\n },\n\n /**\n * Gets all the instances\n *\n * @method getInstances\n * @static\n * @return {Array} Collection of existing instances.\n * @public\n */\n getInstances: function() {\n if( _reg.length > 0 ) return _reg;\n var res = [];\n for (var id in instances) {\n if (instances.hasOwnProperty(id)) {\n res.push( instances[id] );\n }\n }\n return res;\n },\n\n /**\n * Boilerplate method to destroy a component.\n * Components should copy this method as its destroy method and modify it.\n *\n * @method destroyComponent\n * @return {void}\n * @public\n * @static\n */\n destroyComponent: function() {\n Common.unregisterInstance(this);\n this._element.parentNode.removeChild(this._element);\n }\n };\n\n\n\n\n /**\n * Ink UI Base Class\n **/\n\n function warnStub() {\n /* jshint validthis: true */\n if (!this || this === window || typeof this.constructor !== 'function') { return; }\n Ink.warn('You called a method on an incorrectly instantiated ' + this.constructor._name + ' component. Check the warnings above to see what went wrong.');\n }\n\n function stub(prototype, obj) {\n for (var k in prototype) if (prototype.hasOwnProperty(k)) {\n if (k === 'constructor') { continue; }\n if (typeof obj[k] === 'function') {\n obj[k] = warnStub;\n }\n }\n }\n\n /**\n * Ink UI Base Class\n *\n * You don't use this class directly, or inherit from it directly.\n *\n * See createUIComponent() (in this module) for how to create a UI component and inherit from this. It's not plain old JS inheritance, for several reasons.\n *\n * @class Ink.UI.Common.BaseUIComponent\n * @constructor\n *\n * @param {Element|String} element Element to associate this UI component with. It's the element you can get later using `comp.getElement()`\n * @param {Object} [options] Options to pass to the component. You should see your specific UI component for this information.\n * @public\n **/\n function BaseUIComponent(element, options) {\n var constructor = this.constructor;\n var _name = constructor._name;\n\n if (!this || this === window) {\n throw new Error('Use \"new InkComponent()\" instead of \"InkComponent()\"');\n }\n\n if (this && !(this instanceof BaseUIComponent)) {\n throw new Error('You forgot to call Ink.UI.Common.createUIComponent() on this module!');\n }\n\n if (!element && !constructor._componentOptions.elementIsOptional) {\n Ink.error(new Error(_name + ': You need to pass an element or a selector as the first argument to \"new ' + _name + '()\"'));\n return;\n } else {\n this._element = Common.elsOrSelector(element,\n _name + ': An element with the selector \"' + element + '\" was not found!')[0];\n }\n\n if (!this._element && !constructor._componentOptions.elementIsOptional) {\n isValidInstance = false;\n Ink.error(new Error(element + ' does not match an element on the page. You need to pass a valid selector to \"new ' + _name + '\".'));\n }\n\n this._options = Common.options(_name, constructor._optionDefinition, options, this._element);\n\n var isValidInstance = BaseUIComponent._validateInstance(this) === true;\n\n if (isValidInstance && typeof this._init === 'function') {\n try {\n this._init.apply(this, arguments);\n } catch(e) {\n isValidInstance = false;\n Ink.error(e);\n }\n }\n\n if (!isValidInstance) {\n BaseUIComponent._stubInstance(this, constructor, _name);\n } else if (this._element) {\n Common.registerInstance(this);\n }\n }\n\n /**\n * Calls the `instance`'s _validate() method so it can validate itself.\n *\n * Returns false if the method exists, was called, but no Error was returned or thrown.\n *\n * @method _validateInstance\n * @private\n */\n BaseUIComponent._validateInstance = function (instance) {\n var err;\n\n if (typeof instance._validate !== 'function') { return true; }\n\n try {\n err = instance._validate();\n } catch (e) {\n err = e;\n }\n\n if (err instanceof Error) {\n instance._validationError = err;\n return false;\n }\n\n return true;\n };\n\n\n /**\n * Replaces every method in the instance with stub functions which just call Ink.warn().\n *\n * This avoids breaking the page when there are errors.\n *\n * @method _stubInstance\n * @param instance\n * @param constructor\n * @param name\n * @private\n */\n BaseUIComponent._stubInstance = function (instance, constructor, name) {\n stub(constructor.prototype, instance);\n stub(BaseUIComponent.prototype, instance);\n Ink.warn(name + ' was not correctly created. ' + (instance._validationError || ''));\n };\n\n // TODO BaseUIComponent.setGlobalOptions = function () {}\n // TODO BaseUIComponent.createMany = function (selector) {}\n BaseUIComponent.getInstance = function (elOrSelector) {\n elOrSelector = Common.elOrSelector(elOrSelector);\n return Common.getInstance(elOrSelector, this /* get instance by constructor */);\n };\n\n Ink.extendObj(BaseUIComponent.prototype, {\n /**\n * Get an UI component's option's value.\n *\n * @method getOption\n * @param {String} name The option's name.\n * @return {Mixed} The option value, or undefined if nothing is found.\n *\n * @example\n *\n * var myUIComponent = new Modal('#element', { trigger: '#trigger' }); // or anything else inheriting BaseUIComponent\n * myUIComponent.getOption('trigger'); // -> The trigger element (not the selector string, mind you)\n *\n **/\n getOption: function (name) {\n if (this.constructor && !(name in this.constructor._optionDefinition)) {\n Ink.error('\"' + name + '\" is not an option for ' + this.constructor._name);\n return undefined;\n }\n\n return this._options[name];\n },\n\n /**\n * Sets an option's value.\n *\n * @method getOption\n * @param {String} name Name of the option.\n * @param {Mixed} value New option value.\n * @return {void}\n * @public\n *\n * @example\n *\n * var myUIComponent = new Modal(...);\n * myUIComponent.setOption('trigger', '#some-element');\n **/\n setOption: function (name, value) {\n if (this.constructor && !(name in this.constructor._optionDefinition)) {\n Ink.error('\"' + name + ' is not an option for ' + this.constructor._name);\n return;\n }\n\n this._options[name] = value;\n },\n\n /**\n * Get the element associated with an UI component (IE the one you used in the constructor)\n *\n * @method getElement\n * @return {Element} The component's element.\n *\n * @example\n * var myUIComponent = new Modal('#element'); // or anything else inheriting BaseUIComponent\n * myUIComponent.getElement(); // -> The '#element' (not the selector string, mind you).\n *\n **/\n getElement: function () {\n return this._element;\n }\n });\n\n Common.BaseUIComponent = BaseUIComponent;\n\n /**\n * Take a constructor, and make it an Ink UI component.\n *\n * Makes it inherit BaseUIComponent, makes sure it has the basic properties Ink.UI.Common needs it to have, adds the necessary static methods, sets its options, etc.\n *\n * @method createUIComponent\n * @param {Function} theConstructor UI component constructor. It should have an _init function in its prototype, an _optionDefinition object, and a _name property indicating its name.\n * @param {Object} [options] Options hash, containing:\n * @param {Boolean} [options.elementIsOptional=false] Whether the element argument is optional (For example, when the component might work on existing markup or create its own).\n * @return {void}\n * @public\n **/\n Common.createUIComponent = function createUIComponent(theConstructor, options) {\n theConstructor._componentOptions = options || {};\n\n function assert(test, msg) {\n if (!test) {\n throw new Error('Ink.UI_1.createUIComponent: ' + msg);\n }\n }\n\n function assertProp(prop, propType, message) {\n var propVal = theConstructor[prop];\n // Check that the property was passed\n assert(typeof propVal !== 'undefined',\n theConstructor + ' doesn\\'t have a \"' + prop + '\" property. ' + message);\n // Check that its type is correct\n assert(propType && typeof propVal === propType,\n 'typeof ' + theConstructor + '.' + prop + ' is not \"' + propType + '\". ' + message);\n }\n\n assert(typeof theConstructor === 'function',\n 'constructor argument is not a function!');\n\n assertProp('_name', 'string', 'This property is used for error ' +\n 'messages. Set it to the full module path and version (Ink.My.Module_1).');\n assertProp('_optionDefinition', 'object', 'This property contains the ' +\n 'option names, types and defaults. See Ink.UI.Common.options() for reference.');\n\n // Extend the instance methods and props\n var _oldProto = theConstructor.prototype;\n\n if (typeof Object.create === 'function') {\n theConstructor.prototype = Object.create(BaseUIComponent.prototype);\n } else {\n theConstructor.prototype = (function hideF() {\n function F() {}\n F.prototype = BaseUIComponent.prototype;\n return new F();\n }());\n }\n\n Ink.extendObj(theConstructor.prototype, _oldProto);\n theConstructor.prototype.constructor = theConstructor;\n // Extend static methods\n Ink.extendObj(theConstructor, BaseUIComponent);\n };\n\n return Common;\n\n});\n","/**\n * Date selector\n * @module Ink.UI.DatePicker_1\n * @version 1\n */\n\nInk.createModule('Ink.UI.DatePicker', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1','Ink.Util.Date_1', 'Ink.Dom.Browser_1'], function(Common, Event, Css, InkElement, Selector, InkArray, InkDate ) {\n 'use strict';\n\n // Clamp a number into a min/max limit\n function clamp(n, min, max) {\n if (n > max) { n = max; }\n if (n < min) { n = min; }\n\n return n;\n }\n\n function dateishFromYMDString(YMD) {\n var split = YMD.split('-');\n return dateishFromYMD(+split[0], +split[1] - 1, +split[2]);\n }\n\n function dateishFromYMD(year, month, day) {\n return {_year: year, _month: month, _day: day};\n }\n\n function dateishFromDate(date) {\n return {_year: date.getFullYear(), _month: date.getMonth(), _day: date.getDate()};\n }\n\n /**\n * @class Ink.UI.DatePicker\n * @constructor\n * @version 1\n *\n * @param {String|Element} selector Datepicker element\n * @param {Object} [options] Options\n * @param {Boolean} [options.autoOpen] Flag to automatically open the datepicker.\n * @param {String} [options.cleanText] Text for the clean button. Defaults to 'Clear'.\n * @param {String} [options.closeText] Text for the close button. Defaults to 'Close'.\n * @param {String} [options.cssClass] CSS class to be applied on the datepicker\n * @param {String|Element} [options.pickerField] (if not using in an input[type=\"text\"]) Element which displays the DatePicker when clicked. Defaults to an \"open\" link.\n * @param {String} [options.dateRange] Enforce limits to year, month and day for the Date, ex: '1990-08-25:2020-11'\n * @param {Boolean} [options.displayInSelect] Flag to display the component in a select element.\n * @param {String|Element} [options.dayField] (if using options.displayInSelect) `select` field with days.\n * @param {String|Element} [options.monthField] (if using options.displayInSelect) `select` field with months.\n * @param {String|Element} [options.yearField] (if using options.displayInSelect) `select` field with years.\n * @param {String} [options.format] Date format string\n * @param {Object} [options.month] Hash of month names. Defaults to english month names. January is 1.\n * @param {String} [options.nextLinkText] Text for the previous button. Defaults to '«'.\n * @param {String} [options.ofText] Text to show between month and year. Defaults to ' of '.\n * @param {Boolean} [options.onFocus] If the datepicker should open when the target element is focused. Defaults to true.\n * @param {Function} [options.onMonthSelected] Callback to execute when the month is selected.\n * @param {Function} [options.onSetDate] Callback to execute when the date is set.\n * @param {Function} [options.onYearSelected] Callback to execute when the year is selected.\n * @param {String} [options.position] Position for the datepicker. Either 'right' or 'bottom'. Defaults to 'right'.\n * @param {String} [options.prevLinkText] Text for the previous button. Defaults to '«'.\n * @param {Boolean} [options.showClean] If the clean button should be visible. Defaults to true.\n * @param {Boolean} [options.showClose] If the close button should be visible. Defaults to true.\n * @param {Boolean} [options.shy] If the datepicker should hide automatically when the user clicks outside. Defaults to true.\n * @param {String} [options.startDate] Date to define initial month. Must be in yyyy-mm-dd format.\n * @param {Number} [options.startWeekDay] First day of the week. Sunday is zero. Defaults to 1 (Monday).\n * @param {Function} [options.validYearFn] Callback to execute when 'rendering' the month (in the month view)\n * @param {Function} [options.validMonthFn] Callback to execute when 'rendering' the month (in the month view)\n * @param {Function} [options.validDayFn] Callback to execute when 'rendering' the day (in the month view)\n * @param {Function} [options.nextValidDateFn] Function to calculate the next valid date, given the current. Useful when there's invalid dates or time frames.\n * @param {Function} [options.prevValidDateFn] Function to calculate the previous valid date, given the current. Useful when there's invalid dates or time frames.\n * @param {Object} [options.wDay] Hash of week day names. Sunday is 0. Defaults to { 0:'Sunday', 1:'Monday', etc...\n * @param {String} [options.yearRange] Enforce limits to year for the Date, ex: '1990:2020' (deprecated)\n *\n * @sample Ink_UI_DatePicker_1.html\n */\n function DatePicker() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n DatePicker._name = 'DatePicker_1';\n\n DatePicker._optionDefinition = {\n autoOpen: ['Boolean', false],\n cleanText: ['String', 'Clear'],\n closeText: ['String', 'Close'],\n pickerField: ['Element', null],\n containerElement:['Element', null],\n cssClass: ['String', 'ink-calendar bottom'],\n dateRange: ['String', null],\n \n // use this in a \n *\n * By applying this UI class to the above input, you get a tag field with the tags \"initial\" and \"value\". The class preserves the original input element. It remains hidden and is updated with new tag information dynamically, so regular HTML form logic still applies.\n *\n * Below \"input\" refers to the current value of the input tag (updated as the user enters text, of course), and \"output\" refers to the value which this class writes back to said input tag.\n *\n * @class Ink.UI.TagField\n * @version 1\n * @constructor\n * @param {String|Element} element Selector or DOM Input Element.\n * @param {Object} [options] Options object\n * @param {String|Array} [options.tags] Initial tags in the input\n * @param {Boolean} [options.allowRepeated] Flag to allow user to input several tags. Defaults to true.\n * @param {RegExp} [options.separator] Split the input by this RegExp. Defaults to /[,;(space)]+/g (spaces, commas and semicolons)\n * @param {String} [options.outSeparator] Use this string to separate each tag from the next in the output. Defaults to ','.\n * @param {Boolean} [options.autoSplit] Flag to activate tag creation when the user types a separator. Defaults to true.\n * @param {Integer} [options.maxTags] Maximum number of tags allowed. Set to -1 for no limit. Defaults to -1.\n * @example\n */\n function TagField() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n TagField._name = 'TagField_1';\n\n TagField._optionDefinition = {\n tags: ['String', []],\n tagQuery: ['Object', null],\n tagQueryAsync: ['Object', null],\n allowRepeated: ['Boolean', false],\n maxTags: ['Integer', -1],\n outSeparator: ['String', ','],\n separator: ['String', /[,; ]+/g],\n autoSplit: ['Boolean', true]\n };\n\n TagField.prototype = {\n /**\n * Init function called by the constructor\n * \n * @method _init\n * @private\n */\n _init: function() {\n var o = this._options;\n if (typeof o.separator === 'string') {\n o.separator = new RegExp(o.separator, 'g');\n }\n\n if (typeof o.tags === 'string') {\n // coerce to array using the separator\n o.tags = this._readInput(o.tags);\n }\n\n Css.addClassName(this._element, 'hide-all');\n\n this._viewElm = InkElement.create('div', {\n className: 'ink-tagfield',\n insertAfter: this._element\n });\n\n this._input = InkElement.create('input', {\n type: 'text',\n className: 'new-tag-input',\n insertBottom: this._viewElm\n });\n\n var tags = [].concat(o.tags, this._tagsFromMarkup(this._element));\n\n this._tags = [];\n\n InkArray.each(tags, Ink.bindMethod(this, '_addTag'));\n\n InkEvent.observe(this._input, 'keyup', Ink.bindEvent(this._onKeyUp, this));\n InkEvent.observe(this._input, 'change', Ink.bindEvent(this._onKeyUp, this));\n InkEvent.observe(this._input, 'keydown', Ink.bindEvent(this._onKeyDown, this));\n InkEvent.observe(this._input, 'blur', Ink.bindEvent(this._onBlur, this));\n InkEvent.observe(this._viewElm, 'click', Ink.bindEvent(this._refocus, this));\n },\n\n destroy: function () {\n InkElement.remove(this._viewElm);\n Css.removeClassName(this._element, 'hide-all');\n },\n\n _tagsFromMarkup: function (element) {\n var tagname = element.tagName.toLowerCase();\n if (tagname === 'input') {\n return this._readInput(element.value);\n } else if (tagname === 'select') {\n return InkArray.map(element.getElementsByTagName('option'), function (option) {\n return InkElement.textContent(option);\n });\n } else {\n throw new Error('Cannot read tags from a ' + tagname + ' tag. Unknown tag');\n }\n },\n\n _tagsToMarkup: function (tags, element) {\n var tagname = element.tagName.toLowerCase();\n if (tagname === 'input') {\n if (this._options.separator) {\n element.value = tags.join(this._options.outSeparator);\n }\n } else if (tagname === 'select') {\n element.innerHTML = '';\n InkArray.each(tags, function (tag) {\n var opt = InkElement.create('option', {selected: 'selected'});\n InkElement.setTextContent(opt, tag);\n element.appendChild(opt);\n });\n } else {\n throw new Error('TagField: Cannot read tags from a ' + tagname + ' tag. Unknown tag');\n }\n },\n\n _addTag: function (tag) {\n if (this._options.maxTags !== -1 &&\n this._tags.length >= this._options.maxTags) {\n return;\n }\n if ((!this._options.allowRepeated &&\n InkArray.inArray(tag, this._tags, tag)) || !tag) {\n return false;\n }\n var elm = InkElement.create('span', {\n className: 'ink-tag',\n setTextContent: tag + ' '\n });\n\n var remove = InkElement.create('span', {\n className: 'remove fa fa-times',\n insertBottom: elm\n });\n InkEvent.observe(remove, 'click', Ink.bindEvent(this._removeTag, this, null));\n\n var spc = document.createTextNode(' ');\n\n this._tags.push(tag);\n this._viewElm.insertBefore(elm, this._input);\n this._viewElm.insertBefore(spc, this._input);\n this._tagsToMarkup(this._tags, this._element);\n },\n\n _readInput: function (text) {\n if (this._options.separator) {\n return InkArray.filter(text.split(this._options.separator), isTruthy);\n } else {\n return [text];\n }\n },\n\n _onKeyUp: function () { // TODO control input box size\n if (!this._options.autoSplit) {\n return;\n }\n\n var split;\n if (!buggySplit) {\n split = this._input.value.split(this._options.separator);\n } else {\n split = splitFunction(this._input.value, this._options.separator);\n }\n\n if (split.length <= 1) {\n return;\n }\n var last = split[split.length - 1];\n split = split.splice(0, split.length - 1);\n split = InkArray.filter(split, isTruthy);\n \n InkArray.each(split, Ink.bind(this._addTag, this));\n this._input.value = last;\n },\n\n _onKeyDown: function (event) {\n if (event.which === enterKey) {\n return this._onEnterKeyDown(event);\n } else if (event.which === backspaceKey) {\n return this._onBackspaceKeyDown();\n } else if (this._removeConfirm) {\n // user pressed another key, cancel removal from a backspace key\n this._unsetRemovingVisual(this._tags.length - 1);\n }\n },\n\n /**\n * When the user presses backspace twice on the empty input, we delete the last tag on the field.\n * @method onBackspaceKeyDown\n * @return {void}\n * @private\n */\n _onBackspaceKeyDown: function () {\n if (this._input.value) { return; }\n\n if (this._removeConfirm) {\n this._unsetRemovingVisual(this._tags.length - 1);\n this._removeTag(this._tags.length - 1);\n this._removeConfirm = null;\n } else {\n this._setRemovingVisual(this._tags.length - 1);\n }\n },\n\n _onEnterKeyDown: function (event) {\n var tag = this._input.value;\n if (tag) {\n this._addTag(tag);\n this._input.value = '';\n }\n InkEvent.stopDefault(event);\n },\n\n _onBlur: function () {\n this._addTag(this._input.value);\n this._input.value = '';\n },\n\n /* For when the user presses backspace.\n * Set the style of the tag so that it seems like it's going to be removed\n * if they press backspace again. */\n _setRemovingVisual: function (tagIndex) {\n var elm = this._viewElm.children[tagIndex];\n if (!elm) { return; }\n\n Css.addClassName(elm, 'tag-deleting');\n\n this._removeRemovingVisualTimeout = setTimeout(Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex), 4000);\n InkEvent.observe(this._input, 'blur', Ink.bindMethod(this, '_unsetRemovingVisual', tagIndex));\n this._removeConfirm = true;\n },\n _unsetRemovingVisual: function (tagIndex) {\n var elm = this._viewElm.children[tagIndex];\n if (elm) {\n Css.removeClassName(elm, 'tag-deleting');\n clearTimeout(this._removeRemovingVisualTimeout);\n }\n this._removeConfirm = null;\n },\n\n _removeTag: function (event) {\n var index;\n if (typeof event === 'object') { // click event on close button\n var elm = InkEvent.element(event).parentNode;\n index = InkElement.parentIndexOf(this._viewElm, elm);\n } else if (typeof event === 'number') { // manual removal\n index = event;\n }\n this._tags = InkArray.remove(this._tags, index, 1);\n InkElement.remove(this._viewElm.children[index]);\n this._tagsToMarkup(this._tags, this._element);\n },\n\n _refocus: function (event) {\n this._input.focus();\n InkEvent.stop(event);\n return false;\n }\n };\n\n Common.createUIComponent(TagField);\n\n return TagField;\n});\n","/**\n * Toggle the visibility of elements.\n * @module Ink.UI.Toggle_1\n * @version 1\n */\n\n Ink.createModule('Ink.UI.Toggle', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, InkEvent, Css, InkElement, Selector, InkArray ) {\n 'use strict';\n\n /**\n * *Important note: Do NOT use this as a dropdown! Use Ink.UI.Dropdown for that.*\n *\n * You need two elements to use Toggle: the `trigger` element, and the `target` element (or elements). The default behaviour is to toggle the `target`(s) when you click the `trigger`.\n *\n * The toggle has a state. It is either \"on\" or \"off\". It works by switching between the CSS classes in `classNameOn` and `classNameOff` according to the current state.\n *\n * When you initialize the Toggle, it will check if the targets are visible to figure out what the initial state is. You can force the toggle to consider itself turned \"on\" or \"off\" by setting the `initialState` option to `true` or `false`, respectively.\n *\n * You can get the current state of the Toggle by calling `getState`, or by checking if your `trigger` element has the \"active\" class.\n * The state can be changed through JavaScript. Just call `setState(true)`\n * to turn the Toggle on (or `setState(false)` to turn it off).\n *\n * @class Ink.UI.Toggle\n * @constructor\n * @version 1\n * @param {String|Element} selector Trigger element. By clicking this, the target (or targets) are triggered.\n * @param {Object} [options] Options object, containing:\n *\n * @param {String} options.target CSS Selector that specifies the elements that this component will toggle\n * @param {Boolean} [options.isAccordion] Set this to true to signal that this toggle is part of an accordion with other toggles. The toggles of an accordion must be common descendants of an element with the class \"accordion\". If they're not, Ink will warn you about this on the console.\n * @param {String} [options.classNameOn] CSS class to toggle when on. Defaults to 'show-all'.\n * @param {String} [options.classNameOff] CSS class to toggle when off. Defaults to 'hide-all'.\n * @param {String} [options.triggerEvent] Event that will trigger the toggling. Defaults to 'click'.\n * @param {Boolean} [options.closeOnClick] Flag to toggle the targe off when clicking outside the toggled content. Defaults to true.\n * @param {Boolean} [options.canToggleAnAncestor] Set to true if you want the toggle to target ancestors of itself. Defaults to false.\n * @param {String} [options.closeOnInsideClick] Toggle off when a child element matching this selector is clicked. Set to null to deactivate the check. Defaults to 'a[href]'.\n * @param {Boolean} [options.initialState] Flag to define initial state. false: off, true: on, null: markup. Defaults to null.\n * @param {Function} [options.onChangeState] Callback when the toggle state changes. Return `false` to cancel the event.\n *\n * @sample Ink_UI_Toggle_1_constructor.html\n */\n function Toggle(){\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n Toggle._name = 'Toggle_1';\n\n Toggle._optionDefinition = {\n target: ['Elements'],\n triggerEvent: ['String', 'click'],\n closeOnClick: ['Boolean', true],\n canToggleAnAncestor: ['Boolean', false],\n isAccordion: ['Boolean', false],\n initialState: ['Boolean', null], // May be true, false, or null to be what it is right now\n classNameOn: ['String', 'show-all'],\n classNameOff: ['String', 'hide-all'],\n closeOnInsideClick: ['String', 'a[href]'], // closes the toggle when a target is clicked and it is a link\n onChangeState: ['Function', null]\n };\n\n Toggle.prototype = {\n\n /**\n * Init function called by the constructor\n *\n * @method _init\n * @private\n */\n _init: function(){\n var i, len;\n\n this._targets = Common.elsOrSelector(this._options.target);\n\n // Boolean option handling\n this._options.closeOnClick = this._options.closeOnClick;\n // Actually a throolean\n if (this._options.initialState === null) {\n this._options.initialState = Css.hasClassName(this._targets[0], this._options.classNameOn);\n }\n\n if (this._options.classNameOn !== 'show-all' || this._options.classNameOff !== 'hide-all') {\n for (i = 0, len = this._targets.length; i < len; i++) {\n Css.removeClassName(this._targets[i], 'show-all');\n Css.removeClassName(this._targets[i], 'hide-all');\n }\n }\n\n if (this._options.isAccordion) {\n this._accordionContainer = InkElement.findUpwardsByClass(\n this._element, 'accordion');\n if (!this._accordionContainer) {\n Ink.warn('Ink.UI.Toggle_1: This toggle has the isToggle option set to `true`, but is not a descendant of an element with the class \"accordion\"! Because of this, it won\\'t be able to find other toggles in the same accordion and cooperate with them.');\n }\n }\n\n this._constructing = true;\n\n this._bindEvents();\n\n if (this._options.initialState !== null) {\n this.setState(this._options.initialState, true);\n } else {\n // Add initial classes matching the current \"display\" of the object.\n var state = Css.getStyle(this._targets[0], 'display') !== 'none';\n this.setState(state, true);\n }\n // Aditionally, remove any inline \"display\" style.\n for (i = 0, len = this._targets.length; i < len; i++) {\n if (this._targets[i].style.display) {\n this._targets[i].style.display = ''; // becomes default\n }\n }\n\n this._element.setAttribute('data-is-toggle-trigger', 'true');\n\n this._constructing = false;\n },\n\n /**\n * @method _bindEvents\n * @private\n */\n _bindEvents: function () {\n if ( this._options.triggerEvent ) {\n InkEvent.on(\n this._element,\n this._options.triggerEvent,\n Ink.bind(this._onTriggerEvent, this));\n }\n if( this._options.closeOnClick ){\n InkEvent.observe( document, 'click', Ink.bind(this._onOutsideClick, this));\n }\n if( this._options.closeOnInsideClick ) {\n var sel = this._options.closeOnInsideClick;\n if (sel.toString() === 'true') {\n sel = '*';\n }\n InkEvent.observeMulti(this._targets, 'click', Ink.bind(function (e) {\n if ( InkElement.findUpwardsBySelector(InkEvent.element(e), sel) ) {\n this.setState(false, true);\n }\n }, this));\n }\n },\n\n /**\n * Event handler. It's responsible for handling the `triggerEvent` as defined in the options.\n *\n * This will trigger the toggle.\n *\n * @method _onTriggerEvent\n * @param {Event} event\n * @private\n */\n _onTriggerEvent: function( event ){\n // When the togglee is a child of the toggler, we get the togglee's events here. We have to check that this event is for us.\n var target = InkEvent.element(event);\n\n var isAncestorOfClickedElement = InkArray.some(this._targets, function (thisOne) {\n return thisOne === target || InkElement.isAncestorOf(thisOne, target);\n });\n\n if (!this._options.canToggleAnAncestor && isAncestorOfClickedElement) {\n return;\n }\n\n var has = this.getState();\n this.setState(!has, true);\n if (!has && this._firstTime) {\n this._firstTime = false;\n }\n\n InkEvent.stopDefault(event);\n },\n\n /**\n * Be compatible with accordions\n *\n * @method _updateAccordion\n **/\n _updateAccordion: function () {\n if (!this._accordionContainer) { return; }\n if (this.getState() === false) { return; }\n\n var elms = Selector.select('[data-is-toggle-trigger]', this._accordionContainer);\n for (var i = 0; i < elms.length; i++) {\n var otherToggle = Toggle.getInstance(elms[i]);\n if (otherToggle && (otherToggle !== this) && otherToggle.getState() === true) {\n otherToggle.setState(false, true);\n }\n }\n },\n\n /**\n * Click handler. Will handle clicks outside the toggle component.\n *\n * @method _onOutsideClick\n * @param {Event} event\n * @private\n */\n _onOutsideClick: function( event ){\n var tgtEl = InkEvent.element(event);\n var shades;\n\n if (!InkElement.isAncestorOf(document.documentElement, tgtEl)) {\n // Because if the element was removed while the click event was\n // bubbling, we can't tell where it came from\n return;\n }\n\n if (InkElement.findUpwardsBySelector(tgtEl, '[data-is-toggle-trigger=\"true\"]')) { return; }\n\n var ancestorOfTargets = InkArray.some(this._targets, function (target) {\n return InkElement.isAncestorOf(target, tgtEl) || target === tgtEl;\n });\n\n if( (this._element === tgtEl) || InkElement.isAncestorOf(this._element, tgtEl) || ancestorOfTargets) {\n return;\n } else if( (shades = Ink.ss('.ink-shade')).length ) {\n var shadesLength = shades.length;\n\n for( var i = 0; i < shadesLength; i++ ){\n if( InkElement.isAncestorOf(shades[i],tgtEl) && InkElement.isAncestorOf(shades[i],this._element) ){\n return;\n }\n }\n }\n\n this.setState(false, true); // dismiss\n },\n\n /**\n * Sets the state of the toggle. (on/off)\n *\n * @method setState\n * @param {Boolean} on New state (on/off)\n * @param {Boolean} callHandler Whether to call the onChangeState handler.\n * @return {void}\n */\n setState: function (on, callHandler) {\n if (on === this.getState() && !this._constructing) { return; }\n\n var i, len;\n if (this._group && on) {\n for (i = 0, len = this._group.length; i < len; i++) {\n if (this._group[i].getState() === true) {\n this._group[i].setState(false, true);\n }\n }\n }\n\n if (callHandler && typeof this._options.onChangeState === 'function') {\n var ret = this._options.onChangeState(on);\n if (ret === false) { return false; } // Canceled by the event handler\n }\n for (i = 0, len = this._targets.length; i < len; i++) {\n Css.addRemoveClassName(this._targets[i], this._options.classNameOn, on);\n Css.addRemoveClassName(this._targets[i], this._options.classNameOff, !on);\n }\n Css.addRemoveClassName(this._element, 'active', on);\n\n if (this._accordionContainer) {\n this._updateAccordion();\n }\n },\n\n /**\n * Gets the state of the toggle. (on/off)\n *\n * @method getState\n *\n * @return {Boolean} whether the toggle is toggled on.\n */\n getState: function () {\n return Css.hasClassName(this._element, 'active');\n }\n };\n\n Common.createUIComponent(Toggle);\n\n return Toggle;\n});\n","/**\n * Content Tooltips\n * @module Ink.UI.Tooltip_1\n * @version 1\n */\nInk.createModule('Ink.UI.Tooltip', '1', ['Ink.UI.Common_1', 'Ink.Dom.Event_1', 'Ink.Dom.Element_1', 'Ink.Dom.Selector_1', 'Ink.Util.Array_1', 'Ink.Dom.Css_1', 'Ink.Dom.Browser_1'], function (Common, InkEvent, InkElement, Selector, InkArray, Css) {\n 'use strict';\n\n /**\n * Tooltips are useful as a means to display information about functionality while avoiding clutter.\n *\n * Tooltips show up when you hover elements which \"have\" tooltips.\n *\n * This class will \"give\" a tooltip to many elements, selected by its first argument (`target`). This is contrary to the other UI modules in Ink, which are created once per element.\n *\n * You can define options either through the second argument of the Tooltip constructor, or as data-attributes in each `target` element. Options set through data-attributes all start with \"data-tip\", and override options passed into the Tooltip constructor.\n *\n * @class Ink.UI.Tooltip\n * @constructor\n *\n * @param {Element|String} target Target element or selector of elements, to display the tooltips on.\n * @param {Object} [options] Options object\n * @param {String} [options.text] Text content for the tooltip.\n * @param {String} [options.html] HTML for the tooltip. Same as above, but won't escape HTML.\n * @param {String} [options.where] Positioning for the tooltip. Options are 'up', 'down', 'left', 'right', 'mousemove' (follows the cursor), and 'mousefix' (stays fixed). Defaults to 'up'.\n * \n * @param {String} [options.color] Color of the tooltip. Options are red, orange, blue, green and black. Default is white.\n * @param {Number} [options.fade] Number of seconds to fade in/out. Defaults to 0.3.\n * @param {Boolean} [options.forever] Flag to prevent the tooltip from being erased when the mouse hovers away from the target.\n * @param {Number} [options.timeout] Number of seconds the tooltip will stay open. Useful together with options.forever. Defaults to 0.\n * @param {Number} [options.delay] Time the tooltip waits until it is displayed. Useful to avoid getting the attention of the user unnecessarily\n * @param {Element|Selector} [options.template] Element or selector containing HTML to be cloned into the tooltips. Can be a hidden element, because CSS `display` is set to `block`.\n * @param {String} [options.templatefield] Selector within the template element to choose where the text is inserted into the tooltip. Useful when a wrapper DIV is required.\n * @param {Number} [options.left] Spacing from the target to the tooltip, when `where` is `mousemove` or `mousefix`. Defaults to 10.\n * @param {Number} [options.top] Spacing from the target to the tooltip, when `where` is `mousemove` or `mousefix`. Defaults to 10.\n * @param {Number} [options.spacing] Spacing between the tooltip and the target element, when `where` is not `mousemove` or `mousefix`. Defaults to 8.\n * \n * @sample Ink_UI_Tooltip_1.html\n */\n function Tooltip(element, options) {\n this._init(element, options || {});\n }\n\n function EachTooltip(root, elm) {\n this._init(root, elm);\n }\n\n var transitionDurationName,\n transitionPropertyName,\n transitionTimingFunctionName;\n (function () { // Feature detection\n var test = document.createElement('DIV');\n var names = ['transition', 'oTransition', 'msTransition', 'mozTransition',\n 'webkitTransition'];\n for (var i = 0; i < names.length; i++) {\n if (typeof test.style[names[i] + 'Duration'] !== 'undefined') {\n transitionDurationName = names[i] + 'Duration';\n transitionPropertyName = names[i] + 'Property';\n transitionTimingFunctionName = names[i] + 'TimingFunction';\n break;\n }\n }\n }());\n\n // Body or documentElement\n var bodies = document.getElementsByTagName('body');\n var body = bodies.length ? bodies[0] : document.documentElement;\n\n Tooltip.prototype = {\n _init: function(element, options) {\n var elements;\n\n this.options = Ink.extendObj({\n where: 'up',\n zIndex: 10000,\n left: 10,\n top: 10,\n spacing: 8,\n forever: 0,\n color: '',\n timeout: 0,\n delay: 0,\n template: null,\n templatefield: null,\n fade: 0.3,\n text: ''\n }, options || {});\n\n if (typeof element === 'string') {\n elements = Selector.select(element);\n } else if (typeof element === 'object') {\n elements = [element];\n } else {\n throw 'Element expected';\n }\n\n this.tooltips = [];\n\n for (var i = 0, len = elements.length; i < len; i++) {\n this.tooltips[i] = new EachTooltip(this, elements[i]);\n }\n },\n /**\n * Destroys the tooltips created by this instance\n *\n * @method destroy\n * @return {void}\n * @public\n */\n destroy: function () {\n InkArray.each(this.tooltips, function (tooltip) {\n tooltip._destroy();\n });\n this.tooltips = null;\n this.options = null;\n }\n };\n\n EachTooltip.prototype = {\n _oppositeDirections: {\n left: 'right',\n right: 'left',\n up: 'down',\n down: 'up'\n },\n _init: function(root, elm) {\n InkEvent.observe(elm, 'mouseover', Ink.bindEvent(this._onMouseOver, this));\n InkEvent.observe(elm, 'focus', Ink.bindEvent(this._onMouseOver, this));\n InkEvent.observe(elm, 'mouseout', Ink.bindEvent(this._onMouseOut, this));\n InkEvent.observe(elm, 'blur', Ink.bindEvent(this._onMouseOut, this));\n InkEvent.observe(elm, 'mousemove', Ink.bindEvent(this._onMouseMove, this));\n\n this.root = root;\n this.element = elm;\n this._delayTimeout = null;\n this.tooltip = null;\n\n Common.registerInstance(this, this.element);\n },\n _makeTooltip: function (mousePosition) {\n if (!this._getOpt('text') &&\n !this._getOpt('html') &&\n !InkElement.hasAttribute(this.element, 'title')) {\n return false;\n }\n\n var tooltip = this._createTooltipElement();\n\n if (this.tooltip) {\n this._removeTooltip();\n }\n\n this.tooltip = tooltip;\n\n this._fadeInTooltipElement(tooltip);\n this._placeTooltipElement(tooltip, mousePosition);\n\n InkEvent.observe(tooltip, 'mouseover', Ink.bindEvent(this._onTooltipMouseOver, this));\n\n var timeout = this._getFloatOpt('timeout');\n if (timeout) {\n setTimeout(Ink.bind(function () {\n if (this.tooltip === tooltip) {\n this._removeTooltip();\n }\n }, this), timeout * 1000);\n }\n },\n _createTooltipElement: function () {\n var template = this._getOpt('template'), // User template instead of our HTML\n templatefield = this._getOpt('templatefield'),\n \n tooltip, // The element we float\n field; // Element where we write our message. Child or same as the above\n\n if (template) { // The user told us of a template to use. We copy it.\n var temp = document.createElement('DIV');\n temp.innerHTML = Common.elOrSelector(template, 'options.template').outerHTML;\n tooltip = temp.firstChild;\n \n if (templatefield) {\n field = Selector.select(templatefield, tooltip);\n if (field) {\n field = field[0];\n } else {\n throw 'options.templatefield must be a valid selector within options.template';\n }\n } else {\n field = tooltip; // Assume same element if user did not specify a field\n }\n } else { // We create the default structure\n tooltip = document.createElement('DIV');\n Css.addClassName(tooltip, 'ink-tooltip');\n Css.addClassName(tooltip, this._getOpt('color'));\n\n field = document.createElement('DIV');\n Css.addClassName(field, 'content');\n\n tooltip.appendChild(field);\n }\n \n if (this._getOpt('html')) {\n field.innerHTML = this._getOpt('html');\n } else if (this._getOpt('text')) {\n InkElement.setTextContent(field, this._getOpt('text'));\n } else {\n InkElement.setTextContent(field, this.element.getAttribute('title'));\n }\n tooltip.style.display = 'block';\n tooltip.style.position = 'absolute';\n tooltip.style.zIndex = this._getIntOpt('zIndex');\n\n return tooltip;\n },\n _fadeInTooltipElement: function (tooltip) {\n var fadeTime = this._getFloatOpt('fade');\n if (transitionDurationName && fadeTime) {\n tooltip.style.opacity = '0';\n tooltip.style[transitionDurationName] = fadeTime + 's';\n tooltip.style[transitionPropertyName] = 'opacity';\n tooltip.style[transitionTimingFunctionName] = 'ease-in-out';\n setTimeout(function () {\n tooltip.style.opacity = '1';\n }, 0); // Wait a tick\n }\n },\n _placeTooltipElement: function (tooltip, mousePosition) {\n var where = this._getOpt('where');\n\n if (mousePosition === null && (where === 'mousemove' || where === 'mousefix')) {\n // When there are no mouse coords available (focus event)\n where = 'up';\n }\n\n if (where === 'mousemove' || where === 'mousefix') {\n var mPos = mousePosition;\n this._setPos(mPos[0], mPos[1]);\n body.appendChild(tooltip);\n } else if (where.match(/(up|down|left|right)/)) {\n body.appendChild(tooltip);\n var targetElementPos = InkElement.offset(this.element);\n var tleft = targetElementPos[0],\n ttop = targetElementPos[1];\n\n var centerh = (InkElement.elementWidth(this.element) / 2) - (InkElement.elementWidth(tooltip) / 2),\n centerv = (InkElement.elementHeight(this.element) / 2) - (InkElement.elementHeight(tooltip) / 2);\n var spacing = this._getIntOpt('spacing');\n\n var tooltipDims = InkElement.elementDimensions(tooltip);\n var elementDims = InkElement.elementDimensions(this.element);\n\n var maxX = InkElement.scrollWidth() + InkElement.viewportWidth();\n var maxY = InkElement.scrollHeight() + InkElement.viewportHeight();\n \n where = this._getWhereValueInsideViewport(where, {\n left: tleft - tooltipDims[0],\n right: tleft + tooltipDims[0],\n top: ttop + tooltipDims[1],\n bottom: ttop + tooltipDims[1]\n }, {\n right: maxX,\n bottom: maxY\n });\n \n if (where === 'up') {\n ttop -= tooltipDims[1];\n ttop -= spacing;\n tleft += centerh;\n } else if (where === 'down') {\n ttop += elementDims[1];\n ttop += spacing;\n tleft += centerh;\n } else if (where === 'left') {\n tleft -= tooltipDims[0];\n tleft -= spacing;\n ttop += centerv;\n } else if (where === 'right') {\n tleft += elementDims[0];\n tleft += spacing;\n ttop += centerv;\n }\n \n var arrow = null;\n if (where.match(/(up|down|left|right)/)) {\n arrow = document.createElement('SPAN');\n Css.addClassName(arrow, 'arrow');\n Css.addClassName(arrow, this._oppositeDirections[where]);\n tooltip.appendChild(arrow);\n }\n\n var tooltipLeft = tleft;\n var tooltipTop = ttop;\n\n var toBottom = (tooltipTop + tooltipDims[1]) - maxY;\n var toRight = (tooltipLeft + tooltipDims[0]) - maxX;\n var toLeft = 0 - tooltipLeft;\n var toTop = 0 - tooltipTop;\n\n if (toBottom > 0) {\n if (arrow) { arrow.style.top = (tooltipDims[1] / 2) + toBottom + 'px'; }\n tooltipTop -= toBottom;\n } else if (toTop > 0) {\n if (arrow) { arrow.style.top = (tooltipDims[1] / 2) - toTop + 'px'; }\n tooltipTop += toTop;\n } else if (toRight > 0) {\n if (arrow) { arrow.style.left = (tooltipDims[0] / 2) + toRight + 'px'; }\n tooltipLeft -= toRight;\n } else if (toLeft > 0) {\n if (arrow) { arrow.style.left = (tooltipDims[0] / 2) - toLeft + 'px'; }\n tooltipLeft += toLeft;\n }\n\n tooltip.style.left = tooltipLeft + 'px';\n tooltip.style.top = tooltipTop + 'px';\n }\n },\n\n /**\n * Get a value for \"where\" (left/right/up/down) which doesn't put the\n * tooltip off the screen\n *\n * @method _getWhereValueInsideViewport\n * @param where {String} \"where\" value which was given by the user and we might change\n * @param bbox {BoundingBox} A bounding box like what you get from getBoundingClientRect ({top, bottom, left, right}) with pixel positions from the top left corner of the viewport.\n * @param viewport {BoundingBox} Bounding box for the viewport. \"top\" and \"left\" are omitted because these coordinates are relative to the top-left corner of the viewport so they are zero.\n *\n * @TODO: we can't use getBoundingClientRect in this case because it returns {0,0,0,0} on our uncreated tooltip.\n */\n _getWhereValueInsideViewport: function (where, bbox, viewport) {\n if (where === 'left' && bbox.left < 0) {\n return 'right';\n } else if (where === 'right' && bbox.right > viewport.right) {\n return 'left';\n } else if (where === 'up' && bbox.top < 0) {\n return 'down';\n } else if (where === 'down' && bbox.bottom > viewport.bottom) {\n return 'up';\n }\n\n return where;\n },\n _removeTooltip: function() {\n var tooltip = this.tooltip;\n if (!tooltip) {return;}\n\n var remove = Ink.bind(InkElement.remove, {}, tooltip);\n\n if (this._getOpt('where') !== 'mousemove' && transitionDurationName) {\n tooltip.style.opacity = 0;\n // remove() will operate on correct tooltip, although this.tooltip === null then\n setTimeout(remove, this._getFloatOpt('fade') * 1000);\n } else {\n remove();\n }\n this.tooltip = null;\n },\n _getOpt: function (option) {\n var dataAttrVal = InkElement.data(this.element)[InkElement._camelCase('tip-' + option)];\n if (dataAttrVal /* either null or \"\" may signify the absense of this attribute*/) {\n return dataAttrVal;\n }\n var instanceOption = this.root.options[option];\n if (typeof instanceOption !== 'undefined') {\n return instanceOption;\n }\n },\n _getIntOpt: function (option) {\n return parseInt(this._getOpt(option), 10);\n },\n _getFloatOpt: function (option) {\n return parseFloat(this._getOpt(option), 10);\n },\n _destroy: function () {\n if (this.tooltip) {\n InkElement.remove(this.tooltip);\n }\n this.root = null; // Cyclic reference = memory leaks\n this.element = null;\n this.tooltip = null;\n },\n _onMouseOver: function(e) {\n // on IE < 10 you can't access the mouse event not even a tick after it fired\n var mousePosition;\n if (e.type !== 'mouseover') {\n // No mouse coords available\n mousePosition = null;\n } else {\n mousePosition = this._getMousePosition(e);\n }\n var delay = this._getFloatOpt('delay');\n if (delay) {\n this._delayTimeout = setTimeout(Ink.bind(function () {\n if (!this.tooltip) {\n this._makeTooltip(mousePosition);\n }\n this._delayTimeout = null;\n }, this), delay * 1000);\n } else {\n this._makeTooltip(mousePosition);\n }\n },\n _onMouseMove: function(e) {\n if (this._getOpt('where') === 'mousemove' && this.tooltip) {\n var mPos = this._getMousePosition(e);\n this._setPos(mPos[0], mPos[1]);\n }\n },\n _onMouseOut: function () {\n if (!this._getIntOpt('forever')) {\n this._removeTooltip();\n }\n if (this._delayTimeout) {\n clearTimeout(this._delayTimeout);\n this._delayTimeout = null;\n }\n },\n _onTooltipMouseOver: function () {\n if (this.tooltip) { // If tooltip is already being removed, this has no effect\n this._removeTooltip();\n }\n },\n _setPos: function(left, top) {\n left += this._getIntOpt('left');\n top += this._getIntOpt('top');\n var pageDims = this._getPageXY();\n if (this.tooltip) {\n var elmDims = [InkElement.elementWidth(this.tooltip), InkElement.elementHeight(this.tooltip)];\n var scrollDim = this._getScroll();\n\n if((elmDims[0] + left - scrollDim[0]) >= (pageDims[0] - 20)) {\n left = (left - elmDims[0] - this._getIntOpt('left') - 10);\n }\n if((elmDims[1] + top - scrollDim[1]) >= (pageDims[1] - 20)) {\n top = (top - elmDims[1] - this._getIntOpt('top') - 10);\n }\n\n this.tooltip.style.left = left + 'px';\n this.tooltip.style.top = top + 'px';\n }\n },\n _getPageXY: function() {\n var cWidth = 0;\n var cHeight = 0;\n if( typeof( window.innerWidth ) === 'number' ) {\n cWidth = window.innerWidth;\n cHeight = window.innerHeight;\n } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {\n cWidth = document.documentElement.clientWidth;\n cHeight = document.documentElement.clientHeight;\n } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {\n cWidth = document.body.clientWidth;\n cHeight = document.body.clientHeight;\n }\n return [parseInt(cWidth, 10), parseInt(cHeight, 10)];\n },\n _getScroll: function() {\n var dd = document.documentElement, db = document.body;\n if (dd && (dd.scrollLeft || dd.scrollTop)) {\n return [dd.scrollLeft, dd.scrollTop];\n } else if (db) {\n return [db.scrollLeft, db.scrollTop];\n } else {\n return [0, 0];\n }\n },\n _getMousePosition: function(e) {\n return [parseInt(InkEvent.pointerX(e), 10), parseInt(InkEvent.pointerY(e), 10)];\n }\n };\n\n return Tooltip;\n});\n","/**\n * Elements in a tree structure\n * @module Ink.UI.TreeView_1\n * @version 1\n */\nInk.createModule('Ink.UI.TreeView', '1', ['Ink.UI.Common_1','Ink.Dom.Event_1','Ink.Dom.Css_1','Ink.Dom.Element_1','Ink.Dom.Selector_1','Ink.Util.Array_1'], function(Common, Event, Css, Element, Selector, InkArray ) {\n 'use strict';\n\n\n /**\n * Shows elements in a tree structure which can be expanded and contracted.\n * A TreeView is built with \"node\"s and \"children\". \"node\"s are `li` tags, and \"children\" are `ul` tags.\n * You can build your TreeView out of a regular UL and LI element structure which you already use to display lists with several levels.\n * If you want a node to be open when the TreeView is built, just add the data-open=\"true\" attribute to it.\n * \n * @class Ink.UI.TreeView\n * @constructor\n * @version 1\n * @param {String|Element} selector Element or selector.\n * @param {String} [options] Options object, containing:\n * @param {String} [options.node] Selector for the nodes. Defaults to 'li'.\n * @param {String} [options.children] Selector for the children. Defaults to 'ul'.\n * @param {String} [options.parentClass] CSS classes to be added to parent nodes. Defaults to 'parent'.\n * @param {String} [options.openClass] CSS classes to be added to the icon when a parent is open. Defaults to 'fa fa-minus-circle'.\n * @param {String} [options.closedClass] CSS classes to be added to the icon when a parent is closed. Defaults to 'fa fa-plus-circle'.\n * @param {String} [options.hideClass] CSS Class to toggle visibility of the children. Defaults to 'hide-all'.\n * @param {String} [options.iconTag] The name of icon tag. The component tries to find a tag with that name as a direct child of the node. If it doesn't find it, it creates it. Defaults to 'i'.\n * @param {Boolean} [options.stopDefault] Flag to stops the default behavior of the click handler. Defaults to true.\n * @example\n * \n * \n * \n * @sample Ink_UI_TreeView_1.html\n */\n function TreeView() {\n Common.BaseUIComponent.apply(this, arguments);\n }\n\n TreeView._name = 'TreeView_1';\n\n TreeView._optionDefinition = {\n 'node': ['String', 'li'],\n 'children': ['String','ul'],\n 'parentClass': ['String','parent'],\n 'openNodeClass': ['String', 'open'],\n 'openClass': ['String','fa fa-minus-circle'],\n 'closedClass': ['String','fa fa-plus-circle'],\n 'hideClass': ['String','hide-all'],\n 'iconTag': ['String', 'i'],\n 'stopDefault' : ['Boolean', true]\n };\n\n TreeView.prototype = {\n /**\n * Init function called by the constructor. Sets the necessary event handlers.\n * \n * @method _init\n * @private\n */\n _init: function(){\n this._handlers = {\n click: Ink.bindEvent(this._onClick,this)\n };\n\n Event.on(this._element, 'click', this._options.node, this._handlers.click);\n\n InkArray.each(Ink.ss(this._options.node, this._element), Ink.bind(function(item){\n if( this.isParent(item) ) {\n Css.addClassName(item, this._options.parentClass);\n\n var isOpen = this.isOpen(item);\n if( !this._getIcon(item) ){\n Element.create(this._options.iconTag, { insertTop: item });\n }\n\n this._setNodeOpen(item, isOpen);\n }\n },this));\n },\n\n _getIcon: function (node) {\n return Ink.s('> ' + this._options.iconTag, node);\n },\n\n /**\n * Checks if a node is open.\n *\n * @method isOpen\n * @param {Element} node The tree node to check\n * @return {Boolean} Whether the node is open.\n **/\n isOpen: function (node) {\n if (!this._getChild(node)) {\n throw new Error('not a node!');\n }\n\n return node.getAttribute('data-open') === 'true' ||\n Css.hasClassName(node, this._options.openNodeClass);\n },\n\n /**\n * Checks if a node is a parent.\n *\n * @method isParent\n * @param {Element} node Node to check\n * @return {Boolean} Whether `node` is a parent.\n **/\n isParent: function (node) {\n return Css.hasClassName(node, this._options.parentClass) ||\n this._getChild(node) != null;\n },\n\n _setNodeOpen: function (node, beOpen) {\n var child = this._getChild(node);\n if (child) {\n Css.setClassName(child, this._options.hideClass, !beOpen);\n var icon = this._getIcon(node);\n\n node.setAttribute('data-open', beOpen);\n\n /*\n * Don't refactor this to\n *\n * setClassName(el, className, status); setClassName(el, className, !status);\n *\n * because it won't work with multiple classes.\n *\n * Doing:\n * setClassName(el, 'fa fa-whatever', true);setClassName(el, 'fa fa-whatever-else', false);\n *\n * will remove 'fa' although it is a class we want.\n */\n\n var toAdd = beOpen ? this._options.openClass : this._options.closedClass;\n var toRemove = beOpen ? this._options.closedClass : this._options.openClass;\n Css.removeClassName(icon, toRemove);\n Css.addClassName(icon, toAdd);\n\n Css.setClassName(node, this._options.openNodeClass, beOpen);\n } else {\n Ink.error('Ink.UI.TreeView: node', node, 'is not a node!');\n }\n },\n\n /**\n * Opens one of the tree nodes\n *\n * Make sure you pass the node's Element\n * @method open\n * @param {Element} node The node you wish to open.\n * @return {void}\n **/\n open: function (node) {\n this._setNodeOpen(node, true);\n },\n\n /**\n * Closes one of the tree nodes\n *\n * Make sure you pass the node's Element\n * @method close\n * @param {Element} node The node you wish to close.\n * @return {void}\n **/\n close: function (node) {\n this._setNodeOpen(node, false);\n },\n\n /**\n * Toggles a node state\n *\n * @method toggle\n * @param {Element} node The node to toggle.\n * @return {void}\n **/\n toggle: function (node) {\n if (this.isOpen(node)) {\n this.close(node);\n } else {\n this.open(node);\n }\n },\n\n /**\n * @method _getChild\n **/\n _getChild: function (node) {\n return Selector.select(this._options.children, node)[0] || null;\n },\n\n /**\n * Handles the click event (as specified in the _init function).\n * \n * @method _onClick\n * @param {Event} ev DOM click event.\n * @return {void}\n * @private\n */\n _onClick: function(ev){\n /**\n * Summary:\n * If the clicked element is a \"node\" as defined in the options, will check if it has any \"child\".\n * If so, will toggle its state and stop the event's default behavior if the stopDefault option is true.\n **/\n\n if (!this.isParent(ev.currentTarget) ||\n Selector.matchesSelector(ev.target, this._options.node) ||\n Selector.matchesSelector(ev.target, this._options.children)) {\n return;\n }\n\n if (this._options.stopDefault){\n ev.preventDefault();\n }\n\n this.toggle(ev.currentTarget);\n }\n };\n\n Common.createUIComponent(TreeView);\n\n return TreeView;\n});\n","Ink.createModule('Ink.UI.Upload', '1', [\n 'Ink.Dom.Event_1',\n 'Ink.Dom.Element_1',\n 'Ink.Dom.Browser_1',\n 'Ink.UI.Common_1'\n], function(Event, Element, Browser, Common) {\n 'use strict';\n\n var DirectoryReader = function(options) {\n this.init(options);\n };\n\n DirectoryReader.prototype = {\n init: function(options) {\n this._options = Ink.extendObj({\n entry: undefined,\n maxDepth: 10\n }, options || {});\n\n try {\n this._read();\n } catch(e) {\n Ink.error(e);\n }\n },\n\n\n _read: function() {\n if(!this._options.entry) {\n Ink.error('You must specify the entry!');\n return;\n }\n\n try {\n this._readDirectories();\n } catch(e) {\n Ink.error(e);\n }\n },\n\n\n _readDirectories: function() {\n var entries = [],\n running = false,\n maxDepth = 0;\n\n /* TODO return as tree because much better well */\n var _readEntries = Ink.bind(function(currentEntry) {\n var dir = currentEntry.createReader();\n running = true;\n\n dir.readEntries(Ink.bind(function(res) {\n if(res.length > 0) {\n for(var i = 0, len = res.length; i=0; i--) {\n if(typeof(arr[i]) === 'undefined' || arr[i] === null || arr[i] === '') {\n arr.splice(i, 1);\n }\n }\n return arr;\n }\n };\n\n var Queue = {\n lists: [],\n items: [],\n\n\n /**\n * Create new queue list\n * @function create\n * @public\n * @param {String} list name\n * @param {Function} function to iterate on items\n * @return {Object} list id\n */\n create: function(name) {\n var id;\n name = String(name);\n this.lists.push({name: name});\n id = this.lists.length - 1;\n return id;\n },\n\n\n getItems: function(parentId) {\n if(!parentId) {\n return this.items;\n }\n var items = [];\n for(var i = 0, len = this.items.length; i=0; i--) {\n if(this.items[i] && id === this.items[i].parentId) {\n this.remove(this.items[i].parentId, this.items[i].pid);\n }\n }\n if(!keepList) {\n this.lists.splice(id, 1);\n }\n return true;\n } catch(e) {\n Ink.error('Purge: invalid id');\n return false;\n }\n },\n\n\n /**\n * add an item to a list\n * @function add\n * @public\n * @param {String} name\n * @param {Object} item\n * @return {Number} pid\n */\n add: function(parentId, item, priority) {\n if(!this.lists[parentId]) {\n return false;\n }\n if(typeof(item) !== 'object') {\n item = String(item);\n }\n\n var pid = parseInt(Math.round(Math.random() * 100000) + \"\" + Math.round(Math.random() * 100000), 10);\n priority = priority || 0;\n\n this.items.push({parentId: parentId, item: item, priority: priority || 0, pid: pid});\n return pid;\n },\n\n\n /**\n * View list\n * @function view\n * @public\n * @param {Number} list id\n * @param {Number} process id\n * @return {Object} item\n */\n view: function(parentId, pid) {\n var id = this._searchByPid(parentId, pid);\n if(id === false) {\n return false;\n }\n return this.items[id];\n },\n\n\n /**\n * Remove an item\n * @function remove\n * @public\n * @param {Object} item\n * @return {Object|Boolean} removed item or false if not found\n */\n remove: function(parentId, pid) {\n try {\n var id = this._searchByPid(parentId, pid);\n if(id === false) {\n return false;\n }\n this.items.splice(id, 1);\n return true;\n } catch(e) {\n Ink.error('Remove: invalid id');\n return false;\n }\n },\n\n _searchByPid: function(parentId, pid) {\n if(!parentId && typeof(parentId) === 'boolean' || !pid) {\n return false;\n }\n\n parentId = parseInt(parentId, 10);\n pid = parseInt(pid, 10);\n\n if(isNaN(parentId) || isNaN(pid)) {\n return false;\n }\n\n for(var i = 0, len = this.items.length; i this._options.minSizeToUseChunks;\n },\n\n\n _dropEventHandler: function(ev) {\n Event.stop(ev);\n\n this.publish('DropComplete', ev.dataTransfer);\n\n var data = ev.dataTransfer;\n\n if(!data || !data.files || !data.files.length) {\n return false;\n }\n\n this._files = data.files;\n this._files = Array.prototype.slice.call(this._files || [], 0);\n\n // check if webkitGetAsEntry exists on first item\n if(data.items && data.items[0] && data.items[0].webkitGetAsEntry) {\n if(!this._options.foldersEnabled) {\n return setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);\n }\n var entry, folders = [];\n for(var i = ev.dataTransfer.items.length-1; i>=0; i--) {\n entry = ev.dataTransfer.items[i].webkitGetAsEntry();\n if(entry && entry.isDirectory) {\n folders.push(entry);\n this._files[i].isDirectory = true;\n this._files.splice(i, 1);\n }\n }\n // starting callback hell\n this._addFolderToQueue(folders, Ink.bind(function() {\n setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);\n }, this));\n } else {\n setTimeout(Ink.bind(this._addFilesToQueue, this, this._files), 0);\n }\n\n return true;\n },\n\n\n _addFolderToQueue: function(folders, cb) {\n var files = [], invalidFolders = {};\n\n if(!folders || !folders.length) {\n cb();\n return files;\n }\n\n var getFiles = function(entries) {\n var files = [];\n for(var i = 0, len = entries.length; i this._options.maxFilesize) {\n this.publish('MaxSizeFailure', file, this._options.maxFilesize);\n continue;\n }\n\n fileID = parseInt(Math.round(Math.random() * 100000) + \"\" + Math.round(Math.random() * 100000), 10);\n o = { id: i, data: file, fileID: fileID, directory: file.isDirectory };\n Queue.add(this._queueId, o);\n\n this.publish('FileAddedToQueue', o);\n }\n this._processQueue(true);\n this._files = [];\n },\n\n\n _processQueue: function(internalUpload) {\n if(this._queueRunning) {\n return false;\n }\n\n this.running = 0;\n var max = 1, i = 0, items,\n queueLen = Queue.items.length;\n this._queueRunning = true;\n\n this.interval = setInterval(Ink.bind(function() {\n if(Queue.items.length === i && this.running === 0) {\n Queue.purge(this._queueId, true);\n this._queueRunning = false;\n clearInterval(this.interval);\n this.publish('QueueEnd', this._queueId, queueLen);\n }\n\n items = Queue.getItems(this._queueId);\n\n if(this.running < max && items[i]) {\n if(!items[i].canceled) {\n _doRequest.call(this, items[i].pid, items[i].item.data, items[i].item.fileID, items[i].item.directory, internalUpload);\n this.running++;\n i++;\n } else {\n var j = i;\n while(items[j] && items[j].canceled) {\n i++;\n j++;\n }\n }\n return true;\n }\n return false;\n }, this), 100);\n\n\n var _doRequest = function(pid, data, fileID, directory, internalUpload) {\n var o = {\n file: data,\n fileID: fileID,\n cb: Ink.bind(function() {\n this.running--;\n }, this)\n };\n if(internalUpload) {\n if(directory) {\n // do magic\n o.cb();\n } else {\n this._upload(o);\n }\n }\n };\n\n return true;\n },\n\n\n _upload: function(o) {\n var file = o.file,\n xhr = new XMLHttpRequest(),\n fileID = o.fileID;\n\n this.publish('BeforeUpload', file, this._options.extraData, fileID, xhr, this._supportChunks(file.size));\n\n var forceAbort = function(showError) {\n if(o.cb && typeof(o.cb === 'function')) {\n o.cb();\n }\n\n this.publish('OnProgress', {\n length: file.size,\n lengthComputable: true,\n loaded: file.size,\n total: file.size\n }, file, fileID);\n this.publish('EndUpload', file, fileID, (showError ? { error: true } : true));\n this.publish('InvalidFile', file, 'name');\n xhr.abort();\n };\n\n if(this._options.INVALID_FILE_NAME && this._options.INVALID_FILE_NAME instanceof RegExp) {\n if(this._options.INVALID_FILE_NAME.test(o.file.name)) {\n forceAbort.call(this);\n return;\n }\n }\n\n // If file was renamed, abort it\n // FU OPERA: Opera always return lastModified date as null\n if(!file.lastModifiedDate && !Ink.Dom.Browser.OPERA) {\n forceAbort.call(this, true);\n return;\n }\n\n xhr.upload.onprogress = Ink.bind(this.publish, this, 'OnProgress', file, fileID);\n\n var endpoint, method;\n if(this._supportChunks(file.size)) {\n if(file.size <= file.chunk_offset) {\n endpoint = this._options.endpointChunkCommit;\n method = 'POST';\n } else {\n endpoint = this._options.endpointChunk;\n if(file.chunk_upload_id) {\n endpoint += '?upload_id=' + file.chunk_upload_id;\n }\n if(file.chunk_offset) {\n endpoint += '&offset=' + file.chunk_offset;\n }\n method = 'PUT';\n }\n } else {\n endpoint = this._options.endpoint;\n method = 'POST';\n }\n\n xhr.open(method, endpoint, true);\n xhr.withCredentials = true;\n xhr.setRequestHeader(\"x-requested-with\", \"XMLHttpRequest\");\n if(this._supportChunks(file.size)) {\n xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n }\n\n var fd = new FormData(),\n blob;\n\n if(\"Blob\" in window && typeof Blob === 'function') {\n blob = new Blob([file], { type: file.type });\n if(this._supportChunks(file.size)) {\n file.chunk_offset = file.chunk_offset || 0;\n blob = blob.slice(file.chunk_offset, file.chunk_offset + this._options.chunkSize);\n } else {\n fd.append(this._options.fileFormName, blob, file.name);\n }\n } else {\n fd.append(this._options.fileFormName, file);\n }\n\n if(!this._supportChunks(file.size)) {\n for(var k in this._options.extraData) {\n if(this._options.extraData.hasOwnProperty(k)) {\n fd.append(k, this._options.extraData[k]);\n }\n }\n } else {\n fd.append('upload_id', file.chunk_upload_id);\n fd.append('path', file.upload_path);\n }\n\n if(!file.hasParent) {\n if(!this._supportChunks(file.size)) {\n xhr.send(fd);\n } else {\n if(file.size <= file.chunk_offset) {\n xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name);\n } else {\n xhr.send(blob);\n }\n }\n } else {\n this.publish('cbCreateFolder', file.parentID, file.fullPath, this._options.extraData, this._folders, file.rootPath, Ink.bind(function() {\n if(!this._supportChunks(file.size)) {\n xhr.send(fd);\n } else {\n if(file.size <= file.chunk_offset) {\n xhr.send('upload_id=' + file.chunk_upload_id + '&path=' + file.upload_path + '/' + file.name);\n } else {\n xhr.send(blob);\n }\n }\n }, this));\n }\n\n\n xhr.onload = Ink.bindEvent(function() {\n /* jshint boss:true */\n if(this._supportChunks(file.size) && file.size > file.chunk_offset) {\n if(xhr.response) {\n var response = JSON.parse(xhr.response);\n\n // check expected offset\n var invalidOffset = file.chunk_offset && response.offset !== (file.chunk_offset + this._options.chunkSize) && file.size !== response.offset;\n if(invalidOffset) {\n if(o.cb) {\n o.cb();\n }\n this.publish('ErrorUpload', file, fileID);\n } else {\n file.chunk_upload_id = response.upload_id;\n file.chunk_offset = response.offset;\n file.chunk_expires = response.expires;\n this._upload(o);\n }\n } else {\n if(o.cb) {\n o.cb();\n }\n this.publish('ErrorUpload', file, fileID);\n }\n return (xhr = null);\n }\n\n if(o.cb) {\n o.cb();\n }\n\n if(xhr.responseText && xhr['status'] < 400) {\n this.publish('EndUpload', file, fileID, xhr.responseText);\n } else {\n this.publish('ErrorUpload', file, fileID);\n }\n return (xhr = null);\n }, this);\n\n\n xhr.onerror = Ink.bindEvent(function() {\n if(o.cb) {\n o.cb();\n }\n this.publish('ErrorUpload', file, fileID);\n }, this);\n\n xhr.onabort = Ink.bindEvent(function() {\n if(o.cb) {\n o.cb();\n }\n this.publish('AbortUpload', file, fileID, {\n abortAll: Ink.bind(this.abortAll, this),\n abortOne: Ink.bind(this.abortOne, this)\n });\n }, this);\n },\n\n\n abortAll: function() {\n if(!this._queueRunning) {\n return false;\n }\n clearInterval(this.interval);\n this._queueRunning = false;\n Queue.purge(this._queueId, true);\n return true;\n },\n\n abortOne: function(id, cb) {\n var items = Queue.getItems(0),\n o;\n for(var i = 0, len = items.length; i [ [1, 1], [2, 2], [3], [1] ]\n * InkArray.groupBy([1.1, 1.2, 2.1], { key: Math.floor }) // -> [ [1.1, 1.2], [2.1] ]\n * InkArray.groupBy([1.1, 1.2, 2.1], { key: Math.floor, pairs: true }) // -> [ [1, [1.1, 1.2]], [2, [2.1]] ]\n *\n **/\n groupBy: function (arr, options) {\n options = options || {};\n var ret = [];\n var latestGroup;\n function eq(a, b) {\n return outKey(a) === outKey(b);\n }\n function outKey(item) {\n if (typeof options.key === 'function') {\n return options.key(item);\n } else {\n return item;\n }\n }\n\n for (var i = 0, len = arr.length; i < len; i++) {\n latestGroup = [arr[i]];\n\n // Chunkin'\n while ((i + 1 < len) && eq(arr[i], arr[i + 1])) {\n latestGroup.push(arr[i + 1]);\n i++;\n }\n\n if (options.pairs) {\n ret.push([outKey(arr[i]), latestGroup]);\n } else {\n ret.push(latestGroup);\n }\n }\n return ret;\n },\n\n /**\n * Replacement for Array.prototype.reduce.\n *\n * Uses Array.prototype.reduce if available.\n *\n * Produces a single result from a list of values by calling an \"aggregator\" function.\n *\n * Falls back to Array.prototype.reduce if available.\n *\n * @method reduce\n * @param {Array} array Input array to be reduced.\n * @param {Function} callback `function (previousValue, currentValue, index, all) { return {Mixed} }` to execute for each value.\n * @param {Mixed} initial Object used as the first argument to the first call of `callback`\n * @return {Mixed} Reduced array.\n *\n * @example\n * var sum = InkArray.reduce([1, 2, 3], function (a, b) { return a + b; }); // -> 6\n */\n reduce: function (array, callback, initial) {\n if (arrayProto.reduce) {\n return arrayProto.reduce.apply(array, arrayProto.slice.call(arguments, 1));\n }\n\n // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Polyfill\n var t = Object( array ), len = t.length >>> 0, k = 0, value;\n if ( arguments.length >= 3 ) {\n value = initial;\n } else {\n while ( k < len && !(k in t) ) k++;\n if ( k >= len )\n throw new TypeError('Reduce of empty array with no initial value');\n value = t[ k++ ];\n }\n for ( ; k < len ; k++ ) {\n if ( k in t ) {\n value = callback( value, t[k], k, t );\n }\n }\n return value;\n },\n\n /**\n * Checks if a value exists in array\n *\n * @method inArray\n * @public\n * @static\n * @param {Mixed} value Value to check\n * @param {Array} arr Array to search in\n * @return {Boolean} True if value exists in the array\n * @sample Ink_Util_Array_inArray.html\n */\n inArray: function(value, arr) {\n if (typeof arr === 'object') {\n for (var i = 0, f = arr.length; i < f; ++i) {\n if (arr[i] === value) {\n return true;\n }\n }\n }\n return false;\n },\n\n /**\n * Sorts an array of objects by an object property\n *\n * @method sortMulti\n * @param {Array} arr Array of objects to sort\n * @param {String} key Property to sort by\n * @return {Array|Boolean} False if it's not an array, returns a sorted array if it's an array.\n * @public\n * @static\n * @sample Ink_Util_Array_sortMulti.html\n */\n sortMulti: function(arr, key) {\n if (typeof arr === 'undefined' || arr.constructor !== Array) { return false; }\n if (typeof key !== 'string') { return arr.sort(); }\n if (arr.length > 0) {\n if (typeof(arr[0][key]) === 'undefined') { return false; }\n arr.sort(function(a, b){\n var x = a[key];\n var y = b[key];\n return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n });\n }\n return arr;\n },\n\n /**\n * Gets the indexes of a value in an array\n *\n * @method keyValue\n * @param {String} value Value to search for.\n * @param {Array} arr Array to run the search in.\n * @param {Boolean} [first] Flag to stop the search at the first match. It also returns an index number instead of an array of indexes.\n * @return {Boolean|Number|Array} False for no matches. Array of matches or first match index.\n * @public\n * @static\n * @sample Ink_Util_Array_keyValue.html\n */\n keyValue: function(value, arr, first) {\n if (typeof value !== 'undefined' && typeof arr === 'object' && this.inArray(value, arr)) {\n var aKeys = [];\n for (var i = 0, f = arr.length; i < f; ++i) {\n if (arr[i] === value) {\n if (typeof first !== 'undefined' && first === true) {\n return i;\n } else {\n aKeys.push(i);\n }\n }\n }\n return aKeys;\n }\n return false;\n },\n\n /**\n * Shuffles an array.\n *\n * @method shuffle\n * @param {Array} arr Array to shuffle\n * @return {Array|Boolean} Shuffled Array or false if not an array.\n * @public\n * @static\n * @sample Ink_Util_Array_shuffle.html\n */\n shuffle: function(arr) {\n if (typeof(arr) !== 'undefined' && arr.constructor !== Array) { return false; }\n var total = arr.length,\n tmp1 = false,\n rnd = false;\n\n while (total--) {\n rnd = Math.floor(Math.random() * (total + 1));\n tmp1 = arr[total];\n arr[total] = arr[rnd];\n arr[rnd] = tmp1;\n }\n return arr;\n },\n\n /**\n * Runs a function through each of the elements of an array.\n *\n * Uses Array.prototype.forEach if available.\n *\n * @method forEach\n * @param {Array} array The array to be cycled/iterated\n * @param {Function} callback The function receives as arguments the value, index and array.\n * @param {Mixed} context The value of `this` inside the `callback` you passed.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Array_forEach.html\n */\n forEach: function(array, callback, context) {\n if (arrayProto.forEach) {\n return arrayProto.forEach.call(array, callback, context);\n }\n for (var i = 0, len = array.length >>> 0; i < len; i++) {\n callback.call(context, array[i], i, array);\n }\n },\n\n /**\n * Alias for backwards compatibility. See forEach\n *\n * @method each\n * @param {Mixed} [forEachArguments] (see forEach)\n * @return {void} (see forEach)\n */\n each: function () {\n InkArray.forEach.apply(InkArray, arrayProto.slice.call(arguments));\n },\n\n /**\n * Runs a function for each item in the array.\n * Uses Array.prototype.map if available.\n * That function will receive each item as an argument and its return value will change the corresponding array item.\n * @method map\n * @param {Array} array The array to map over\n * @param {Function} mapFn The map function. Will take `(item, index, array)` as arguments and the `this` value will be the `context` argument you pass to this function.\n * @param {Object} [context] Object to be `this` in the map function.\n * @return {Array} A copy of the original array, with all of its items processed by the map function.\n *\n * @sample Ink_Util_Array_map.html\n */\n map: function (array, mapFn, context) {\n if (arrayProto.map) {\n return arrayProto.map.call(array, mapFn, context);\n }\n var mapped = new Array(len);\n for (var i = 0, len = array.length >>> 0; i < len; i++) {\n mapped[i] = mapFn.call(context, array[i], i, array);\n }\n return mapped;\n },\n\n /**\n * Filters an array based on a truth test.\n * This method runs a test function on all the array values and returns a new array with all the values that pass the test.\n * @method filter\n * @param {Array} array The array to filter\n * @param {Function} test A test function taking `(item, index, array)`\n * @param {Object} [context] Object to be `this` in the test function.\n * @return {Array} Returns the filtered array\n *\n * @sample Ink_Util_Array_filter.html\n */\n filter: function (array, test, context) {\n if (arrayProto.filter) {\n return arrayProto.filter.call(array, test, context);\n }\n var filtered = [],\n val = null;\n for (var i = 0, len = array.length; i < len; i++) {\n val = array[i]; // it might be mutated\n if (test.call(context, val, i, array)) {\n filtered.push(val);\n }\n }\n return filtered;\n },\n\n /**\n * Checks if some element in the array passes a truth test\n *\n * @method some\n * @param {Array} arr The array to iterate through\n * @param {Function} cb The callback to be called on the array's elements. It receives the value, the index and the array as arguments.\n * @param {Object} context Object of the callback function\n * @return {Boolean} True if the callback returns true at any point, false otherwise\n * @public\n * @static\n * @sample Ink_Util_Array_some.html\n */\n some: function(arr, cb, context){\n\n if (arr === null){\n throw new TypeError('First argument is invalid.');\n }\n\n var t = Object(arr);\n var len = t.length >>> 0;\n if (typeof cb !== \"function\"){ throw new TypeError('Second argument must be a function.'); }\n\n for (var i = 0; i < len; i++) {\n if (i in t && cb.call(context, t[i], i, t)){ return true; }\n }\n\n return false;\n },\n\n /**\n * Compares the values of two arrays and return the matches\n *\n * @method intersect\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n * @return {Array} Empty array if one of the arrays is false (or do not intersect) | Array with the intersected values\n * @public\n * @static\n * @sample Ink_Util_Array_intersect.html\n */\n intersect: function(arr1, arr2) {\n if (!arr1 || !arr2 || arr1 instanceof Array === false || arr2 instanceof Array === false) {\n return [];\n }\n\n var shared = [];\n for (var i = 0, I = arr1.length; i 0) {\n for (x = start; x < stop; x += step) {\n r.push(x);\n }\n } else {\n for (x = start; x > stop; x += step) {\n r.push(x);\n }\n }\n\n return r;\n },\n\n /**\n * Inserts a value on a specified index\n *\n * @method insert\n * @param {Array} arr Array where the value will be inserted\n * @param {Number} idx Index of the array where the value should be inserted\n * @param {Mixed} value Value to be inserted\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Array_insert.html\n */\n insert: function(arr, idx, value) {\n arr.splice(idx, 0, value);\n },\n\n /**\n * Removes a range of values from the array\n *\n * @method remove\n * @param {Array} arr Array where the value will be removed\n * @param {Number} from Index of the array where the removal will start removing.\n * @param {Number} rLen Number of items to be removed from the index onwards.\n * @return {Array} An array with the remaining values\n * @public\n * @static\n * @sample Ink_Util_Array_remove.html\n */\n remove: function(arr, from, rLen){\n var output = [];\n\n for(var i = 0, iLen = arr.length; i < iLen; i++){\n if(i >= from && i < from + rLen){\n continue;\n }\n\n output.push(arr[i]);\n }\n\n return output;\n }\n };\n\n return InkArray;\n\n});\n","/**\n * Binary Packing algorithm implementation\n * @module Ink.Util.BinPack_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.BinPack', '1', [], function() {\n\n 'use strict';\n\n /*jshint boss:true */\n\n // https://github.com/jakesgordon/bin-packing/\n\n /*\n Copyright (c) 2011, 2012, 2013 Jake Gordon and contributors\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\n\n\n var Packer = function(w, h) {\n this.init(w, h);\n };\n\n Packer.prototype = {\n\n init: function(w, h) {\n this.root = { x: 0, y: 0, w: w, h: h };\n },\n\n fit: function(blocks) {\n var n, node, block;\n for (n = 0; n < blocks.length; ++n) {\n block = blocks[n];\n if (node = this.findNode(this.root, block.w, block.h)) {\n block.fit = this.splitNode(node, block.w, block.h);\n }\n }\n },\n\n findNode: function(root, w, h) {\n if (root.used) {\n return this.findNode(root.right, w, h) || this.findNode(root.down, w, h);\n }\n else if ((w <= root.w) && (h <= root.h)) {\n return root;\n }\n else {\n return null;\n }\n },\n\n splitNode: function(node, w, h) {\n node.used = true;\n node.down = { x: node.x, y: node.y + h, w: node.w, h: node.h - h };\n node.right = { x: node.x + w, y: node.y, w: node.w - w, h: h };\n return node;\n }\n\n };\n\n\n\n var GrowingPacker = function() {};\n\n GrowingPacker.prototype = {\n\n fit: function(blocks) {\n var n, node, block, len = blocks.length;\n var w = len > 0 ? blocks[0].w : 0;\n var h = len > 0 ? blocks[0].h : 0;\n this.root = { x: 0, y: 0, w: w, h: h };\n for (n = 0; n < len ; n++) {\n block = blocks[n];\n if (node = this.findNode(this.root, block.w, block.h)) {\n block.fit = this.splitNode(node, block.w, block.h);\n }\n else {\n block.fit = this.growNode(block.w, block.h);\n }\n }\n },\n\n findNode: function(root, w, h) {\n if (root.used) {\n return this.findNode(root.right, w, h) || this.findNode(root.down, w, h);\n }\n else if ((w <= root.w) && (h <= root.h)) {\n return root;\n }\n else {\n return null;\n }\n },\n\n splitNode: function(node, w, h) {\n node.used = true;\n node.down = { x: node.x, y: node.y + h, w: node.w, h: node.h - h };\n node.right = { x: node.x + w, y: node.y, w: node.w - w, h: h };\n return node;\n },\n\n growNode: function(w, h) {\n var canGrowDown = (w <= this.root.w);\n var canGrowRight = (h <= this.root.h);\n\n var shouldGrowRight = canGrowRight && (this.root.h >= (this.root.w + w)); // attempt to keep square-ish by growing right when height is much greater than width\n var shouldGrowDown = canGrowDown && (this.root.w >= (this.root.h + h)); // attempt to keep square-ish by growing down when width is much greater than height\n\n if (shouldGrowRight) {\n return this.growRight(w, h);\n }\n else if (shouldGrowDown) {\n return this.growDown(w, h);\n }\n else if (canGrowRight) {\n return this.growRight(w, h);\n }\n else if (canGrowDown) {\n return this.growDown(w, h);\n }\n else {\n return null; // need to ensure sensible root starting size to avoid this happening\n }\n },\n\n growRight: function(w, h) {\n this.root = {\n used: true,\n x: 0,\n y: 0,\n w: this.root.w + w,\n h: this.root.h,\n down: this.root,\n right: { x: this.root.w, y: 0, w: w, h: this.root.h }\n };\n var node;\n if (node = this.findNode(this.root, w, h)) {\n return this.splitNode(node, w, h);\n }\n else {\n return null;\n }\n },\n\n growDown: function(w, h) {\n this.root = {\n used: true,\n x: 0,\n y: 0,\n w: this.root.w,\n h: this.root.h + h,\n down: { x: 0, y: this.root.h, w: this.root.w, h: h },\n right: this.root\n };\n var node;\n if (node = this.findNode(this.root, w, h)) {\n return this.splitNode(node, w, h);\n }\n else {\n return null;\n }\n }\n\n };\n\n\n\n var sorts = {\n random: function() { return Math.random() - 0.5; },\n w: function(a, b) { return b.w - a.w; },\n h: function(a, b) { return b.h - a.h; },\n a: function(a, b) { return b.area - a.area; },\n max: function(a, b) { return Math.max(b.w, b.h) - Math.max(a.w, a.h); },\n min: function(a, b) { return Math.min(b.w, b.h) - Math.min(a.w, a.h); },\n height: function(a, b) { return sorts.msort(a, b, ['h', 'w']); },\n width: function(a, b) { return sorts.msort(a, b, ['w', 'h']); },\n area: function(a, b) { return sorts.msort(a, b, ['a', 'h', 'w']); },\n maxside: function(a, b) { return sorts.msort(a, b, ['max', 'min', 'h', 'w']); },\n msort: function(a, b, criteria) { /* sort by multiple criteria */\n var diff, n;\n for (n = 0; n < criteria.length; ++n) {\n diff = sorts[ criteria[n] ](a, b);\n if (diff !== 0) {\n return diff;\n }\n }\n return 0;\n }\n };\n\n\n\n // end of Jake's code\n\n\n\n // aux, used to display blocks in unfitted property\n var toString = function() {\n return [this.w, ' x ', this.h].join('');\n };\n\n\n\n /**\n * Binary Packing algorithm implementation\n *\n * Based on the work of Jake Gordon\n *\n * see https://github.com/jakesgordon/bin-packing/\n *\n * @namespace Ink.Util.BinPack\n * @version 1\n * @static\n */\n var BinPack = {\n\n /**\n * @method binPack\n * @param {Object} o Options\n * @param {Array} o.blocks Array of items with width and height integer attributes.\n * @param {Array} [o.dimensions] Flag to fix container dimensions\n * @param {String} [o.sorter] Sorting function. One of: random, height, width, area, maxside\n * @return {Object} Returns an object containing container dimensions, filled ratio, fitted blocks, unfitted blocks and all blocks\n * @static\n */\n binPack: function(o) {\n var i, f, bl;\n\n\n\n // calculate area if not there already\n for (i = 0, f = o.blocks.length; i < f; ++i) {\n bl = o.blocks[i];\n if (! ('area' in bl) ) {\n bl.area = bl.w * bl.h;\n }\n }\n\n\n\n // apply algorithm\n var packer = o.dimensions ? new Packer(o.dimensions[0], o.dimensions[1]) : new GrowingPacker();\n\n if (!o.sorter) { o.sorter = 'maxside'; }\n\n o.blocks.sort( sorts[ o.sorter ] );\n\n packer.fit(o.blocks);\n\n var dims2 = [packer.root.w, packer.root.h];\n\n\n\n // layout is done here, generating report data...\n var fitted = [];\n var unfitted = [];\n\n for (i = 0, f = o.blocks.length; i < f; ++i) {\n bl = o.blocks[i];\n if (bl.fit) {\n fitted.push(bl);\n }\n else {\n bl.toString = toString; // TO AID SERIALIZATION\n unfitted.push(bl);\n }\n }\n\n var area = dims2[0] * dims2[1];\n var fit = 0;\n for (i = 0, f = fitted.length; i < f; ++i) {\n bl = fitted[i];\n fit += bl.area;\n }\n\n return {\n dimensions: dims2,\n filled: fit / area,\n blocks: o.blocks,\n fitted: fitted,\n unfitted: unfitted\n };\n }\n };\n\n\n\n return BinPack;\n\n});","/**\n * Cookie Utilities\n * @module Ink.Util.Cookie_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Cookie', '1', [], function() {\n 'use strict';\n\n /**\n * @namespace Ink.Util.Cookie_1\n */\n var Cookie = {\n\n /**\n * Gets an object with the current page cookies, or a specific cookie if you specify the `name`.\n *\n * @method get\n * @param {String} [name] The cookie name.\n * @return {String|Object} If the name is specified, it returns the value of that key. Otherwise it returns the full cookie object\n * @public\n * @static\n * @sample Ink_Util_Cookie_get.html\n */\n get: function(name)\n {\n var cookie = document.cookie || false;\n\n var _Cookie = {};\n\n if(cookie) {\n cookie = cookie.replace(new RegExp(\"; \", \"g\"), ';');\n\n var aCookie = cookie.split(';');\n var aItem = [];\n if(aCookie.length > 0) {\n for(var i=0; i < aCookie.length; i++) {\n aItem = aCookie[i].split('=');\n if(aItem.length === 2) {\n _Cookie[aItem[0]] = decodeURIComponent(aItem[1]);\n }\n }\n }\n if(name) {\n if(typeof(_Cookie[name]) !== 'undefined') {\n return _Cookie[name];\n } else {\n return null;\n }\n }\n }\n return _Cookie;\n },\n\n /**\n * Sets a cookie.\n *\n * @method set\n * @param {String} name Cookie name.\n * @param {String} value Cookie value.\n * @param {Number} [expires] Number of seconds the cookie will be valid for.\n * @param {String} [path] Path for the cookie. Defaults to '/'.\n * @param {String} [domain] Domain for the cookie. Defaults to current hostname.\n * @param {Boolean} [secure] Flag for secure. Default 'false'.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Cookie_set.html\n */\n set: function(name, value, expires, path, domain, secure)\n {\n var sName;\n if(!name || value===false || typeof(name) === 'undefined' || typeof(value) === 'undefined') {\n return false;\n } else {\n sName = name+'='+encodeURIComponent(value);\n }\n var sExpires = false;\n var sPath = false;\n var sDomain = false;\n var sSecure = false;\n\n if(expires && typeof(expires) !== 'undefined' && !isNaN(expires)) {\n var oDate = new Date();\n var sDate = (parseInt(Number(oDate.valueOf()), 10) + (Number(parseInt(expires, 10)) * 1000));\n\n var nDate = new Date(sDate);\n var expiresString = nDate.toGMTString();\n\n var re = new RegExp(\"([^\\\\s]+)(\\\\s\\\\d\\\\d)\\\\s(\\\\w\\\\w\\\\w)\\\\s(.*)\");\n expiresString = expiresString.replace(re, \"$1$2-$3-$4\");\n\n sExpires = 'expires='+expiresString;\n } else {\n if(typeof(expires) !== 'undefined' && !isNaN(expires) && Number(parseInt(expires, 10))===0) {\n sExpires = '';\n } else {\n sExpires = 'expires=Thu, 01-Jan-2037 00:00:01 GMT';\n }\n }\n\n if(path && typeof(path) !== 'undefined') {\n sPath = 'path='+path;\n } else {\n sPath = 'path=/';\n }\n\n if(domain) {\n sDomain = 'domain='+domain;\n } else if (/\\./.test(window.location.hostname)) {\n // When trying to set domain=localhost or any other domain\n // without dots, setting the cookie fails.\n // Anyways, the cookies are bound to the current domain by default so let it be.\n sDomain = 'domain='+window.location.hostname;\n }\n\n if(secure && typeof(secure) !== 'undefined') {\n sSecure = secure;\n } else {\n sSecure = false;\n }\n\n document.cookie = sName +\n '; ' + sExpires +\n '; ' + sPath +\n (sDomain ? '; ' + sDomain : '') +\n '; ' + sSecure;\n },\n\n /**\n * Deletes a cookie.\n *\n * @method remove\n * @param {String} cookieName Cookie name.\n * @param {String} [path] Path of the cookie. Defaults to '/'.\n * @param {String} [domain] Domain of the cookie. Defaults to current hostname.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Cookie_remove.html\n */\n remove: function(cookieName, path, domain) {\n var expiresDate = -1;\n\n this.set(cookieName, 'deleted', expiresDate, path, domain);\n }\n };\n\n return Cookie;\n\n});\n","/**\n * Date utility functions\n * @module Ink.Util.Date_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Date', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Date_1 \n */\n var InkDate = {\n\n /**\n * Function that returns the string representation of the month [PT only]\n *\n * @method _months\n * @param {Number} index Month javascript (0 to 11)\n * @return {String} The month's name\n * @private\n * @static\n * @example\n * console.log( InkDate._months(0) ); // Result: Janeiro\n */\n _months: function(index){\n var _m = ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];\n return _m[index];\n },\n\n /**\n * Function that returns the month [PT only] ( 0 to 11 )\n *\n * @method _iMonth\n * @param {String} month Month javascript (0 to 11)\n * @return {Number} The month's number\n * @private\n * @static\n * @example\n * console.log( InkDate._iMonth('maio') ); // Result: 4\n */\n _iMonth : function( month )\n {\n if ( Number( month ) ) { return +month - 1; }\n return {\n 'janeiro' : 0 ,\n 'jan' : 0 ,\n 'fevereiro' : 1 ,\n 'fev' : 1 ,\n 'março' : 2 ,\n 'mar' : 2 ,\n 'abril' : 3 ,\n 'abr' : 3 ,\n 'maio' : 4 ,\n 'mai' : 4 ,\n 'junho' : 5 ,\n 'jun' : 5 ,\n 'julho' : 6 ,\n 'jul' : 6 ,\n 'agosto' : 7 ,\n 'ago' : 7 ,\n 'setembro' : 8 ,\n 'set' : 8 ,\n 'outubro' : 9 ,\n 'out' : 9 ,\n 'novembro' : 10 ,\n 'nov' : 10 ,\n 'dezembro' : 11 ,\n 'dez' : 11\n }[ month.toLowerCase( ) ];\n } ,\n\n /**\n * Function that returns the representation the day of the week [PT Only]\n *\n * @method _wDays\n * @param {Number} index Week's day index\n * @return {String} The week's day name\n * @private\n * @static\n * @example\n * console.log( InkDate._wDays(0) ); // Result: Domingo\n */\n _wDays: function(index){\n var _d = ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'];\n return _d[index];\n },\n\n /**\n * Function that returns day of the week in javascript 1 to 7\n *\n * @method _iWeek\n * @param {String} week Week's day name\n * @return {Number} The week's day index\n * @private\n * @static\n * @example\n * console.log( InkDate._iWeek('quarta') ); // Result: 3\n */\n _iWeek: function( week )\n {\n if ( Number( week ) ) { return +week || 7; }\n return {\n 'segunda' : 1 ,\n 'seg' : 1 ,\n 'terça' : 2 ,\n 'ter' : 2 ,\n 'quarta' : 3 ,\n 'qua' : 3 ,\n 'quinta' : 4 ,\n 'qui' : 4 ,\n 'sexta' : 5 ,\n 'sex' : 5 ,\n 'sábado' : 6 ,\n 'sáb' : 6 ,\n 'domingo' : 7 ,\n 'dom' : 7\n }[ week.toLowerCase( ) ];\n },\n\n /**\n * Function that returns the number of days of a given month (m) on a given year (y)\n *\n * @method _daysInMonth\n * @param {Number} _m Month\n * @param {Number} _y Year\n * @return {Number} Number of days of a give month on a given year\n * @private\n * @static\n * @example\n * console.log( InkDate._daysInMonth(2,2013) ); // Result: 28\n */\n _daysInMonth: function(_m,_y){\n var nDays;\n\n if(_m===1 || _m===3 || _m===5 || _m===7 || _m===8 || _m===10 || _m===12)\n {\n nDays= 31;\n }\n else if ( _m===4 || _m===6 || _m===9 || _m===11)\n {\n nDays = 30;\n }\n else\n {\n if((_y%400===0) || (_y%4===0 && _y%100!==0))\n {\n nDays = 29;\n }\n else\n {\n nDays = 28;\n }\n }\n return nDays;\n },\n\n /**\n * Formats a date object.\n * This works exactly as php date() function. http://php.net/manual/en/function.date.php\n *\n * @method get\n * @param {String} format The format in which the date it will be formatted.\n * @param {Date} [_date] The date to format. Can receive unix timestamp or a date object. Defaults to current time.\n * @return {String} Formatted date\n * @public\n * @static\n * @sample Ink_Util_Date_get.html \n */\n get: function(format, _date){\n /*jshint maxcomplexity:65 */\n if(typeof(format) === 'undefined' || format === ''){\n format = \"Y-m-d\";\n }\n\n\n var iFormat = format.split(\"\");\n var result = new Array(iFormat.length);\n var escapeChar = \"\\\\\";\n var jsDate;\n\n if (typeof(_date) === 'undefined'){\n jsDate = new Date();\n } else if (typeof(_date)==='number'){\n jsDate = new Date(_date*1000);\n } else {\n jsDate = new Date(_date);\n }\n\n var jsFirstDay, jsThisDay, jsHour;\n /* This switch is presented in the same order as in php date function (PHP 5.2.2) */\n for (var i = 0; i < iFormat.length; i++) {\n switch(iFormat[i]) {\n case escapeChar:\n result[i] = iFormat[i+1];\n i++;\n break;\n\n\n /* DAY */\n case \"d\": /* Day of the month, 2 digits with leading zeros; ex: 01 to 31 */\n var jsDay = jsDate.getDate();\n result[i] = (String(jsDay).length > 1) ? jsDay : \"0\" + jsDay;\n break;\n\n case \"D\": /* A textual representation of a day, three letters; Seg to Dom */\n result[i] = this._wDays(jsDate.getDay()).substring(0, 3);\n break;\n\n case \"j\": /* Day of the month without leading zeros; ex: 1 to 31 */\n result[i] = jsDate.getDate();\n break;\n\n case \"l\": /* A full textual representation of the day of the week; Domingo to Sabado */\n result[i] = this._wDays(jsDate.getDay());\n break;\n\n case \"N\": /* ISO-8601 numeric representation of the day of the week; 1 (Segunda) to 7 (Domingo) */\n result[i] = jsDate.getDay() || 7;\n break;\n\n case \"S\": /* English ordinal suffix for the day of the month, 2 characters; st, nd, rd or th. Works well with j */\n var temp = jsDate.getDate();\n var suffixes = [\"st\", \"nd\", \"rd\"];\n var suffix = \"\";\n\n if (temp >= 11 && temp <= 13) {\n result[i] = \"th\";\n } else {\n result[i] = (suffix = suffixes[String(temp).substr(-1) - 1]) ? (suffix) : (\"th\");\n }\n break;\n\n case \"w\": /* Numeric representation of the day of the week; 0 (for Sunday) through 6 (for Saturday) */\n result[i] = jsDate.getDay();\n break;\n\n case \"z\": /* The day of the year (starting from 0); 0 to 365 */\n jsFirstDay = Date.UTC(jsDate.getFullYear(), 0, 0);\n jsThisDay = Date.UTC(jsDate.getFullYear(), jsDate.getMonth(), jsDate.getDate());\n result[i] = Math.floor((jsThisDay - jsFirstDay) / (1000 * 60 * 60 * 24));\n break;\n\n /* WEEK */\n case \"W\": /* ISO-8601 week number of year, weeks starting on Monday; ex: 42 (the 42nd week in the year) */\n var jsYearStart = new Date( jsDate.getFullYear( ) , 0 , 1 );\n jsFirstDay = jsYearStart.getDay() || 7;\n\n var days = Math.floor( ( jsDate - jsYearStart ) / ( 24 * 60 * 60 * 1000 ) + 1 );\n\n result[ i ] = Math.ceil( ( days - ( 8 - jsFirstDay ) ) / 7 ) + 1;\n break;\n\n\n /* MONTH */\n case \"F\": /* A full textual representation of a month, such as Janeiro or Marco; Janeiro a Dezembro */\n result[i] = this._months(jsDate.getMonth());\n break;\n\n case \"m\": /* Numeric representation of a month, with leading zeros; 01 to 12 */\n var jsMonth = String(jsDate.getMonth() + 1);\n result[i] = (jsMonth.length > 1) ? jsMonth : \"0\" + jsMonth;\n break;\n\n case \"M\": /* A short textual representation of a month, three letters; Jan a Dez */\n result[i] = this._months(jsDate.getMonth()).substring(0,3);\n break;\n\n case \"n\": /* Numeric representation of a month, without leading zeros; 1 a 12 */\n result[i] = jsDate.getMonth() + 1;\n break;\n\n case \"t\": /* Number of days in the given month; ex: 28 */\n result[i] = this._daysInMonth(jsDate.getMonth()+1,jsDate.getYear());\n break;\n\n /* YEAR */\n case \"L\": /* Whether it's a leap year; 1 if it is a leap year, 0 otherwise. */\n var jsYear = jsDate.getFullYear();\n result[i] = (jsYear % 4) ? false : ( (jsYear % 100) ? true : ( (jsYear % 400) ? false : true ) );\n break;\n\n case \"o\": /* ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. */\n throw '\"o\" not implemented!';\n\n case \"Y\": /* A full numeric representation of a year, 4 digits; 1999 */\n result[i] = jsDate.getFullYear();\n break;\n\n case \"y\": /* A two digit representation of a year; 99 */\n result[i] = String(jsDate.getFullYear()).substring(2);\n break;\n\n /* TIME */\n case \"a\": /* Lowercase Ante meridiem and Post meridiem; am or pm */\n result[i] = (jsDate.getHours() < 12) ? \"am\" : \"pm\";\n break;\n\n case \"A\": /* Uppercase Ante meridiem and Post meridiem; AM or PM */\n result[i] = (jsDate.getHours < 12) ? \"AM\" : \"PM\";\n break;\n\n case \"B\": /* Swatch Internet time; 000 through 999 */\n throw '\"B\" not implemented!';\n\n case \"g\": /* 12-hour format of an hour without leading zeros; 1 to 12 */\n jsHour = jsDate.getHours();\n result[i] = (jsHour <= 12) ? jsHour : (jsHour - 12);\n break;\n\n case \"G\": /* 24-hour format of an hour without leading zeros; 1 to 23 */\n result[i] = String(jsDate.getHours());\n break;\n\n case \"h\": /* 12-hour format of an hour with leading zeros; 01 to 12 */\n jsHour = String(jsDate.getHours());\n jsHour = (jsHour <= 12) ? jsHour : (jsHour - 12);\n result[i] = (jsHour.length > 1) ? jsHour : \"0\" + jsHour;\n break;\n\n case \"H\": /* 24-hour format of an hour with leading zeros; 01 to 24 */\n jsHour = String(jsDate.getHours());\n result[i] = (jsHour.length > 1) ? jsHour : \"0\" + jsHour;\n break;\n\n case \"i\": /* Minutes with leading zeros; 00 to 59 */\n var jsMinute = String(jsDate.getMinutes());\n result[i] = (jsMinute.length > 1) ? jsMinute : \"0\" + jsMinute;\n break;\n\n case \"s\": /* Seconds with leading zeros; 00 to 59; */\n var jsSecond = String(jsDate.getSeconds());\n result[i] = (jsSecond.length > 1) ? jsSecond : \"0\" + jsSecond;\n break;\n\n case \"u\": /* Microseconds */\n throw '\"u\" not implemented!';\n\n\n /* TIMEZONE */\n\n case \"e\": /* Timezone identifier */\n throw '\"e\" not implemented!';\n\n case \"I\": /* \"1\" if Daylight Savings Time, \"0\" otherwise. Works only on the northern hemisphere */\n jsFirstDay = new Date(jsDate.getFullYear(), 0, 1);\n result[i] = (jsDate.getTimezoneOffset() !== jsFirstDay.getTimezoneOffset()) ? (1) : (0);\n break;\n\n case \"O\": /* Difference to Greenwich time (GMT) in hours */\n var jsMinZone = jsDate.getTimezoneOffset();\n var jsMinutes = jsMinZone % 60;\n jsHour = String(((jsMinZone - jsMinutes) / 60) * -1);\n\n if (jsHour.charAt(0) !== \"-\") {\n jsHour = \"+\" + jsHour;\n }\n\n jsHour = (jsHour.length === 3) ? (jsHour) : (jsHour.replace(/([+\\-])(\\d)/, \"$1\" + 0 + \"$2\"));\n result[i] = jsHour + jsMinutes + \"0\";\n break;\n\n case \"P\": /* Difference to Greenwich time (GMT) with colon between hours and minutes */\n throw '\"P\" not implemented!';\n\n case \"T\": /* Timezone abbreviation */\n throw '\"T\" not implemented!';\n\n case \"Z\": /* Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. */\n result[i] = jsDate.getTimezoneOffset() * 60;\n break;\n\n\n /* FULL DATE/TIME */\n\n case \"c\": /* ISO 8601 date */\n throw '\"c\" not implemented!';\n\n case \"r\": /* RFC 2822 formatted date */\n var jsDayName = this._wDays(jsDate.getDay()).substr(0, 3);\n var jsMonthName = this._months(jsDate.getMonth()).substr(0, 3);\n result[i] = jsDayName + \", \" + jsDate.getDate() + \" \" + jsMonthName + this.get(\" Y H:i:s O\",jsDate);\n break;\n\n case \"U\": /* Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) */\n result[i] = Math.floor(jsDate.getTime() / 1000);\n break;\n\n default:\n result[i] = iFormat[i];\n }\n }\n\n return result.join('');\n\n },\n\n /**\n * Creates a date object based on a format string.\n * This works exactly as php date() function. http://php.net/manual/en/function.date.php\n *\n * @method set\n * @param {String} [format] The format in which the date will be formatted. Defaults to 'Y-m-d'\n * @param {String} str_date The date formatted.\n * @return {Date} Date object based on the formatted date and format\n * @public\n * @static\n * @sample Ink_Util_Date_set.html \n */\n set : function( format , str_date ) {\n if ( typeof str_date === 'undefined' ) { return ; }\n if ( typeof format === 'undefined' || format === '' ) { format = \"Y-m-d\"; }\n\n var iFormat = format.split(\"\");\n var result = new Array( iFormat.length );\n var escapeChar = \"\\\\\";\n var mList;\n\n var objIndex = {\n year : undefined ,\n month : undefined ,\n day : undefined ,\n dayY : undefined ,\n dayW : undefined ,\n week : undefined ,\n hour : undefined ,\n hourD : undefined ,\n min : undefined ,\n sec : undefined ,\n msec : undefined ,\n ampm : undefined ,\n diffM : undefined ,\n diffH : undefined ,\n date : undefined\n };\n\n var matches = 0;\n\n /* This switch is presented in the same order as in php date function (PHP 5.2.2) */\n for ( var i = 0; i < iFormat.length; i++) {\n switch( iFormat[ i ] ) {\n case escapeChar:\n result[i] = iFormat[ i + 1 ];\n i++;\n break;\n\n /* DAY */\n case \"d\": /* Day of the month, 2 digits with leading zeros; ex: 01 to 31 */\n result[ i ] = '(\\\\d{2})';\n objIndex.day = { original : i , match : matches++ };\n break;\n\n case \"j\": /* Day of the month without leading zeros; ex: 1 to 31 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.day = { original : i , match : matches++ };\n break;\n\n case \"D\": /* A textual representation of a day, three letters; Seg to Dom */\n result[ i ] = '([\\\\wá]{3})';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"l\": /* A full textual representation of the day of the week; Domingo to Sabado */\n result[i] = '([\\\\wá]{5,7})';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"N\": /* ISO-8601 numeric representation of the day of the week; 1 (Segunda) to 7 (Domingo) */\n result[ i ] = '(\\\\d)';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"w\": /* Numeric representation of the day of the week; 0 (for Sunday) through 6 (for Saturday) */\n result[ i ] = '(\\\\d)';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"S\": /* English ordinal suffix for the day of the month, 2 characters; st, nd, rd or th. Works well with j */\n result[ i ] = '\\\\w{2}';\n break;\n\n case \"z\": /* The day of the year (starting from 0); 0 to 365 */\n result[ i ] = '(\\\\d{1,3})';\n objIndex.dayY = { original : i , match : matches++ };\n break;\n\n /* WEEK */\n case \"W\": /* ISO-8601 week number of year, weeks starting on Monday; ex: 42 (the 42nd week in the year) */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.week = { original : i , match : matches++ };\n break;\n\n /* MONTH */\n case \"F\": /* A full textual representation of a month, such as Janeiro or Marco; Janeiro a Dezembro */\n result[ i ] = '([\\\\wç]{4,9})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"M\": /* A short textual representation of a month, three letters; Jan a Dez */\n result[ i ] = '(\\\\w{3})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"m\": /* Numeric representation of a month, with leading zeros; 01 to 12 */\n result[ i ] = '(\\\\d{2})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"n\": /* Numeric representation of a month, without leading zeros; 1 a 12 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"t\": /* Number of days in the given month; ex: 28 */\n result[ i ] = '\\\\d{2}';\n break;\n\n /* YEAR */\n case \"L\": /* Whether it's a leap year; 1 if it is a leap year, 0 otherwise. */\n result[ i ] = '\\\\w{4,5}';\n break;\n\n case \"o\": /* ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. */\n throw '\"o\" not implemented!';\n\n case \"Y\": /* A full numeric representation of a year, 4 digits; 1999 */\n result[ i ] = '(\\\\d{4})';\n objIndex.year = { original : i , match : matches++ };\n break;\n\n case \"y\": /* A two digit representation of a year; 99 */\n result[ i ] = '(\\\\d{2})';\n if ( typeof objIndex.year === 'undefined' || iFormat[ objIndex.year.original ] !== 'Y' ) {\n objIndex.year = { original : i , match : matches++ };\n }\n break;\n\n /* TIME */\n case \"a\": /* Lowercase Ante meridiem and Post meridiem; am or pm */\n result[ i ] = '(am|pm)';\n objIndex.ampm = { original : i , match : matches++ };\n break;\n\n case \"A\": /* Uppercase Ante meridiem and Post meridiem; AM or PM */\n result[ i ] = '(AM|PM)';\n objIndex.ampm = { original : i , match : matches++ };\n break;\n\n case \"B\": /* Swatch Internet time; 000 through 999 */\n throw '\"B\" not implemented!';\n\n case \"g\": /* 12-hour format of an hour without leading zeros; 1 to 12 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.hourD = { original : i , match : matches++ };\n break;\n\n case \"G\": /* 24-hour format of an hour without leading zeros; 1 to 23 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.hour = { original : i , match : matches++ };\n break;\n\n case \"h\": /* 12-hour format of an hour with leading zeros; 01 to 12 */\n result[ i ] = '(\\\\d{2})';\n objIndex.hourD = { original : i , match : matches++ };\n break;\n\n case \"H\": /* 24-hour format of an hour with leading zeros; 01 to 24 */\n result[ i ] = '(\\\\d{2})';\n objIndex.hour = { original : i , match : matches++ };\n break;\n\n case \"i\": /* Minutes with leading zeros; 00 to 59 */\n result[ i ] = '(\\\\d{2})';\n objIndex.min = { original : i , match : matches++ };\n break;\n\n case \"s\": /* Seconds with leading zeros; 00 to 59; */\n result[ i ] = '(\\\\d{2})';\n objIndex.sec = { original : i , match : matches++ };\n break;\n\n case \"u\": /* Microseconds */\n throw '\"u\" not implemented!';\n\n /* TIMEZONE */\n case \"e\": /* Timezone identifier */\n throw '\"e\" not implemented!';\n\n case \"I\": /* \"1\" if Daylight Savings Time, \"0\" otherwise. Works only on the northern hemisphere */\n result[i] = '\\\\d';\n break;\n\n case \"O\": /* Difference to Greenwich time (GMT) in hours */\n result[ i ] = '([-+]\\\\d{4})';\n objIndex.diffH = { original : i , match : matches++ };\n break;\n\n case \"P\": /* Difference to Greenwich time (GMT) with colon between hours and minutes */\n throw '\"P\" not implemented!';\n\n case \"T\": /* Timezone abbreviation */\n throw '\"T\" not implemented!';\n\n case \"Z\": /* Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. */\n result[ i ] = '(\\\\-?\\\\d{1,5})';\n objIndex.diffM = { original : i , match : matches++ };\n break;\n\n /* FULL DATE/TIME */\n case \"c\": /* ISO 8601 date */\n throw '\"c\" not implemented!';\n\n case \"r\": /* RFC 2822 formatted date */\n result[ i ] = '([\\\\wá]{3}, \\\\d{1,2} \\\\w{3} \\\\d{4} \\\\d{2}:\\\\d{2}:\\\\d{2} [+\\\\-]\\\\d{4})';\n objIndex.date = { original : i , match : matches++ };\n break;\n\n case \"U\": /* Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) */\n result[ i ] = '(\\\\d{1,13})';\n objIndex.date = { original : i , match : matches++ };\n break;\n\n default:\n result[ i ] = iFormat[ i ];\n }\n }\n\n var pattr = new RegExp( result.join('') );\n\n try {\n mList = str_date.match( pattr );\n if ( !mList ) { return; }\n }\n catch ( e ) { return ; }\n\n var _haveDatetime = typeof objIndex.date !== 'undefined';\n\n var _haveYear = typeof objIndex.year !== 'undefined';\n\n var _haveYDay = typeof objIndex.dayY !== 'undefined';\n\n var _haveDay = typeof objIndex.day !== 'undefined';\n var _haveMonth = typeof objIndex.month !== 'undefined';\n var _haveMonthDay = _haveMonth && _haveDay;\n var _haveOnlyDay = !_haveMonth && _haveDay;\n\n var _haveWDay = typeof objIndex.dayW !== 'undefined';\n var _haveWeek = typeof objIndex.week !== 'undefined';\n var _haveWeekWDay = _haveWeek && _haveWDay;\n var _haveOnlyWDay = !_haveWeek && _haveWDay;\n\n var _validDate = _haveYDay || _haveMonthDay || !_haveYear && _haveOnlyDay || _haveWeekWDay || !_haveYear && _haveOnlyWDay;\n var _noDate = !_haveYear && !_haveYDay && !_haveDay && !_haveMonth && !_haveWDay && !_haveWeek;\n\n var _haveHour12 = typeof objIndex.hourD !== 'undefined' && typeof objIndex.ampm !== 'undefined';\n var _haveHour24 = typeof objIndex.hour !== 'undefined';\n var _haveHour = _haveHour12 || _haveHour24;\n\n var _haveMin = typeof objIndex.min !== 'undefined';\n var _haveSec = typeof objIndex.sec !== 'undefined';\n var _haveMSec = typeof objIndex.msec !== 'undefined';\n\n var _haveMoreM = !_noDate || _haveHour;\n var _haveMoreS = _haveMoreM || _haveMin;\n\n var _haveDiffM = typeof objIndex.diffM !== 'undefined';\n var _haveDiffH = typeof objIndex.diffH !== 'undefined';\n //var _haveGMT = _haveDiffM || _haveDiffH;\n var hour;\n var min;\n\n if ( _haveDatetime ) {\n if ( iFormat[ objIndex.date.original ] === 'U' ) {\n return new Date( +mList[ objIndex.date.match + 1 ] * 1000 );\n }\n\n var dList = mList[ objIndex.date.match + 1 ].match( /\\w{3}, (\\d{1,2}) (\\w{3}) (\\d{4}) (\\d{2}):(\\d{2}):(\\d{2}) ([+\\-]\\d{4})/ );\n hour = +dList[ 4 ] + ( +dList[ 7 ].slice( 0 , 3 ) );\n min = +dList[ 5 ] + ( dList[ 7 ].slice( 0 , 1 ) + dList[ 7 ].slice( 3 ) ) / 100 * 60;\n\n return new Date( dList[ 3 ] , this._iMonth( dList[ 2 ] ) , dList[ 1 ] , hour , min , dList[ 6 ] );\n }\n\n var _d = new Date( );\n var year;\n var month;\n var day;\n var sec;\n var msec;\n var gmt;\n\n if ( !_validDate && !_noDate ) { return ; }\n\n if ( _validDate ) {\n if ( _haveYear ) {\n var _y = _d.getFullYear( ) - 50 + '';\n year = mList[ objIndex.year.match + 1 ];\n if ( iFormat[ objIndex.year.original ] === 'y' ) {\n year = +_y.slice( 0 , 2 ) + ( year >= ( _y ).slice( 2 ) ? 0 : 1 ) + year;\n }\n } else {\n year = _d.getFullYear();\n }\n\n if ( _haveYDay ) {\n month = 0;\n day = mList[ objIndex.dayY.match + 1 ];\n } else if ( _haveDay ) {\n if ( _haveMonth ) {\n month = this._iMonth( mList[ objIndex.month.match + 1 ] );\n } else {\n month = _d.getMonth( );\n }\n\n day = mList[ objIndex.day.match + 1 ];\n } else {\n month = 0;\n\n var week;\n if ( _haveWeek ) {\n week = mList[ objIndex.week.match + 1 ];\n } else {\n week = this.get( 'W' , _d );\n }\n\n day = ( week - 2 ) * 7 + ( 8 - ( ( new Date( year , 0 , 1 ) ).getDay( ) || 7 ) ) + this._iWeek( mList[ objIndex.week.match + 1 ] );\n }\n\n if ( month === 0 && day > 31 ) {\n var aux = new Date( year , month , day );\n month = aux.getMonth( );\n day = aux.getDate( );\n }\n }\n else {\n year = _d.getFullYear( );\n month = _d.getMonth( );\n day = _d.getDate( );\n }\n\n if ( _haveHour12 ) { hour = +mList[ objIndex.hourD.match + 1 ] + ( mList[ objIndex.ampm.match + 1 ] === 'pm' ? 12 : 0 ); }\n else if ( _haveHour24 ) { hour = mList[ objIndex.hour.match + 1 ]; }\n else if ( _noDate ) { hour = _d.getHours( ); }\n else { hour = '00'; }\n\n if ( _haveMin ) { min = mList[ objIndex.min.match + 1 ]; }\n else if ( !_haveMoreM ) { min = _d.getMinutes( ); }\n else { min = '00'; }\n\n if ( _haveSec ) { sec = mList[ objIndex.sec.match + 1 ]; }\n else if ( !_haveMoreS ) { sec = _d.getSeconds( ); }\n else { sec = '00'; }\n\n if ( _haveMSec ) { msec = mList[ objIndex.msec.match + 1 ]; }\n else { msec = '000'; }\n\n if ( _haveDiffH ) { gmt = mList[ objIndex.diffH.match + 1 ]; }\n else if ( _haveDiffM ) { gmt = String( -1 * mList[ objIndex.diffM.match + 1 ] / 60 * 100 ).replace( /^(\\d)/ , '+$1' ).replace( /(^[\\-+])(\\d{3}$)/ , '$10$2' ); }\n else { gmt = '+0000'; }\n\n return new Date( year, month, day, hour, min, sec );\n }\n };\n\n\n return InkDate;\n\n});\n","/**\n * Dump/Profiling Utilities\n * @module Ink.Util.Dumper_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Dumper', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Dumper_1 \n */\n\n var Dumper = {\n\n /**\n * Hex code for the 'tab'\n * \n * @property _tab\n * @type {String}\n * @private\n * @readOnly\n * @static\n *\n */\n _tab: '\\xA0\\xA0\\xA0\\xA0',\n\n /**\n * Function that returns the argument passed formatted\n *\n * @method _formatParam\n * @param {Mixed} param The thing to format.\n * @return {String} The argument passed formatted\n * @private\n * @static\n */\n _formatParam: function(param)\n {\n var formated = '';\n\n switch(typeof(param)) {\n case 'string':\n formated = '(string) '+param;\n break;\n case 'number':\n formated = '(number) '+param;\n break;\n case 'boolean':\n formated = '(boolean) '+param;\n break;\n case 'object':\n if(param !== null) {\n if(param.constructor === Array) {\n formated = 'Array \\n{\\n' + this._outputFormat(param, 0) + '\\n}';\n } else {\n formated = 'Object \\n{\\n' + this._outputFormat(param, 0) + '\\n}';\n }\n } else {\n formated = 'null';\n }\n break;\n default:\n formated = false;\n }\n\n return formated;\n },\n\n /**\n * Function that returns the tabs concatenated\n *\n * @method _getTabs\n * @param {Number} numberOfTabs Number of Tabs\n * @return {String} Tabs concatenated\n * @private\n * @static\n */\n _getTabs: function(numberOfTabs)\n {\n var tabs = '';\n for(var _i = 0; _i < numberOfTabs; _i++) {\n tabs += this._tab;\n }\n return tabs;\n },\n\n /**\n * Function that formats the parameter to display.\n *\n * @method _outputFormat\n * @param {Mixed} param The thing to format.\n * @param {Number} indent Indentation level.\n * @return {String} The parameter passed formatted to displat\n * @private\n * @static\n */\n _outputFormat: function(param, indent)\n {\n var formated = '';\n //var _strVal = false;\n var _typeof = false;\n for(var key in param) {\n if(param[key] !== null) {\n if(typeof(param[key]) === 'object' && (param[key].constructor === Array || param[key].constructor === Object)) {\n if(param[key].constructor === Array) {\n _typeof = 'Array';\n } else if(param[key].constructor === Object) {\n _typeof = 'Object';\n }\n formated += this._tab + this._getTabs(indent) + '[' + key + '] => '+_typeof+'\\n';\n formated += this._tab + this._getTabs(indent) + '{\\n';\n formated += this._outputFormat(param[key], indent + 1) + this._tab + this._getTabs(indent) + '}\\n';\n } else if(param[key].constructor === Function) {\n continue;\n } else {\n formated = formated + this._tab + this._getTabs(indent) + '[' + key + '] => ' + param[key] + '\\n';\n }\n } else {\n formated = formated + this._tab + this._getTabs(indent) + '[' + key + '] => null \\n';\n }\n }\n return formated;\n },\n\n /**\n * Prints variable structure.\n *\n * @method printDump\n * @param {Mixed} param Variable to be dumped.\n * @param {DOMElement|String} [target] Element to print the dump on.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Dumper_printDump.html \n */\n printDump: function(param, target)\n {\n /*jshint evil:true */\n if(!target || typeof(target) === 'undefined') {\n document.write('
              '+this._formatParam(param)+'
              ');\n } else {\n if(typeof(target) === 'string') {\n document.getElementById(target).innerHTML = '
              ' + this._formatParam(param) + '
              ';\n } else if(typeof(target) === 'object') {\n target.innerHTML = '
              '+this._formatParam(param)+'
              ';\n } else {\n throw \"TARGET must be an element or an element ID\";\n }\n }\n },\n\n /**\n * Get a variable's structure.\n *\n * @method returnDump\n * @param {Mixed} param Variable to get the structure.\n * @return {String} The variable's structure.\n * @public\n * @static\n * @sample Ink_Util_Dumper_returnDump.html \n */\n returnDump: function(param)\n {\n return this._formatParam(param);\n },\n\n /**\n * Alert a variable's structure.\n *\n * @method alertDump\n * @param {Mixed} param Variable to be dumped.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Dumper_alertDump.html \n */\n alertDump: function(param)\n {\n window.alert(this._formatParam(param).replace(/()(Array|Object)(<\\/b>)/g, \"$2\"));\n },\n\n /**\n * Prints the variable structure to a new window.\n *\n * @method windowDump\n * @param {Mixed} param Variable to be dumped.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Dumper_windowDump.html \n */\n windowDump: function(param)\n {\n var dumperwindow = 'dumperwindow_'+(Math.random() * 10000);\n var win = window.open('',\n dumperwindow,\n 'width=400,height=300,left=50,top=50,status,menubar,scrollbars,resizable'\n );\n win.document.open();\n win.document.write('
              '+this._formatParam(param)+'
              ');\n win.document.close();\n win.focus();\n }\n\n };\n\n return Dumper;\n\n});\n","/**\n * Internationalization Utilities \n * @module Ink.Util.I18n_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.I18n', '1', [], function () {\n 'use strict';\n\n var pattrText = /\\{(?:(\\{.*?})|(?:%s:)?(\\d+)|(?:%s)?|([\\w-]+))}/g;\n\n var funcOrVal = function( ret , args ) {\n if ( typeof ret === 'function' ) {\n return ret.apply(this, args);\n } else if (typeof ret !== undefined) {\n return ret;\n } else {\n return '';\n }\n };\n\n /**\n * You can use this module to internationalize your applications. It roughly emulates GNU gettext's API.\n *\n * @class Ink.Util.I18n\n * @constructor\n *\n * @param {Object} dict Object mapping language codes (in the form of `pt_PT`, `pt_BR`, `fr`, `en_US`, etc.) to their `dictionaries`\n * @param {String} [lang='pt_PT'] language code of the target language\n * @param {Boolean} [testMode=false] Sets the test mode (see `testMode()`) on construction.\n *\n * @sample Ink_Util_I18n_1.html\n */\n var I18n = function( dict , lang , testMode ) {\n if ( !( this instanceof I18n ) ) { return new I18n( dict , lang , testMode ); }\n\n this.reset( )\n .lang( lang )\n .testMode( testMode )\n .append( dict || { } , lang );\n };\n\n I18n.prototype = {\n reset: function( ) {\n this._dicts = [ ];\n this._dict = { };\n this._testMode = false;\n this._lang = this._gLang;\n\n return this;\n },\n /**\n * Adds translation strings for the helper to use.\n *\n * @method append\n * @param {Object} dict Object containing language objects identified by their language code\n * @return {I18n} (itself)\n *\n * @sample Ink_Util_I18n_1_append.html\n */\n append: function( dict ) {\n this._dicts.push( dict );\n\n this._dict = Ink.extendObj(this._dict , dict[ this._lang ] );\n\n return this;\n },\n /**\n * Gets or sets the language.\n * If there are more dictionaries available in cache, they will be loaded.\n *\n * @method lang\n * @param {String} [lang] Language code to set this instance to. Omit this argument if you want to get the language code instead.\n * @return {String|I18n} The language code, if called without arguments, or this I18n instance if called with an argument.\n */\n lang: function( lang ) {\n if ( !arguments.length ) { return this._lang; }\n\n if ( lang && this._lang !== lang ) {\n this._lang = lang;\n\n this._dict = { };\n\n for ( var i = 0, l = this._dicts.length; i < l; i++ ) {\n this._dict = Ink.extendObj( this._dict , this._dicts[ i ][ lang ] || { } );\n }\n }\n\n return this;\n },\n /**\n * Sets or unsets test mode.\n * In test mode, unknown strings are wrapped in `[ ... ]`. This is useful for debugging your application and to make sure all your translation keys are in place.\n *\n * @method testMode\n * @param {Boolean} [newTestMode] Flag to set the test mode state. Omit this argument to *get* the current testMode instead.\n * @return {String|I18n} The current testMode, if called without arguments, or this I18n instance if called with an argument.\n *\n */\n testMode: function( newTestMode ) {\n if ( !arguments.length ) { return !!this._testMode; }\n\n if ( newTestMode !== undefined ) { this._testMode = !!newTestMode; }\n\n return this;\n },\n\n /**\n * Gest a key from the current dictionary\n *\n * @method getKey\n * @param {String} key Key you wish to get from the dictionary.\n * @return {Mixed} The object which happened to be in the current language dictionary on the given key.\n *\n * @sample Ink_Util_I18n_1_getKey.html\n */\n getKey: function( key ) {\n var ret;\n var gLang = this._gLang;\n var lang = this._lang;\n \n if ( key in this._dict ) {\n ret = this._dict[ key ];\n } else {\n I18n.langGlobal( lang );\n \n ret = this._gDict[ key ];\n \n I18n.langGlobal( gLang );\n }\n \n return ret;\n },\n\n /**\n * Translates a string.\n * Given a translation key, return a translated string, with replaced parameters.\n * When a translated string is not available, the original string is returned unchanged.\n *\n * @method text\n * @param {String} str Key to look for in i18n dictionary (which is returned verbatim if unknown)\n * @param {Object} [namedParms] Named replacements. Replaces {named} with values in this object.\n * @param {String} [args] Replacement #1 (replaces first {} and all {1})\n * @param {String} [arg2] Replacement #2 (replaces second {} and all {2})\n * @param {String} [argn...] Replacement #n (replaces nth {} and all {n})\n *\n * @return {String} Translated string.\n *\n * @sample Ink_Util_I18n_1_text.html\n */\n text: function( str /*, replacements...*/ ) {\n if ( typeof str !== 'string' ) { return; } // Backwards-compat\n\n var pars = Array.prototype.slice.call( arguments , 1 );\n var idx = 0;\n var isObj = typeof pars[ 0 ] === 'object';\n\n var original = this.getKey( str );\n if ( original === undefined ) { original = this._testMode ? '[' + str + ']' : str; }\n if ( typeof original === 'number' ) { original += ''; }\n\n if (typeof original === 'string') {\n original = original.replace( pattrText , function( m , $1 , $2 , $3 ) {\n var ret =\n $1 ? $1 :\n $2 ? pars[ $2 - ( isObj ? 0 : 1 ) ] :\n $3 ? pars[ 0 ][ $3 ] || '' :\n pars[ (idx++) + ( isObj ? 1 : 0 ) ];\n return funcOrVal( ret , [idx].concat(pars) );\n });\n return original;\n }\n \n return (\n typeof original === 'function' ? original.apply( this , pars ) :\n original instanceof Array ? funcOrVal( original[ pars[ 0 ] ] , pars ) :\n typeof original === 'object' ? funcOrVal( original[ pars[ 0 ] ] , pars ) :\n '');\n },\n\n /**\n * Translates and pluralizes text.\n * Given a singular string, a plural string and a number, translates either the singular or plural string.\n *\n * @method ntext\n *\n * @param {String} strSin Word to use when count is 1\n * @param {String} strPlur Word to use otherwise\n * @param {Number} count Number which defines which word to use\n * @param {Mixed} [args...] Extra arguments, to be passed to `text()`\n *\n * @return {String} Pluralized text string.\n *\n * @sample Ink_Util_I18n_1_ntext.html\n */\n ntext: function( strSin , strPlur , count ) {\n var pars = Array.prototype.slice.apply( arguments );\n var original;\n\n if ( pars.length === 2 && typeof strPlur === 'number' ) {\n original = this.getKey( strSin );\n if ( !( original instanceof Array ) ) { return ''; }\n\n pars.splice( 0 , 1 );\n original = original[ strPlur === 1 ? 0 : 1 ];\n } else {\n pars.splice( 0 , 2 );\n original = count === 1 ? strSin : strPlur;\n }\n\n return this.text.apply( this , [ original ].concat( pars ) );\n },\n\n /**\n * Gets the ordinal suffix of a number.\n *\n * This works by using transforms (in the form of Objects or Functions) passed into the function or found in the special key `_ordinals` in the active language dictionary.\n *\n * @method ordinal\n *\n * @param {Number} num Input number\n * @param {Object|Function} [options]={} Dictionaries for translating. Each of these options' fallback is found in the current language's dictionary. The lookup order is the following: `exceptions`, `byLastDigit`, `default`. Each of these may be either an `Object` or a `Function`. If it's a function, it is called (with `number` and `digit` for any function except for byLastDigit, which is called with the `lastDigit` of the number in question), and if the function returns a string, that is used. If it's an object, the property is looked up using `obj[prop]`. If what is found is a string, it is used directly.\n * @param {Object|Function} [options.byLastDigit]={} If the language requires the last digit to be considered, mappings of last digits to ordinal suffixes can be created here.\n * @param {Object|Function} [options.exceptions]={} Map unique, special cases to their ordinal suffixes.\n *\n * @returns {String} Ordinal suffix for `num`.\n *\n * @sample Ink_Util_I18n_1_ordinal.html\n **/\n ordinal: function( num ) {\n if ( num === undefined ) { return ''; }\n\n var lastDig = +num.toString( ).slice( -1 );\n\n var ordDict = this.getKey( '_ordinals' );\n if ( ordDict === undefined ) { return ''; }\n\n if ( typeof ordDict === 'string' ) { return ordDict; }\n\n var ret;\n\n if ( typeof ordDict === 'function' ) {\n ret = ordDict( num , lastDig );\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n if ( 'exceptions' in ordDict ) {\n ret = typeof ordDict.exceptions === 'function' ? ordDict.exceptions( num , lastDig ) :\n num in ordDict.exceptions ? funcOrVal( ordDict.exceptions[ num ] , [num , lastDig] ) :\n undefined;\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n if ( 'byLastDigit' in ordDict ) {\n ret = typeof ordDict.byLastDigit === 'function' ? ordDict.byLastDigit( lastDig , num ) :\n lastDig in ordDict.byLastDigit ? funcOrVal( ordDict.byLastDigit[ lastDig ] , [lastDig , num] ) :\n undefined;\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n if ( 'default' in ordDict ) {\n ret = funcOrVal( ordDict['default'] , [ num , lastDig ] );\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n return '';\n },\n\n /**\n * Create an alias.\n *\n * Returns an alias to this I18n instance. It contains the I18n methods documented here, but is also a function. If you call it, it just calls `text()`. This is commonly assigned to \"_\".\n *\n * @method alias\n * @returns {Function} an alias to `text()` on this instance. You can also access the rest of the translation API through this alias.\n *\n * @sample Ink_Util_I18n_1_alias.html\n */\n alias: function( ) {\n var ret = Ink.bind( I18n.prototype.text , this );\n ret.ntext = Ink.bind( I18n.prototype.ntext , this );\n ret.append = Ink.bind( I18n.prototype.append , this );\n ret.ordinal = Ink.bind( I18n.prototype.ordinal , this );\n ret.testMode = Ink.bind( I18n.prototype.testMode , this );\n\n return ret;\n }\n };\n\n /**\n * Resets I18n global state (global dictionaries, and default language for instances)\n *\n * @method reset\n * @return {void}\n * @static\n *\n **/\n I18n.reset = function( ) {\n I18n.prototype._gDicts = [ ];\n I18n.prototype._gDict = { };\n I18n.prototype._gLang = 'pt_PT';\n };\n I18n.reset( );\n\n /**\n * Adds a dictionary to be used in all I18n instances for the corresponding language.\n *\n * @method appendGlobal\n * @static\n *\n * @param {Object} dict Dictionary to be added\n * @param {String} lang Language fo the dictionary being added\n * @return {void}\n *\n */\n I18n.appendGlobal = function( dict , lang ) {\n if ( lang ) {\n if ( !( lang in dict ) ) {\n var obj = { };\n\n obj[ lang ] = dict;\n\n dict = obj;\n }\n\n if ( lang !== I18n.prototype._gLang ) { I18n.langGlobal( lang ); }\n }\n\n I18n.prototype._gDicts.push( dict );\n\n Ink.extendObj( I18n.prototype._gDict , dict[ I18n.prototype._gLang ] );\n };\n\n /**\n * Gets or sets the current default language of I18n instances.\n *\n * @method langGlobal\n * @param {String} [lang] the new language for all I18n instances. Omit this argument if you wish to *get* the current default language instead.\n *\n * @static\n *\n * @return {String} language code, or nothing if not used as a setter.\n */\n I18n.langGlobal = function( lang ) {\n if ( !arguments.length ) { return I18n.prototype._gLang; }\n\n if ( lang && I18n.prototype._gLang !== lang ) {\n I18n.prototype._gLang = lang;\n\n I18n.prototype._gDict = { };\n\n for ( var i = 0, l = I18n.prototype._gDicts.length; i < l; i++ ) {\n Ink.extendObj( I18n.prototype._gDict , I18n.prototype._gDicts[ i ][ lang ] || { } );\n }\n }\n };\n\n return I18n;\n});","/**\n * JSON Utilities\n * @module Ink.Util.Json_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Json', '1', [], function() {\n 'use strict';\n\n var function_call = Function.prototype.call;\n var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n\n function twoDigits(n) {\n var r = '' + n;\n if (r.length === 1) {\n return '0' + r;\n } else {\n return r;\n }\n }\n\n var dateToISOString = Date.prototype.toISOString ?\n Ink.bind(function_call, Date.prototype.toISOString) :\n function(date) {\n // Adapted from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString\n return date.getUTCFullYear() +\n '-' + twoDigits( date.getUTCMonth() + 1 ) +\n '-' + twoDigits( date.getUTCDate() ) +\n 'T' + twoDigits( date.getUTCHours() ) +\n ':' + twoDigits( date.getUTCMinutes() ) +\n ':' + twoDigits( date.getUTCSeconds() ) +\n '.' + String( (date.getUTCMilliseconds()/1000).toFixed(3) ).slice( 2, 5 ) +\n 'Z';\n };\n\n /**\n * Use this class to convert JSON strings to JavaScript objects\n * `.parse()` and also to do the opposite operation `.stringify()`.\n * Internally, the standard JSON implementation is used if available\n * Otherwise, the functions mimic the standard implementation.\n *\n * Here's how to produce JSON from an existing object:\n * \n * Ink.requireModules(['Ink.Util.Json_1'], function (Json) {\n * var obj = {\n * key1: 'value1',\n * key2: 'value2',\n * keyArray: ['arrayValue1', 'arrayValue2', 'arrayValue3']\n * };\n * Json.stringify(obj); // The above object as a JSON string\n * });\n *\n * And here is how to parse JSON:\n *\n * Ink.requireModules(['Ink.Util.Json_1'], function (Json) {\n * var source = '{\"key\": \"value\", \"array\": [true, null, false]}';\n * Json.parse(source); // The above JSON string as an object\n * });\n *\n * @namespace Ink.Util.Json_1 \n * @static\n * \n */\n var InkJson = {\n _nativeJSON: window.JSON || null,\n\n _convertToUnicode: false,\n\n // Escape characters so as to embed them in JSON strings\n _escape: function (theString) {\n var _m = { '\\b': '\\\\b', '\\t': '\\\\t', '\\n': '\\\\n', '\\f': '\\\\f', '\\r': '\\\\r', '\"': '\\\\\"', '\\\\': '\\\\\\\\' };\n\n if (/[\"\\\\\\x00-\\x1f]/.test(theString)) {\n theString = theString.replace(/([\\x00-\\x1f\\\\\"])/g, function(a, b) {\n var c = _m[b];\n if (c) {\n return c;\n }\n c = b.charCodeAt();\n return '\\\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);\n });\n }\n\n return theString;\n },\n\n // A character conversion map\n _toUnicode: function (theString)\n {\n if(!this._convertToUnicode) {\n return this._escape(theString);\n } else {\n var unicodeString = '';\n var inInt = false;\n var theUnicode = false;\n var i = 0;\n var total = theString.length;\n while(i < total) {\n inInt = theString.charCodeAt(i);\n if( (inInt >= 32 && inInt <= 126) ||\n //(inInt >= 48 && inInt <= 57) ||\n //(inInt >= 65 && inInt <= 90) ||\n //(inInt >= 97 && inInt <= 122) ||\n inInt === 8 ||\n inInt === 9 ||\n inInt === 10 ||\n inInt === 12 ||\n inInt === 13 ||\n inInt === 32 ||\n inInt === 34 ||\n inInt === 47 ||\n inInt === 58 ||\n inInt === 92) {\n\n if(inInt === 34 || inInt === 92 || inInt === 47) {\n theUnicode = '\\\\'+theString.charAt(i);\n } else if(inInt === 8) {\n theUnicode = '\\\\b';\n } else if(inInt === 9) {\n theUnicode = '\\\\t';\n } else if(inInt === 10) {\n theUnicode = '\\\\n';\n } else if(inInt === 12) {\n theUnicode = '\\\\f';\n } else if(inInt === 13) {\n theUnicode = '\\\\r';\n } else {\n theUnicode = theString.charAt(i);\n }\n } else {\n if(this._convertToUnicode) {\n theUnicode = theString.charCodeAt(i).toString(16)+''.toUpperCase();\n while (theUnicode.length < 4) {\n theUnicode = '0' + theUnicode;\n }\n theUnicode = '\\\\u' + theUnicode;\n } else {\n theUnicode = theString.charAt(i);\n }\n }\n unicodeString += theUnicode;\n\n i++;\n }\n\n return unicodeString;\n }\n\n },\n\n _stringifyValue: function(param) {\n if (typeof param === 'string') {\n return '\"' + this._toUnicode(param) + '\"';\n } else if (typeof param === 'number' && (isNaN(param) || !isFinite(param))) { // Unusable numbers go null\n return 'null';\n } else if (typeof param === 'undefined' || param === null) { // And so does undefined\n return 'null';\n } else if (typeof param.toJSON === 'function') {\n var t = param.toJSON();\n if (typeof t === 'string') {\n return '\"' + this._escape(t) + '\"';\n } else {\n return this._escape(t.toString());\n }\n } else if (typeof param === 'number' || typeof param === 'boolean') { // These ones' toString methods return valid JSON.\n return '' + param;\n } else if (typeof param === 'function') {\n return 'null'; // match JSON.stringify\n } else if (param.constructor === Date) {\n return '\"' + this._escape(dateToISOString(param)) + '\"';\n } else if (param.constructor === Array) {\n var arrayString = '';\n for (var i = 0, len = param.length; i < len; i++) {\n if (i > 0) {\n arrayString += ',';\n }\n arrayString += this._stringifyValue(param[i]);\n }\n return '[' + arrayString + ']';\n } else { // Object\n var objectString = '';\n for (var k in param) {\n if ({}.hasOwnProperty.call(param, k)) {\n if (objectString !== '') {\n objectString += ',';\n }\n objectString += '\"' + this._escape(k) + '\": ' + this._stringifyValue(param[k]);\n }\n }\n return '{' + objectString + '}';\n }\n },\n\n /**\n * Serializes a JSON object into a string.\n *\n * @method stringify\n * @param {Object} input Data to be serialized into JSON\n * @param {Boolean} convertToUnicode When `true`, converts string contents to unicode \\uXXXX\n * @return {String} Serialized string\n *\n * @sample Ink_Util_Json_stringify.html \n */\n stringify: function(input, convertToUnicode) {\n this._convertToUnicode = !!convertToUnicode;\n if(!this._convertToUnicode && this._nativeJSON) {\n return this._nativeJSON.stringify(input);\n }\n return this._stringifyValue(input); // And recurse.\n },\n \n /**\n * Parses a JSON text through a function\n * \n * @method parse\n * @param text {String} Input string\n * @param reviver {Function} Function receiving `(key, value)`, and `this`=(containing object), used to walk objects.\n * \n * @return {Object} JSON object\n *\n * @sample Ink_Util_Json_parse.html \n */\n /* From https://github.com/douglascrockford/JSON-js/blob/master/json.js */\n parse: function (text, reviver) {\n /*jshint evil:true*/\n\n// The parse method takes a text and an optional reviver function, and returns\n// a JavaScript value if the text is a valid JSON text.\n\n var j;\n\n function walk(holder, key) {\n\n// The walk method is used to recursively walk the resulting structure so\n// that modifications can be made.\n\n var k, v, value = holder[key];\n if (value && typeof value === 'object') {\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = walk(value, k);\n if (v !== undefined) {\n value[k] = v;\n } else {\n delete value[k];\n }\n }\n }\n }\n return reviver.call(holder, key, value);\n }\n\n\n// Parsing happens in four stages. In the first stage, we replace certain\n// Unicode characters with escape sequences. JavaScript handles many characters\n// incorrectly, either silently deleting them, or treating them as line endings.\n\n text = String(text);\n cx.lastIndex = 0;\n if (cx.test(text)) {\n text = text.replace(cx, function (a) {\n return '\\\\u' +\n ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n });\n }\n\n// In the second stage, we run the text against regular expressions that look\n// for non-JSON patterns. We are especially concerned with '()' and 'new'\n// because they can cause invocation, and '=' because it can cause mutation.\n// But just to be safe, we want to reject all unexpected forms.\n\n// We split the second stage into 4 regexp operations in order to work around\n// crippling inefficiencies in IE's and Safari's regexp engines. First we\n// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we\n// replace all simple value tokens with ']' characters. Third, we delete all\n// open brackets that follow a colon or comma or that begin the text. Finally,\n// we look to see that the remaining characters are only whitespace or ']' or\n// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.\n\n if (/^[\\],:{}\\s]*$/\n .test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')\n .replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']')\n .replace(/(?:^|:|,)(?:\\s*\\[)+/g, ''))) {\n\n// In the third stage we use the eval function to compile the text into a\n// JavaScript structure. The '{' operator is subject to a syntactic ambiguity\n// in JavaScript: it can begin a block or an object literal. We wrap the text\n// in parens to eliminate the ambiguity.\n\n j = eval('(' + text + ')');\n\n// In the optional fourth stage, we recursively walk the new structure, passing\n// each name/value pair to a reviver function for possible transformation.\n\n return typeof reviver === 'function' ?\n walk({'': j}, '') :\n j;\n }\n\n// If the text is not JSON parseable, then a SyntaxError is thrown.\n\n throw new SyntaxError('JSON.parse');\n }\n };\n\n return InkJson;\n});\n","/**\n * String Utilities\n * @module Ink.Util.String_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.String', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.String_1 \n */\n var InkUtilString = {\n\n /**\n * List of special chars\n * \n * @property _chars\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _chars: ['&','à','á','â','ã','ä','å','æ','ç','è','é',\n 'ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô',\n 'õ','ö','ø','ù','ú','û','ü','ý','þ','ÿ','À',\n 'Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë',\n 'Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö',\n 'Ø','Ù','Ú','Û','Ü','Ý','Þ','€','\\\"','ß','<',\n '>','¢','£','¤','¥','¦','§','¨','©','ª','«',\n '¬','\\xad','®','¯','°','±','²','³','´','µ','¶',\n '·','¸','¹','º','»','¼','½','¾'],\n\n /**\n * List of the special characters' html entities\n * \n * @property _entities\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _entities: ['amp','agrave','aacute','acirc','atilde','auml','aring',\n 'aelig','ccedil','egrave','eacute','ecirc','euml','igrave',\n 'iacute','icirc','iuml','eth','ntilde','ograve','oacute',\n 'ocirc','otilde','ouml','oslash','ugrave','uacute','ucirc',\n 'uuml','yacute','thorn','yuml','Agrave','Aacute','Acirc',\n 'Atilde','Auml','Aring','AElig','Ccedil','Egrave','Eacute',\n 'Ecirc','Euml','Igrave','Iacute','Icirc','Iuml','ETH','Ntilde',\n 'Ograve','Oacute','Ocirc','Otilde','Ouml','Oslash','Ugrave',\n 'Uacute','Ucirc','Uuml','Yacute','THORN','euro','quot','szlig',\n 'lt','gt','cent','pound','curren','yen','brvbar','sect','uml',\n 'copy','ordf','laquo','not','shy','reg','macr','deg','plusmn',\n 'sup2','sup3','acute','micro','para','middot','cedil','sup1',\n 'ordm','raquo','frac14','frac12','frac34'],\n\n /**\n * List of accented chars\n * \n * @property _accentedChars\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _accentedChars:['à','á','â','ã','ä','å',\n 'è','é','ê','ë',\n 'ì','í','î','ï',\n 'ò','ó','ô','õ','ö',\n 'ù','ú','û','ü',\n 'ç','ñ',\n 'À','Á','Â','Ã','Ä','Å',\n 'È','É','Ê','Ë',\n 'Ì','Í','Î','Ï',\n 'Ò','Ó','Ô','Õ','Ö',\n 'Ù','Ú','Û','Ü',\n 'Ç','Ñ'],\n\n /**\n * List of the accented chars (above), but without the accents\n * \n * @property _accentedRemovedChars\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _accentedRemovedChars:['a','a','a','a','a','a',\n 'e','e','e','e',\n 'i','i','i','i',\n 'o','o','o','o','o',\n 'u','u','u','u',\n 'c','n',\n 'A','A','A','A','A','A',\n 'E','E','E','E',\n 'I','I','I','I',\n 'O','O','O','O','O',\n 'U','U','U','U',\n 'C','N'],\n /**\n * Object that contains the basic HTML unsafe chars, as keys, and their HTML entities as values\n * \n * @property _htmlUnsafeChars\n * @type {Object}\n * @private\n * @readOnly\n * @static\n */\n _htmlUnsafeChars:{'<':'<','>':'>','&':'&','\"':'"',\"'\":'''},\n\n /**\n * Capitalizes a word.\n * If param as more than one word, it converts first letter of all words that have more than 2 letters\n *\n * @method ucFirst\n * @param {String} string String to capitalize.\n * @param {Boolean} [firstWordOnly]=false Flag to capitalize only the first word.\n * @return {String} Camel cased string.\n * @public\n * @static\n * @sample Ink_Util_String_ucFirst.html \n */\n ucFirst: function(string, firstWordOnly) {\n var replacer = firstWordOnly ? /(^|\\s)(\\w)(\\S{2,})/ : /(^|\\s)(\\w)(\\S{2,})/g;\n return string ? String(string).replace(replacer, function(_, $1, $2, $3){\n return $1 + $2.toUpperCase() + $3.toLowerCase();\n }) : string;\n },\n\n /**\n * Trims whitespace from strings\n *\n * @method trim\n * @param {String} string String to be trimmed\n * @return {String} Trimmed string\n * @public\n * @static\n * @sample Ink_Util_String_trim.html \n */\n trim: function(string)\n {\n if (typeof string === 'string') {\n return string.replace(/^\\s+|\\s+$|\\n+$/g, '');\n }\n return string;\n },\n\n /**\n * Strips HTML tags from strings\n *\n * @method stripTags\n * @param {String} string String to strip tags from.\n * @param {String} allowed Comma separated list of allowed tags.\n * @return {String} Stripped string\n * @public\n * @static\n * @sample Ink_Util_String_stripTags.html \n */\n stripTags: function(string, allowed)\n {\n if (allowed && typeof allowed === 'string') {\n var aAllowed = InkUtilString.trim(allowed).split(',');\n var aNewAllowed = [];\n var cleanedTag = false;\n for(var i=0; i < aAllowed.length; i++) {\n if(InkUtilString.trim(aAllowed[i]) !== '') {\n cleanedTag = InkUtilString.trim(aAllowed[i].replace(/(<|\\>)/g, '').replace(/\\s/, ''));\n aNewAllowed.push('(<'+cleanedTag+'\\\\s[^>]+>|<(\\\\s|\\\\/)?(\\\\s|\\\\/)?'+cleanedTag+'>)');\n }\n }\n var strAllowed = aNewAllowed.join('|');\n var reAllowed = new RegExp(strAllowed, \"i\");\n\n var aFoundTags = string.match(new RegExp(\"<[^>]*>\", \"g\"));\n\n for(var j=0; j < aFoundTags.length; j++) {\n if(!aFoundTags[j].match(reAllowed)) {\n string = string.replace((new RegExp(aFoundTags[j], \"gm\")), '');\n }\n }\n return string;\n } else {\n return string.replace(/<[^\\>]+\\>/g, '');\n }\n },\n\n /**\n * Encodes string into HTML entities.\n *\n * @method htmlEntitiesEncode\n * @param {String} string Input string.\n * @return {String} HTML encoded string.\n * @public\n * @static\n * @sample Ink_Util_String_htmlEntitiesEncode.html \n */\n htmlEntitiesEncode: function(string)\n {\n if (string && string.replace) {\n var re = false;\n for (var i = 0; i < InkUtilString._chars.length; i++) {\n re = new RegExp(InkUtilString._chars[i], \"gm\");\n string = string.replace(re, '&' + InkUtilString._entities[i] + ';');\n }\n }\n return string;\n },\n\n /**\n * Decodes string from HTML entities.\n *\n * @method htmlEntitiesDecode\n * @param {String} string String to be decoded\n * @return {String} Decoded string\n * @public\n * @static\n * @sample Ink_Util_String_htmlEntitiesDecode.html \n */\n htmlEntitiesDecode: function(string)\n {\n if (string && string.replace) {\n var re = false;\n for (var i = 0; i < InkUtilString._entities.length; i++) {\n re = new RegExp(\"&\"+InkUtilString._entities[i]+\";\", \"gm\");\n string = string.replace(re, InkUtilString._chars[i]);\n }\n string = string.replace(/&#[^;]+;?/g, function($0){\n if ($0.charAt(2) === 'x') {\n return String.fromCharCode(parseInt($0.substring(3), 16));\n }\n else {\n return String.fromCharCode(parseInt($0.substring(2), 10));\n }\n });\n }\n return string;\n },\n\n /**\n * Encode a string to UTF-8.\n *\n * @method utf8Encode\n * @param {String} string String to be encoded\n * @return {String} string UTF-8 encoded string\n * @public\n * @static\n */\n utf8Encode: function(string) {\n /*jshint bitwise:false*/\n string = string.replace(/\\r\\n/g,\"\\n\");\n var utfstring = \"\";\n\n for (var n = 0; n < string.length; n++) {\n\n var c = string.charCodeAt(n);\n\n if (c < 128) {\n utfstring += String.fromCharCode(c);\n }\n else if((c > 127) && (c < 2048)) {\n utfstring += String.fromCharCode((c >> 6) | 192);\n utfstring += String.fromCharCode((c & 63) | 128);\n }\n else {\n utfstring += String.fromCharCode((c >> 12) | 224);\n utfstring += String.fromCharCode(((c >> 6) & 63) | 128);\n utfstring += String.fromCharCode((c & 63) | 128);\n }\n\n }\n return utfstring;\n },\n\n /**\n * Truncates a string without breaking words. Inserts an ellipsis HTML entity at the end of the string if it's too long.\n *\n * @method shortString\n * @param {String} str String to truncate\n * @param {Number} n Number of chars of the short string\n * @return {String} Truncated string, or the original `str` if it's shorter than `n`\n * @public\n * @static\n * @sample Ink_Util_String_shortString.html \n */\n shortString: function(str,n) {\n var words = str.split(' ');\n var resultstr = '';\n for(var i = 0; i < words.length; i++ ){\n if((resultstr + words[i] + ' ').length>=n){\n resultstr += '…';\n break;\n }\n resultstr += words[i] + ' ';\n }\n return resultstr;\n },\n\n /**\n * Truncates a string, breaking words and adding ... at the end.\n *\n * @method truncateString\n * @param {String} str String to truncate\n * @param {Number} length Limit for the returned string, ellipsis included.\n * @return {String} Truncated String\n * @public\n * @static\n * @sample Ink_Util_String_truncateString.html \n */\n truncateString: function(str, length) {\n if(str.length - 1 > length) {\n return str.substr(0, length - 1) + \"\\u2026\";\n } else {\n return str;\n }\n },\n\n /**\n * Decodes a string from UTF-8.\n *\n * @method utf8Decode\n * @param {String} string String to be decoded\n * @return {String} Decoded string\n * @public\n * @static\n */\n utf8Decode: function(string) {\n /*jshint bitwise:false*/\n var ret = \"\";\n var i = 0, c = 0, c2 = 0, c3 = 0;\n\n while ( i < string.length ) {\n\n c = string.charCodeAt(i);\n\n if (c < 128) {\n ret += String.fromCharCode(c);\n i++;\n }\n else if((c > 191) && (c < 224)) {\n c2 = string.charCodeAt(i+1);\n ret += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n i += 2;\n }\n else {\n c2 = string.charCodeAt(i+1);\n c3 = string.charCodeAt(i+2);\n ret += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n i += 3;\n }\n\n }\n return ret;\n },\n\n /**\n * Removes all accented characters from a string.\n *\n * @method removeAccentedChars\n * @param {String} string String to remove accents from\n * @return {String} String without accented chars\n * @public\n * @static\n * @sample Ink_Util_String_removeAccentedChars.html \n */\n removeAccentedChars: function(string)\n {\n var newString = string;\n var re = false;\n for (var i = 0; i < InkUtilString._accentedChars.length; i++) {\n re = new RegExp(InkUtilString._accentedChars[i], \"gm\");\n newString = newString.replace(re, '' + InkUtilString._accentedRemovedChars[i] + '');\n }\n return newString;\n },\n\n /**\n * Count the number of occurrences of a specific needle in a haystack\n *\n * @method substrCount\n * @param {String} haystack String to search in\n * @param {String} needle String to search for\n * @return {Number} Number of occurrences\n * @public\n * @static\n * @sample Ink_Util_String_substrCount.html \n */\n substrCount: function(haystack,needle)\n {\n return haystack ? haystack.split(needle).length - 1 : 0;\n },\n\n /**\n * Eval a JSON - We recommend you Ink.Util.Json\n *\n * @method evalJSON\n * @param {String} strJSON JSON string to eval\n * @param {Boolean} sanitize Flag to sanitize input\n * @return {Object} JS Object\n * @public\n * @static\n */\n evalJSON: function(strJSON, sanitize) {\n /* jshint evil:true */\n if( (typeof sanitize === 'undefined' || sanitize === null) || InkUtilString.isJSON(strJSON)) {\n try {\n if(typeof(JSON) !== \"undefined\" && typeof(JSON.parse) !== 'undefined'){\n return JSON.parse(strJSON);\n }\n return eval('('+strJSON+')');\n } catch(e) {\n throw new Error('ERROR: Bad JSON string...');\n }\n }\n },\n\n /**\n * Checks if a string is a valid JSON object (string encoded)\n *\n * @method isJSON\n * @param {String} str String to check\n * @return {Boolean} Return whether it's JSON.\n * @public\n * @static\n */\n isJSON: function(str)\n {\n str = str.replace(/\\\\./g, '@').replace(/\"[^\"\\\\\\n\\r]*\"/g, '');\n return (/^[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]*$/).test(str);\n },\n\n /**\n * Escapes unsafe html chars as HTML entities\n *\n * @method htmlEscapeUnsafe\n * @param {String} str String to escape\n * @return {String} Escaped string\n * @public\n * @static\n * @sample Ink_Util_String_htmlEscapeUnsafe.html \n */\n htmlEscapeUnsafe: function(str){\n var chars = InkUtilString._htmlUnsafeChars;\n return str !== null ? String(str).replace(/[<>&'\"]/g,function(c){return chars[c];}) : str;\n },\n\n /**\n * Normalizes whitespace in string.\n * String is trimmed and sequences of whitespaces are collapsed.\n *\n * @method normalizeWhitespace\n * @param {String} str String to normalize\n * @return {String} Normalized string\n * @public\n * @static\n * @sample Ink_Util_String_normalizeWhitespace.html \n */\n normalizeWhitespace: function(str){\n return str !== null ? InkUtilString.trim(String(str).replace(/\\s+/g,' ')) : str;\n },\n\n /**\n * Converts string to unicode.\n *\n * @method toUnicode\n * @param {String} str String to convert\n * @return {String} Unicoded String\n * @public\n * @static\n * @sample Ink_Util_String_toUnicode.html \n */\n toUnicode: function(str) {\n if (typeof str === 'string') {\n var unicodeString = '';\n var inInt = false;\n var theUnicode = false;\n var total = str.length;\n var i=0;\n\n while(i < total)\n {\n inInt = str.charCodeAt(i);\n if( (inInt >= 32 && inInt <= 126) ||\n inInt === 8 ||\n inInt === 9 ||\n inInt === 10 ||\n inInt === 12 ||\n inInt === 13 ||\n inInt === 32 ||\n inInt === 34 ||\n inInt === 47 ||\n inInt === 58 ||\n inInt === 92) {\n\n /*\n if(inInt == 34 || inInt == 92 || inInt == 47) {\n theUnicode = '\\\\'+str.charAt(i);\n } else {\n }\n */\n if(inInt === 8) {\n theUnicode = '\\\\b';\n } else if(inInt === 9) {\n theUnicode = '\\\\t';\n } else if(inInt === 10) {\n theUnicode = '\\\\n';\n } else if(inInt === 12) {\n theUnicode = '\\\\f';\n } else if(inInt === 13) {\n theUnicode = '\\\\r';\n } else {\n theUnicode = str.charAt(i);\n }\n } else {\n theUnicode = str.charCodeAt(i).toString(16)+''.toUpperCase();\n while (theUnicode.length < 4) {\n theUnicode = '0' + theUnicode;\n }\n theUnicode = '\\\\u' + theUnicode;\n }\n unicodeString += theUnicode;\n\n i++;\n }\n return unicodeString;\n }\n },\n\n /**\n * Escapes a unicode character.\n *\n * @method escape\n * @param {String} c Character to escape\n * @return {String} Escaped character. Returns \\xXX if hex smaller than 0x100, otherwise \\uXXXX\n * @public\n * @static\n * @sample Ink_Util_String_escape.html \n */\n escape: function(c) {\n var hex = (c).charCodeAt(0).toString(16).split('');\n if (hex.length < 3) {\n while (hex.length < 2) { hex.unshift('0'); }\n hex.unshift('x');\n }\n else {\n while (hex.length < 4) { hex.unshift('0'); }\n hex.unshift('u');\n }\n\n hex.unshift('\\\\');\n return hex.join('');\n },\n\n /**\n * Unescapes a unicode character escape sequence\n *\n * @method unescape\n * @param {String} es Escape sequence\n * @return {String} String un-unicoded\n * @public\n * @static\n * @sample Ink_Util_String_unescape.html \n */\n unescape: function(es) {\n var idx = es.lastIndexOf('0');\n idx = idx === -1 ? 2 : Math.min(idx, 2);\n //console.log(idx);\n var hexNum = es.substring(idx);\n //console.log(hexNum);\n var num = parseInt(hexNum, 16);\n return String.fromCharCode(num);\n },\n\n /**\n * Escapes unicode characters in a string as unicode character entities (`\\x##`, where the `##` are hex digits).\n *\n * @method escapeText\n * @param {String} txt String with characters outside the ASCII printable range (32 < charCode < 127)\n * @param {Array} [whiteList] Whitelist of characters which should NOT be escaped\n * @return {String} String escaped with unicode character entities.\n * @public\n * @static\n * @sample Ink_Util_String_escapeText.html \n */\n escapeText: function(txt, whiteList) {\n if (whiteList === undefined) {\n whiteList = ['[', ']', '\\'', ','];\n }\n var txt2 = [];\n var c, C;\n for (var i = 0, f = txt.length; i < f; ++i) {\n c = txt[i];\n C = c.charCodeAt(0);\n if (C < 32 || C > 126 && whiteList.indexOf(c) === -1) {\n c = InkUtilString.escape(c);\n }\n txt2.push(c);\n }\n return txt2.join('');\n },\n\n /**\n * Regex to check escaped strings\n *\n * @property escapedCharRegex\n * @type {Regex}\n * @public\n * @readOnly\n * @static\n */\n escapedCharRegex: /(\\\\x[0-9a-fA-F]{2})|(\\\\u[0-9a-fA-F]{4})/g,\n\n /**\n * Removes unicode entities (in the format \"\\x##\" or \"\\u####\", where \"#\" is a hexadecimal digit)\n *\n * @method unescapeText\n * @param {String} txt Text you intend to remove unicode character entities.\n * @return {String} Unescaped string\n * @public\n * @static\n * @sample Ink_Util_String_unescapeText.html \n */\n unescapeText: function(txt) {\n /*jshint boss:true */\n var m;\n while (m = InkUtilString.escapedCharRegex.exec(txt)) {\n m = m[0];\n txt = txt.replace(m, InkUtilString.unescape(m));\n InkUtilString.escapedCharRegex.lastIndex = 0;\n }\n return txt;\n },\n\n /**\n * Compares two strings.\n *\n * @method strcmp\n * @param {String} str1 First String\n * @param {String} str2 Second String\n * @return {Number} 0 if given strings are equal, 1 if str1 is greater than str2, and -1 if str2 is greater than str1.\n * @public\n * @static\n * @sample Ink_Util_String_strcmp.html \n */\n strcmp: function(str1, str2) {\n return ((str1 === str2) ? 0 : ((str1 > str2) ? 1 : -1));\n },\n\n /**\n * Splits a string into smaller chunks\n *\n * @method packetize\n * @param {String} str String to divide\n * @param {Number} maxLen Maximum chunk size (in characters)\n * @return {Array} Chunks of the original string\n * @public\n * @static\n * @sample Ink_Util_String_packetize.html \n */\n packetize: function(str, maxLen) {\n var len = str.length;\n var parts = new Array( Math.ceil(len / maxLen) );\n var chars = str.split('');\n var sz, i = 0;\n while (len) {\n sz = Math.min(maxLen, len);\n parts[i++] = chars.splice(0, sz).join('');\n len -= sz;\n }\n return parts;\n }\n };\n\n return InkUtilString;\n\n});\n","/**\n * URL Utilities\n * @module Ink.Util.Url_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Url', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Url_1\n */\n var Url = {\n\n /**\n * Auxiliary string for encoding\n *\n * @property _keyStr\n * @type {String}\n * @readOnly\n * @private\n */\n _keyStr : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n\n\n /**\n * Gets URL of current page\n *\n * @method getUrl\n * @return {String} Current URL\n * @public\n * @static\n * @sample Ink_Util_Url_getUrl.html \n */\n getUrl: function()\n {\n return window.location.href;\n },\n\n /**\n * Generates an URL string.\n *\n * @method genQueryString\n * @param {String} uri Base URL\n * @param {Object} params Object to transform to query string\n * @return {String} URI with query string set\n * @public\n * @static\n * @sample Ink_Util_Url_genQueryString.html \n */\n genQueryString: function(uri, params) {\n var hasQuestionMark = uri.indexOf('?') !== -1;\n var sep, pKey, pValue, parts = [uri];\n\n for (pKey in params) {\n if (params.hasOwnProperty(pKey)) {\n if (!hasQuestionMark) {\n sep = '?';\n hasQuestionMark = true;\n } else {\n sep = '&';\n }\n pValue = params[pKey];\n if (typeof pValue !== 'number' && !pValue) {\n pValue = '';\n }\n parts = parts.concat([sep, encodeURIComponent(pKey), '=', encodeURIComponent(pValue)]);\n }\n }\n\n return parts.join('');\n },\n\n /**\n * Gets an object from an URL encoded string.\n *\n * @method getQueryString\n * @param {String} [str] URL String. When not specified it uses the current URL.\n * @return {Object} Key-Value pair object\n * @public\n * @static\n * @sample Ink_Util_Url_getQueryString.html \n */\n getQueryString: function(str)\n {\n var url;\n if(str && typeof(str) !== 'undefined') {\n url = str;\n } else {\n url = this.getUrl();\n }\n var aParams = {};\n if(url.match(/\\?(.+)/i)) {\n var queryStr = url.replace(/^(.*)\\?([^\\#]+)(\\#(.*))?/g, \"$2\");\n if(queryStr.length > 0) {\n var aQueryStr = queryStr.split(/[;&]/);\n for(var i=0; i < aQueryStr.length; i++) {\n var pairVar = aQueryStr[i].split('=');\n aParams[decodeURIComponent(pairVar[0])] = (typeof(pairVar[1]) !== 'undefined' && pairVar[1]) ? decodeURIComponent(pairVar[1]) : false;\n }\n }\n }\n return aParams;\n },\n\n /**\n * Gets the URL hash value\n *\n * @method getAnchor\n * @param {String} [str] URL String. Defaults to current page URL.\n * @return {String|Boolean} Hash in the URL. If there's no hash, returns false.\n * @public\n * @static\n * @sample Ink_Util_Url_getAnchor.html \n */\n getAnchor: function(str)\n {\n var url;\n if(str && typeof(str) !== 'undefined') {\n url = str;\n } else {\n url = this.getUrl();\n }\n var anchor = false;\n if(url.match(/#(.+)/)) {\n anchor = url.replace(/([^#]+)#(.*)/, \"$2\");\n }\n return anchor;\n },\n\n /**\n * Gets the anchor string of an URL\n *\n * @method getAnchorString\n * @param {String} [string] URL to parse. Defaults to current URL.\n * @return {Object} Key-value pair object of the URL's hashtag 'variables'\n * @public\n * @static\n * @sample Ink_Util_Url_getAnchorString.html \n */\n getAnchorString: function(string)\n {\n var url;\n if(string && typeof(string) !== 'undefined') {\n url = string;\n } else {\n url = this.getUrl();\n }\n var aParams = {};\n if(url.match(/#(.+)/i)) {\n var anchorStr = url.replace(/^([^#]+)#(.*)?/g, \"$2\");\n if(anchorStr.length > 0) {\n var aAnchorStr = anchorStr.split(/[;&]/);\n for(var i=0; i < aAnchorStr.length; i++) {\n var pairVar = aAnchorStr[i].split('=');\n aParams[decodeURIComponent(pairVar[0])] = (typeof(pairVar[1]) !== 'undefined' && pairVar[1]) ? decodeURIComponent(pairVar[1]) : false;\n }\n }\n }\n return aParams;\n },\n\n\n /**\n * Parses URL string into URL parts\n *\n * @method parseUrl\n * @param {String} url URL to be parsed\n * @return {Object} Parsed URL as a key-value object.\n * @public\n * @static\n * @sample Ink_Util_Url_parseUrl.html \n */\n parseUrl: function(url) {\n var aURL = {};\n if(url && typeof url === 'string') {\n if(url.match(/^([^:]+):\\/\\//i)) {\n var re = /^([^:]+):\\/\\/([^\\/]*)\\/?([^\\?#]*)\\??([^#]*)#?(.*)/i;\n if(url.match(re)) {\n aURL.scheme = url.replace(re, \"$1\");\n aURL.host = url.replace(re, \"$2\");\n aURL.path = '/'+url.replace(re, \"$3\");\n aURL.query = url.replace(re, \"$4\") || false;\n aURL.fragment = url.replace(re, \"$5\") || false;\n }\n } else {\n var re1 = new RegExp(\"^([^\\\\?]+)\\\\?([^#]+)#(.*)\", \"i\");\n var re2 = new RegExp(\"^([^\\\\?]+)\\\\?([^#]+)#?\", \"i\");\n var re3 = new RegExp(\"^([^\\\\?]+)\\\\??\", \"i\");\n if(url.match(re1)) {\n aURL.scheme = false;\n aURL.host = false;\n aURL.path = url.replace(re1, \"$1\");\n aURL.query = url.replace(re1, \"$2\");\n aURL.fragment = url.replace(re1, \"$3\");\n } else if(url.match(re2)) {\n aURL.scheme = false;\n aURL.host = false;\n aURL.path = url.replace(re2, \"$1\");\n aURL.query = url.replace(re2, \"$2\");\n aURL.fragment = false;\n } else if(url.match(re3)) {\n aURL.scheme = false;\n aURL.host = false;\n aURL.path = url.replace(re3, \"$1\");\n aURL.query = false;\n aURL.fragment = false;\n }\n }\n if(aURL.host) {\n var regPort = /^(.*?)\\\\:(\\\\d+)$/i;\n // check for port\n if(aURL.host.match(regPort)) {\n var tmpHost1 = aURL.host;\n aURL.host = tmpHost1.replace(regPort, \"$1\");\n aURL.port = tmpHost1.replace(regPort, \"$2\");\n } else {\n aURL.port = false;\n }\n // check for user and pass\n if(aURL.host.match(/@/i)) {\n var tmpHost2 = aURL.host;\n aURL.host = tmpHost2.split('@')[1];\n var tmpUserPass = tmpHost2.split('@')[0];\n if(tmpUserPass.match(/\\:/)) {\n aURL.user = tmpUserPass.split(':')[0];\n aURL.pass = tmpUserPass.split(':')[1];\n } else {\n aURL.user = tmpUserPass;\n aURL.pass = false;\n }\n }\n }\n }\n return aURL;\n },\n\n /**\n * Formats an URL object into an URL string.\n *\n * @method format\n * @param {String|Location|Object} urlObj Window.location, a.href, or parseUrl object to format\n * @return {String} Full URL.\n */\n format: function (urlObj) {\n var protocol = '';\n var host = '';\n var path = '';\n var frag = '';\n var query = '';\n\n if (typeof urlObj.protocol === 'string') {\n protocol = urlObj.protocol + '//'; // here it comes with the colon\n } else if (typeof urlObj.scheme === 'string') {\n protocol = urlObj.scheme + '://';\n }\n\n host = urlObj.host || urlObj.hostname || '';\n path = urlObj.path || '';\n\n if (typeof urlObj.query === 'string') {\n query = urlObj.query;\n } else if (typeof urlObj.search === 'string') {\n query = urlObj.search.replace(/^\\?/, '');\n }\n if (typeof urlObj.fragment === 'string') {\n frag = urlObj.fragment;\n } else if (typeof urlObj.hash === 'string') {\n frag = urlObj.hash.replace(/#$/, '');\n }\n\n return [\n protocol,\n host,\n path,\n query && '?' + query,\n frag && '#' + frag\n ].join('');\n },\n\n /**\n * Gets the last loaded script element\n *\n * @method currentScriptElement\n * @param {String} [match] String to match against the script src attribute\n * @return {DOMElement|Boolean} Returns the `script` DOM Element or false if unable to find it.\n * @public\n * @static\n * @sample Ink_Util_Url_currentScriptElement.html \n */\n currentScriptElement: function(match)\n {\n var aScripts = document.getElementsByTagName('script');\n if(typeof(match) === 'undefined') {\n if(aScripts.length > 0) {\n return aScripts[(aScripts.length - 1)];\n } else {\n return false;\n }\n } else {\n var curScript = false;\n var re = new RegExp(\"\"+match+\"\", \"i\");\n for(var i=0, total = aScripts.length; i < total; i++) {\n curScript = aScripts[i];\n if(re.test(curScript.src)) {\n return curScript;\n }\n }\n return false;\n }\n }\n };\n\n return Url;\n\n});\n","/**\n * Validation Utilities\n * @module Ink.Util.Validator_1\n * @version 1\n */\n \nInk.createModule('Ink.Util.Validator', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Validator_1 \n */\n var Validator = {\n\n /**\n * List of country codes avaible for the isPhone method\n *\n * @property _countryCodes\n * @type {Array}\n * @private\n * @static\n * @readOnly\n */\n _countryCodes : [\n 'AO',\n 'CV',\n 'MZ',\n 'PT'\n ],\n\n /**\n * International number for portugal\n *\n * @property _internacionalPT\n * @type {Number}\n * @private\n * @static\n * @readOnly\n *\n */\n _internacionalPT: 351,\n\n /**\n * List of all portuguese number prefixes\n *\n * @property _indicativosPT\n * @type {Object}\n * @private\n * @static\n * @readOnly\n *\n */\n _indicativosPT: {\n 21: 'lisboa',\n 22: 'porto',\n 231: 'mealhada',\n 232: 'viseu',\n 233: 'figueira da foz',\n 234: 'aveiro',\n 235: 'arganil',\n 236: 'pombal',\n 238: 'seia',\n 239: 'coimbra',\n 241: 'abrantes',\n 242: 'ponte de sôr',\n 243: 'santarém',\n 244: 'leiria',\n 245: 'portalegre',\n 249: 'torres novas',\n 251: 'valença',\n 252: 'vila nova de famalicão',\n 253: 'braga',\n 254: 'peso da régua',\n 255: 'penafiel',\n 256: 'são joão da madeira',\n 258: 'viana do castelo',\n 259: 'vila real',\n 261: 'torres vedras',\n 262: 'caldas da raínha',\n 263: 'vila franca de xira',\n 265: 'setúbal',\n 266: 'évora',\n 268: 'estremoz',\n 269: 'santiago do cacém',\n 271: 'guarda',\n 272: 'castelo branco',\n 273: 'bragança',\n 274: 'proença-a-nova',\n 275: 'covilhã',\n 276: 'chaves',\n 277: 'idanha-a-nova',\n 278: 'mirandela',\n 279: 'moncorvo',\n 281: 'tavira',\n 282: 'portimão',\n 283: 'odemira',\n 284: 'beja',\n 285: 'moura',\n 286: 'castro verde',\n 289: 'faro',\n 291: 'funchal, porto santo',\n 292: 'corvo, faial, flores, horta, pico',\n 295: 'angra do heroísmo, graciosa, são jorge, terceira',\n 296: 'ponta delgada, são miguel, santa maria',\n\n 91 : 'rede móvel 91 (Vodafone / Yorn)',\n 93 : 'rede móvel 93 (Optimus)',\n 96 : 'rede móvel 96 (TMN)',\n 92 : 'rede móvel 92 (TODOS)',\n //925 : 'rede móvel 925 (TMN 925)',\n //926 : 'rede móvel 926 (TMN 926)',\n //927 : 'rede móvel 927 (TMN 927)',\n //922 : 'rede móvel 922 (Phone-ix)',\n\n 707: 'número único',\n 760: 'número único',\n 800: 'número grátis',\n 808: 'chamada local',\n 30: 'voip'\n },\n /**\n * International number for Cabo Verde\n *\n * @property _internacionalCV\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalCV: 238,\n\n /**\n * List of all Cabo Verde number prefixes\n *\n * @property _indicativosCV\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosCV: {\n 2: 'fixo',\n 91: 'móvel 91',\n 95: 'móvel 95',\n 97: 'móvel 97',\n 98: 'móvel 98',\n 99: 'móvel 99'\n },\n /**\n * International number for Angola\n *\n * @property _internacionalAO\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalAO: 244,\n\n /**\n * List of all Angola number prefixes\n *\n * @property _indicativosAO\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosAO: {\n 2: 'fixo',\n 91: 'móvel 91',\n 92: 'móvel 92'\n },\n /**\n * International number for Mozambique\n *\n * @property _internacionalMZ\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalMZ: 258,\n\n /**\n * List of all Mozambique number prefixes\n *\n * @property _indicativosMZ\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosMZ: {\n 2: 'fixo',\n 82: 'móvel 82',\n 84: 'móvel 84'\n },\n\n /**\n * International number for Timor\n *\n * @property _internacionalTL\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalTL: 670,\n\n /**\n * List of all Timor number prefixes\n *\n * @property _indicativosTL\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosTL: {\n 3: 'fixo',\n 7: 'móvel 7'\n },\n\n /**\n * Regular expression groups for several groups of characters\n *\n * http://en.wikipedia.org/wiki/C0_Controls_and_Basic_Latin\n * http://en.wikipedia.org/wiki/Plane_%28Unicode%29#Basic_Multilingual_Plane\n * http://en.wikipedia.org/wiki/ISO_8859-1\n *\n * @property _characterGroups\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _characterGroups: {\n numbers: ['0-9'],\n asciiAlpha: ['a-zA-Z'],\n latin1Alpha: ['a-zA-Z', '\\u00C0-\\u00FF'],\n unicodeAlpha: ['a-zA-Z', '\\u00C0-\\u00FF', '\\u0100-\\u1FFF', '\\u2C00-\\uD7FF'],\n /* whitespace characters */\n space: [' '],\n dash: ['-'],\n underscore: ['_'],\n nicknamePunctuation: ['_.-'],\n\n singleLineWhitespace: ['\\t '],\n newline: ['\\n'],\n whitespace: ['\\t\\n\\u000B\\f\\r\\u00A0 '],\n\n asciiPunctuation: ['\\u0021-\\u002F', '\\u003A-\\u0040', '\\u005B-\\u0060', '\\u007B-\\u007E'],\n latin1Punctuation: ['\\u0021-\\u002F', '\\u003A-\\u0040', '\\u005B-\\u0060', '\\u007B-\\u007E', '\\u00A1-\\u00BF', '\\u00D7', '\\u00F7'],\n unicodePunctuation: ['\\u0021-\\u002F', '\\u003A-\\u0040', '\\u005B-\\u0060', '\\u007B-\\u007E', '\\u00A1-\\u00BF', '\\u00D7', '\\u00F7', '\\u2000-\\u206F', '\\u2E00-\\u2E7F', '\\u3000-\\u303F']\n },\n\n /**\n * Creates a regular expression for several character groups.\n *\n * @method createRegExp\n *\n * @param {Object} groups\n * Groups to build regular expressions for. Possible keys are:\n *\n * - **numbers**: 0-9\n * - **asciiAlpha**: a-z, A-Z\n * - **latin1Alpha**: asciiAlpha, plus printable characters in latin-1\n * - **unicodeAlpha**: unicode alphanumeric characters.\n * - **space**: ' ', the space character.\n * - **dash**: dash character.\n * - **underscore**: underscore character.\n * - **nicknamePunctuation**: dash, dot, underscore\n * - **singleLineWhitespace**: space and tab (whitespace which only spans one line).\n * - **newline**: newline character ('\\n')\n * - **whitespace**: whitespace characters in the ASCII character set.\n * - **asciiPunctuation**: punctuation characters in the ASCII character set.\n * - **latin1Punctuation**: punctuation characters in latin-1.\n * - **unicodePunctuation**: punctuation characters in unicode.\n *\n * @returns {RegExp} A regular expression with the given groups.\n */\n createRegExp: function (groups) {\n var re = '^[';\n for (var key in groups) if (groups.hasOwnProperty(key)) {\n if (!(key in Validator._characterGroups)) {\n throw new Error('group ' + key + ' is not a valid character group');\n } else if (groups[key]) {\n re += Validator._characterGroups[key].join('');\n }\n }\n if (re === '^[') {\n // No changes\n return new RegExp('$^'); // match nothing\n }\n return new RegExp(re + ']*?$');\n },\n\n /**\n * Checks if a field has the required groups.\n *\n * @method checkCharacterGroups\n * @param {String} s The validation string\n * @param {Object} [groups={}] What groups are included. See `createRegExp`\n * @return {Boolean} Whether this is a valid string (all groups pass).\n * @sample Ink_Util_Validator_checkCharacterGroups.html \n */\n checkCharacterGroups: function (s, groups) {\n return Validator.createRegExp(groups).test(s);\n },\n\n /**\n * Checks if a field contains unicode printable characters.\n *\n * @method unicode\n * @param {String} s The validation string\n * @param {Object} [options={}] Optional configuration object. See createRegexp\n * @return {Boolean} Whether this is a valid unicode string.\n */\n unicode: function (s, options) {\n return Validator.checkCharacterGroups(s, Ink.extendObj({\n unicodeAlpha: true}, options));\n },\n\n /**\n * Checks if a field only contains latin-1 alphanumeric characters. \n * Takes options for allowing singleline whitespace, cross-line whitespace and punctuation.\n *\n * @method latin1\n *\n * @param {String} s The validation string\n * @param {Object} [options={}] Optional configuration object. See createRegexp\n * @return {Boolean} Whether this is a valid latin1 string.\n * @sample Ink_Util_Validator_latin1.html \n */\n latin1: function (s, options) {\n return Validator.checkCharacterGroups(s, Ink.extendObj({\n latin1Alpha: true}, options));\n },\n\n /**\n * Checks if a field only contains only ASCII alphanumeric characters. \n * Takes options for allowing singleline whitespace, cross-line whitespace and punctuation.\n *\n * @method ascii\n *\n * @param {String} s The validation string\n * @param {Object} [options={}] Optional configuration object. See createRegexp\n * @return {Boolean} Whether this is a valid ascii string.\n * @sample Ink_Util_Validator_ascii.html \n */\n ascii: function (s, options) {\n return Validator.checkCharacterGroups(s, Ink.extendObj({\n asciiAlpha: true}, options));\n },\n\n /**\n * Checks if a number is a valid\n *\n * @method number\n * @param {String} numb The number\n * @param {Object} [options] Further options\n * @param {String} [options.decimalSep='.'] Allow decimal separator.\n * @param {String} [options.thousandSep=\",\"] Strip this character from the number.\n * @param {String} [options.negative=false] Allow negative numbers.\n * @param {String} [options.decimalPlaces=null] Maximum number of decimal places. Use `0` for an integer number.\n * @param {Number} [options.max=null] Maximum number\n * @param {Number} [options.min=null] Minimum number\n * @param {Boolean}[options.returnNumber=false] When this option is `true`, return the number itself when the value is valid.\n * @return {Boolean|Number} `false` when invalid, `true` when valid. If `options.returnNumber` is `true`, return the parsed, valid number or `false`.\n * @sample Ink_Util_Validator_number.html \n */\n number: function (numb, options) {\n numb = numb + '';\n options = Ink.extendObj({\n decimalSep: '.',\n thousandSep: '',\n negative: true,\n decimalPlaces: null,\n maxDigits: null,\n max: null,\n min: null,\n returnNumber: false\n }, options || {});\n // smart recursion thing sets up aliases for options.\n if (options.thousandSep) {\n numb = numb.replace(new RegExp('\\\\' + options.thousandSep, 'g'), '');\n options.thousandSep = '';\n return Validator.number(numb, options);\n }\n if (options.negative === false) {\n options.min = 0;\n options.negative = true;\n return Validator.number(numb, options);\n }\n if (options.decimalSep !== '.') {\n numb = numb.replace(new RegExp('\\\\' + options.decimalSep, 'g'), '.');\n }\n\n if (!/^(-)?(\\d+)?(\\.\\d+)?$/.test(numb) || numb === '') {\n return false; // forbidden character found\n }\n \n var split;\n if (options.decimalSep && numb.indexOf(options.decimalSep) !== -1) {\n split = numb.split(options.decimalSep);\n if (options.decimalPlaces !== null &&\n split[1].length > options.decimalPlaces) {\n return false;\n }\n } else {\n split = ['' + numb, ''];\n }\n \n if (options.maxDigits!== null) {\n if (split[0].replace(/-/g, '').length > options.maxDigits) {\n return split;\n }\n }\n \n // Now look at the actual float\n var ret = parseFloat(numb);\n \n if (options.maxExcl !== null && ret >= options.maxExcl ||\n options.minExcl !== null && ret <= options.minExcl) {\n return false;\n }\n if (options.max !== null && ret > options.max ||\n options.min !== null && ret < options.min) {\n return false;\n }\n \n if (options.returnNumber) {\n return ret;\n } else {\n return true;\n }\n },\n\n /**\n * Checks if a year is Leap \"Bissexto\"\n *\n * @method _isLeapYear\n * @param {Number} year Year to be checked\n * @return {Boolean} True if it is a leap year.\n * @private\n * @static\n * @example\n * Ink.requireModules(['Ink.Util.Validator_1'], function( InkValidator ){\n * console.log( InkValidator._isLeapYear( 2004 ) ); // Result: true\n * console.log( InkValidator._isLeapYear( 2006 ) ); // Result: false\n * });\n */\n _isLeapYear: function(year){\n var yearRegExp = /^\\d{4}$/;\n\n if(yearRegExp.test(year)){\n return ((year%4) ? false: ((year%100) ? true : ((year%400)? false : true)) );\n }\n\n return false;\n },\n\n /**\n * Object with the date formats available for validation\n *\n * @property _dateParsers\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _dateParsers: {\n 'yyyy-mm-dd': {day:5, month:3, year:1, sep: '-', parser: /^(\\d{4})(\\-)(\\d{1,2})(\\-)(\\d{1,2})$/},\n 'yyyy/mm/dd': {day:5, month:3, year:1, sep: '/', parser: /^(\\d{4})(\\/)(\\d{1,2})(\\/)(\\d{1,2})$/},\n 'yy-mm-dd': {day:5, month:3, year:1, sep: '-', parser: /^(\\d{2})(\\-)(\\d{1,2})(\\-)(\\d{1,2})$/},\n 'yy/mm/dd': {day:5, month:3, year:1, sep: '/', parser: /^(\\d{2})(\\/)(\\d{1,2})(\\/)(\\d{1,2})$/},\n 'dd-mm-yyyy': {day:1, month:3, year:5, sep: '-', parser: /^(\\d{1,2})(\\-)(\\d{1,2})(\\-)(\\d{4})$/},\n 'dd/mm/yyyy': {day:1, month:3, year:5, sep: '/', parser: /^(\\d{1,2})(\\/)(\\d{1,2})(\\/)(\\d{4})$/},\n 'dd-mm-yy': {day:1, month:3, year:5, sep: '-', parser: /^(\\d{1,2})(\\-)(\\d{1,2})(\\-)(\\d{2})$/},\n 'dd/mm/yy': {day:1, month:3, year:5, sep: '/', parser: /^(\\d{1,2})(\\/)(\\d{1,2})(\\/)(\\d{2})$/}\n },\n\n /**\n * Gets the number of days in a given month of a given year\n *\n * @method _daysInMonth\n * @param {Number} _m Month (1 to 12)\n * @param {Number} _y Year\n * @return {Number} Returns the number of days in a given month of a given year\n * @private\n * @static\n * @example\n * Ink.requireModules(['Ink.Util.Validator_1'], function( InkValidator ){\n * console.log( InkValidator._daysInMonth( 2, 2004 ) ); // Result: 29\n * console.log( InkValidator._daysInMonth( 2, 2006 ) ); // Result: 28\n * });\n */\n _daysInMonth: function(_m,_y){\n var nDays=0;\n\n _m = parseInt(_m, 10);\n _y = parseInt(_y, 10);\n\n if(_m===1 || _m===3 || _m===5 || _m===7 || _m===8 || _m===10 || _m===12) {\n nDays= 31;\n } else if ( _m===4 || _m===6 || _m===9 || _m===11) {\n nDays = 30;\n } else if (_m===2) {\n if((_y%400===0) || (_y%4===0 && _y%100!==0)) {\n nDays = 29;\n } else {\n nDays = 28;\n }\n }\n\n return nDays;\n },\n\n\n\n /**\n * Checks if a date is valid\n *\n * @method _isValidDate\n * @param {Number} year Year fragment of your date.\n * @param {Number} month Month fragment of your date.\n * @param {Number} day Day fragment of your date.\n * @return {Boolean} True if valid\n * @private\n * @static\n * @example\n * Ink.requireModules(['Ink.Util.Validator_1'], function( InkValidator ){\n * console.log( InkValidator._isValidDate( 2004, 2, 29 ) ); // Result: true\n * console.log( InkValidator._isValidDate( 2006, 2, 29 ) ); // Result: false\n * });\n */\n _isValidDate: function(year, month, day){\n var yearRegExp = /^\\d{4}$/;\n var validOneOrTwo = /^\\d{1,2}$/;\n if(yearRegExp.test(year) && validOneOrTwo.test(month) && validOneOrTwo.test(day)){\n if(month>=1 && month<=12 && day>=1 && this._daysInMonth(month,year)>=day){\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if an email address is valid\n *\n * @method email\n * @param {String} email String containing the e-mail.\n * @return {Boolean} `true` if it's a valid e-mail address.\n * @public\n * @static\n * @sample Ink_Util_Validator_mail.html \n */\n email: function(email)\n {\n var emailValido = new RegExp(\"^[_a-z0-9-]+((\\\\.|\\\\+)[_a-z0-9-]+)*@([\\\\w]*-?[\\\\w]*\\\\.)+[a-z]{2,4}$\", \"i\");\n return !!emailValido.test(email);\n },\n\n /**\n * Deprecated. Alias for email(). Use it instead.\n *\n * @method mail\n * @public\n * @param {String} mail See `email`\n * @returns {Boolean} See `email`\n * @static\n * @private\n */\n mail: function (mail) { return Validator.email(mail); },\n\n /**\n * Checks if an url is valid\n *\n * @method url\n * @param {String} url URL to be checked\n * @param {Boolean} [full] If true, validates a full URL (one that should start with 'http')\n * @return {Boolean} True if valid\n * @public\n * @static\n * @sample Ink_Util_Validator_url.html \n */\n url: function(url, full)\n {\n if(typeof full === \"undefined\" || full === false) {\n var reHTTP = new RegExp(\"(^(http\\\\:\\\\/\\\\/|https\\\\:\\\\/\\\\/)(.+))\", \"i\");\n if(reHTTP.test(url) === false) {\n url = 'http://'+url;\n }\n }\n\n var reUrl = new RegExp(\"^(http:\\\\/\\\\/|https:\\\\/\\\\/)([\\\\w]*(-?[\\\\w]*)*\\\\.)+[a-z]{2,4}\", \"i\");\n if(reUrl.test(url) === false) {\n return false;\n } else {\n return true;\n }\n },\n\n /**\n * Checks if a phone is valid in Portugal\n *\n * @method isPTPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Portuguese Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isPTPhone.html\n */\n isPTPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosPT) {\n if(typeof(this._indicativosPT[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n\n var re351 = /^(00351|\\+351)/;\n if(re351.test(phone)) {\n phone = phone.replace(re351, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{9}/i;\n if(phone.length === 9 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Alias function for isPTPhone\n *\n * @method isPortuguesePhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Portuguese Phone\n * @public\n * @static\n */\n isPortuguesePhone: function(phone)\n {\n return this.isPTPhone(phone);\n },\n\n /**\n * Checks if a phone is valid in Cabo Verde\n *\n * @method isCVPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Cape Verdean Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isCVPhone.html \n */\n isCVPhone: function(phone)\n {\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosCV) {\n if(typeof(this._indicativosCV[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n\n var re238 = /^(00238|\\+238)/;\n if(re238.test(phone)) {\n phone = phone.replace(re238, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{7}/i;\n if(phone.length === 7 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a phone is valid in Angola\n *\n * @method isAOPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Angolan Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isAOPhone.html \n */\n isAOPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosAO) {\n if(typeof(this._indicativosAO[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n\n var re244 = /^(00244|\\+244)/;\n if(re244.test(phone)) {\n phone = phone.replace(re244, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{9}/i;\n if(phone.length === 9 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a phone is valid in Mozambique\n *\n * @method isMZPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Mozambican Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isMZPhone.html \n */\n isMZPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosMZ) {\n if(typeof(this._indicativosMZ[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n var re258 = /^(00258|\\+258)/;\n if(re258.test(phone)) {\n phone = phone.replace(re258, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{8,9}/i;\n if((phone.length === 9 || phone.length === 8) && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n if(phone.indexOf('2') === 0 && phone.length === 8) {\n return true;\n } else if(phone.indexOf('8') === 0 && phone.length === 9) {\n return true;\n }\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a phone is valid in Timor\n *\n * @method isTLPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid phone from Timor-Leste\n * @public\n * @static\n * @sample Ink_Util_Validator_isTLPhone.html \n */\n isTLPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosTL) {\n if(typeof(this._indicativosTL[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n var re670 = /^(00670|\\+670)/;\n if(re670.test(phone)) {\n phone = phone.replace(re670, \"\");\n }\n\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{7}/i;\n if(phone.length === 7 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a number is a phone number.\n * This method validates the number in all country codes available the ones set in the second param\n *\n * @method isPhone\n * @param {String} phone Phone number to validate\n * @param {String|Array} [countryCode] Country code or array of countries to validate\n * @return {Boolean} True if it's a valid phone in any country available\n * @public\n * @static\n * @sample Ink_Util_Validator_isPhone.html\n */\n isPhone: function(){\n var index;\n\n if(arguments.length===0){\n return false;\n }\n\n var phone = arguments[0];\n\n if(arguments.length>1){\n if(arguments[1].constructor === Array){\n var func;\n for(index=0; index= 0 && match[i-1] <= 100){\n valid = true;\n } else {\n return false;\n }\n }\n // check 0 to 255 values\n if(i===1 || i===3 || i===5 && (typeof match[i+1] === \"undefined\" || match[i+1] === \"\")){\n if(typeof match[i] !== \"undefined\" && match[i] >= 0 && match[i] <= 255){\n valid = true;\n } else {\n return false;\n }\n }\n }\n }\n\n // hsl range check\n if((match = hsl.exec(str)) !== null || (match = hsla.exec(str)) !== null){\n i = match.length;\n while(i--){\n // check percentage values\n if(i===3 || i===5){\n if(typeof match[i-1] !== \"undefined\" && typeof match[i] !== \"undefined\" && match[i] !== \"\" &&\n match[i-1] >= 0 && match[i-1] <= 100){\n valid = true;\n } else {\n return false;\n }\n }\n // check 0 to 360 value\n if(i===1){\n if(typeof match[i] !== \"undefined\" && match[i] >= 0 && match[i] <= 360){\n valid = true;\n } else {\n return false;\n }\n }\n }\n }\n\n return valid;\n },\n\n /**\n * Checks if the value is a valid IP. \n *\n * @method isIP\n * @param {String} value Value to be checked\n * @param {String} ipType Type of IP to be validated. The values are: ipv4, ipv6. By default is ipv4.\n * @return {Boolean} True if the value is a valid IP address. False if not.\n * @sample Ink_Util_Validator_isIP.html \n */\n isIP: function( value, ipType ){\n if( typeof value !== 'string' ){\n return false;\n }\n\n ipType = (ipType || 'ipv4').toLowerCase();\n\n switch( ipType ){\n case 'ipv4':\n return (/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/).test(value);\n case 'ipv6':\n return (/^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/).test(value);\n default:\n return false;\n }\n },\n\n /**\n * Credit Card specifications, to be used in the credit card verification.\n *\n * @property _creditCardSpecs\n * @type {Object}\n * @private\n */\n _creditCardSpecs: {\n 'default': {\n 'length': '13,14,15,16,17,18,19',\n 'prefix': /^.+/,\n 'luhn': true\n },\n\n 'american express': {\n 'length': '15',\n 'prefix': /^3[47]/,\n 'luhn' : true\n },\n\n 'diners club': {\n 'length': '14,16',\n 'prefix': /^36|55|30[0-5]/,\n 'luhn' : true\n },\n\n 'discover': {\n 'length': '16',\n 'prefix': /^6(?:5|011)/,\n 'luhn' : true\n },\n\n 'jcb': {\n 'length': '15,16',\n 'prefix': /^3|1800|2131/,\n 'luhn' : true\n },\n\n 'maestro': {\n 'length': '16,18',\n 'prefix': /^50(?:20|38)|6(?:304|759)/,\n 'luhn' : true\n },\n\n 'mastercard': {\n 'length': '16',\n 'prefix': /^5[1-5]/,\n 'luhn' : true\n },\n\n 'visa': {\n 'length': '13,16',\n 'prefix': /^4/,\n 'luhn' : true\n }\n },\n\n /**\n * Luhn function, to be used when validating credit card numbers\n * @method _luhn\n * @private\n * @param {Number} num Given credit card number\n * @returns {Boolean} Whether the credit card number is valid.\n */\n _luhn: function (num){\n\n num = parseInt(num,10);\n\n if ( (typeof num !== 'number') && (num % 1 !== 0) ){\n // Luhn can only be used on nums!\n return false;\n }\n\n num = num+'';\n // Check num length\n var length = num.length;\n\n // Checksum of the card num\n var i;\n var checksum = 0;\n\n for (i = length - 1; i >= 0; i -= 2)\n {\n // Add up every 2nd digit, starting from the right\n checksum += parseInt(num.substr(i, 1),10);\n }\n\n for (i = length - 2; i >= 0; i -= 2)\n {\n // Add up every 2nd digit doubled, starting from the right\n var dbl = parseInt(num.substr(i, 1) * 2,10);\n\n // Subtract 9 from the dbl where value is greater than 10\n checksum += (dbl >= 10) ? (dbl - 9) : dbl;\n }\n\n // If the checksum is a multiple of 10, the number is valid\n return (checksum % 10 === 0);\n },\n\n /**\n * Checks if a number is of a specific credit card type\n * @method isCreditCard\n * @param {String} num Number to be validates\n * @param {String|Array} creditCardType Credit card type or list of types. See _creditCardSpecs for the list of supported values.\n * @return {Boolean} Whether the number is of that credit card type (or at least one of `creditCardType` if you pass in an array).\n * @sample Ink_Util_Validator_isCreditCard.html \n */\n isCreditCard: function(num, creditCardType){\n\n if ( /\\d+/.test(num) === false ){\n return false;\n }\n\n if ( typeof creditCardType === 'undefined' ){\n creditCardType = 'default';\n }\n else if ( creditCardType instanceof Array ){\n var i, ccLength = creditCardType.length;\n for ( i=0; i < ccLength; i++ ){\n // Test each type for validity\n if (this.isCreditCard(num, creditCardType[i]) ){\n return true;\n }\n }\n\n return false;\n }\n\n // Check card type\n creditCardType = creditCardType.toLowerCase();\n\n if ( typeof this._creditCardSpecs[creditCardType] === 'undefined' ){\n return false;\n }\n\n // Check card number length\n var length = num.length+'';\n\n // Validate the card length by the card type\n if ( this._creditCardSpecs[creditCardType]['length'].split(\",\").indexOf(length) === -1 ){\n return false;\n }\n\n // Check card number prefix\n if ( !this._creditCardSpecs[creditCardType]['prefix'].test(num) ){\n return false;\n }\n\n // No Luhn check required\n if (this._creditCardSpecs[creditCardType]['luhn'] === false){\n return true;\n }\n\n return this._luhn(num);\n }\n };\n\n return Validator;\n\n});\n"]} \ No newline at end of file diff --git a/dist/js/ink.js b/dist/js/ink.js index 87077555f..c54cafe1c 100644 --- a/dist/js/ink.js +++ b/dist/js/ink.js @@ -47,7 +47,7 @@ /** * @property {String} VERSION **/ - VERSION: '3.1.2', + VERSION: '3.1.4', _checkPendingRequireModules: function() { var I, F, o, dep, mod, cb, pRMs = []; var toApply = []; diff --git a/dist/js/ink.min.js b/dist/js/ink.min.js index b3f178493..064317602 100644 --- a/dist/js/ink.min.js +++ b/dist/js/ink.min.js @@ -1,4 +1,4 @@ -!function(a,b){"use strict";if(!("Ink"in a)){var c={},d={},e=[],f={},g=[],h={},i=Function.prototype.apply,j=function(a){if("object"!=typeof a)return!1;for(var b in a)if(a.hasOwnProperty(b))return!1;return!0};a.Ink={VERSION:"3.1.2",_checkPendingRequireModules:function(){var a,b,c,e,f,h,i=[],j=[];for(a=0,b=g.length;b>a;++a)if(c=g[a]){for(e in c.left)c.left.hasOwnProperty(e)&&(f=d[e],f&&(c.args[c.left[e]]=f,delete c.left[e],--c.remaining));if(c.remaining>0)i.push(c);else{if(h=c.cb,!h)continue;delete c.cb,j.push([h,c.args])}}g=i;for(var k=0;k0&&setTimeout(function(){Ink._checkPendingRequireModules()},0)},getPath:function(a,b){var d=a.split(/[._]/g),e,f,g,h;for(f=d.length;f>=0;f-=1)if(e=d.slice(0,f+1).join("."),c[e]){g=e;break}return g in c?(h=c[g],/\/$/.test(h)||(h+="/"),fg;++g)e[d[g]]=e[d[g]]||{},f=e,e=e[d[g]];return c?[f,d[g-1]]:e},getModule:function(a,b){var c=b?[a,"_",b].join(""):a;return d[c]},createModule:function(b,c,g,i){if("string"!=typeof b)throw new Error("module name must be a string!");if(!("number"==typeof c||"string"==typeof c&&c.length>0))throw new Error("version number missing!");var k=[b,"_",c].join("");h[k]=!0;var l=function(){if(!d[k]){delete f[k],delete f[b];var g=Array.prototype.slice.call(arguments),l=i.apply(a,g);e.push(k),"object"==typeof l?l._version=c:"function"==typeof l&&(l.prototype._version=c,l._version=c);var m=0===b.indexOf("Ink."),n;m&&(n=Ink.namespace(b,!0)),d[k]=l,delete h[k],m&&(n[0][n[1]+"_"+c]=l),d[b]=l,m&&j(n[0][n[1]])&&(n[0][n[1]]=l),this&&Ink._checkPendingRequireModules()}};this.requireModules(g,l)},requireModules:function(a,b){var c,e,h,i,j;if(e=a&&a.length,h={args:new Array(e),left:{},remaining:e,cb:b},"object"!=typeof a||void 0===a.length)throw new Error("Dependency list should be an array!");if("function"!=typeof b)throw new Error("Callback should be a function!");for(c=0;e>c;++c)Ink._moduleRenames[a[c]]?(Ink.warn(a[c]+" was renamed to "+Ink._moduleRenames[a[c]]),i=Ink._moduleRenames[a[c]]):i=a[c],i?(j=d[i],j?(h.args[c]=j,--h.remaining):(f[i]||Ink._loadLater(i),h.left[i]=c)):--h.remaining;h.remaining>0?g.push(h):b.apply(!0,h.args)},_moduleRenames:{"Ink.UI.Aux_1":"Ink.UI.Common_1"},getModulesLoadOrder:function(){return e.slice()},getModuleScripts:function(){var a=this.getModulesLoadOrder();return a.unshift("Ink_1"),a=a.map(function(a){return[""].join("")}),a.join("\n")},createExt:function(a,b,c,d){return Ink.createModule("Ink.Ext."+a,b,c,d)},bind:function(a,b){var c=Array.prototype.slice.call(arguments,2);return function(){var d=Array.prototype.slice.call(arguments),e=c.concat(d);return a.apply(b===!1?this:b,e)}},bindMethod:function(a,b){return Ink.bind.apply(Ink,[a[b],a].concat([].slice.call(arguments,2)))},bindEvent:function(b,c){var d=Array.prototype.slice.call(arguments,2);return function(e){var f=d.slice();return f.unshift(e||a.event),b.apply(c===!1?this:c,f)}},i:function(a){return"string"==typeof a?b.getElementById(a)||null:a},ss:function(a,c){if("undefined"==typeof Ink.Dom||"undefined"==typeof Ink.Dom.Selector)throw new Error("This method requires Ink.Dom.Selector");return Ink.Dom.Selector.select(a,c||b)},s:function(a,c){if("undefined"==typeof Ink.Dom||"undefined"==typeof Ink.Dom.Selector)throw new Error("This method requires Ink.Dom.Selector");return Ink.Dom.Selector.select(a,c||b)[0]||null},extendObj:function(a){for(var b=[].slice.call(arguments,1),c=0,d=b.length;d>c;c++)if(b[c])for(var e in b[c])Object.prototype.hasOwnProperty.call(b[c],e)&&(a[e]=b[c][e]);return a},log:function(){var b=a.console;b&&b.log&&i.call(b.log,b,arguments)},warn:function(){var b=a.console;b&&b.warn&&i.call(b.warn,b,arguments)},error:function(){var b=a.console;b&&b.error&&i.call(b.error,b,arguments)}}}}(window,document),Ink.createModule("Ink.Net.Ajax","1",[],function(){"use strict";var Ajax=function(a,b){this.init(a,b)};Ajax.globalOptions={parameters:{},requestHeaders:{}};var xMLHttpRequestWithCredentials="XMLHttpRequest"in window&&"withCredentials"in new XMLHttpRequest;return Ajax.prototype={init:function(a,b){if(!a)throw new Error("new Ink.Net.Ajax: Pass a url as the first argument!");var c=Ink.extendObj({asynchronous:!0,contentType:"application/x-www-form-urlencoded",cors:!1,validateCors:!1,debug:!1,delay:0,evalJS:!0,method:"POST",parameters:null,postBody:"",requestHeaders:null,sanitizeJSON:!1,signRequest:!1,timeout:0,useCredentials:!1,xhrProxy:"",onComplete:null,onCreate:null,onException:null,onFailure:null,onHeaders:null,onInit:null,onSuccess:null,onTimeout:null},Ajax.globalOptions);if(b&&"object"==typeof b){if(c=Ink.extendObj(c,b),"object"==typeof b.parameters)c.parameters=Ink.extendObj(Ink.extendObj({},Ajax.globalOptions.parameters),b.parameters);else if(null!==b.parameters){var d=this.paramsObjToStr(Ajax.globalOptions.parameters);d&&(c.parameters=b.parameters+"&"+d)}c.requestHeaders=Ink.extendObj({},Ajax.globalOptions.requestHeaders),c.requestHeaders=Ink.extendObj(c.requestHeaders,b.requestHeaders)}this.options=c,this.safeCall("onInit"),this.url=a;var e=this._locationFromURL(a);this.isHTTP=this._locationIsHTTP(e),this.isCrossDomain=this._locationIsCrossDomain(e,location),this.requestHasBody=c.method.search(/^get|head$/i)<0,this.options.validateCors===!0&&(this.options.cors=this.isCrossDomain),this.options.cors&&(this.isCrossDomain=!1),this.transport=this.getTransport(),this.request()},_locationFromURL:function(a){var b=document.createElementNS?document.createElementNS("http://www.w3.org/1999/xhtml","a"):document.createElement("a");return b.setAttribute("href",a),b},_locationIsHTTP:function(a){return a.href.match(/^https?:/i)?!0:!1},_locationIsCrossDomain:function(a,b){if(b=b||window.location,Ajax.prototype._locationIsHTTP(a)&&"widget:"!==b.protocol&&"object"!=typeof window.widget){var c=a.href.split("//"),d=b.href.split("//");if(1===c.length||1===d.length)return!1;var e=c[0],f=d[0],g=/:|\//,h=c[1].split(g)[0],i=d[1].split(g)[0];return e!==f||h!==i}return!1},getTransport:function(){if(!xMLHttpRequestWithCredentials&&this.options.cors&&"XDomainRequest"in window)return this.usingXDomainReq=!0,new XDomainRequest;if("undefined"!=typeof XMLHttpRequest)return new XMLHttpRequest;if("undefined"==typeof ActiveXObject)return null;try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(a){return new ActiveXObject("Microsoft.XMLHTTP")}},setHeaders:function(){if(this.transport)try{var a={Accept:"text/javascript,text/xml,application/xml,application/xhtml+xml,text/html,application/json;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1","Accept-Language":navigator.language,"X-Requested-With":"XMLHttpRequest","X-Ink-Version":"3"};if(this.options.cors&&(this.options.signRequest||delete a["X-Requested-With"],delete a["X-Ink-Version"]),this.options.requestHeaders&&"object"==typeof this.options.requestHeaders)for(var b in this.options.requestHeaders)this.options.requestHeaders.hasOwnProperty(b)&&(a[b]=this.options.requestHeaders[b]);this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005&&(a.Connection="close");for(var c in a)a.hasOwnProperty(c)&&this.transport.setRequestHeader(c,a[c])}catch(d){}},paramsObjToStr:function(a){var b,c,d,e,f=[];if("object"!=typeof a)return a;for(d in a)if(a.hasOwnProperty(d))if(e=a[d],"[object Array]"!==Object.prototype.toString.call(e)||isNaN(e.length))f=f.concat([encodeURIComponent(d),"=",encodeURIComponent(e),"&"]);else for(b=0,c=e.length;c>b;b++)f=f.concat([encodeURIComponent(d),"[]","=",encodeURIComponent(e[b]),"&"]);return f.length>0&&f.pop(),f.join("")},setParams:function(){var a=null,b=this.options.parameters;a="object"==typeof b?this.paramsObjToStr(b):""+b,a&&(this.url=this.url.indexOf("?")>-1?this.url.split("#")[0]+"&"+a:this.url.split("#")[0]+"?"+a)},getHeader:function(a){if(this.usingXDomainReq&&"Content-Type"===a)return this.transport.contentType;try{return this.transport.getResponseHeader(a)}catch(b){return null}},getAllHeaders:function(){try{return this.transport.getAllResponseHeaders()}catch(a){return null}},getResponse:function(){var a=this.transport,b={headerJSON:null,responseJSON:null,getHeader:this.getHeader,getAllHeaders:this.getAllHeaders,request:this,transport:a,timeTaken:new Date-this.startTime,requestedUrl:this.url};b.readyState=a.readyState;try{b.responseText=a.responseText}catch(c){}try{b.responseXML=a.responseXML}catch(c){}try{b.status=a.status}catch(c){b.status=0}try{b.statusText=a.statusText}catch(c){b.statusText=""}return b},abort:function(){if(this.transport){clearTimeout(this.delayTimeout),clearTimeout(this.stoTimeout);try{this.transport.abort()}catch(a){}this.finish()}},runStateChange:function(){var a=this.transport.readyState;if(3===a)this.isHTTP&&this.safeCall("onHeaders");else if(4===a||this.usingXDomainReq){if(this.options.asynchronous&&this.options.delay&&this.startTime+this.options.delay>(new Date).getTime())return void(this.delayTimeout=setTimeout(Ink.bind(this.runStateChange,this),this.options.delay+this.startTime-(new Date).getTime()));var b,c=this.transport.responseText,d=this.getResponse(),e=this.transport.status;this.isHTTP&&!this.options.asynchronous&&this.safeCall("onHeaders"),clearTimeout(this.stoTimeout),0===e?this.isHTTP?this.safeCall("onException",new Error("Ink.Net.Ajax: network error! (HTTP status 0)")):e=c?200:404:304===e&&(e=200);var f=this.usingXDomainReq||e>=200&&300>e,g=this.getHeader("Content-Type")||"";if(this.options.evalJS&&(g.indexOf("application/json")>=0||"force"===this.options.evalJS))try{b=this.evalJSON(c,this.sanitizeJSON),b&&(c=d.responseJSON=b)}catch(h){f&&this.safeCall("onException",h)}if(this.usingXDomainReq&&-1!==g.indexOf("xml")&&"DOMParser"in window){var i;switch(g){case"application/xml":case"application/xhtml+xml":case"image/svg+xml":i=g;break;default:i="text/xml"}var j=(new DOMParser).parseFromString(this.transport.responseText,i);this.transport.responseXML=j,d.responseXML=j}null!=this.transport.responseXML&&null==d.responseJSON&&""!==this.transport.responseXML.xml&&(c=this.transport.responseXML),(e||this.usingXDomainReq)&&(f?this.safeCall("onSuccess",d,c):this.safeCall("onFailure",d,c),this.safeCall("on"+e,d,c)),this.finish(d,c)}},finish:function(a,b){if(a&&this.safeCall("onComplete",a,b),clearTimeout(this.stoTimeout),this.transport){try{this.transport.onreadystatechange=null}catch(c){}"function"==typeof this.transport.destroy&&this.transport.destroy(),this.transport=null}},safeCall:function(a){var b=arguments[1]instanceof Error?arguments[1]:null;if("function"==typeof this.options[a])try{this.options[a].apply(this,[].slice.call(arguments,1))}catch(c){Ink.error("Ink.Net.Ajax: an error was raised while executing "+a+".",c)}else b&&Ink.error("Ink.Net.Ajax: "+b)},setRequestHeader:function(a,b){this.options.requestHeaders||(this.options.requestHeaders={}),this.options.requestHeaders[a]=b},request:function(){if(this.transport){var a=null;this.requestHasBody?(null!==this.options.postBody&&""!==this.options.postBody?(a=this.options.postBody,this.setParams()):null!==this.options.parameters&&""!==this.options.parameters&&(a=this.options.parameters),"object"!=typeof a||a.nodeType?"object"!=typeof a&&null!==a&&(a=""+a):a=this.paramsObjToStr(a),this.options.contentType&&this.setRequestHeader("Content-Type",this.options.contentType)):this.setParams();var b=this.url,c=this.options.method,d=this.isCrossDomain;d&&this.options.xhrProxy&&(this.setRequestHeader("X-Url",b),b=this.options.xhrProxy+encodeURIComponent(b),d=!1);try{this.transport.open(c,b,this.options.asynchronous)}catch(e){return this.safeCall("onException",e),this.finish(this.getResponse(),null)}this.setHeaders(),this.safeCall("onCreate"),this.options.timeout&&!isNaN(this.options.timeout)&&(this.stoTimeout=setTimeout(Ink.bind(function(){this.options.onTimeout&&(this.safeCall("onTimeout"),this.abort())},this),1e3*this.options.timeout)),this.options.useCredentials&&!this.usingXDomainReq&&(this.transport.withCredentials=!0),this.options.asynchronous&&!this.usingXDomainReq?this.transport.onreadystatechange=Ink.bind(this.runStateChange,this):this.usingXDomainReq&&(this.transport.onload=Ink.bind(this.runStateChange,this));try{if(d)return void Ink.error("Ink.Net.Ajax: You are attempting to request a URL which is cross-domain from this one. To do this, you *must* enable the `cors` option!");this.startTime=(new Date).getTime(),this.transport.send(a)}catch(e){return this.safeCall("onException",e),this.finish(this.getResponse(),null)}this.options.asynchronous||this.runStateChange()}},isJSON:function(a){return"string"==typeof a&&a?(a=a.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,""),/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/.test(a)):!1},evalJSON:function(strJSON,sanitize){if(strJSON&&(!sanitize||this.isJSON(strJSON)))try{return"undefined"!=typeof JSON&&"undefined"!=typeof JSON.parse?JSON.parse(strJSON):eval("("+strJSON+")")}catch(e){throw new Error("Ink.Net.Ajax: Bad JSON string. "+e)}return null}},Ajax.load=function(a,b){var c=Ajax.prototype._locationIsCrossDomain(window.location,Ajax.prototype._locationFromURL(a));return new Ajax(a,{method:"GET",cors:c,onSuccess:function(a){b(a.responseJSON||a.responseText,a)}})},Ajax.ping=function(a,b){var c=Ajax.prototype._locationIsCrossDomain(window.location,Ajax.prototype._locationFromURL(a));return new Ajax(a,{method:"HEAD",cors:c,onSuccess:function(a){"function"==typeof b&&b(a)}})},Ajax}),Ink.createModule("Ink.Net.JsonP","1",[],function(){"use strict";var a=function(a,b){this.init(a,b)};return a.prototype={init:function(a,b){if(this.options=Ink.extendObj({onSuccess:void 0,onFailure:void 0,failureObj:{},timeout:10,params:{},callbackParam:"jsoncallback",internalCallback:"_cb",randVar:!1},b||{}),this.randVar=this.options.randVar!==!1?this.options.randVar:parseInt(1e5*Math.random(),10),this.options.internalCallback+=this.randVar,this.uri=a,"function"==typeof this.options.onComplete&&(this.options.onSuccess=this.options.onComplete),"string"!=typeof this.uri)throw new Error("Ink.Net.JsonP: Please define an URI");if("function"!=typeof this.options.onSuccess)throw new Error("Ink.Net.JsonP: please define a callback function on option onSuccess!");Ink.Net.JsonP[this.options.internalCallback]=Ink.bind(function(){this.options.onSuccess(arguments[0]),this._cleanUp()},this),this.timeout=setTimeout(Ink.bind(function(){this.abort(),"function"==typeof this.options.onFailure&&this.options.onFailure(this.options.failureObj)},this),1e3*this.options.timeout),this._addScriptTag()},abort:function(){Ink.Net.JsonP[this.options.internalCallback]=Ink.bindMethod(this,"_cleanUp")},_addParamsToGet:function(a,b){var c=-1!==a.indexOf("?"),d,e,f,g=[a];for(e in b)b.hasOwnProperty(e)&&(c?d="&":(d="?",c=!0),f=b[e],"number"==typeof f||f||(f=""),g=g.concat([d,e,"=",encodeURIComponent(f)]));return g.join("")},_getScriptContainer:function(){return document.body||document.getElementsByTagName("body")[0]||document.getElementsByTagName("head")[0]||document.documentElement},_addScriptTag:function(){this.options.params[this.options.callbackParam]="Ink.Net.JsonP."+this.options.internalCallback,this.options.params.rnd_seed=this.randVar,this.uri=this._addParamsToGet(this.uri,this.options.params),this._scriptEl=document.createElement("script"),this._scriptEl.type="text/javascript",this._scriptEl.src=this.uri;var a=this._getScriptContainer();a.appendChild(this._scriptEl)},_cleanUp:function(){this.timeout&&window.clearTimeout(this.timeout),delete this.options.onSuccess,delete this.options.onFailure,delete Ink.Net.JsonP[this.options.internalCallback],this._removeScriptTag()},_removeScriptTag:function(){this._scriptEl&&(this._scriptEl.parentNode.removeChild(this._scriptEl),delete this._scriptEl)}},a}),Ink.createModule("Ink.Dom.Browser","1",[],function(){"use strict";var a={IE:!1,GECKO:!1,OPERA:!1,SAFARI:!1,KONQUEROR:!1,CHROME:!1,model:!1,version:!1,userAgent:!1,cssPrefix:!1,domPrefix:!1,init:function(){this.detectBrowser(),this.setDimensions(),this.setReferrer()},setDimensions:function(){var a=0,b=0;"number"==typeof window.innerWidth?(a=window.innerWidth,b=window.innerHeight):document.documentElement&&(document.documentElement.clientWidth||document.documentElement.clientHeight)?(a=document.documentElement.clientWidth,b=document.documentElement.clientHeight):document.body&&(document.body.clientWidth||document.body.clientHeight)&&(a=document.body.clientWidth,b=document.body.clientHeight),this.windowWidth=a,this.windowHeight=b},setReferrer:function(){this.referrer=document.referrer&&document.referrer.length?window.escape(document.referrer):!1},detectBrowser:function(){this._sniffUserAgent(navigator.userAgent)},_sniffUserAgent:function(a){if(this.userAgent=a,a=a.toLowerCase(),/applewebkit\//.test(a))if(this.cssPrefix="-webkit-",this.domPrefix="Webkit",/(chrome|crios)\//.test(a))this.CHROME=!0,this.model="chrome",this.version=a.replace(/(.*)chrome\/([^\s]+)(.*)/,"$2");else{this.SAFARI=!0,this.model="safari";var b=/version\/([^) ]+)/;this.version=b.test(a)?a.match(b)[1]:a.replace(/(.*)applewebkit\/([^\s]+)(.*)/,"$2")}else if(/opera/.test(a))this.OPERA=!0,this.model="opera",this.version=a.replace(/(.*)opera.([^\s$]+)(.*)/,"$2"),this.cssPrefix="-o-",this.domPrefix="O";else if(/konqueror/.test(a))this.KONQUEROR=!0,this.model="konqueror",this.version=a.replace(/(.*)konqueror\/([^;]+);(.*)/,"$2"),this.cssPrefix="-khtml-",this.domPrefix="Khtml";else if(/(msie|trident)/i.test(a))this.IE=!0,this.model="ie",this.version=/rv:((?:\d|\.)+)/.test(a)?a.match(/rv:((?:\d|\.)+)/)[1]:a.replace(/(.*)\smsie\s([^;]+);(.*)/,"$2"),this.cssPrefix="-ms-",this.domPrefix="ms";else if(/gecko/.test(a)){this.cssPrefix="-moz-",this.domPrefix="Moz",this.GECKO=!0;var c=/(camino|chimera|epiphany|minefield|firefox|firebird|phoenix|galeon|iceweasel|k\-meleon|seamonkey|netscape|songbird|sylera)/;if(c.test(a))this.model=a.match(c)[1],this.version=a.replace(new RegExp("(.*)"+this.model+"/([^;\\s$]+)(.*)"),"$2");else{this.model="mozilla";var d=/(.*)rv:([^)]+)(.*)/;d.test(a)&&(this.version=a.replace(d,"$2"))}}},debug:function(){var a="known browsers: (ie, gecko, opera, safari, konqueror) \n";a+=[this.IE,this.GECKO,this.OPERA,this.SAFARI,this.KONQUEROR]+"\n",a+="cssPrefix -> "+this.cssPrefix+"\n",a+="domPrefix -> "+this.domPrefix+"\n",a+="model -> "+this.model+"\n",a+="version -> "+this.version+"\n",a+="\n",a+="original UA -> "+this.userAgent,alert(a)}};return a.init(),a}),Ink.createModule("Ink.Dom.Css",1,[],function(){"use strict";var a="defaultView"in document&&"getComputedStyle"in document.defaultView?document.defaultView.getComputedStyle:window.getComputedStyle,b={addRemoveClassName:function(a,b,c){return c?this.addClassName(a,b):void this.removeClassName(a,b)},addClassName:function(a,c){if(a=Ink.i(a),!a||!c)return null;c=(""+c).split(/[, ]+/);for(var d=0,e=c.length;e>d;d++)c[d].replace(/^\s+|\s+$/g,"")&&("undefined"!=typeof a.classList?a.classList.add(c[d]):b.hasClassName(a,c[d])||(a.className+=(a.className?" ":"")+c[d]))},removeClassName:function(a,b){if(a=Ink.i(a),!a||!b)return null;b=(""+b).split(/[, ]+/);var c=0,d=b.length;if("undefined"!=typeof a.classList)for(;d>c;c++)a.classList.remove(b[c]);else{for(var e=a.className||"",f;d>c;c++)f=new RegExp("(^|\\s+)"+b[c]+"(\\s+|$)"),e=e.replace(f," ");a.className=e.replace(/^\s+/,"").replace(/\s+$/,"")}},setClassName:function(a,b,c){this.addRemoveClassName(a,b,c||!1)},hasClassName:function(a,b,c){if(a=Ink.i(a),!a||!b)return!1;b=(""+b).split(/[, ]+/);for(var d=0,e=b.length,f,g;e>d;d++){if("undefined"!=typeof a.classList)f=a.classList.contains(b[d]);else{var h=a.className;h===b[d]?f=!0:(g=new RegExp("(^|\\s)"+b[d]+"(\\s|$)"),f=g.test(h))}if(f&&!c)return!0;if(!f&&c)return!1}return c?!0:!1},blinkClass:function(a,c,d,e){a=Ink.i(a),b.addRemoveClassName(a,c,!e),setTimeout(function(){b.addRemoveClassName(a,c,e)},Number(d)||100)},toggleClassName:function(a,c,d){return a&&c?"undefined"!=typeof d?b.addRemoveClassName(a,c,d):void("undefined"==typeof a.classList||/[, ]/.test(c)?b.hasClassName(a,c)?b.removeClassName(a,c):b.addClassName(a,c):(a=Ink.i(a),null!==a&&a.classList.toggle(c))):!1},setOpacity:function(a,b){if(a=Ink.i(a),null!==a){var c=1;isNaN(Number(b))||(c=0>=b?0:1>=b?b:100>=b?b/100:1),"undefined"!=typeof a.style.opacity?a.style.opacity=c:a.style.filter="alpha(opacity:"+(100*c|0)+")"}},_camelCase:function(a){return a?a.replace(/-(\w)/g,function(a,b){return b.toUpperCase()}):a},getStyle:function(b,c){if(b=Ink.i(b),null!==b&&b.style){c="float"===c?"cssFloat":this._camelCase(c);var d=b.style[c];if(!a||d&&"auto"!==d)!d&&b.currentStyle&&(d=b.currentStyle[c],"auto"!==d||"width"!==c&&"height"!==c||(d=b["offset"+c.charAt(0).toUpperCase()+c.slice(1)]+"px"));else{var e=a(b,null);d=e?e[c]:null}if("opacity"===c)return d?parseFloat(d,10):1;if("borderTopWidth"===c||"borderBottomWidth"===c||"borderRightWidth"===c||"borderLeftWidth"===c){if("thin"===d)return"1px";if("medium"===d)return"3px";if("thick"===d)return"5px"}return"auto"===d?null:d}},setStyle:function(a,b){if(a=Ink.i(a),null!==a)if("string"==typeof b)a.style.cssText+="; "+b,-1!==b.indexOf("opacity")&&this.setOpacity(a,b.match(/opacity:\s*(\d?\.?\d*)/)[1]);else for(var c in b)b.hasOwnProperty(c)&&("opacity"===c?this.setOpacity(a,b[c]):"float"===c||"cssFloat"===c?"undefined"==typeof a.style.styleFloat?a.style.cssFloat=b[c]:a.style.styleFloat=b[c]:a.style[c]=b[c])},show:function(a,b){a=Ink.i(a),null!==a&&(a.style.display=b||"")},hide:function(a){a=Ink.i(a),null!==a&&(a.style.display="none")},showHide:function(a,b){a=Ink.i(a),a&&(a.style.display=b?"":"none")},toggle:function(a,b){a=Ink.i(a),null!==a&&("undefined"!=typeof b?b===!0?this.show(a):this.hide(a):"none"===this.getStyle(a,"display").toLowerCase()?this.show(a):this.hide(a))},_getRefTag:function(a){if(a.firstElementChild)return a.firstElementChild;for(var b=a.firstChild;b;b=b.nextSibling)if(1===b.nodeType)return b;return null},appendStyleTag:function(a,b,c){c=Ink.extendObj({type:"text/css",force:!1},c||{});var d=document.getElementsByTagName("style"),e=!1,f=!0,g,h;for(g=0,h=d.length;h>g;g++)e=d[g].innerHTML,e.indexOf(a)>=0&&(f=!1);if(f){var i=document.createElement("style"),j=document.getElementsByTagName("head")[0],k=!1,l="";i.type=c.type,l+=a+" {",l+=b,l+="} ","undefined"!=typeof i.styleSheet?i.styleSheet.cssText=l:i.appendChild(document.createTextNode(l)),c.force?j.appendChild(i):(k=this._getRefTag(j),k&&j.insertBefore(i,k))}},appendStylesheet:function(a,b){b=Ink.extendObj({media:"screen",type:"text/css",force:!1},b||{});var c,d=document.createElement("link"),e=document.getElementsByTagName("head")[0];d.media=b.media,d.type=b.type,d.href=a,d.rel="Stylesheet",b.force?e.appendChild(d):(c=this._getRefTag(e),c&&e.insertBefore(d,c))},_loadingCSSFiles:{},_loadedCSSFiles:{},appendStylesheetCb:function(a,b){if(!a)return b(a);if(this._loadedCSSFiles[a])return b(a);var c=this._loadingCSSFiles[a];if(c)return c.push(b);this._loadingCSSFiles[a]=[b];var d=document.createElement("link");d.type="text/css",d.rel="stylesheet",d.href=a;var e=document.getElementsByTagName("head")[0];e.appendChild(d);var f=document.createElement("img");f.onerror=Ink.bindEvent(function(a,b){var c=b;this._loadedCSSFiles[c]=!0;for(var d=this._loadingCSSFiles[c],e=0,f=d.length;f>e;++e)d[e](c);delete this._loadingCSSFiles[c]},this,a),f.src=a},decToHex:function(a){var b=function(a){return 1===a.length&&(a="0"+a),a=a.toUpperCase()};if("object"==typeof a){var c=b(parseInt(a.r,10).toString(16)),d=b(parseInt(a.g,10).toString(16)),e=b(parseInt(a.b,10).toString(16));return c+d+e}a+="";var f=a.match(/\((\d+),\s?(\d+),\s?(\d+)\)/);return null!==f?b(parseInt(f[1],10).toString(16))+b(parseInt(f[2],10).toString(16))+b(parseInt(f[3],10).toString(16)):b(parseInt(a,10).toString(16))},hexToDec:function(a){return 0===a.indexOf("#")&&(a=a.substr(1)),6===a.length?{r:parseInt(a.substr(0,2),16),g:parseInt(a.substr(2,2),16),b:parseInt(a.substr(4,2),16)}:3===a.length?{r:parseInt(a.charAt(0)+a.charAt(0),16),g:parseInt(a.charAt(1)+a.charAt(1),16),b:parseInt(a.charAt(2)+a.charAt(2),16)}:a.length<=2?parseInt(a,16):void 0},getPropertyFromStylesheet:function(a,b){var c=this.getRuleFromStylesheet(a);return c?c.style[b]:null},getPropertyFromStylesheet2:function(a,b){for(var c=this.getRulesFromStylesheet(a),d,e=0,f=c.length;f>e;e++)if(d=c[e].style[b],null!==d&&void 0!==d)return d;return null},getRuleFromStylesheet:function(a){var b,c,d,e,f,g=document.styleSheets;if(!g)return null;for(var h=0,i=document.styleSheets.length;i>h;++h){if(b=document.styleSheets[h],c=b.rules?b.rules:b.cssRules,!c)return null;for(d=0,e=c.length;e>d;++d)if(f=c[d],f.selectorText&&f.selectorText===a)return f}return null},getRulesFromStylesheet:function(a){var b=[],c,d,e,f,g,h=document.styleSheets;if(!h)return b;for(var i=0,j=document.styleSheets.length;j>i;++i){if(c=document.styleSheets[i],d=c.rules?c.rules:c.cssRules,!d)return null;for(e=0,f=d.length;f>e;++e)g=d[e],g.selectorText&&g.selectorText===a&&b.push(g)}return b},getPropertiesFromRule:function(a){var b=this.getRuleFromStylesheet(a),c={},d,e,f;b=b.style.cssText;var g=b.split(";"),h,i,j,k;for(e=0,f=g.length;f>e;++e)" "===g[e].charAt(0)&&(g[e]=g[e].substring(1)),h=g[e].split(":"),d=this._camelCase(h[0].toLowerCase()),i=h[1],i&&(i=i.substring(1),"padding"===d||"margin"===d||"borderWidth"===d?("borderWidth"===d?(j="border",k="Width"):(j=d,k=""),-1!==i.indexOf(" ")?(i=i.split(" "),c[j+"Top"+k]=i[0],c[j+"Bottom"+k]=i[0],c[j+"Left"+k]=i[1],c[j+"Right"+k]=i[1]):(c[j+"Top"+k]=i,c[j+"Bottom"+k]=i,c[j+"Left"+k]=i,c[j+"Right"+k]=i)):"borderRadius"===d?-1!==i.indexOf(" ")?(i=i.split(" "),c.borderTopLeftRadius=i[0],c.borderBottomRightRadius=i[0],c.borderTopRightRadius=i[1],c.borderBottomLeftRadius=i[1]):(c.borderTopLeftRadius=i,c.borderTopRightRadius=i,c.borderBottomLeftRadius=i,c.borderBottomRightRadius=i):c[d]=i);return c},changeFontSize:function(a,b,c,d,e){var f=this;Ink.requireModules(["Ink.Dom.Selector_1"],function(g){var h;if("string"!=typeof a?h="1st argument must be a CSS selector rule.":"number"!=typeof b?h="2nd argument must be a number.":void 0!==c&&"+"!==c&&"*"!==c?h='3rd argument must be one of "+", "*".':void 0!==d&&("number"!=typeof d||0>=d)?h="4th argument must be a positive number.":void 0!==e&&("number"!=typeof e||e>e)&&(h="5th argument must be a positive number greater than minValue."),h)throw new TypeError(h);var i,j,k=g.select(a);void 0===d&&(d=1),c="*"===c?function(a,b){return a*b}:function(a,b){return a+b};for(var l=0,m=k.length;m>l;++l)j=k[l],i=parseFloat(f.getStyle(j,"fontSize")),i=c(i,b),d>i||"number"==typeof e&&i>e||(j.style.fontSize=i+"px")})}};return b}),Ink.createModule("Ink.Dom.Element",1,[],function(){"use strict";function a(a){var b={};try{b=a.getBoundingClientRect()}catch(c){b={top:a.offsetTop,left:a.offsetLeft}}return b}var b="function"==typeof document.createRange&&"function"==typeof window.Range.prototype.createContextualFragment,c="Ink.Dom.Element tbody: "+Math.random(),d=function(){var a=document.createElement("div");return a.innerHTML="",0!==a.getElementsByTagName("tbody").length}(),e={isDOMElement:function(a){return null!==a&&"object"==typeof a&&"nodeType"in a&&1===a.nodeType},get:function(a){return"undefined"!=typeof a?"string"==typeof a?document.getElementById(a):a:null},create:function(a,b){var c=document.createElement(a);if(b)for(var d in b)b.hasOwnProperty(d)&&(d in e?e[d](c,b[d]):"className"===d||"class"===d?c.className=b.className||b["class"]:c.setAttribute(d,b[d]));return c},remove:function(a){a=Ink.i(a);var b;a&&(b=a.parentNode)&&b.removeChild(a)},scrollTo:function(a){if(a=e.get(a)){if(a.scrollIntoView)return a.scrollIntoView();var b={},c=0,d=0;do c+=a.offsetTop||0,d+=a.offsetLeft||0,a=a.offsetParent;while(a);b={x:d,y:c},window.scrollTo(b.x,b.y)}},offsetTop:function(a){return e.offset(a)[1]},offsetLeft:function(a){return e.offset(a)[0]},positionedOffset:function(a){var b=0,c=0;a=e.get(a);do if(b+=a.offsetTop||0,c+=a.offsetLeft||0,a=a.offsetParent){if("body"===a.tagName.toLowerCase())break;var d=a.style.position;if(!d&&a.currentStyle&&(d=a.currentStyle.position),(!d||"auto"===d)&&"undefined"!=typeof getComputedStyle){var f=getComputedStyle(a,null);d=f?f.position:null}if("relative"===d||"absolute"===d)break}while(a);return[c,b]},offset:function(b){b=Ink.i(b);var c=[0,0],d=b.ownerDocument,e=d.documentElement,f=a(b),g=d.body,h=e.clientTop||g.clientTop||0,i=e.clientLeft||g.clientLeft||0,j=d.pageYOffset||e.scrollTop||g.scrollTop,k=d.pageXOffset||e.scrollLeft||g.scrollLeft,l=f.top+j-h,m=f.left+k-i;return c=[m,l]},scroll:function(a){return a=a?Ink.i(a):document.body,[window.pageXOffset?window.pageXOffset:a.scrollLeft,window.pageYOffset?window.pageYOffset:a.scrollTop]},_getPropPx:function(a,b){var c,d,e=a.getPropertyValue?a.getPropertyValue(b):a[b];return e?(d=e.indexOf("px"),c=-1===d?0:parseFloat(e,10)):c=0,c},offset2:function(a){return e.offset(a)},hasAttribute:function(a,b){return a=Ink.i(a),a.hasAttribute?a.hasAttribute(b):!!a.getAttribute(b)},insertAfter:function(a,b){(b=e.get(b))&&(null!==b.nextSibling?b.parentNode.insertBefore(a,b.nextSibling):b.parentNode.appendChild(a))},insertBefore:function(a,b){(b=e.get(b))&&b.parentNode.insertBefore(a,b)},insertTop:function(a,b){(b=e.get(b))&&(b.firstChild?b.insertBefore(a,b.firstChild):b.appendChild(a))},insertBottom:function(a,b){b=Ink.i(b),b.appendChild(a)},textContent:function(a){a=Ink.i(a);var b,c,d,f;switch(a&&a.nodeType){case 9:return e.textContent(a.documentElement||a.body&&a.body.parentNode||a.body);case 1:if(b="textContent"in a?a.textContent:a.innerText,"undefined"!=typeof b)return b;case 11:if(b=a.textContent,"undefined"!=typeof b)return b;if(a.firstChild===a.lastChild)return e.textContent(a.firstChild);for(b=[],d=a.childNodes,c=0,f=d.length;f>c;++c)b.push(e.textContent(d[c]));return b.join("");case 3:case 4:return a.nodeValue}return""},setTextContent:function(a,b){switch(a=Ink.i(a),a&&a.nodeType){case 1:if("innerText"in a){a.innerText=b;break}case 11:if("textContent"in a){a.textContent=b;break}case 9:for(;a.firstChild;)a.removeChild(a.firstChild);if(""!==b){var c=a.ownerDocument||a;a.appendChild(c.createTextNode(b))}break;case 3:case 4:a.nodeValue=b}},isLink:function(a){var b=a&&1===a.nodeType&&(/^a|area$/i.test(a.tagName)||a.hasAttributeNS&&a.hasAttributeNS("http://www.w3.org/1999/xlink","href"));return!!b},isAncestorOf:function(a,b){if(!b||!a)return!1;if(b.compareDocumentPosition)return 0!==(16&a.compareDocumentPosition(b));for(;b=b.parentNode;)if(b===a)return!0;return!1},descendantOf:function(a,b){return a!==b&&e.isAncestorOf(a,b)},firstElementChild:function(a){if(!a)return null;if("firstElementChild"in a)return a.firstElementChild;for(var b=a.firstChild;b&&1!==b.nodeType;)b=b.nextSibling;return b},lastElementChild:function(a){if(!a)return null;if("lastElementChild"in a)return a.lastElementChild;for(var b=a.lastChild;b&&1!==b.nodeType;)b=b.previousSibling;return b},nextElementSibling:function(a){var b=null;if(!a)return b;if("nextElementSibling"in a)return a.nextElementSibling;for(b=a.nextSibling;b&&1!==b.nodeType;)b=b.nextSibling;return b},previousElementSibling:function(a){var b=null;if(!a)return b;if("previousElementSibling"in a)return a.previousElementSibling;for(b=a.previousSibling;b&&1!==b.nodeType;)b=b.previousSibling; +!function(a,b){"use strict";if(!("Ink"in a)){var c={},d={},e=[],f={},g=[],h={},i=Function.prototype.apply,j=function(a){if("object"!=typeof a)return!1;for(var b in a)if(a.hasOwnProperty(b))return!1;return!0};a.Ink={VERSION:"3.1.4",_checkPendingRequireModules:function(){var a,b,c,e,f,h,i=[],j=[];for(a=0,b=g.length;b>a;++a)if(c=g[a]){for(e in c.left)c.left.hasOwnProperty(e)&&(f=d[e],f&&(c.args[c.left[e]]=f,delete c.left[e],--c.remaining));if(c.remaining>0)i.push(c);else{if(h=c.cb,!h)continue;delete c.cb,j.push([h,c.args])}}g=i;for(var k=0;k0&&setTimeout(function(){Ink._checkPendingRequireModules()},0)},getPath:function(a,b){var d=a.split(/[._]/g),e,f,g,h;for(f=d.length;f>=0;f-=1)if(e=d.slice(0,f+1).join("."),c[e]){g=e;break}return g in c?(h=c[g],/\/$/.test(h)||(h+="/"),fg;++g)e[d[g]]=e[d[g]]||{},f=e,e=e[d[g]];return c?[f,d[g-1]]:e},getModule:function(a,b){var c=b?[a,"_",b].join(""):a;return d[c]},createModule:function(b,c,g,i){if("string"!=typeof b)throw new Error("module name must be a string!");if(!("number"==typeof c||"string"==typeof c&&c.length>0))throw new Error("version number missing!");var k=[b,"_",c].join("");h[k]=!0;var l=function(){if(!d[k]){delete f[k],delete f[b];var g=Array.prototype.slice.call(arguments),l=i.apply(a,g);e.push(k),"object"==typeof l?l._version=c:"function"==typeof l&&(l.prototype._version=c,l._version=c);var m=0===b.indexOf("Ink."),n;m&&(n=Ink.namespace(b,!0)),d[k]=l,delete h[k],m&&(n[0][n[1]+"_"+c]=l),d[b]=l,m&&j(n[0][n[1]])&&(n[0][n[1]]=l),this&&Ink._checkPendingRequireModules()}};this.requireModules(g,l)},requireModules:function(a,b){var c,e,h,i,j;if(e=a&&a.length,h={args:new Array(e),left:{},remaining:e,cb:b},"object"!=typeof a||void 0===a.length)throw new Error("Dependency list should be an array!");if("function"!=typeof b)throw new Error("Callback should be a function!");for(c=0;e>c;++c)Ink._moduleRenames[a[c]]?(Ink.warn(a[c]+" was renamed to "+Ink._moduleRenames[a[c]]),i=Ink._moduleRenames[a[c]]):i=a[c],i?(j=d[i],j?(h.args[c]=j,--h.remaining):(f[i]||Ink._loadLater(i),h.left[i]=c)):--h.remaining;h.remaining>0?g.push(h):b.apply(!0,h.args)},_moduleRenames:{"Ink.UI.Aux_1":"Ink.UI.Common_1"},getModulesLoadOrder:function(){return e.slice()},getModuleScripts:function(){var a=this.getModulesLoadOrder();return a.unshift("Ink_1"),a=a.map(function(a){return[""].join("")}),a.join("\n")},createExt:function(a,b,c,d){return Ink.createModule("Ink.Ext."+a,b,c,d)},bind:function(a,b){var c=Array.prototype.slice.call(arguments,2);return function(){var d=Array.prototype.slice.call(arguments),e=c.concat(d);return a.apply(b===!1?this:b,e)}},bindMethod:function(a,b){return Ink.bind.apply(Ink,[a[b],a].concat([].slice.call(arguments,2)))},bindEvent:function(b,c){var d=Array.prototype.slice.call(arguments,2);return function(e){var f=d.slice();return f.unshift(e||a.event),b.apply(c===!1?this:c,f)}},i:function(a){return"string"==typeof a?b.getElementById(a)||null:a},ss:function(a,c){if("undefined"==typeof Ink.Dom||"undefined"==typeof Ink.Dom.Selector)throw new Error("This method requires Ink.Dom.Selector");return Ink.Dom.Selector.select(a,c||b)},s:function(a,c){if("undefined"==typeof Ink.Dom||"undefined"==typeof Ink.Dom.Selector)throw new Error("This method requires Ink.Dom.Selector");return Ink.Dom.Selector.select(a,c||b)[0]||null},extendObj:function(a){for(var b=[].slice.call(arguments,1),c=0,d=b.length;d>c;c++)if(b[c])for(var e in b[c])Object.prototype.hasOwnProperty.call(b[c],e)&&(a[e]=b[c][e]);return a},log:function(){var b=a.console;b&&b.log&&i.call(b.log,b,arguments)},warn:function(){var b=a.console;b&&b.warn&&i.call(b.warn,b,arguments)},error:function(){var b=a.console;b&&b.error&&i.call(b.error,b,arguments)}}}}(window,document),Ink.createModule("Ink.Net.Ajax","1",[],function(){"use strict";var Ajax=function(a,b){this.init(a,b)};Ajax.globalOptions={parameters:{},requestHeaders:{}};var xMLHttpRequestWithCredentials="XMLHttpRequest"in window&&"withCredentials"in new XMLHttpRequest;return Ajax.prototype={init:function(a,b){if(!a)throw new Error("new Ink.Net.Ajax: Pass a url as the first argument!");var c=Ink.extendObj({asynchronous:!0,contentType:"application/x-www-form-urlencoded",cors:!1,validateCors:!1,debug:!1,delay:0,evalJS:!0,method:"POST",parameters:null,postBody:"",requestHeaders:null,sanitizeJSON:!1,signRequest:!1,timeout:0,useCredentials:!1,xhrProxy:"",onComplete:null,onCreate:null,onException:null,onFailure:null,onHeaders:null,onInit:null,onSuccess:null,onTimeout:null},Ajax.globalOptions);if(b&&"object"==typeof b){if(c=Ink.extendObj(c,b),"object"==typeof b.parameters)c.parameters=Ink.extendObj(Ink.extendObj({},Ajax.globalOptions.parameters),b.parameters);else if(null!==b.parameters){var d=this.paramsObjToStr(Ajax.globalOptions.parameters);d&&(c.parameters=b.parameters+"&"+d)}c.requestHeaders=Ink.extendObj({},Ajax.globalOptions.requestHeaders),c.requestHeaders=Ink.extendObj(c.requestHeaders,b.requestHeaders)}this.options=c,this.safeCall("onInit"),this.url=a;var e=this._locationFromURL(a);this.isHTTP=this._locationIsHTTP(e),this.isCrossDomain=this._locationIsCrossDomain(e,location),this.requestHasBody=c.method.search(/^get|head$/i)<0,this.options.validateCors===!0&&(this.options.cors=this.isCrossDomain),this.options.cors&&(this.isCrossDomain=!1),this.transport=this.getTransport(),this.request()},_locationFromURL:function(a){var b=document.createElementNS?document.createElementNS("http://www.w3.org/1999/xhtml","a"):document.createElement("a");return b.setAttribute("href",a),b},_locationIsHTTP:function(a){return a.href.match(/^https?:/i)?!0:!1},_locationIsCrossDomain:function(a,b){if(b=b||window.location,Ajax.prototype._locationIsHTTP(a)&&"widget:"!==b.protocol&&"object"!=typeof window.widget){var c=a.href.split("//"),d=b.href.split("//");if(1===c.length||1===d.length)return!1;var e=c[0],f=d[0],g=/:|\//,h=c[1].split(g)[0],i=d[1].split(g)[0];return e!==f||h!==i}return!1},getTransport:function(){if(!xMLHttpRequestWithCredentials&&this.options.cors&&"XDomainRequest"in window)return this.usingXDomainReq=!0,new XDomainRequest;if("undefined"!=typeof XMLHttpRequest)return new XMLHttpRequest;if("undefined"==typeof ActiveXObject)return null;try{return new ActiveXObject("Msxml2.XMLHTTP")}catch(a){return new ActiveXObject("Microsoft.XMLHTTP")}},setHeaders:function(){if(this.transport)try{var a={Accept:"text/javascript,text/xml,application/xml,application/xhtml+xml,text/html,application/json;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1","Accept-Language":navigator.language,"X-Requested-With":"XMLHttpRequest","X-Ink-Version":"3"};if(this.options.cors&&(this.options.signRequest||delete a["X-Requested-With"],delete a["X-Ink-Version"]),this.options.requestHeaders&&"object"==typeof this.options.requestHeaders)for(var b in this.options.requestHeaders)this.options.requestHeaders.hasOwnProperty(b)&&(a[b]=this.options.requestHeaders[b]);this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\/(\d{4})/)||[0,2005])[1]<2005&&(a.Connection="close");for(var c in a)a.hasOwnProperty(c)&&this.transport.setRequestHeader(c,a[c])}catch(d){}},paramsObjToStr:function(a){var b,c,d,e,f=[];if("object"!=typeof a)return a;for(d in a)if(a.hasOwnProperty(d))if(e=a[d],"[object Array]"!==Object.prototype.toString.call(e)||isNaN(e.length))f=f.concat([encodeURIComponent(d),"=",encodeURIComponent(e),"&"]);else for(b=0,c=e.length;c>b;b++)f=f.concat([encodeURIComponent(d),"[]","=",encodeURIComponent(e[b]),"&"]);return f.length>0&&f.pop(),f.join("")},setParams:function(){var a=null,b=this.options.parameters;a="object"==typeof b?this.paramsObjToStr(b):""+b,a&&(this.url=this.url.indexOf("?")>-1?this.url.split("#")[0]+"&"+a:this.url.split("#")[0]+"?"+a)},getHeader:function(a){if(this.usingXDomainReq&&"Content-Type"===a)return this.transport.contentType;try{return this.transport.getResponseHeader(a)}catch(b){return null}},getAllHeaders:function(){try{return this.transport.getAllResponseHeaders()}catch(a){return null}},getResponse:function(){var a=this.transport,b={headerJSON:null,responseJSON:null,getHeader:this.getHeader,getAllHeaders:this.getAllHeaders,request:this,transport:a,timeTaken:new Date-this.startTime,requestedUrl:this.url};b.readyState=a.readyState;try{b.responseText=a.responseText}catch(c){}try{b.responseXML=a.responseXML}catch(c){}try{b.status=a.status}catch(c){b.status=0}try{b.statusText=a.statusText}catch(c){b.statusText=""}return b},abort:function(){if(this.transport){clearTimeout(this.delayTimeout),clearTimeout(this.stoTimeout);try{this.transport.abort()}catch(a){}this.finish()}},runStateChange:function(){var a=this.transport.readyState;if(3===a)this.isHTTP&&this.safeCall("onHeaders");else if(4===a||this.usingXDomainReq){if(this.options.asynchronous&&this.options.delay&&this.startTime+this.options.delay>(new Date).getTime())return void(this.delayTimeout=setTimeout(Ink.bind(this.runStateChange,this),this.options.delay+this.startTime-(new Date).getTime()));var b,c=this.transport.responseText,d=this.getResponse(),e=this.transport.status;this.isHTTP&&!this.options.asynchronous&&this.safeCall("onHeaders"),clearTimeout(this.stoTimeout),0===e?this.isHTTP?this.safeCall("onException",new Error("Ink.Net.Ajax: network error! (HTTP status 0)")):e=c?200:404:304===e&&(e=200);var f=this.usingXDomainReq||e>=200&&300>e,g=this.getHeader("Content-Type")||"";if(this.options.evalJS&&(g.indexOf("application/json")>=0||"force"===this.options.evalJS))try{b=this.evalJSON(c,this.sanitizeJSON),b&&(c=d.responseJSON=b)}catch(h){f&&this.safeCall("onException",h)}if(this.usingXDomainReq&&-1!==g.indexOf("xml")&&"DOMParser"in window){var i;switch(g){case"application/xml":case"application/xhtml+xml":case"image/svg+xml":i=g;break;default:i="text/xml"}var j=(new DOMParser).parseFromString(this.transport.responseText,i);this.transport.responseXML=j,d.responseXML=j}null!=this.transport.responseXML&&null==d.responseJSON&&""!==this.transport.responseXML.xml&&(c=this.transport.responseXML),(e||this.usingXDomainReq)&&(f?this.safeCall("onSuccess",d,c):this.safeCall("onFailure",d,c),this.safeCall("on"+e,d,c)),this.finish(d,c)}},finish:function(a,b){if(a&&this.safeCall("onComplete",a,b),clearTimeout(this.stoTimeout),this.transport){try{this.transport.onreadystatechange=null}catch(c){}"function"==typeof this.transport.destroy&&this.transport.destroy(),this.transport=null}},safeCall:function(a){var b=arguments[1]instanceof Error?arguments[1]:null;if("function"==typeof this.options[a])try{this.options[a].apply(this,[].slice.call(arguments,1))}catch(c){Ink.error("Ink.Net.Ajax: an error was raised while executing "+a+".",c)}else b&&Ink.error("Ink.Net.Ajax: "+b)},setRequestHeader:function(a,b){this.options.requestHeaders||(this.options.requestHeaders={}),this.options.requestHeaders[a]=b},request:function(){if(this.transport){var a=null;this.requestHasBody?(null!==this.options.postBody&&""!==this.options.postBody?(a=this.options.postBody,this.setParams()):null!==this.options.parameters&&""!==this.options.parameters&&(a=this.options.parameters),"object"!=typeof a||a.nodeType?"object"!=typeof a&&null!==a&&(a=""+a):a=this.paramsObjToStr(a),this.options.contentType&&this.setRequestHeader("Content-Type",this.options.contentType)):this.setParams();var b=this.url,c=this.options.method,d=this.isCrossDomain;d&&this.options.xhrProxy&&(this.setRequestHeader("X-Url",b),b=this.options.xhrProxy+encodeURIComponent(b),d=!1);try{this.transport.open(c,b,this.options.asynchronous)}catch(e){return this.safeCall("onException",e),this.finish(this.getResponse(),null)}this.setHeaders(),this.safeCall("onCreate"),this.options.timeout&&!isNaN(this.options.timeout)&&(this.stoTimeout=setTimeout(Ink.bind(function(){this.options.onTimeout&&(this.safeCall("onTimeout"),this.abort())},this),1e3*this.options.timeout)),this.options.useCredentials&&!this.usingXDomainReq&&(this.transport.withCredentials=!0),this.options.asynchronous&&!this.usingXDomainReq?this.transport.onreadystatechange=Ink.bind(this.runStateChange,this):this.usingXDomainReq&&(this.transport.onload=Ink.bind(this.runStateChange,this));try{if(d)return void Ink.error("Ink.Net.Ajax: You are attempting to request a URL which is cross-domain from this one. To do this, you *must* enable the `cors` option!");this.startTime=(new Date).getTime(),this.transport.send(a)}catch(e){return this.safeCall("onException",e),this.finish(this.getResponse(),null)}this.options.asynchronous||this.runStateChange()}},isJSON:function(a){return"string"==typeof a&&a?(a=a.replace(/\\./g,"@").replace(/"[^"\\\n\r]*"/g,""),/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/.test(a)):!1},evalJSON:function(strJSON,sanitize){if(strJSON&&(!sanitize||this.isJSON(strJSON)))try{return"undefined"!=typeof JSON&&"undefined"!=typeof JSON.parse?JSON.parse(strJSON):eval("("+strJSON+")")}catch(e){throw new Error("Ink.Net.Ajax: Bad JSON string. "+e)}return null}},Ajax.load=function(a,b){var c=Ajax.prototype._locationIsCrossDomain(window.location,Ajax.prototype._locationFromURL(a));return new Ajax(a,{method:"GET",cors:c,onSuccess:function(a){b(a.responseJSON||a.responseText,a)}})},Ajax.ping=function(a,b){var c=Ajax.prototype._locationIsCrossDomain(window.location,Ajax.prototype._locationFromURL(a));return new Ajax(a,{method:"HEAD",cors:c,onSuccess:function(a){"function"==typeof b&&b(a)}})},Ajax}),Ink.createModule("Ink.Net.JsonP","1",[],function(){"use strict";var a=function(a,b){this.init(a,b)};return a.prototype={init:function(a,b){if(this.options=Ink.extendObj({onSuccess:void 0,onFailure:void 0,failureObj:{},timeout:10,params:{},callbackParam:"jsoncallback",internalCallback:"_cb",randVar:!1},b||{}),this.randVar=this.options.randVar!==!1?this.options.randVar:parseInt(1e5*Math.random(),10),this.options.internalCallback+=this.randVar,this.uri=a,"function"==typeof this.options.onComplete&&(this.options.onSuccess=this.options.onComplete),"string"!=typeof this.uri)throw new Error("Ink.Net.JsonP: Please define an URI");if("function"!=typeof this.options.onSuccess)throw new Error("Ink.Net.JsonP: please define a callback function on option onSuccess!");Ink.Net.JsonP[this.options.internalCallback]=Ink.bind(function(){this.options.onSuccess(arguments[0]),this._cleanUp()},this),this.timeout=setTimeout(Ink.bind(function(){this.abort(),"function"==typeof this.options.onFailure&&this.options.onFailure(this.options.failureObj)},this),1e3*this.options.timeout),this._addScriptTag()},abort:function(){Ink.Net.JsonP[this.options.internalCallback]=Ink.bindMethod(this,"_cleanUp")},_addParamsToGet:function(a,b){var c=-1!==a.indexOf("?"),d,e,f,g=[a];for(e in b)b.hasOwnProperty(e)&&(c?d="&":(d="?",c=!0),f=b[e],"number"==typeof f||f||(f=""),g=g.concat([d,e,"=",encodeURIComponent(f)]));return g.join("")},_getScriptContainer:function(){return document.body||document.getElementsByTagName("body")[0]||document.getElementsByTagName("head")[0]||document.documentElement},_addScriptTag:function(){this.options.params[this.options.callbackParam]="Ink.Net.JsonP."+this.options.internalCallback,this.options.params.rnd_seed=this.randVar,this.uri=this._addParamsToGet(this.uri,this.options.params),this._scriptEl=document.createElement("script"),this._scriptEl.type="text/javascript",this._scriptEl.src=this.uri;var a=this._getScriptContainer();a.appendChild(this._scriptEl)},_cleanUp:function(){this.timeout&&window.clearTimeout(this.timeout),delete this.options.onSuccess,delete this.options.onFailure,delete Ink.Net.JsonP[this.options.internalCallback],this._removeScriptTag()},_removeScriptTag:function(){this._scriptEl&&(this._scriptEl.parentNode.removeChild(this._scriptEl),delete this._scriptEl)}},a}),Ink.createModule("Ink.Dom.Browser","1",[],function(){"use strict";var a={IE:!1,GECKO:!1,OPERA:!1,SAFARI:!1,KONQUEROR:!1,CHROME:!1,model:!1,version:!1,userAgent:!1,cssPrefix:!1,domPrefix:!1,init:function(){this.detectBrowser(),this.setDimensions(),this.setReferrer()},setDimensions:function(){var a=0,b=0;"number"==typeof window.innerWidth?(a=window.innerWidth,b=window.innerHeight):document.documentElement&&(document.documentElement.clientWidth||document.documentElement.clientHeight)?(a=document.documentElement.clientWidth,b=document.documentElement.clientHeight):document.body&&(document.body.clientWidth||document.body.clientHeight)&&(a=document.body.clientWidth,b=document.body.clientHeight),this.windowWidth=a,this.windowHeight=b},setReferrer:function(){this.referrer=document.referrer&&document.referrer.length?window.escape(document.referrer):!1},detectBrowser:function(){this._sniffUserAgent(navigator.userAgent)},_sniffUserAgent:function(a){if(this.userAgent=a,a=a.toLowerCase(),/applewebkit\//.test(a))if(this.cssPrefix="-webkit-",this.domPrefix="Webkit",/(chrome|crios)\//.test(a))this.CHROME=!0,this.model="chrome",this.version=a.replace(/(.*)chrome\/([^\s]+)(.*)/,"$2");else{this.SAFARI=!0,this.model="safari";var b=/version\/([^) ]+)/;this.version=b.test(a)?a.match(b)[1]:a.replace(/(.*)applewebkit\/([^\s]+)(.*)/,"$2")}else if(/opera/.test(a))this.OPERA=!0,this.model="opera",this.version=a.replace(/(.*)opera.([^\s$]+)(.*)/,"$2"),this.cssPrefix="-o-",this.domPrefix="O";else if(/konqueror/.test(a))this.KONQUEROR=!0,this.model="konqueror",this.version=a.replace(/(.*)konqueror\/([^;]+);(.*)/,"$2"),this.cssPrefix="-khtml-",this.domPrefix="Khtml";else if(/(msie|trident)/i.test(a))this.IE=!0,this.model="ie",this.version=/rv:((?:\d|\.)+)/.test(a)?a.match(/rv:((?:\d|\.)+)/)[1]:a.replace(/(.*)\smsie\s([^;]+);(.*)/,"$2"),this.cssPrefix="-ms-",this.domPrefix="ms";else if(/gecko/.test(a)){this.cssPrefix="-moz-",this.domPrefix="Moz",this.GECKO=!0;var c=/(camino|chimera|epiphany|minefield|firefox|firebird|phoenix|galeon|iceweasel|k\-meleon|seamonkey|netscape|songbird|sylera)/;if(c.test(a))this.model=a.match(c)[1],this.version=a.replace(new RegExp("(.*)"+this.model+"/([^;\\s$]+)(.*)"),"$2");else{this.model="mozilla";var d=/(.*)rv:([^)]+)(.*)/;d.test(a)&&(this.version=a.replace(d,"$2"))}}},debug:function(){var a="known browsers: (ie, gecko, opera, safari, konqueror) \n";a+=[this.IE,this.GECKO,this.OPERA,this.SAFARI,this.KONQUEROR]+"\n",a+="cssPrefix -> "+this.cssPrefix+"\n",a+="domPrefix -> "+this.domPrefix+"\n",a+="model -> "+this.model+"\n",a+="version -> "+this.version+"\n",a+="\n",a+="original UA -> "+this.userAgent,alert(a)}};return a.init(),a}),Ink.createModule("Ink.Dom.Css",1,[],function(){"use strict";var a="defaultView"in document&&"getComputedStyle"in document.defaultView?document.defaultView.getComputedStyle:window.getComputedStyle,b={addRemoveClassName:function(a,b,c){return c?this.addClassName(a,b):void this.removeClassName(a,b)},addClassName:function(a,c){if(a=Ink.i(a),!a||!c)return null;c=(""+c).split(/[, ]+/);for(var d=0,e=c.length;e>d;d++)c[d].replace(/^\s+|\s+$/g,"")&&("undefined"!=typeof a.classList?a.classList.add(c[d]):b.hasClassName(a,c[d])||(a.className+=(a.className?" ":"")+c[d]))},removeClassName:function(a,b){if(a=Ink.i(a),!a||!b)return null;b=(""+b).split(/[, ]+/);var c=0,d=b.length;if("undefined"!=typeof a.classList)for(;d>c;c++)a.classList.remove(b[c]);else{for(var e=a.className||"",f;d>c;c++)f=new RegExp("(^|\\s+)"+b[c]+"(\\s+|$)"),e=e.replace(f," ");a.className=e.replace(/^\s+/,"").replace(/\s+$/,"")}},setClassName:function(a,b,c){this.addRemoveClassName(a,b,c||!1)},hasClassName:function(a,b,c){if(a=Ink.i(a),!a||!b)return!1;b=(""+b).split(/[, ]+/);for(var d=0,e=b.length,f,g;e>d;d++){if("undefined"!=typeof a.classList)f=a.classList.contains(b[d]);else{var h=a.className;h===b[d]?f=!0:(g=new RegExp("(^|\\s)"+b[d]+"(\\s|$)"),f=g.test(h))}if(f&&!c)return!0;if(!f&&c)return!1}return c?!0:!1},blinkClass:function(a,c,d,e){a=Ink.i(a),b.addRemoveClassName(a,c,!e),setTimeout(function(){b.addRemoveClassName(a,c,e)},Number(d)||100)},toggleClassName:function(a,c,d){return a&&c?"undefined"!=typeof d?b.addRemoveClassName(a,c,d):void("undefined"==typeof a.classList||/[, ]/.test(c)?b.hasClassName(a,c)?b.removeClassName(a,c):b.addClassName(a,c):(a=Ink.i(a),null!==a&&a.classList.toggle(c))):!1},setOpacity:function(a,b){if(a=Ink.i(a),null!==a){var c=1;isNaN(Number(b))||(c=0>=b?0:1>=b?b:100>=b?b/100:1),"undefined"!=typeof a.style.opacity?a.style.opacity=c:a.style.filter="alpha(opacity:"+(100*c|0)+")"}},_camelCase:function(a){return a?a.replace(/-(\w)/g,function(a,b){return b.toUpperCase()}):a},getStyle:function(b,c){if(b=Ink.i(b),null!==b&&b.style){c="float"===c?"cssFloat":this._camelCase(c);var d=b.style[c];if(!a||d&&"auto"!==d)!d&&b.currentStyle&&(d=b.currentStyle[c],"auto"!==d||"width"!==c&&"height"!==c||(d=b["offset"+c.charAt(0).toUpperCase()+c.slice(1)]+"px"));else{var e=a(b,null);d=e?e[c]:null}if("opacity"===c)return d?parseFloat(d,10):1;if("borderTopWidth"===c||"borderBottomWidth"===c||"borderRightWidth"===c||"borderLeftWidth"===c){if("thin"===d)return"1px";if("medium"===d)return"3px";if("thick"===d)return"5px"}return"auto"===d?null:d}},setStyle:function(a,b){if(a=Ink.i(a),null!==a)if("string"==typeof b)a.style.cssText+="; "+b,-1!==b.indexOf("opacity")&&this.setOpacity(a,b.match(/opacity:\s*(\d?\.?\d*)/)[1]);else for(var c in b)b.hasOwnProperty(c)&&("opacity"===c?this.setOpacity(a,b[c]):"float"===c||"cssFloat"===c?"undefined"==typeof a.style.styleFloat?a.style.cssFloat=b[c]:a.style.styleFloat=b[c]:a.style[c]=b[c])},show:function(a,b){a=Ink.i(a),null!==a&&(a.style.display=b||"")},hide:function(a){a=Ink.i(a),null!==a&&(a.style.display="none")},showHide:function(a,b){a=Ink.i(a),a&&(a.style.display=b?"":"none")},toggle:function(a,b){a=Ink.i(a),null!==a&&("undefined"!=typeof b?b===!0?this.show(a):this.hide(a):"none"===this.getStyle(a,"display").toLowerCase()?this.show(a):this.hide(a))},_getRefTag:function(a){if(a.firstElementChild)return a.firstElementChild;for(var b=a.firstChild;b;b=b.nextSibling)if(1===b.nodeType)return b;return null},appendStyleTag:function(a,b,c){c=Ink.extendObj({type:"text/css",force:!1},c||{});var d=document.getElementsByTagName("style"),e=!1,f=!0,g,h;for(g=0,h=d.length;h>g;g++)e=d[g].innerHTML,e.indexOf(a)>=0&&(f=!1);if(f){var i=document.createElement("style"),j=document.getElementsByTagName("head")[0],k=!1,l="";i.type=c.type,l+=a+" {",l+=b,l+="} ","undefined"!=typeof i.styleSheet?i.styleSheet.cssText=l:i.appendChild(document.createTextNode(l)),c.force?j.appendChild(i):(k=this._getRefTag(j),k&&j.insertBefore(i,k))}},appendStylesheet:function(a,b){b=Ink.extendObj({media:"screen",type:"text/css",force:!1},b||{});var c,d=document.createElement("link"),e=document.getElementsByTagName("head")[0];d.media=b.media,d.type=b.type,d.href=a,d.rel="Stylesheet",b.force?e.appendChild(d):(c=this._getRefTag(e),c&&e.insertBefore(d,c))},_loadingCSSFiles:{},_loadedCSSFiles:{},appendStylesheetCb:function(a,b){if(!a)return b(a);if(this._loadedCSSFiles[a])return b(a);var c=this._loadingCSSFiles[a];if(c)return c.push(b);this._loadingCSSFiles[a]=[b];var d=document.createElement("link");d.type="text/css",d.rel="stylesheet",d.href=a;var e=document.getElementsByTagName("head")[0];e.appendChild(d);var f=document.createElement("img");f.onerror=Ink.bindEvent(function(a,b){var c=b;this._loadedCSSFiles[c]=!0;for(var d=this._loadingCSSFiles[c],e=0,f=d.length;f>e;++e)d[e](c);delete this._loadingCSSFiles[c]},this,a),f.src=a},decToHex:function(a){var b=function(a){return 1===a.length&&(a="0"+a),a=a.toUpperCase()};if("object"==typeof a){var c=b(parseInt(a.r,10).toString(16)),d=b(parseInt(a.g,10).toString(16)),e=b(parseInt(a.b,10).toString(16));return c+d+e}a+="";var f=a.match(/\((\d+),\s?(\d+),\s?(\d+)\)/);return null!==f?b(parseInt(f[1],10).toString(16))+b(parseInt(f[2],10).toString(16))+b(parseInt(f[3],10).toString(16)):b(parseInt(a,10).toString(16))},hexToDec:function(a){return 0===a.indexOf("#")&&(a=a.substr(1)),6===a.length?{r:parseInt(a.substr(0,2),16),g:parseInt(a.substr(2,2),16),b:parseInt(a.substr(4,2),16)}:3===a.length?{r:parseInt(a.charAt(0)+a.charAt(0),16),g:parseInt(a.charAt(1)+a.charAt(1),16),b:parseInt(a.charAt(2)+a.charAt(2),16)}:a.length<=2?parseInt(a,16):void 0},getPropertyFromStylesheet:function(a,b){var c=this.getRuleFromStylesheet(a);return c?c.style[b]:null},getPropertyFromStylesheet2:function(a,b){for(var c=this.getRulesFromStylesheet(a),d,e=0,f=c.length;f>e;e++)if(d=c[e].style[b],null!==d&&void 0!==d)return d;return null},getRuleFromStylesheet:function(a){var b,c,d,e,f,g=document.styleSheets;if(!g)return null;for(var h=0,i=document.styleSheets.length;i>h;++h){if(b=document.styleSheets[h],c=b.rules?b.rules:b.cssRules,!c)return null;for(d=0,e=c.length;e>d;++d)if(f=c[d],f.selectorText&&f.selectorText===a)return f}return null},getRulesFromStylesheet:function(a){var b=[],c,d,e,f,g,h=document.styleSheets;if(!h)return b;for(var i=0,j=document.styleSheets.length;j>i;++i){if(c=document.styleSheets[i],d=c.rules?c.rules:c.cssRules,!d)return null;for(e=0,f=d.length;f>e;++e)g=d[e],g.selectorText&&g.selectorText===a&&b.push(g)}return b},getPropertiesFromRule:function(a){var b=this.getRuleFromStylesheet(a),c={},d,e,f;b=b.style.cssText;var g=b.split(";"),h,i,j,k;for(e=0,f=g.length;f>e;++e)" "===g[e].charAt(0)&&(g[e]=g[e].substring(1)),h=g[e].split(":"),d=this._camelCase(h[0].toLowerCase()),i=h[1],i&&(i=i.substring(1),"padding"===d||"margin"===d||"borderWidth"===d?("borderWidth"===d?(j="border",k="Width"):(j=d,k=""),-1!==i.indexOf(" ")?(i=i.split(" "),c[j+"Top"+k]=i[0],c[j+"Bottom"+k]=i[0],c[j+"Left"+k]=i[1],c[j+"Right"+k]=i[1]):(c[j+"Top"+k]=i,c[j+"Bottom"+k]=i,c[j+"Left"+k]=i,c[j+"Right"+k]=i)):"borderRadius"===d?-1!==i.indexOf(" ")?(i=i.split(" "),c.borderTopLeftRadius=i[0],c.borderBottomRightRadius=i[0],c.borderTopRightRadius=i[1],c.borderBottomLeftRadius=i[1]):(c.borderTopLeftRadius=i,c.borderTopRightRadius=i,c.borderBottomLeftRadius=i,c.borderBottomRightRadius=i):c[d]=i);return c},changeFontSize:function(a,b,c,d,e){var f=this;Ink.requireModules(["Ink.Dom.Selector_1"],function(g){var h;if("string"!=typeof a?h="1st argument must be a CSS selector rule.":"number"!=typeof b?h="2nd argument must be a number.":void 0!==c&&"+"!==c&&"*"!==c?h='3rd argument must be one of "+", "*".':void 0!==d&&("number"!=typeof d||0>=d)?h="4th argument must be a positive number.":void 0!==e&&("number"!=typeof e||e>e)&&(h="5th argument must be a positive number greater than minValue."),h)throw new TypeError(h);var i,j,k=g.select(a);void 0===d&&(d=1),c="*"===c?function(a,b){return a*b}:function(a,b){return a+b};for(var l=0,m=k.length;m>l;++l)j=k[l],i=parseFloat(f.getStyle(j,"fontSize")),i=c(i,b),d>i||"number"==typeof e&&i>e||(j.style.fontSize=i+"px")})}};return b}),Ink.createModule("Ink.Dom.Element",1,[],function(){"use strict";function a(a){var b={};try{b=a.getBoundingClientRect()}catch(c){b={top:a.offsetTop,left:a.offsetLeft}}return b}var b="function"==typeof document.createRange&&"function"==typeof window.Range.prototype.createContextualFragment,c="Ink.Dom.Element tbody: "+Math.random(),d=function(){var a=document.createElement("div");return a.innerHTML="
              ",0!==a.getElementsByTagName("tbody").length}(),e={isDOMElement:function(a){return null!==a&&"object"==typeof a&&"nodeType"in a&&1===a.nodeType},get:function(a){return"undefined"!=typeof a?"string"==typeof a?document.getElementById(a):a:null},create:function(a,b){var c=document.createElement(a);if(b)for(var d in b)b.hasOwnProperty(d)&&(d in e?e[d](c,b[d]):"className"===d||"class"===d?c.className=b.className||b["class"]:c.setAttribute(d,b[d]));return c},remove:function(a){a=Ink.i(a);var b;a&&(b=a.parentNode)&&b.removeChild(a)},scrollTo:function(a){if(a=e.get(a)){if(a.scrollIntoView)return a.scrollIntoView();var b={},c=0,d=0;do c+=a.offsetTop||0,d+=a.offsetLeft||0,a=a.offsetParent;while(a);b={x:d,y:c},window.scrollTo(b.x,b.y)}},offsetTop:function(a){return e.offset(a)[1]},offsetLeft:function(a){return e.offset(a)[0]},positionedOffset:function(a){var b=0,c=0;a=e.get(a);do if(b+=a.offsetTop||0,c+=a.offsetLeft||0,a=a.offsetParent){if("body"===a.tagName.toLowerCase())break;var d=a.style.position;if(!d&&a.currentStyle&&(d=a.currentStyle.position),(!d||"auto"===d)&&"undefined"!=typeof getComputedStyle){var f=getComputedStyle(a,null);d=f?f.position:null}if("relative"===d||"absolute"===d)break}while(a);return[c,b]},offset:function(b){b=Ink.i(b);var c=[0,0],d=b.ownerDocument,e=d.documentElement,f=a(b),g=d.body,h=e.clientTop||g.clientTop||0,i=e.clientLeft||g.clientLeft||0,j=d.pageYOffset||e.scrollTop||g.scrollTop,k=d.pageXOffset||e.scrollLeft||g.scrollLeft,l=f.top+j-h,m=f.left+k-i;return c=[m,l]},scroll:function(a){return a=a?Ink.i(a):document.body,[window.pageXOffset?window.pageXOffset:a.scrollLeft,window.pageYOffset?window.pageYOffset:a.scrollTop]},_getPropPx:function(a,b){var c,d,e=a.getPropertyValue?a.getPropertyValue(b):a[b];return e?(d=e.indexOf("px"),c=-1===d?0:parseFloat(e,10)):c=0,c},offset2:function(a){return e.offset(a)},hasAttribute:function(a,b){return a=Ink.i(a),a.hasAttribute?a.hasAttribute(b):!!a.getAttribute(b)},insertAfter:function(a,b){(b=e.get(b))&&(null!==b.nextSibling?b.parentNode.insertBefore(a,b.nextSibling):b.parentNode.appendChild(a))},insertBefore:function(a,b){(b=e.get(b))&&b.parentNode.insertBefore(a,b)},insertTop:function(a,b){(b=e.get(b))&&(b.firstChild?b.insertBefore(a,b.firstChild):b.appendChild(a))},insertBottom:function(a,b){b=Ink.i(b),b.appendChild(a)},textContent:function(a){a=Ink.i(a);var b,c,d,f;switch(a&&a.nodeType){case 9:return e.textContent(a.documentElement||a.body&&a.body.parentNode||a.body);case 1:if(b="textContent"in a?a.textContent:a.innerText,"undefined"!=typeof b)return b;case 11:if(b=a.textContent,"undefined"!=typeof b)return b;if(a.firstChild===a.lastChild)return e.textContent(a.firstChild);for(b=[],d=a.childNodes,c=0,f=d.length;f>c;++c)b.push(e.textContent(d[c]));return b.join("");case 3:case 4:return a.nodeValue}return""},setTextContent:function(a,b){switch(a=Ink.i(a),a&&a.nodeType){case 1:if("innerText"in a){a.innerText=b;break}case 11:if("textContent"in a){a.textContent=b;break}case 9:for(;a.firstChild;)a.removeChild(a.firstChild);if(""!==b){var c=a.ownerDocument||a;a.appendChild(c.createTextNode(b))}break;case 3:case 4:a.nodeValue=b}},isLink:function(a){var b=a&&1===a.nodeType&&(/^a|area$/i.test(a.tagName)||a.hasAttributeNS&&a.hasAttributeNS("http://www.w3.org/1999/xlink","href"));return!!b},isAncestorOf:function(a,b){if(!b||!a)return!1;if(b.compareDocumentPosition)return 0!==(16&a.compareDocumentPosition(b));for(;b=b.parentNode;)if(b===a)return!0;return!1},descendantOf:function(a,b){return a!==b&&e.isAncestorOf(a,b)},firstElementChild:function(a){if(!a)return null;if("firstElementChild"in a)return a.firstElementChild;for(var b=a.firstChild;b&&1!==b.nodeType;)b=b.nextSibling;return b},lastElementChild:function(a){if(!a)return null;if("lastElementChild"in a)return a.lastElementChild;for(var b=a.lastChild;b&&1!==b.nodeType;)b=b.previousSibling;return b},nextElementSibling:function(a){var b=null;if(!a)return b;if("nextElementSibling"in a)return a.nextElementSibling;for(b=a.nextSibling;b&&1!==b.nodeType;)b=b.nextSibling;return b},previousElementSibling:function(a){var b=null;if(!a)return b;if("previousElementSibling"in a)return a.previousElementSibling;for(b=a.previousSibling;b&&1!==b.nodeType;)b=b.previousSibling; return b},elementWidth:function(a){return"string"==typeof a&&(a=document.getElementById(a)),a.offsetWidth},elementHeight:function(a){return"string"==typeof a&&(a=document.getElementById(a)),a.offsetHeight},elementLeft:function(a){return e.offsetLeft(a)},elementTop:function(a){return e.offsetTop(a)},elementDimensions:function(a){return a=Ink.i(a),[a.offsetWidth,a.offsetHeight]},outerDimensions:function(b){var c=a(b),d=Ink.getModule("Ink.Dom.Css_1"),e=Ink.bindMethod(d,"getStyle",b);return[c.right-c.left+parseFloat(e("marginLeft")||0)+parseFloat(e("marginRight")||0),c.bottom-c.top+parseFloat(e("marginTop")||0)+parseFloat(e("marginBottom")||0)]},inViewport:function(b,c){var d=a(Ink.i(b));return"boolean"==typeof c&&(c={partial:c,margin:0}),c=Ink.extendObj({partial:!1,margin:0},c||{}),c.partial?d.bottom+c.margin>0&&d.left-c.margin0:d.top+c.margin>0&&d.right-c.margin0},isHidden:function(a){var b=a.offsetWidth,c=a.offsetHeight,d="tr"===a.tagName.toLowerCase(),e=Ink.getModule("Ink.Dom.Css_1");return 0!==b||0!==c||d?0===b||0===c||d?"none"===e.getStyle(a,"display").toLowerCase():!1:!0},isVisible:function(a){return!this.isHidden(a)},clonePosition:function(a,b){var c=e.offset(b);return a.style.left=c[0]+"px",a.style.top=c[1]+"px",a},ellipsizeText:function(a){(a=Ink.i(a))&&(a.style.overflow="hidden",a.style.whiteSpace="nowrap",a.style.textOverflow="ellipsis")},findUpwardsHaving:function(a,b){for(;a&&1===a.nodeType;){if(b(a))return a;a=a.parentNode}return!1},findUpwardsByClass:function(a,b){var c=new RegExp("(^|\\s)"+b+"(\\s|$)"),d=function(a){var b=a.className;return b&&c.test(b)};return e.findUpwardsHaving(a,d)},findUpwardsByTag:function(a,b){b=b.toUpperCase();var c=function(a){return a.nodeName&&a.nodeName.toUpperCase()===b};return e.findUpwardsHaving(a,c)},findUpwardsById:function(a,b){var c=function(a){return a.id===b};return e.findUpwardsHaving(a,c)},findUpwardsBySelector:function(a,b){var c=Ink.getModule("Ink.Dom.Selector","1");if(!c)throw new Error("This method requires Ink.Dom.Selector");var d=function(a){return c.matchesSelector(a,b)};return e.findUpwardsHaving(a,d)},getChildrenText:function(a,b){var c,d,f,g=a.childNodes,h=g.length,i="";if(!a)return i;for(d=0;h>d;++d)c=g[d],c&&3===c.nodeType&&(f=e._trimString(String(c.data)),f.length>0?(i+=f,b&&a.removeChild(c)):a.removeChild(c));return i},_trimString:function(a){return String.prototype.trim?a.trim():a.replace(/^\s*/,"").replace(/\s*$/,"")},getSelectValues:function(a){for(var b=Ink.i(a),c=[],d=0;dd;++d)b=a[d],b instanceof Array?1===b.length&&b.push(b[0]):b=[b,b],c.push(b);return c},fillSelect:function(a,b,c,d){var f=Ink.i(a);if(f){f.innerHTML="";var g,h;c||(h=document.createElement("option"),h.setAttribute("value",""),f.appendChild(h)),b=e._normalizeData(b);for(var i=0,j=b.length;j>i;++i)g=b[i],h=document.createElement("option"),h.setAttribute("value",g[0]),g.length>2&&h.setAttribute("extra",g[2]),h.appendChild(document.createTextNode(g[1])),g[0]===d&&h.setAttribute("selected","selected"),f.appendChild(h)}},fillRadios:function(a,b,c,d,f,g){a=Ink.i(a);var h=document.createElement("span");e.insertAfter(h,a),c=e._normalizeData(c);var i,j;d||(j=document.createElement("input"),j.setAttribute("type","radio"),j.setAttribute("name",b),j.setAttribute("value",""),h.appendChild(j),g&&h.appendChild(document.createElement(g)));for(var k=0;kc;++c)if(a.children[c]===b)return c;return!1},nextSiblings:function(a){if(a=Ink.i(a),"object"==typeof a&&null!==a&&a.nodeType&&1===a.nodeType){for(var b=[],c=a.parentNode.children,d=e.parentIndexOf(a.parentNode,a),f=++d,g=c.length;g>f;f++)b.push(c[f]);return b}return[]},previousSiblings:function(a){if(a=Ink.i(a),"object"==typeof a&&null!==a&&a.nodeType&&1===a.nodeType){for(var b=[],c=a.parentNode.children,d=e.parentIndexOf(a.parentNode,a),f=0,g=d;g>f;f++)b.push(c[f]);return b}return[]},siblings:function(a){if(a=Ink.i(a),"object"==typeof a&&null!==a&&a.nodeType&&1===a.nodeType){for(var b=[],c=a.parentNode.children,d=0,e=c.length;e>d;d++)a!==c[d]&&b.push(c[d]);return b}return[]},childElementCount:function(a){return a=Ink.i(a),"childElementCount"in a?a.childElementCount:a?e.siblings(a).length+1:0},_wrapElements:{TABLE:function(a,b){return a.innerHTML=d?"
              "+b+"
              "+c+"
              ":""+b+"
              ",a.firstChild},TBODY:function(a,b){return a.innerHTML=""+b+"
              ",a.firstChild.getElementsByTagName("tbody")[0]},THEAD:function(a,b){return a.innerHTML=""+b+"
              ",a.firstChild.getElementsByTagName("thead")[0]},TFOOT:function(a,b){return a.innerHTML=""+b+"
              ",a.firstChild.getElementsByTagName("tfoot")[0]},TR:function(a,b){return a.innerHTML=""+b+"
              ",a.firstChild.firstChild.firstChild}},_getWrapper:function(a,b){var f=a.nodeName&&a.nodeName.toUpperCase(),g=document.createElement("div"),h=e._wrapElements[f];if(!h)return g.innerHTML=b,g;if(g=h(g,b),d&&"TABLE"===f)for(var i=g.getElementsByTagName("td"),j=0,k=i.length;k>j;j++)if(i[j].innerHTML===c){var l=i[j].parentNode.parentNode;l.parentNode.removeChild(l)}return g},appendHTML:function(a,b){if(a=Ink.i(a),null!==a)for(var c=e._getWrapper(a,b);c.firstChild;)a.appendChild(c.firstChild)},prependHTML:function(a,b){if(a=Ink.i(a),null!==a)for(var c=e._getWrapper(a,b);c.lastChild;)a.insertBefore(c.lastChild,a.firstChild)},setHTML:function(a,b){if(a=Ink.i(a),null!==a)try{a.innerHTML=b}catch(c){for(;a.firstChild;)a.removeChild(a.firstChild);e.appendHTML(a,b)}},wrap:function(a,b){a=Ink.i(a),b=Ink.i(b);var c=a.nextSibling,d=a.parentNode;return b.appendChild(a),null!==c?d.insertBefore(b,c):d.appendChild(b),b},unwrap:function(a,b){a=Ink.i(a);var c;c="string"==typeof b?e.findUpwardsBySelector(a,b):"object"==typeof b&&b.tagName?e.findUpwardsHaving(a,function(a){return a===b}):a.parentNode,c&&c.parentNode&&e.insertBefore(a,c)},replace:function(a,b){a=Ink.i(a),null!==a&&a.parentNode.replaceChild(b,a)},removeTextNodeChildren:function(a){if(a=Ink.i(a),null!==a){var b,c,d=a;for(a=a.firstChild;a;)c=3===a.nodeType,b=a,a=a.nextSibling,c&&d.removeChild(b)}},htmlToFragment:b?function(a){var b;return"string"!=typeof a?document.createDocumentFragment():(b=document.createRange(),b.selectNode(document.body),b.createContextualFragment(a))}:function(a){var b=document.createDocumentFragment(),c,d;if("string"!=typeof a)return b;for(c=document.createElement("div"),c.innerHTML=a;d=c.firstChild;)b.appendChild(d);return b},_camelCase:function(a){return a?a.replace(/-(\w)/g,function(a,b){return b.toUpperCase()}):a},data:function(a){var b;if("object"!=typeof a&&"string"!=typeof a)throw"[Ink.Dom.Element.data] :: Invalid selector defined";if("object"==typeof a)b=a;else{var c=Ink.getModule("Ink.Dom.Selector",1);if(!c)throw"[Ink.Dom.Element.data] :: this method requires Ink.Dom.Selector - v1";if(b=c.select(a),b.length<=0)throw"[Ink.Dom.Element.data] :: Can't find any element with the specified selector";b=b[0]}var d={},f=b.attributes||[],g,h,i;if(f)for(var j=0,k=f.length;k>j;++j)g=f[j],h=g.name,i=g.value,h&&0===h.indexOf("data-")&&(d[e._camelCase(h.replace("data-",""))]=i);return d},moveCursorTo:function(a,b){if(a=Ink.i(a),null!==a)if(a.setSelectionRange)a.setSelectionRange(b,b);else{var c=a.createTextRange();c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",b),c.select()}},pageWidth:function(){var a;a=window.innerWidth&&window.scrollMaxX?window.innerWidth+window.scrollMaxX:document.body.scrollWidth>document.body.offsetWidth?document.body.scrollWidth:document.body.offsetWidth;var b;return window.self.innerWidth?b=document.documentElement.clientWidth?document.documentElement.clientWidth:window.self.innerWidth:document.documentElement&&document.documentElement.clientWidth?b=document.documentElement.clientWidth:document.body&&(b=document.body.clientWidth),b>a?a:b},pageHeight:function(){var a;a=window.innerHeight&&window.scrollMaxY?window.innerHeight+window.scrollMaxY:document.body.scrollHeight>document.body.offsetHeight?document.body.scrollHeight:document.body.offsetHeight;var b;return window.self.innerHeight?b=window.self.innerHeight:document.documentElement&&document.documentElement.clientHeight?b=document.documentElement.clientHeight:document.body&&(b=document.body.clientHeight),b>a?b:a},viewportWidth:function(){return"undefined"!=typeof window.innerWidth?window.innerWidth:document.documentElement&&"undefined"!=typeof document.documentElement.offsetWidth?document.documentElement.offsetWidth:void 0},viewportHeight:function(){return"undefined"!=typeof window.innerHeight?window.innerHeight:document.documentElement&&"undefined"!=typeof document.documentElement.offsetHeight?document.documentElement.offsetHeight:void 0},scrollWidth:function(){return"undefined"!=typeof window.self.pageXOffset?window.self.pageXOffset:"undefined"!=typeof document.documentElement&&"undefined"!=typeof document.documentElement.scrollLeft?document.documentElement.scrollLeft:document.body.scrollLeft},scrollHeight:function(){return"undefined"!=typeof window.self.pageYOffset?window.self.pageYOffset:"undefined"!=typeof document.documentElement&&"undefined"!=typeof document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop}};return e}),Ink.createModule("Ink.Dom.Event",1,[],function(){var a=function(a,b,c){return c()}("bean",this,function(a,b){a=a||"bean",b=b||this;var c=window,d=b[a],e=/[^\.]*(?=\..*)\.|.*/,f=/\..*/,g="addEventListener",h="removeEventListener",i=document||{},j=i.documentElement||{},k=j[g],l=k?g:"attachEvent",m={},n=Array.prototype.slice,o=function(a,b){return a.split(b||" ")},p=function(a){return"string"==typeof a},q=function(a){return"function"==typeof a},r="click dblclick mouseup mousedown contextmenu mousewheel mousemultiwheel DOMMouseScroll mouseover mouseout mousemove selectstart selectend keydown keypress keyup orientationchange focus blur change reset select submit load unload beforeunload resize move DOMContentLoaded readystatechange message error abort scroll ",s="show input invalid touchstart touchmove touchend touchcancel gesturestart gesturechange gestureend textinputreadystatechange pageshow pagehide popstate hashchange offline online afterprint beforeprint dragstart dragenter dragover dragleave drag drop dragend loadstart progress suspend emptied stalled loadmetadata loadeddata canplay canplaythrough playing waiting seeking seeked ended durationchange timeupdate play pause ratechange volumechange cuechange checking noupdate downloading cached updateready obsolete ",t=function(a,b,c){for(c=0;cg;g++)if(m[g].reg.test(e)){n[e]=k=m[g].fix;break}for(j=k(a,this,e),g=j.length;g--;)!((i=j[g])in this)&&i in a&&(this[i]=a[i])}}};return p.prototype.preventDefault=function(){this.originalEvent.preventDefault?this.originalEvent.preventDefault():this.originalEvent.returnValue=!1},p.prototype.stopPropagation=function(){this.originalEvent.stopPropagation?this.originalEvent.stopPropagation():this.originalEvent.cancelBubble=!0},p.prototype.stop=function(){this.preventDefault(),this.stopPropagation(),this.stopped=!0},p.prototype.stopImmediatePropagation=function(){this.originalEvent.stopImmediatePropagation&&this.originalEvent.stopImmediatePropagation(),this.isImmediatePropagationStopped=function(){return!0}},p.prototype.isImmediatePropagationStopped=function(){return this.originalEvent.isImmediatePropagationStopped&&this.originalEvent.isImmediatePropagationStopped()},p.prototype.clone=function(a){var b=new p(this,this.element,this.isNative);return b.currentTarget=a,b},p}(),w=function(a,b){return k||b||a!==i&&a!==c?a:j},x=function(){var a=function(a,b,c,d){var e=function(c,e){return b.apply(a,d?n.call(e,c?0:1).concat(d):e)},f=function(c,d){return b.__beanDel?b.__beanDel.ft(c.target,a):d},g=c?function(a){var b=f(a,this);return c.apply(b,arguments)?(a&&(a.currentTarget=b),e(a,arguments)):void 0}:function(a){return b.__beanDel&&(a=a.clone(f(a))),e(a,arguments)};return g.__beanDel=b.__beanDel,g},b=function(b,c,d,e,f,g,h){var i=u[c],j;"unload"==c&&(d=D(E,b,c,d,e)),i&&(i.condition&&(d=a(b,d,i.condition,g)),c=i.base||c),this.isNative=j=t[c]&&!!b[l],this.customType=!k&&!j&&c,this.element=b,this.type=c,this.original=e,this.namespaces=f,this.eventType=k||j?c:"propertychange",this.target=w(b,j),this[l]=!!this.target[l],this.root=h,this.handler=a(b,d,null,g)};return b.prototype.inNamespaces=function(a){var b,c,d=0;if(!a)return!0;if(!this.namespaces)return!1;for(b=a.length;b--;)for(c=this.namespaces.length;c--;)a[b]==this.namespaces[c]&&d++;return a.length===d},b.prototype.matches=function(a,b,c){return!(this.element!==a||b&&this.original!==b||c&&this.handler!==c)},b}(),y=function(){var a={},b=function(c,d,e,f,g,h){var i=g?"r":"$";if(d&&"*"!=d){var j=0,k,l=a[i+d],m="*"==c;if(!l)return;for(k=l.length;k>j;j++)if((m||l[j].matches(c,e,f))&&!h(l[j],l,j,d))return}else for(var n in a)n.charAt(0)==i&&b(c,n.substr(1),e,f,g,h)},c=function(b,c,d,e){var f,g=a[(e?"r":"$")+c];if(g)for(f=g.length;f--;)if(!g[f].root&&g[f].matches(b,d,null))return!0;return!1},d=function(a,c,d,e){var f=[];return b(a,c,d,null,e,function(a){return f.push(a)}),f},e=function(b){var c=!b.root&&!this.has(b.element,b.type,null,!1),d=(b.root?"r":"$")+b.type;return(a[d]||(a[d]=[])).push(b),c},f=function(c){b(c.element,c.type,null,c.handler,c.root,function(b,c,d){return c.splice(d,1),b.removed=!0,0===c.length&&delete a[(b.root?"r":"$")+b.type],!1})},g=function(){var b,c=[];for(b in a)"$"==b.charAt(0)&&(c=c.concat(a[b]));return c};return{has:c,get:d,put:e,del:f,entries:g}}(),z,A=function(a){z=arguments.length?a:i.querySelectorAll?function(a,b){return b.querySelectorAll(a)}:function(){throw new Error("Bean: No selector engine installed")}},B=function(a,b){if(k||!b||!a||a.propertyName=="_on"+b){var c=y.get(this,b||a.type,null,!1),d=c.length,e=0;for(a=new v(a,this,!0),b&&(a.type=b);d>e&&!a.isImmediatePropagationStopped();e++)c[e].removed||c[e].handler.call(this,a)}},C=k?function(a,b,c){a[c?g:h](b,B,!1)}:function(a,b,c,d){var e;c?(y.put(e=new x(a,d||b,function(b){B.call(a,b,d)},B,null,null,!0)),d&&null==a["_on"+d]&&(a["_on"+d]=0),e.target.attachEvent("on"+e.eventType,e.handler)):(e=y.get(a,d||b,B,!0)[0],e&&(e.target.detachEvent("on"+e.eventType,e.handler),y.del(e)))},D=function(a,b,c,d,e){return function(){d.apply(this,arguments),a(b,c,e)}},E=function(a,b,c,d){var e=b&&b.replace(f,""),g=y.get(a,e,null,!1),h={},i,j;for(i=0,j=g.length;j>i;i++)c&&g[i].original!==c||!g[i].inNamespaces(d)||(y.del(g[i]),!h[g[i].eventType]&&g[i][l]&&(h[g[i].eventType]={t:g[i].eventType,c:g[i].type}));for(i in h)h.hasOwnProperty(i)&&(y.has(a,h[i].t,null,!1)||C(a,h[i].t,!1,h[i].c))},F=function(a,b){var c=function(b,c){for(var d,e=p(a)?z(a,c):a;b&&b!==c;b=b.parentNode)for(d=e.length;d--;)if(e[d]===b)return b},d=function(a){var d=c(a.target,this);d&&b.apply(d,arguments)};return d.__beanDel={ft:c,selector:a},d},G=k?function(a,b,d){var e=i.createEvent(a?"HTMLEvents":"UIEvents");e[a?"initEvent":"initUIEvent"](b,!0,!0,c,1),d.dispatchEvent(e)}:function(a,b,c){c=w(c,a),a?c.fireEvent("on"+b,i.createEventObject()):c["_on"+b]++},H=function(a,b,c){var d=p(b),g,h,i,j;if(d&&b.indexOf(" ")>0){for(b=o(b),j=b.length;j--;)H(a,b[j],c);return a}if(h=d&&b.replace(f,""),h&&u[h]&&(h=u[h].base),!b||d)(i=d&&b.replace(e,""))&&(i=o(i,".")),E(a,h,c,i);else if(q(b))E(a,null,b);else for(g in b)b.hasOwnProperty(g)&&H(a,g,b[g]);return a},I=function(a,b,c,d){var g,h,i,j,k,p,r;{if(void 0!==c||"object"!=typeof b){for(q(c)?(k=n.call(arguments,3),d=g=c):(g=d,k=n.call(arguments,4),d=F(c,g,z)),i=o(b),this===m&&(d=D(H,a,b,d,g)),j=i.length;j--;)r=y.put(p=new x(a,i[j].replace(f,""),d,g,o(i[j].replace(e,""),"."),k,!1)),p[l]&&r&&C(a,p.eventType,!0,p.customType);return a}for(h in b)b.hasOwnProperty(h)&&I.call(this,a,h,b[h])}},J=function(a,b,c,d){return I.apply(null,p(c)?[a,c,b,d].concat(arguments.length>3?n.call(arguments,5):[]):n.call(arguments))},K=function(){return I.apply(m,arguments)},L=function(a,b,c){var d=o(b),g,h,i,j,k;for(g=d.length;g--;)if(b=d[g].replace(f,""),(j=d[g].replace(e,""))&&(j=o(j,".")),j||c||!a[l])for(k=y.get(a,b,null,!1),c=[!1].concat(c),h=0,i=k.length;i>h;h++)k[h].inNamespaces(j)&&k[h].handler.apply(a,c);else G(t[b],b,a);return a},M=function(a,b,c){for(var d=y.get(b,c,null,!1),e=d.length,f=0,g,h;e>f;f++)d[f].original&&(g=[a,d[f].type],(h=d[f].handler.__beanDel)&&g.push(h.selector),g.push(d[f].original),I.apply(null,g));return a},N={on:I,add:J,one:K,off:H,remove:H,clone:M,fire:L,Event:v,setSelectorEngine:A,noConflict:function(){return b[a]=d,this}};if(c.attachEvent){var O=function(){var a,b=y.entries();for(a in b)b[a].type&&"unload"!==b[a].type&&H(b[a].element,b[a].type);c.detachEvent("onunload",O),c.CollectGarbage&&c.CollectGarbage()};c.attachEvent("onunload",O)}return A(Ink.ss),N}),b={KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_SPACE:32,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,KEY_HOME:36,KEY_END:35,KEY_PAGEUP:33,KEY_PAGEDOWN:34,KEY_INSERT:45,throttle:function(a,b){function c(){var f=+new Date,g=f-d;if(g>=b)return d=f,a.apply(this,[].slice.call(arguments));var h=this,i=[].slice.call(arguments);e&&clearTimeout(e),e=setTimeout(function(){return e=null,c.apply(h,i)},b-g)}b=b||0;var d=0,e;return c},element:function(a){var b=a.delegationTarget||a.target||"mouseout"===a.type&&a.fromElement||"mouseleave"===a.type&&a.fromElement||"mouseover"===a.type&&a.toElement||"mouseenter"===a.type&&a.toElement||a.srcElement||null;return!b||3!==b.nodeType&&4!==b.nodeType?b:b.parentNode},relatedTarget:function(a){var b=a.relatedTarget||"mouseout"===a.type&&a.toElement||"mouseleave"===a.type&&a.toElement||"mouseover"===a.type&&a.fromElement||"mouseenter"===a.type&&a.fromElement||null;return!b||3!==b.nodeType&&4!==b.nodeType?b:b.parentNode},findElement:function(a,b,c){for(var d=this.element(a);;){if(d.nodeName.toLowerCase()===b.toLowerCase())return d;if(d=d.parentNode,!d)return c?!1:document;if(!d.parentNode)return c?!1:document}},observe:function(a,b,c,d){return a=Ink.i(a),a?(a.addEventListener?a.addEventListener(b,c,!!d):a.attachEvent("on"+b,c=Ink.bind(c,a)),c):void 0},observeOnce:function(a,c,d,e){var f=function(){return b.stopObserving(a,c,g),d.apply(this,arguments)},g=b.observe(a,c,f,e);return g},observeMulti:function(a,b,c,d){if("string"==typeof a?a=Ink.ss(a):a&&1===a.nodeType&&(a=[a]),!a[0])return!1;for(var e=0,f=a.length;f>e;e++)this.observe(a[e],b,c,d);return c},observeDelegated:function(a,c,d,e){return b.observe(a,c,function(c){var f=b.element(c);if(f&&f!==a)for(var g=f;g!==a&&g!==document&&g;){if(Ink.Dom.Selector_1.matchesSelector(g,d))return c.delegationTarget=g,e(c);g=g.parentNode}})},stopObserving:function(a,b,c,d){a=Ink.i(a),a&&(a.removeEventListener?a.removeEventListener(b,c,!!d):a.detachEvent("on"+b,c))},stop:function(a){null!==a.cancelBubble&&(a.cancelBubble=!0),a.stopPropagation&&a.stopPropagation(),a.preventDefault&&a.preventDefault(),window.attachEvent&&(a.returnValue=!1),null!==a.cancel&&(a.cancel=!0)},stopPropagation:function(a){null!==a.cancelBubble&&(a.cancelBubble=!0),a.stopPropagation&&a.stopPropagation()},stopDefault:function(a){a.preventDefault&&a.preventDefault(),window.attachEvent&&(a.returnValue=!1),null!==a.cancel&&(a.cancel=!0)},pointer:function(a){return{x:this.pointerX(a),y:this.pointerY(a)}},pointerX:function(a){return a.touches&&a.touches[0]&&a.touches[0].clientX||a.pageX||a.clientX+(document.documentElement.scrollLeft||document.body.scrollLeft)},pointerY:function(a){return a.touches&&a.touches[0]&&a.touches[0].clientY||a.pageY||a.clientY+(document.documentElement.scrollTop||document.body.scrollTop)},isLeftClick:function(a){if(window.addEventListener){if(0===a.button)return!0;if("touchend"===a.type&&null===a.button)return!0}else if(1===a.button)return!0;return!1},isRightClick:function(a){return 2===a.button},isMiddleClick:function(a){return window.addEventListener?1===a.button:4===a.button;return!1},getCharFromKeyboardEvent:function(a,b){var c=a.keyCode,d=String.fromCharCode(c),e=a.shiftKey;if(c>=65&&90>=c)return"boolean"==typeof b&&(e=b),e?d:d.toLowerCase();if(c>=96&&105>=c)return String.fromCharCode(48+(c-96));switch(c){case 109:case 189:return"-";case 107:case 187:return"+"}return d},debug:function(){}};return Ink.extendObj(b,a)}),Ink.createModule("Ink.Dom.FormSerialize",1,["Ink.Util.Array_1","Ink.Dom.Element_1","Ink.Dom.Selector_1"],function(a,b,c){"use strict";function d(c){return null!=c&&!b.isDOMElement(c)&&(a.isArray(c)||"string"!=typeof c&&"number"==typeof c.length)}function e(a){return d(a)?a:[a]}var f={serialize:function(b,c){c=c||{};var d={},e={},g=this.asPairs(b,{elements:!0,emptyArray:e,outputUnchecked:c.outputUnchecked});return null==g?g:(a.forEach(g,function(a){var b=a[0].replace(/\[\]$/,""),c=a[1],g=a[2];c===e?d[b]=[]:f._resultsInArray(g)||/\[\]$/.test(a[0])?(d[b]=d[b]||[],d[b].push(c)):d[b]=c}),d)},asPairs:function(b,d){function e(a,b,c){h.push(d.elements?[a,b,c]:[a,b])}function g(b){var f=b.nodeName.toLowerCase(),g=(b.type+"").toLowerCase();if("select"===f&&b.multiple){var h=!1;a.forEach(c.select("option:checked",b),function(a){e(b.name,a.value,b),h=!0}),!h&&"emptyArray"in d&&e(b.name,d.emptyArray,b)}else"input"!==f||"checkbox"!==g&&"radio"!==g||!d.outputUnchecked?e(b.name,b.value,b):e(b.name,null,b)}var h=[];if(d=d||{},b=Ink.i(b)){for(var i=a.filter(b.elements,function(a){return f._isSerialized(a,d)}),j=0,k=i.length;k>j;j++)g(i[j]);return h}return null},fillIn:function(a,b){if(!(a=Ink.i(a)))return null;var c;if("object"!=typeof b||d(b)){if(!d(b))return null;c=b}else c=f._objToPairs(b);return f._fillInPairs(a,c)},_objToPairs:function(a){var b=[],c;for(var d in a)if(a.hasOwnProperty(d)){c=e(a[d]);for(var f=0,g=c.length;g>f;f++)b.push([d,c[f]]);0===g&&b.push([d,[]])}return b},_fillInPairs:function(b,c){c=a.groupBy(c,{key:function(a){return a[0].replace(/\[\]$/,"")}}),c=a.map(c,function(b){var c=a.reduce(b,function(a,b){return[null,a[1].concat([b[1]])]},[null,[]])[1];return[b[0][0],c]});for(var d,g,h,i=0,j=c.length;j>i;i++){if(d=c[i][0],d in b)g=b[d];else{if(!(d+"[]"in b))continue;g=b[d+"[]"],d+="[]"}g=e(g),h=c[i][1],f._fillInOne(d,g,h)}},_fillInOne:function(a,c,d){var e=c[0],g=e.nodeName.toLowerCase(),h=e.getAttribute("type");h=h&&h.toLowerCase();var i="select"===g&&b.hasAttribute(e,"multiple");if("checkbox"===h||"radio"===h)f._fillInBoolean(c,d,"checked");else if(i)f._fillInBoolean(c[0].options,d,"selected");else{c.length!==d.length&&Ink.warn("Form had "+c.length+' inputs named "'+a+'", but received '+d.length+" values.");for(var j=0,k=Math.min(c.length,d.length);k>j;j+=1)c[j].value=d[j]}},_fillInBoolean:function(b,c,d){a.forEach(b,function(b){var e=a.inArray(b.value,c);b[d]=e})},_resultsInArray:function(a){var c=a.getAttribute("type"),d=a.nodeName.toLowerCase();return"checkbox"===c||"select"===d&&b.hasAttribute(a,"multiple")},_isSerialized:function(a,c){if(c=c||{},!b.isDOMElement(a))return!1;if(!b.hasAttribute(a,"name"))return!1;var d=a.nodeName.toLowerCase();return d&&"fieldset"!==d?"checkbox"===a.type||"radio"===a.type?c.outputUnchecked?!0:!!a.checked:!0:!1}};return f}),Ink.createModule("Ink.Dom.Loaded",1,[],function(){"use strict";var a={_contexts:[],run:function(a,b){b||(b=a,a=window);for(var c,d=0,e=this._contexts.length;e>d;d++)if(this._contexts[d][0]===a){c=this._contexts[d][1];break}c||(c={cbQueue:[],win:a,doc:a.document,root:a.document.documentElement,done:!1,top:!0},c.handlers={checkState:Ink.bindEvent(this._checkState,this,c),poll:Ink.bind(this._poll,this,c)},this._contexts.push([a,c]));var f=c.doc.addEventListener;c.add=f?"addEventListener":"attachEvent",c.rem=f?"removeEventListener":"detachEvent",c.pre=f?"":"on",c.det=f?"DOMContentLoaded":"onreadystatechange",c.wet=c.pre+"load";var g=c.handlers.checkState,h=/complete|loaded/.test(c.doc.readyState)&&"about:blank"!==c.win.location.toString();if(h)setTimeout(Ink.bind(function(){b.call(c.win,"lazy")},this),0);else{c.cbQueue.push(b),c.doc[c.add](c.det,g),c.win[c.add](c.wet,g);var i=1;try{i=c.win.frameElement}catch(j){}if(!f&&c.root&&c.root.doScroll){try{c.top=!i}catch(j){}c.top&&this._poll(c)}}},_checkState:function(a,b){if(a&&("readystatechange"!==a.type||/complete|loaded/.test(b.doc.readyState))){var c="load"===a.type?b.win:b.doc;c[b.rem](b.pre+a.type,b.handlers.checkState,!1),this._ready(b)}},_poll:function(a){try{a.root.doScroll("left")}catch(b){return setTimeout(a.handlers.poll,50)}this._ready(a)},_ready:function(a){if(!a.done){a.done=!0;for(var b=0;bw.cacheLength&&delete a[b.shift()],a[c]=d}}function c(a){return a[L]=!0,a}function d(a){var b=E.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b=null}}function e(a,b,c,d){var e,f,g,h,i,l,m,n,o,p;if((b?b.ownerDocument||b:M)!==E&&D(b),b=b||E,c=c||[],!a||"string"!=typeof a)return c;if(1!==(h=b.nodeType)&&9!==h)return[];if(G&&!d){if(e=pb.exec(a))if(g=e[1]){if(9===h){if(f=b.getElementById(g),!f||!f.parentNode)return c;if(f.id===g)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(g))&&K(b,f)&&f.id===g)return c.push(f),c}else{if(e[2])return $.apply(c,b.getElementsByTagName(a)),c;if((g=e[3])&&N.getElementsByClassName&&b.getElementsByClassName)return $.apply(c,b.getElementsByClassName(g)),c}if(N.qsa&&!H.test(a)){if(m=!0,n=L,o=b,p=9===h&&a,1===h&&"object"!==b.nodeName.toLowerCase()){for(l=j(a),(m=b.getAttribute("id"))?n=m.replace(sb,"\\$&"):b.setAttribute("id",n),n="[id='"+n+"'] ",i=l.length;i--;)l[i]=n+k(l[i]);o=nb.test(a)&&b.parentNode||b,p=l.join(",")}if(p)try{return $.apply(c,o.querySelectorAll(p)),c}catch(q){}finally{m||b.removeAttribute("id")}}}return s(a.replace(hb,"$1"),b,c,d)}function f(a,b){var c=b&&a,d=c&&(~b.sourceIndex||W)-(~a.sourceIndex||W);if(d)return d;if(c)for(;c=c.nextSibling;)if(c===b)return-1;return a?1:-1}function g(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function h(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function i(a){return c(function(b){return b=+b,c(function(c,d){for(var e,f=a([],c.length,b),g=f.length;g--;)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function j(a,b){var c,d,f,g,h,i,j,k=R[a+" "];if(k)return b?0:k.slice(0);for(h=a,i=[],j=w.preFilter;h;){(!c||(d=ib.exec(h)))&&(d&&(h=h.slice(d[0].length)||h),i.push(f=[])),c=!1,(d=jb.exec(h))&&(c=d.shift(),f.push({value:c,type:d[0].replace(hb," ")}),h=h.slice(c.length));for(g in w.filter)!(d=mb[g].exec(h))||j[g]&&!(d=j[g](d))||(c=d.shift(),f.push({value:c,type:g,matches:d}),h=h.slice(c.length));if(!c)break}return b?h.length:h?e.error(a):R(a,i).slice(0)}function k(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function l(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=P++;return b.first?function(b,c,f){for(;b=b[d];)if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=O+" "+f;if(g){for(;b=b[d];)if((1===b.nodeType||e)&&a(b,c,g))return!0}else for(;b=b[d];)if(1===b.nodeType||e)if(j=b[L]||(b[L]={}),(i=j[d])&&i[0]===k){if((h=i[1])===!0||h===v)return h===!0}else if(i=j[d]=[k],i[1]=a(b,c,g)||v,i[1]===!0)return!0}}function m(a){return a.length>1?function(b,c,d){for(var e=a.length;e--;)if(!a[e](b,c,d))return!1;return!0}:a[0]}function n(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function o(a,b,d,e,f,g){return e&&!e[L]&&(e=o(e)),f&&!f[L]&&(f=o(f,g)),c(function(c,g,h,i){var j,k,l,m=[],o=[],p=g.length,q=c||r(b||"*",h.nodeType?[h]:h,[]),s=!a||!c&&b?q:n(q,m,a,h,i),t=d?f||(c?a:p||e)?[]:g:s;if(d&&d(s,t,h,i),e)for(j=n(t,o),e(j,[],h,i),k=j.length;k--;)(l=j[k])&&(t[o[k]]=!(s[o[k]]=l));if(c){if(f||a){if(f){for(j=[],k=t.length;k--;)(l=t[k])&&j.push(s[k]=l);f(null,t=[],j,i)}for(k=t.length;k--;)(l=t[k])&&(j=f?ab.call(c,l):m[k])>-1&&(c[j]=!(g[j]=l))}}else t=n(t===g?t.splice(p,t.length):t),f?f(null,g,t,i):$.apply(g,t)})}function p(a){for(var b,c,d,e=a.length,f=w.relative[a[0].type],g=f||w.relative[" "],h=f?1:0,i=l(function(a){return a===b},g,!0),j=l(function(a){return ab.call(b,a)>-1},g,!0),n=[function(a,c,d){return!f&&(d||c!==A)||((b=c).nodeType?i(a,c,d):j(a,c,d))}];e>h;h++)if(c=w.relative[a[h].type])n=[l(m(n),c)];else{if(c=w.filter[a[h].type].apply(null,a[h].matches),c[L]){for(d=++h;e>d&&!w.relative[a[d].type];d++);return o(h>1&&m(n),h>1&&k(a.slice(0,h-1)).replace(hb,"$1"),c,d>h&&p(a.slice(h,d)),e>d&&p(a=a.slice(d)),e>d&&k(a)) }n.push(c)}return m(n)}function q(a,b){var d=0,f=b.length>0,g=a.length>0,h=function(c,h,i,j,k){var l,m,o,p=[],q=0,r="0",s=c&&[],t=null!=k,u=A,x=c||g&&w.find.TAG("*",k&&h.parentNode||h),y=O+=null==u?1:Math.random()||.1;for(t&&(A=h!==E&&h,v=d);null!=(l=x[r]);r++){if(g&&l){for(m=0;o=a[m++];)if(o(l,h,i)){j.push(l);break}t&&(O=y,v=++d)}f&&((l=!o&&l)&&q--,c&&s.push(l))}if(q+=r,f&&r!==q){for(m=0;o=b[m++];)o(s,p,h,i);if(c){if(q>0)for(;r--;)s[r]||p[r]||(p[r]=Y.call(j));p=n(p)}$.apply(j,p),t&&!c&&p.length>0&&q+b.length>1&&e.uniqueSort(j)}return t&&(O=y,A=u),s};return f?c(h):h}function r(a,b,c){for(var d=0,f=b.length;f>d;d++)e(a,b[d],c);return c}function s(a,b,c,d){var e,f,g,h,i,l=j(a);if(!d&&1===l.length){if(f=l[0]=l[0].slice(0),f.length>2&&"ID"===(g=f[0]).type&&9===b.nodeType&&G&&w.relative[f[1].type]){if(b=(w.find.ID(g.matches[0].replace(ub,vb),b)||[])[0],!b)return c;a=a.slice(f.shift().value.length)}for(e=mb.needsContext.test(a)?0:f.length;e--&&(g=f[e],!w.relative[h=g.type]);)if((i=w.find[h])&&(d=i(g.matches[0].replace(ub,vb),nb.test(f[0].type)&&b.parentNode||b))){if(f.splice(e,1),a=d.length&&k(f),!a)return $.apply(c,d),c;break}}return z(a,l)(d,b,!G,c,nb.test(a)),c}function t(){}var u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L="sizzle"+-new Date,M=window.document,N={},O=0,P=0,Q=b(),R=b(),S=b(),T=!1,U=function(){return 0},V="undefined",W=1<<31,X=[],Y=X.pop,Z=X.push,$=X.push,_=X.slice,ab=X.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},bb="[\\x20\\t\\r\\n\\f]",cb="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",db=cb.replace("w","w#"),eb="([*^$|!~]?=)",fb="\\["+bb+"*("+cb+")"+bb+"*(?:"+eb+bb+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+db+")|)|)"+bb+"*\\]",gb=":("+cb+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+fb.replace(3,8)+")*)|.*)\\)|)",hb=new RegExp("^"+bb+"+|((?:^|[^\\\\])(?:\\\\.)*)"+bb+"+$","g"),ib=new RegExp("^"+bb+"*,"+bb+"*"),jb=new RegExp("^"+bb+"*([\\x20\\t\\r\\n\\f>+~])"+bb+"*"),kb=new RegExp(gb),lb=new RegExp("^"+db+"$"),mb={ID:new RegExp("^#("+cb+")"),CLASS:new RegExp("^\\.("+cb+")"),NAME:new RegExp("^\\[name=['\"]?("+cb+")['\"]?\\]"),TAG:new RegExp("^("+cb.replace("w","w*")+")"),ATTR:new RegExp("^"+fb),PSEUDO:new RegExp("^"+gb),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+bb+"*(even|odd|(([+-]|)(\\d*)n|)"+bb+"*(?:([+-]|)"+bb+"*(\\d+)|))"+bb+"*\\)|)","i"),needsContext:new RegExp("^"+bb+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+bb+"*((?:-\\d)?\\d*)"+bb+"*\\)|)(?=[^-]|$)","i")},nb=/[\x20\t\r\n\f]*[+~]/,ob=/^[^{]+\{\s*\[native code/,pb=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,qb=/^(?:input|select|textarea|button)$/i,rb=/^h\d$/i,sb=/'|\\/g,tb=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,ub=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,vb=function(a,b){var c="0x"+b-65536;return c!==c?b:0>c?String.fromCharCode(c+65536):String.fromCharCode(c>>10|55296,1023&c|56320)};try{$.apply(X=_.call(M.childNodes),M.childNodes),X[M.childNodes.length].nodeType}catch(wb){$={apply:X.length?function(a,b){Z.apply(a,_.call(b))}:function(a,b){for(var c=a.length,d=0;a[c++]=b[d++];);a.length=c-1}}}y=e.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},D=e.setDocument=function(b){var c=b?b.ownerDocument||b:M;return c!==E&&9===c.nodeType&&c.documentElement?(E=c,F=c.documentElement,G=!y(c),N.getElementsByTagName=d(function(a){return a.appendChild(c.createComment("")),!a.getElementsByTagName("*").length}),N.attributes=d(function(a){a.innerHTML="";var b=typeof a.lastChild.getAttribute("multiple");return"boolean"!==b&&"string"!==b}),N.getElementsByClassName=d(function(a){return a.innerHTML="",a.getElementsByClassName&&a.getElementsByClassName("e").length?(a.lastChild.className="e",2===a.getElementsByClassName("e").length):!1}),N.getByName=d(function(a){a.id=L+0,a.appendChild(E.createElement("a")).setAttribute("name",L),a.appendChild(E.createElement("i")).setAttribute("name",L),F.appendChild(a);var b=c.getElementsByName&&c.getElementsByName(L).length===2+c.getElementsByName(L+0).length;return F.removeChild(a),b}),N.sortDetached=d(function(a){return a.compareDocumentPosition&&1&a.compareDocumentPosition(E.createElement("div"))}),w.attrHandle=d(function(a){return a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!==V&&"#"===a.firstChild.getAttribute("href")})?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},N.getByName?(w.find.ID=function(a,b){if(typeof b.getElementById!==V&&G){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},w.filter.ID=function(a){var b=a.replace(ub,vb);return function(a){return a.getAttribute("id")===b}}):(w.find.ID=function(a,b){if(typeof b.getElementById!==V&&G){var c=b.getElementById(a);return c?c.id===a||typeof c.getAttributeNode!==V&&c.getAttributeNode("id").value===a?[c]:void 0:[]}},w.filter.ID=function(a){var b=a.replace(ub,vb);return function(a){var c=typeof a.getAttributeNode!==V&&a.getAttributeNode("id");return c&&c.value===b}}),w.find.TAG=N.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==V?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){for(;c=f[e++];)1===c.nodeType&&d.push(c);return d}return f},w.find.NAME=N.getByName&&function(a,b){return typeof b.getElementsByName!==V?b.getElementsByName(name):void 0},w.find.CLASS=N.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==V&&G?b.getElementsByClassName(a):void 0},I=[],H=[":focus"],(N.qsa=a(c.querySelectorAll))&&(d(function(a){a.innerHTML="",a.querySelectorAll("[selected]").length||H.push("\\["+bb+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||H.push(":checked")}),d(function(a){a.innerHTML="",a.querySelectorAll("[i^='']").length&&H.push("[*^$]="+bb+"*(?:\"\"|'')"),a.querySelectorAll(":enabled").length||H.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),H.push(",.*:")})),(N.matchesSelector=a(J=F.matchesSelector||F.mozMatchesSelector||F.webkitMatchesSelector||F.oMatchesSelector||F.msMatchesSelector))&&d(function(a){N.disconnectedMatch=J.call(a,"div"),J.call(a,"[s!='']:x"),I.push("!=",gb)}),H=new RegExp(H.join("|")),I=I.length&&new RegExp(I.join("|")),K=a(F.contains)||F.compareDocumentPosition?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},U=F.compareDocumentPosition?function(a,b){if(a===b)return T=!0,0;var d=b.compareDocumentPosition&&a.compareDocumentPosition&&a.compareDocumentPosition(b);return d?1&d||B&&b.compareDocumentPosition(a)===d?a===c||K(M,a)?-1:b===c||K(M,b)?1:C?ab.call(C,a)-ab.call(C,b):0:4&d?-1:1:a.compareDocumentPosition?-1:1}:function(a,b){var d,e=0,g=a.parentNode,h=b.parentNode,i=[a],j=[b];if(a===b)return T=!0,0;if(!g||!h)return a===c?-1:b===c?1:g?-1:h?1:0;if(g===h)return f(a,b);for(d=a;d=d.parentNode;)i.unshift(d);for(d=b;d=d.parentNode;)j.unshift(d);for(;i[e]===j[e];)e++;return e?f(i[e],j[e]):i[e]===M?-1:j[e]===M?1:0},E):E},e.matches=function(a,b){return e(a,null,null,b)},e.matchesSelector=function(a,b){if((a.ownerDocument||a)!==E&&D(a),b=b.replace(tb,"='$1']"),N.matchesSelector&&G&&(!I||!I.test(b))&&!H.test(b))try{var c=J.call(a,b);if(c||N.disconnectedMatch||a.document&&11!==a.document.nodeType)return c}catch(d){}return e(b,E,null,[a]).length>0},e.contains=function(a,b){return(a.ownerDocument||a)!==E&&D(a),K(a,b)},e.attr=function(a,b){var c;return(a.ownerDocument||a)!==E&&D(a),G&&(b=b.toLowerCase()),(c=w.attrHandle[b])?c(a):!G||N.attributes?a.getAttribute(b):((c=a.getAttributeNode(b))||a.getAttribute(b))&&a[b]===!0?b:c&&c.specified?c.value:null},e.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},e.uniqueSort=function(a){var b,c=[],d=0,e=0;if(T=!N.detectDuplicates,B=!N.sortDetached,C=!N.sortStable&&a.slice(0),a.sort(U),T){for(;b=a[e++];)b===a[e]&&(d=c.push(e));for(;d--;)a.splice(c[d],1)}return a},x=e.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(1===e||9===e||11===e){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=x(a)}else if(3===e||4===e)return a.nodeValue}else for(;b=a[d];d++)c+=x(b);return c},w=e.selectors={cacheLength:50,createPseudo:c,match:mb,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ub,vb),a[3]=(a[4]||a[5]||"").replace(ub,vb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||e.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&e.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return mb.CHILD.test(a[0])?null:(a[4]?a[2]=a[4]:c&&kb.test(c)&&(b=j(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){return"*"===a?function(){return!0}:(a=a.replace(ub,vb).toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=Q[a+" "];return b||(b=new RegExp("(^|"+bb+")"+a+"("+bb+"|$)"))&&Q(a,function(a){return b.test(a.className||typeof a.getAttribute!==V&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var f=e.attr(d,a);return null==f?"!="===b:b?(f+="","="===b?f===c:"!="===b?f!==c:"^="===b?c&&0===f.indexOf(c):"*="===b?c&&f.indexOf(c)>-1:"$="===b?c&&f.slice(-c.length)===c:"~="===b?(" "+f+" ").indexOf(c)>-1:"|="===b?f===c||f.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){for(;p;){for(l=b;l=l[p];)if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){for(k=q[L]||(q[L]={}),j=k[a]||[],n=j[0]===O&&j[1],m=j[0]===O&&j[2],l=n&&q.childNodes[n];l=++n&&l&&l[p]||(m=n=0)||o.pop();)if(1===l.nodeType&&++m&&l===b){k[a]=[O,n,m];break}}else if(s&&(j=(b[L]||(b[L]={}))[a])&&j[0]===O)m=j[1];else for(;(l=++n&&l&&l[p]||(m=n=0)||o.pop())&&((h?l.nodeName.toLowerCase()!==r:1!==l.nodeType)||!++m||(s&&((l[L]||(l[L]={}))[a]=[O,m]),l!==b)););return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var d,f=w.pseudos[a]||w.setFilters[a.toLowerCase()]||e.error("unsupported pseudo: "+a);return f[L]?f(b):f.length>1?(d=[a,a,"",b],w.setFilters.hasOwnProperty(a.toLowerCase())?c(function(a,c){for(var d,e=f(a,b),g=e.length;g--;)d=ab.call(a,e[g]),a[d]=!(c[d]=e[g])}):function(a){return f(a,0,d)}):f}},pseudos:{not:c(function(a){var b=[],d=[],e=z(a.replace(hb,"$1"));return e[L]?c(function(a,b,c,d){for(var f,g=e(a,null,d,[]),h=a.length;h--;)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,c,f){return b[0]=a,e(b,null,f,d),!d.pop()}}),has:c(function(a){return function(b){return e(a,b).length>0}}),contains:c(function(a){return function(b){return(b.textContent||b.innerText||x(b)).indexOf(a)>-1}}),lang:c(function(a){return lb.test(a||"")||e.error("unsupported lang: "+a),a=a.replace(ub,vb).toLowerCase(),function(b){var c;do if(c=G?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(a){var b=window.location&&window.location.hash;return b&&b.slice(1)===a.id},root:function(a){return a===F},focus:function(a){return a===E.activeElement&&(!E.hasFocus||E.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeName>"@"||3===a.nodeType||4===a.nodeType)return!1;return!0},parent:function(a){return!w.pseudos.empty(a)},header:function(a){return rb.test(a.nodeName)},input:function(a){return qb.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||b.toLowerCase()===a.type)},first:i(function(){return[0]}),last:i(function(a,b){return[b-1]}),eq:i(function(a,b,c){return[0>c?c+b:c]}),even:i(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:i(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:i(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:i(function(a,b,c){for(var d=0>c?c+b:c;++dg;g++){for(f=[a[g]];h>g+1&&c(a[g],a[g+1]);)f.push(a[g+1]),g++;e.push(b.pairs?[d(a[g]),f]:f)}return e},reduce:function(b,c,d){if(a.reduce)return a.reduce.apply(b,a.slice.call(arguments,1));var e=Object(b),f=e.length>>>0,g=0,h;if(arguments.length>=3)h=d;else{for(;f>g&&!(g in e);)g++;if(g>=f)throw new TypeError("Reduce of empty array with no initial value");h=e[g++]}for(;f>g;g++)g in e&&(h=c(h,e[g],g,e));return h},inArray:function(a,b){if("object"==typeof b)for(var c=0,d=b.length;d>c;++c)if(b[c]===a)return!0;return!1},sortMulti:function(a,b){if("undefined"==typeof a||a.constructor!==Array)return!1;if("string"!=typeof b)return a.sort();if(a.length>0){if("undefined"==typeof a[0][b])return!1;a.sort(function(a,c){var d=a[b],e=c[b];return e>d?-1:d>e?1:0})}return a},keyValue:function(a,b,c){if("undefined"!=typeof a&&"object"==typeof b&&this.inArray(a,b)){for(var d=[],e=0,f=b.length;f>e;++e)if(b[e]===a){if("undefined"!=typeof c&&c===!0)return e;d.push(e)}return d}return!1},shuffle:function(a){if("undefined"!=typeof a&&a.constructor!==Array)return!1;for(var b=a.length,c=!1,d=!1;b--;)d=Math.floor(Math.random()*(b+1)),c=a[b],a[b]=a[d],a[d]=c;return a},forEach:function(b,c,d){if(a.forEach)return a.forEach.call(b,c,d);for(var e=0,f=b.length>>>0;f>e;e++)c.call(d,b[e],e,b)},each:function(){b.forEach.apply(b,a.slice.call(arguments))},map:function(b,c,d){if(a.map)return a.map.call(b,c,d);for(var e=new Array(g),f=0,g=b.length>>>0;g>f;f++)e[f]=c.call(d,b[f],f,b);return e},filter:function(b,c,d){if(a.filter)return a.filter.call(b,c,d);for(var e=[],f=null,g=0,h=b.length;h>g;g++)f=b[g],c.call(d,f,g,b)&&e.push(f);return e},some:function(a,b,c){if(null===a)throw new TypeError("First argument is invalid.");var d=Object(a),e=d.length>>>0;if("function"!=typeof b)throw new TypeError("Second argument must be a function.");for(var f=0;e>f;f++)if(f in d&&b.call(c,d[f],f,d))return!0;return!1},intersect:function(a,b){if(!a||!b||a instanceof Array==!1||b instanceof Array==!1)return[];for(var c=[],d=0,e=a.length;e>d;++d)for(var f=0,g=b.length;g>f;++f)a[d]===b[f]&&c.push(a[d]);return c},convert:function(b){return a.slice.call(b||[],0)},unique:function(a){if(!Array.prototype.lastIndexOf){var c=[];return b.forEach(b.convert(a),function(a){b.inArray(a,c)||c.push(a)}),c}return b.filter(b.convert(a),function(a,b,c){return c.lastIndexOf(a)===b})},range:function c(a,b,d){d||(d=1);var e=[],f;if(d>0)for(f=a;b>f;f+=d)e.push(f);else for(f=a;f>b;f+=d)e.push(f);return e},insert:function(a,b,c){a.splice(b,0,c)},remove:function(a,b,c){for(var d=[],e=0,f=a.length;f>e;e++)e>=b&&b+c>e||d.push(a[e]);return d}};return b}),Ink.createModule("Ink.Util.BinPack","1",[],function(){"use strict";var a=function(a,b){this.init(a,b)};a.prototype={init:function(a,b){this.root={x:0,y:0,w:a,h:b}},fit:function(a){var b,c,d;for(b=0;b0?a[0].w:0,g=e>0?a[0].h:0;for(this.root={x:0,y:0,w:f,h:g},b=0;e>b;b++)d=a[b],d.fit=(c=this.findNode(this.root,d.w,d.h))?this.splitNode(c,d.w,d.h):this.growNode(d.w,d.h)},findNode:function(a,b,c){return a.used?this.findNode(a.right,b,c)||this.findNode(a.down,b,c):b<=a.w&&c<=a.h?a:null},splitNode:function(a,b,c){return a.used=!0,a.down={x:a.x,y:a.y+c,w:a.w,h:a.h-c},a.right={x:a.x+b,y:a.y,w:a.w-b,h:c},a},growNode:function(a,b){var c=a<=this.root.w,d=b<=this.root.h,e=d&&this.root.h>=this.root.w+a,f=c&&this.root.w>=this.root.h+b;return e?this.growRight(a,b):f?this.growDown(a,b):d?this.growRight(a,b):c?this.growDown(a,b):null},growRight:function(a,b){this.root={used:!0,x:0,y:0,w:this.root.w+a,h:this.root.h,down:this.root,right:{x:this.root.w,y:0,w:a,h:this.root.h}};var c;return(c=this.findNode(this.root,a,b))?this.splitNode(c,a,b):null},growDown:function(a,b){this.root={used:!0,x:0,y:0,w:this.root.w,h:this.root.h+b,down:{x:0,y:this.root.h,w:this.root.w,h:b},right:this.root};var c;return(c=this.findNode(this.root,a,b))?this.splitNode(c,a,b):null}};var c={random:function(){return Math.random()-.5},w:function(a,b){return b.w-a.w},h:function(a,b){return b.h-a.h},a:function(a,b){return b.area-a.area},max:function(a,b){return Math.max(b.w,b.h)-Math.max(a.w,a.h)},min:function(a,b){return Math.min(b.w,b.h)-Math.min(a.w,a.h)},height:function(a,b){return c.msort(a,b,["h","w"])},width:function(a,b){return c.msort(a,b,["w","h"])},area:function(a,b){return c.msort(a,b,["a","h","w"])},maxside:function(a,b){return c.msort(a,b,["max","min","h","w"])},msort:function(a,b,d){var e,f;for(f=0;ff;++f)h=e.blocks[f],"area"in h||(h.area=h.w*h.h);var i=e.dimensions?new a(e.dimensions[0],e.dimensions[1]):new b;e.sorter||(e.sorter="maxside"),e.blocks.sort(c[e.sorter]),i.fit(e.blocks);var j=[i.root.w,i.root.h],k=[],l=[];for(f=0,g=e.blocks.length;g>f;++f)h=e.blocks[f],h.fit?k.push(h):(h.toString=d,l.push(h));var m=j[0]*j[1],n=0;for(f=0,g=k.length;g>f;++f)h=k[f],n+=h.area;return{dimensions:j,filled:n/m,blocks:e.blocks,fitted:k,unfitted:l}}};return e}),Ink.createModule("Ink.Util.Cookie","1",[],function(){"use strict";var a={get:function(a){var b=document.cookie||!1,c={};if(b){b=b.replace(new RegExp("; ","g"),";");var d=b.split(";"),e=[];if(d.length>0)for(var f=0;f1?k:"0"+k;break;case"D":d[j]=this._wDays(f.getDay()).substring(0,3);break;case"j":d[j]=f.getDate();break;case"l":d[j]=this._wDays(f.getDay());break;case"N":d[j]=f.getDay()||7;break;case"S":var l=f.getDate(),m=["st","nd","rd"],n="";d[j]=l>=11&&13>=l?"th":(n=m[String(l).substr(-1)-1])?n:"th";break;case"w":d[j]=f.getDay();break;case"z":g=Date.UTC(f.getFullYear(),0,0),h=Date.UTC(f.getFullYear(),f.getMonth(),f.getDate()),d[j]=Math.floor((h-g)/864e5);break;case"W":var o=new Date(f.getFullYear(),0,1);g=o.getDay()||7;var p=Math.floor((f-o)/864e5+1);d[j]=Math.ceil((p-(8-g))/7)+1;break;case"F":d[j]=this._months(f.getMonth());break;case"m":var q=String(f.getMonth()+1);d[j]=q.length>1?q:"0"+q;break;case"M":d[j]=this._months(f.getMonth()).substring(0,3);break;case"n":d[j]=f.getMonth()+1;break;case"t":d[j]=this._daysInMonth(f.getMonth()+1,f.getYear());break;case"L":var r=f.getFullYear();d[j]=r%4?!1:r%100?!0:r%400?!1:!0;break;case"o":throw'"o" not implemented!';case"Y":d[j]=f.getFullYear();break;case"y":d[j]=String(f.getFullYear()).substring(2);break;case"a":d[j]=f.getHours()<12?"am":"pm";break;case"A":d[j]=f.getHours<12?"AM":"PM";break;case"B":throw'"B" not implemented!';case"g":i=f.getHours(),d[j]=12>=i?i:i-12;break;case"G":d[j]=String(f.getHours());break;case"h":i=String(f.getHours()),i=12>=i?i:i-12,d[j]=i.length>1?i:"0"+i;break;case"H":i=String(f.getHours()),d[j]=i.length>1?i:"0"+i;break;case"i":var s=String(f.getMinutes());d[j]=s.length>1?s:"0"+s;break;case"s":var t=String(f.getSeconds());d[j]=t.length>1?t:"0"+t;break;case"u":throw'"u" not implemented!';case"e":throw'"e" not implemented!';case"I":g=new Date(f.getFullYear(),0,1),d[j]=f.getTimezoneOffset()!==g.getTimezoneOffset()?1:0;break;case"O":var u=f.getTimezoneOffset(),v=u%60;i=String((u-v)/60*-1),"-"!==i.charAt(0)&&(i="+"+i),i=3===i.length?i:i.replace(/([+\-])(\d)/,"$10$2"),d[j]=i+v+"0";break;case"P":throw'"P" not implemented!';case"T":throw'"T" not implemented!';case"Z":d[j]=60*f.getTimezoneOffset();break;case"c":throw'"c" not implemented!';case"r":var w=this._wDays(f.getDay()).substr(0,3),x=this._months(f.getMonth()).substr(0,3);d[j]=w+", "+f.getDate()+" "+x+this.get(" Y H:i:s O",f);break;case"U":d[j]=Math.floor(f.getTime()/1e3);break;default:d[j]=c[j]}return d.join("")},set:function(a,b){if("undefined"!=typeof b){("undefined"==typeof a||""===a)&&(a="Y-m-d");for(var c=a.split(""),d=new Array(c.length),e="\\",f,g={year:void 0,month:void 0,day:void 0,dayY:void 0,dayW:void 0,week:void 0,hour:void 0,hourD:void 0,min:void 0,sec:void 0,msec:void 0,ampm:void 0,diffM:void 0,diffH:void 0,date:void 0},h=0,i=0;i=S.slice(2)?0:1)+M)}else M=L.getFullYear();if(n)N=0,O=f[g.dayY.match+1];else if(o)N=p?this._iMonth(f[g.month.match+1]):L.getMonth(),O=f[g.day.match+1];else{N=0;var T;T=t?f[g.week.match+1]:this.get("W",L),O=7*(T-2)+(8-(new Date(M,0,1).getDay()||7))+this._iWeek(f[g.week.match+1])}if(0===N&&O>31){var U=new Date(M,N,O);N=U.getMonth(),O=U.getDate()}}else M=L.getFullYear(),N=L.getMonth(),O=L.getDate();return I=y?+f[g.hourD.match+1]+("pm"===f[g.ampm.match+1]?12:0):z?f[g.hour.match+1]:x?L.getHours():"00",J=B?f[g.min.match+1]:E?"00":L.getMinutes(),P=C?f[g.sec.match+1]:F?"00":L.getSeconds(),Q=D?f[g.msec.match+1]:"000",R=H?f[g.diffH.match+1]:G?String(-1*f[g.diffM.match+1]/60*100).replace(/^(\d)/,"+$1").replace(/(^[\-+])(\d{3}$)/,"$10$2"):"+0000",new Date(M,N,O,I,J,P)}}}};return a}),Ink.createModule("Ink.Util.Dumper","1",[],function(){"use strict";var a={_tab:"    ",_formatParam:function(a){var b="";switch(typeof a){case"string":b="(string) "+a;break;case"number":b="(number) "+a;break;case"boolean":b="(boolean) "+a;break;case"object":b=null!==a?a.constructor===Array?"Array \n{\n"+this._outputFormat(a,0)+"\n}":"Object \n{\n"+this._outputFormat(a,0)+"\n}":"null";break;default:b=!1}return b},_getTabs:function(a){for(var b="",c=0;a>c;c++)b+=this._tab;return b},_outputFormat:function(a,b){var c="",d=!1;for(var e in a)if(null!==a[e])if("object"!=typeof a[e]||a[e].constructor!==Array&&a[e].constructor!==Object){if(a[e].constructor===Function)continue;c=c+this._tab+this._getTabs(b)+"["+e+"] => "+a[e]+"\n"}else a[e].constructor===Array?d="Array":a[e].constructor===Object&&(d="Object"),c+=this._tab+this._getTabs(b)+"["+e+"] => "+d+"\n",c+=this._tab+this._getTabs(b)+"{\n",c+=this._outputFormat(a[e],b+1)+this._tab+this._getTabs(b)+"}\n";else c=c+this._tab+this._getTabs(b)+"["+e+"] => null \n";return c},printDump:function(a,b){if(b&&"undefined"!=typeof b)if("string"==typeof b)document.getElementById(b).innerHTML="
              "+this._formatParam(a)+"
              ";else{if("object"!=typeof b)throw"TARGET must be an element or an element ID";b.innerHTML="
              "+this._formatParam(a)+"
              "}else document.write("
              "+this._formatParam(a)+"
              ")},returnDump:function(a){return this._formatParam(a)},alertDump:function(a){window.alert(this._formatParam(a).replace(/()(Array|Object)(<\/b>)/g,"$2"))},windowDump:function(a){var b="dumperwindow_"+1e4*Math.random(),c=window.open("",b,"width=400,height=300,left=50,top=50,status,menubar,scrollbars,resizable");c.document.open(),c.document.write("
              "+this._formatParam(a)+"
              "),c.document.close(),c.focus()}};return a}),Ink.createModule("Ink.Util.I18n","1",[],function(){"use strict";var a=/\{(?:(\{.*?})|(?:%s:)?(\d+)|(?:%s)?|([\w-]+))}/g,b=function(a,b){return"function"==typeof a?a.apply(this,b):void 0!==typeof a?a:""},c=function(a,b,d){return this instanceof c?void this.reset().lang(b).testMode(d).append(a||{},b):new c(a,b,d)};return c.prototype={reset:function(){return this._dicts=[],this._dict={},this._testMode=!1,this._lang=this._gLang,this},append:function(a){return this._dicts.push(a),this._dict=Ink.extendObj(this._dict,a[this._lang]),this},lang:function(a){if(!arguments.length)return this._lang;if(a&&this._lang!==a){this._lang=a,this._dict={};for(var b=0,c=this._dicts.length;c>b;b++)this._dict=Ink.extendObj(this._dict,this._dicts[b][a]||{})}return this},testMode:function(a){return arguments.length?(void 0!==a&&(this._testMode=!!a),this):!!this._testMode},getKey:function(a){var b,d=this._gLang,e=this._lang;return a in this._dict?b=this._dict[a]:(c.langGlobal(e),b=this._gDict[a],c.langGlobal(d)),b},text:function(c){if("string"==typeof c){var d=Array.prototype.slice.call(arguments,1),e=0,f="object"==typeof d[0],g=this.getKey(c);return void 0===g&&(g=this._testMode?"["+c+"]":c),"number"==typeof g&&(g+=""),"string"==typeof g?g=g.replace(a,function(a,c,g,h){var i=c?c:g?d[g-(f?0:1)]:h?d[0][h]||"":d[e++ +(f?1:0)];return b(i,[e].concat(d))}):"function"==typeof g?g.apply(this,d):g instanceof Array?b(g[d[0]],d):"object"==typeof g?b(g[d[0]],d):""}},ntext:function(a,b,c){var d=Array.prototype.slice.apply(arguments),e;if(2===d.length&&"number"==typeof b){if(e=this.getKey(a),!(e instanceof Array))return"";d.splice(0,1),e=e[1===b?0:1]}else d.splice(0,2),e=1===c?a:b;return this.text.apply(this,[e].concat(d))},ordinal:function(a){if(void 0===a)return"";var c=+a.toString().slice(-1),d=this.getKey("_ordinals"); if(void 0===d)return"";if("string"==typeof d)return d;var e;return"function"==typeof d&&(e=d(a,c),"string"==typeof e)?e:"exceptions"in d&&(e="function"==typeof d.exceptions?d.exceptions(a,c):a in d.exceptions?b(d.exceptions[a],[a,c]):void 0,"string"==typeof e)?e:"byLastDigit"in d&&(e="function"==typeof d.byLastDigit?d.byLastDigit(c,a):c in d.byLastDigit?b(d.byLastDigit[c],[c,a]):void 0,"string"==typeof e)?e:"default"in d&&(e=b(d["default"],[a,c]),"string"==typeof e)?e:""},alias:function(){var a=Ink.bind(c.prototype.text,this);return a.ntext=Ink.bind(c.prototype.ntext,this),a.append=Ink.bind(c.prototype.append,this),a.ordinal=Ink.bind(c.prototype.ordinal,this),a.testMode=Ink.bind(c.prototype.testMode,this),a}},c.reset=function(){c.prototype._gDicts=[],c.prototype._gDict={},c.prototype._gLang="pt_PT"},c.reset(),c.appendGlobal=function(a,b){if(b){if(!(b in a)){var d={};d[b]=a,a=d}b!==c.prototype._gLang&&c.langGlobal(b)}c.prototype._gDicts.push(a),Ink.extendObj(c.prototype._gDict,a[c.prototype._gLang])},c.langGlobal=function(a){if(!arguments.length)return c.prototype._gLang;if(a&&c.prototype._gLang!==a){c.prototype._gLang=a,c.prototype._gDict={};for(var b=0,d=c.prototype._gDicts.length;d>b;b++)Ink.extendObj(c.prototype._gDict,c.prototype._gDicts[b][a]||{})}},c}),Ink.createModule("Ink.Util.Json","1",[],function(){"use strict";function twoDigits(a){var b=""+a;return 1===b.length?"0"+b:b}var function_call=Function.prototype.call,cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,dateToISOString=Date.prototype.toISOString?Ink.bind(function_call,Date.prototype.toISOString):function(a){return a.getUTCFullYear()+"-"+twoDigits(a.getUTCMonth()+1)+"-"+twoDigits(a.getUTCDate())+"T"+twoDigits(a.getUTCHours())+":"+twoDigits(a.getUTCMinutes())+":"+twoDigits(a.getUTCSeconds())+"."+String((a.getUTCMilliseconds()/1e3).toFixed(3)).slice(2,5)+"Z"},InkJson={_nativeJSON:window.JSON||null,_convertToUnicode:!1,_escape:function(a){var b={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};return/["\\\x00-\x1f]/.test(a)&&(a=a.replace(/([\x00-\x1f\\"])/g,function(a,c){var d=b[c];return d?d:(d=c.charCodeAt(),"\\u00"+Math.floor(d/16).toString(16)+(d%16).toString(16))})),a},_toUnicode:function(a){if(this._convertToUnicode){for(var b="",c=!1,d=!1,e=0,f=a.length;f>e;){if(c=a.charCodeAt(e),c>=32&&126>=c||8===c||9===c||10===c||12===c||13===c||32===c||34===c||47===c||58===c||92===c)d=34===c||92===c||47===c?"\\"+a.charAt(e):8===c?"\\b":9===c?"\\t":10===c?"\\n":12===c?"\\f":13===c?"\\r":a.charAt(e);else if(this._convertToUnicode){for(d=a.charCodeAt(e).toString(16)+"".toUpperCase();d.length<4;)d="0"+d;d="\\u"+d}else d=a.charAt(e);b+=d,e++}return b}return this._escape(a)},_stringifyValue:function(a){if("string"==typeof a)return'"'+this._toUnicode(a)+'"';if("number"!=typeof a||!isNaN(a)&&isFinite(a)){if("undefined"==typeof a||null===a)return"null";if("function"==typeof a.toJSON){var b=a.toJSON();return"string"==typeof b?'"'+this._escape(b)+'"':this._escape(b.toString())}if("number"==typeof a||"boolean"==typeof a)return""+a;if("function"==typeof a)return"null";if(a.constructor===Date)return'"'+this._escape(dateToISOString(a))+'"';if(a.constructor===Array){for(var c="",d=0,e=a.length;e>d;d++)d>0&&(c+=","),c+=this._stringifyValue(a[d]);return"["+c+"]"}var f="";for(var g in a)({}).hasOwnProperty.call(a,g)&&(""!==f&&(f+=","),f+='"'+this._escape(g)+'": '+this._stringifyValue(a[g]));return"{"+f+"}"}return"null"},stringify:function(a,b){return this._convertToUnicode=!!b,!this._convertToUnicode&&this._nativeJSON?this._nativeJSON.stringify(a):this._stringifyValue(a)},parse:function(text,reviver){function walk(a,b){var c,d,e=a[b];if(e&&"object"==typeof e)for(c in e)Object.prototype.hasOwnProperty.call(e,c)&&(d=walk(e,c),void 0!==d?e[c]=d:delete e[c]);return reviver.call(a,b,e)}var j;if(text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})),/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")}};return InkJson}),Ink.createModule("Ink.Util.String","1",[],function(){"use strict";var InkUtilString={_chars:["&","à","á","â","ã","ä","å","æ","ç","è","é","ê","ë","ì","í","î","ï","ð","ñ","ò","ó","ô","õ","ö","ø","ù","ú","û","ü","ý","þ","ÿ","À","Á","Â","Ã","Ä","Å","Æ","Ç","È","É","Ê","Ë","Ì","Í","Î","Ï","Ð","Ñ","Ò","Ó","Ô","Õ","Ö","Ø","Ù","Ú","Û","Ü","Ý","Þ","€",'"',"ß","<",">","¢","£","¤","¥","¦","§","¨","©","ª","«","¬","­","®","¯","°","±","²","³","´","µ","¶","·","¸","¹","º","»","¼","½","¾"],_entities:["amp","agrave","aacute","acirc","atilde","auml","aring","aelig","ccedil","egrave","eacute","ecirc","euml","igrave","iacute","icirc","iuml","eth","ntilde","ograve","oacute","ocirc","otilde","ouml","oslash","ugrave","uacute","ucirc","uuml","yacute","thorn","yuml","Agrave","Aacute","Acirc","Atilde","Auml","Aring","AElig","Ccedil","Egrave","Eacute","Ecirc","Euml","Igrave","Iacute","Icirc","Iuml","ETH","Ntilde","Ograve","Oacute","Ocirc","Otilde","Ouml","Oslash","Ugrave","Uacute","Ucirc","Uuml","Yacute","THORN","euro","quot","szlig","lt","gt","cent","pound","curren","yen","brvbar","sect","uml","copy","ordf","laquo","not","shy","reg","macr","deg","plusmn","sup2","sup3","acute","micro","para","middot","cedil","sup1","ordm","raquo","frac14","frac12","frac34"],_accentedChars:["à","á","â","ã","ä","å","è","é","ê","ë","ì","í","î","ï","ò","ó","ô","õ","ö","ù","ú","û","ü","ç","ñ","À","Á","Â","Ã","Ä","Å","È","É","Ê","Ë","Ì","Í","Î","Ï","Ò","Ó","Ô","Õ","Ö","Ù","Ú","Û","Ü","Ç","Ñ"],_accentedRemovedChars:["a","a","a","a","a","a","e","e","e","e","i","i","i","i","o","o","o","o","o","u","u","u","u","c","n","A","A","A","A","A","A","E","E","E","E","I","I","I","I","O","O","O","O","O","U","U","U","U","C","N"],_htmlUnsafeChars:{"<":"<",">":">","&":"&",'"':""","'":"'"},ucFirst:function(a,b){var c=b?/(^|\s)(\w)(\S{2,})/:/(^|\s)(\w)(\S{2,})/g;return a?String(a).replace(c,function(a,b,c,d){return b+c.toUpperCase()+d.toLowerCase()}):a},trim:function(a){return"string"==typeof a?a.replace(/^\s+|\s+$|\n+$/g,""):a},stripTags:function(a,b){if(b&&"string"==typeof b){for(var c=InkUtilString.trim(b).split(","),d=[],e=!1,f=0;f)/g,"").replace(/\s/,"")),d.push("(<"+e+"\\s[^>]+>|<(\\s|\\/)?(\\s|\\/)?"+e+">)"));for(var g=d.join("|"),h=new RegExp(g,"i"),i=a.match(new RegExp("<[^>]*>","g")),j=0;j]+\>/g,"")},htmlEntitiesEncode:function(a){if(a&&a.replace)for(var b=!1,c=0;cd?b+=String.fromCharCode(d):d>127&&2048>d?(b+=String.fromCharCode(d>>6|192),b+=String.fromCharCode(63&d|128)):(b+=String.fromCharCode(d>>12|224),b+=String.fromCharCode(d>>6&63|128),b+=String.fromCharCode(63&d|128))}return b},shortString:function(a,b){for(var c=a.split(" "),d="",e=0;e=b){d+="…";break}d+=c[e]+" "}return d},truncateString:function(a,b){return a.length-1>b?a.substr(0,b-1)+"…":a},utf8Decode:function(a){for(var b="",c=0,d=0,e=0,f=0;cd?(b+=String.fromCharCode(d),c++):d>191&&224>d?(e=a.charCodeAt(c+1),b+=String.fromCharCode((31&d)<<6|63&e),c+=2):(e=a.charCodeAt(c+1),f=a.charCodeAt(c+2),b+=String.fromCharCode((15&d)<<12|(63&e)<<6|63&f),c+=3);return b},removeAccentedChars:function(a){for(var b=a,c=!1,d=0;d&'"]/g,function(a){return b[a]}):a},normalizeWhitespace:function(a){return null!==a?InkUtilString.trim(String(a).replace(/\s+/g," ")):a},toUnicode:function(a){if("string"==typeof a){for(var b="",c=!1,d=!1,e=a.length,f=0;e>f;){if(c=a.charCodeAt(f),c>=32&&126>=c||8===c||9===c||10===c||12===c||13===c||32===c||34===c||47===c||58===c||92===c)d=8===c?"\\b":9===c?"\\t":10===c?"\\n":12===c?"\\f":13===c?"\\r":a.charAt(f);else{for(d=a.charCodeAt(f).toString(16)+"".toUpperCase();d.length<4;)d="0"+d;d="\\u"+d}b+=d,f++}return b}},escape:function(a){var b=a.charCodeAt(0).toString(16).split("");if(b.length<3){for(;b.length<2;)b.unshift("0");b.unshift("x")}else{for(;b.length<4;)b.unshift("0");b.unshift("u")}return b.unshift("\\"),b.join("")},unescape:function(a){var b=a.lastIndexOf("0");b=-1===b?2:Math.min(b,2);var c=a.substring(b),d=parseInt(c,16);return String.fromCharCode(d)},escapeText:function(a,b){void 0===b&&(b=["[","]","'",","]);for(var c=[],d,e,f=0,g=a.length;g>f;++f)d=a[f],e=d.charCodeAt(0),(32>e||e>126&&-1===b.indexOf(d))&&(d=InkUtilString.escape(d)),c.push(d);return c.join("")},escapedCharRegex:/(\\x[0-9a-fA-F]{2})|(\\u[0-9a-fA-F]{4})/g,unescapeText:function(a){for(var b;b=InkUtilString.escapedCharRegex.exec(a);)b=b[0],a=a.replace(b,InkUtilString.unescape(b)),InkUtilString.escapedCharRegex.lastIndex=0;return a},strcmp:function(a,b){return a===b?0:a>b?1:-1},packetize:function(a,b){for(var c=a.length,d=new Array(Math.ceil(c/b)),e=a.split(""),f,g=0;c;)f=Math.min(b,c),d[g++]=e.splice(0,f).join(""),c-=f;return d}};return InkUtilString}),Ink.createModule("Ink.Util.Url","1",[],function(){"use strict";var a={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",getUrl:function(){return window.location.href},genQueryString:function(a,b){var c=-1!==a.indexOf("?"),d,e,f,g=[a];for(e in b)b.hasOwnProperty(e)&&(c?d="&":(d="?",c=!0),f=b[e],"number"==typeof f||f||(f=""),g=g.concat([d,encodeURIComponent(e),"=",encodeURIComponent(f)]));return g.join("")},getQueryString:function(a){var b;b=a&&"undefined"!=typeof a?a:this.getUrl();var c={};if(b.match(/\?(.+)/i)){var d=b.replace(/^(.*)\?([^\#]+)(\#(.*))?/g,"$2");if(d.length>0)for(var e=d.split(/[;&]/),f=0;f0)for(var e=d.split(/[;&]/),f=0;f0?b[b.length-1]:!1;for(var c=!1,d=new RegExp(""+a,"i"),e=0,f=b.length;f>e;e++)if(c=b[e],d.test(c.src))return c;return!1}};return a}),Ink.createModule("Ink.Util.Validator","1",[],function(){"use strict";var a={_countryCodes:["AO","CV","MZ","PT"],_internacionalPT:351,_indicativosPT:{21:"lisboa",22:"porto",231:"mealhada",232:"viseu",233:"figueira da foz",234:"aveiro",235:"arganil",236:"pombal",238:"seia",239:"coimbra",241:"abrantes",242:"ponte de sôr",243:"santarém",244:"leiria",245:"portalegre",249:"torres novas",251:"valença",252:"vila nova de famalicão",253:"braga",254:"peso da régua",255:"penafiel",256:"são joão da madeira",258:"viana do castelo",259:"vila real",261:"torres vedras",262:"caldas da raínha",263:"vila franca de xira",265:"setúbal",266:"évora",268:"estremoz",269:"santiago do cacém",271:"guarda",272:"castelo branco",273:"bragança",274:"proença-a-nova",275:"covilhã",276:"chaves",277:"idanha-a-nova",278:"mirandela",279:"moncorvo",281:"tavira",282:"portimão",283:"odemira",284:"beja",285:"moura",286:"castro verde",289:"faro",291:"funchal, porto santo",292:"corvo, faial, flores, horta, pico",295:"angra do heroísmo, graciosa, são jorge, terceira",296:"ponta delgada, são miguel, santa maria",91:"rede móvel 91 (Vodafone / Yorn)",93:"rede móvel 93 (Optimus)",96:"rede móvel 96 (TMN)",92:"rede móvel 92 (TODOS)",707:"número único",760:"número único",800:"número grátis",808:"chamada local",30:"voip"},_internacionalCV:238,_indicativosCV:{2:"fixo",91:"móvel 91",95:"móvel 95",97:"móvel 97",98:"móvel 98",99:"móvel 99"},_internacionalAO:244,_indicativosAO:{2:"fixo",91:"móvel 91",92:"móvel 92"},_internacionalMZ:258,_indicativosMZ:{2:"fixo",82:"móvel 82",84:"móvel 84"},_internacionalTL:670,_indicativosTL:{3:"fixo",7:"móvel 7"},_characterGroups:{numbers:["0-9"],asciiAlpha:["a-zA-Z"],latin1Alpha:["a-zA-Z","À-ÿ"],unicodeAlpha:["a-zA-Z","À-ÿ","Ā-῿","Ⰰ-퟿"],space:[" "],dash:["-"],underscore:["_"],nicknamePunctuation:["_.-"],singleLineWhitespace:[" "],newline:["\n"],whitespace:[" \n \f\r  "],asciiPunctuation:["!-/",":-@","[-`","{-~"],latin1Punctuation:["!-/",":-@","[-`","{-~","¡-¿","×","÷"],unicodePunctuation:["!-/",":-@","[-`","{-~","¡-¿","×","÷"," -","⸀-⹿"," -〿"]},createRegExp:function(b){var c="^[";for(var d in b)if(b.hasOwnProperty(d)){if(!(d in a._characterGroups))throw new Error("group "+d+" is not a valid character group");b[d]&&(c+=a._characterGroups[d].join(""))}return new RegExp("^["===c?"$^":c+"]*?$")},checkCharacterGroups:function(b,c){return a.createRegExp(c).test(b)},unicode:function(b,c){return a.checkCharacterGroups(b,Ink.extendObj({unicodeAlpha:!0},c))},latin1:function(b,c){return a.checkCharacterGroups(b,Ink.extendObj({latin1Alpha:!0},c))},ascii:function(b,c){return a.checkCharacterGroups(b,Ink.extendObj({asciiAlpha:!0},c))},number:function(b,c){if(b+="",c=Ink.extendObj({decimalSep:".",thousandSep:"",negative:!0,decimalPlaces:null,maxDigits:null,max:null,min:null,returnNumber:!1},c||{}),c.thousandSep)return b=b.replace(new RegExp("\\"+c.thousandSep,"g"),""),c.thousandSep="",a.number(b,c);if(c.negative===!1)return c.min=0,c.negative=!0,a.number(b,c);if("."!==c.decimalSep&&(b=b.replace(new RegExp("\\"+c.decimalSep,"g"),".")),!/^(-)?(\d+)?(\.\d+)?$/.test(b)||""===b)return!1;var d;if(c.decimalSep&&-1!==b.indexOf(c.decimalSep)){if(d=b.split(c.decimalSep),null!==c.decimalPlaces&&d[1].length>c.decimalPlaces)return!1}else d=[""+b,""];if(null!==c.maxDigits&&d[0].replace(/-/g,"").length>c.maxDigits)return d;var e=parseFloat(b);return null!==c.maxExcl&&e>=c.maxExcl||null!==c.minExcl&&e<=c.minExcl?!1:null!==c.max&&e>c.max||null!==c.min&&e=1&&12>=b&&c>=1&&this._daysInMonth(b,a)>=c?!0:!1},email:function(a){var b=new RegExp("^[_a-z0-9-]+((\\.|\\+)[_a-z0-9-]+)*@([\\w]*-?[\\w]*\\.)+[a-z]{2,4}$","i");return!!b.test(a)},mail:function(b){return a.email(b)},url:function(a,b){if("undefined"==typeof b||b===!1){var c=new RegExp("(^(http\\:\\/\\/|https\\:\\/\\/)(.+))","i");c.test(a)===!1&&(a="http://"+a)}var d=new RegExp("^(http:\\/\\/|https:\\/\\/)([\\w]*(-?[\\w]*)*\\.)+[a-z]{2,4}","i");return d.test(a)===!1?!1:!0},isPTPhone:function(a){a=a.toString();var b=[];for(var c in this._indicativosPT)"string"==typeof this._indicativosPT[c]&&b.push(c);var d=b.join("|"),e=/^(00351|\+351)/;e.test(a)&&(a=a.replace(e,""));var f=/(\s|\-|\.)+/g;a=a.replace(f,"");var g=/[\d]{9}/i;if(9===a.length&&g.test(a)){var h=new RegExp("^("+d+")");if(h.test(a))return!0}return!1},isPortuguesePhone:function(a){return this.isPTPhone(a)},isCVPhone:function(a){a=a.toString();var b=[];for(var c in this._indicativosCV)"string"==typeof this._indicativosCV[c]&&b.push(c);var d=b.join("|"),e=/^(00238|\+238)/;e.test(a)&&(a=a.replace(e,""));var f=/(\s|\-|\.)+/g;a=a.replace(f,"");var g=/[\d]{7}/i;if(7===a.length&&g.test(a)){var h=new RegExp("^("+d+")");if(h.test(a))return!0}return!1},isAOPhone:function(a){a=a.toString();var b=[];for(var c in this._indicativosAO)"string"==typeof this._indicativosAO[c]&&b.push(c);var d=b.join("|"),e=/^(00244|\+244)/;e.test(a)&&(a=a.replace(e,""));var f=/(\s|\-|\.)+/g;a=a.replace(f,"");var g=/[\d]{9}/i;if(9===a.length&&g.test(a)){var h=new RegExp("^("+d+")");if(h.test(a))return!0}return!1},isMZPhone:function(a){a=a.toString();var b=[];for(var c in this._indicativosMZ)"string"==typeof this._indicativosMZ[c]&&b.push(c);var d=b.join("|"),e=/^(00258|\+258)/;e.test(a)&&(a=a.replace(e,""));var f=/(\s|\-|\.)+/g;a=a.replace(f,"");var g=/[\d]{8,9}/i;if((9===a.length||8===a.length)&&g.test(a)){var h=new RegExp("^("+d+")");if(h.test(a)){if(0===a.indexOf("2")&&8===a.length)return!0;if(0===a.indexOf("8")&&9===a.length)return!0}}return!1},isTLPhone:function(a){a=a.toString();var b=[];for(var c in this._indicativosTL)"string"==typeof this._indicativosTL[c]&&b.push(c);var d=b.join("|"),e=/^(00670|\+670)/;e.test(a)&&(a=a.replace(e,""));var f=/(\s|\-|\.)+/g;a=a.replace(f,"");var g=/[\d]{7}/i;if(7===a.length&&g.test(a)){var h=new RegExp("^("+d+")");if(h.test(a))return!0}return!1},isPhone:function(){var a;if(0===arguments.length)return!1;var b=arguments[0];if(arguments.length>1){if(arguments[1].constructor!==Array){if("function"==typeof this["is"+arguments[1].toUpperCase()+"Phone"])return this["is"+arguments[1].toUpperCase()+"Phone"](b);throw"Invalid Country Code!"}var c;for(a=0;a=0&&b[j-1]<=100))return!1;c=!0}if(1===j||3===j||5===j&&("undefined"==typeof b[j+1]||""===b[j+1])){if(!("undefined"!=typeof b[j]&&b[j]>=0&&b[j]<=255))return!1;c=!0}}if(null!==(b=h.exec(a))||null!==(b=i.exec(a)))for(j=b.length;j--;){if(3===j||5===j){if(!("undefined"!=typeof b[j-1]&&"undefined"!=typeof b[j]&&""!==b[j]&&b[j-1]>=0&&b[j-1]<=100))return!1;c=!0}if(1===j){if(!("undefined"!=typeof b[j]&&b[j]>=0&&b[j]<=360))return!1;c=!0}}return c},isIP:function(a,b){if("string"!=typeof a)return!1;switch(b=(b||"ipv4").toLowerCase()){case"ipv4":return/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(a);case"ipv6":return/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/.test(a);default:return!1}},_creditCardSpecs:{"default":{length:"13,14,15,16,17,18,19",prefix:/^.+/,luhn:!0},"american express":{length:"15",prefix:/^3[47]/,luhn:!0},"diners club":{length:"14,16",prefix:/^36|55|30[0-5]/,luhn:!0},discover:{length:"16",prefix:/^6(?:5|011)/,luhn:!0},jcb:{length:"15,16",prefix:/^3|1800|2131/,luhn:!0},maestro:{length:"16,18",prefix:/^50(?:20|38)|6(?:304|759)/,luhn:!0},mastercard:{length:"16",prefix:/^5[1-5]/,luhn:!0},visa:{length:"13,16",prefix:/^4/,luhn:!0}},_luhn:function(a){if(a=parseInt(a,10),"number"!=typeof a&&a%1!==0)return!1;a+="";var b=a.length,c,d=0;for(c=b-1;c>=0;c-=2)d+=parseInt(a.substr(c,1),10);for(c=b-2;c>=0;c-=2){var e=parseInt(2*a.substr(c,1),10);d+=e>=10?e-9:e}return d%10===0},isCreditCard:function(a,b){if(/\d+/.test(a)===!1)return!1;if("undefined"==typeof b)b="default";else if(b instanceof Array){var c,d=b.length;for(c=0;d>c;c++)if(this.isCreditCard(a,b[c]))return!0;return!1}if(b=b.toLowerCase(),"undefined"==typeof this._creditCardSpecs[b])return!1;var e=a.length+"";return-1===this._creditCardSpecs[b].length.split(",").indexOf(e)?!1:this._creditCardSpecs[b].prefix.test(a)?this._creditCardSpecs[b].luhn===!1?!0:this._luhn(a):!1}};return a}); diff --git a/dist/js/ink.min.js.map b/dist/js/ink.min.js.map index 81b91ccee..8b7e18ffd 100644 --- a/dist/js/ink.min.js.map +++ b/dist/js/ink.min.js.map @@ -1 +1 @@ -{"version":3,"file":"ink.min.js","sources":["../../src/js/Ink/1/lib.js","../../src/js/Ink/Net/Ajax/1/lib.js","../../src/js/Ink/Net/JsonP/1/lib.js","../../src/js/Ink/Dom/Browser/1/lib.js","../../src/js/Ink/Dom/Css/1/lib.js","../../src/js/Ink/Dom/Element/1/lib.js","../../src/js/Ink/Dom/Event/1/lib.js","../../src/js/Ink/Dom/FormSerialize/1/lib.js","../../src/js/Ink/Dom/Loaded/1/lib.js","../../src/js/Ink/Dom/Selector/1/lib.js","../../src/js/Ink/Util/Array/1/lib.js","../../src/js/Ink/Util/BinPack/1/lib.js","../../src/js/Ink/Util/Cookie/1/lib.js","../../src/js/Ink/Util/Date/1/lib.js","../../src/js/Ink/Util/Dumper/1/lib.js","../../src/js/Ink/Util/I18n/1/lib.js","../../src/js/Ink/Util/Json/1/lib.js","../../src/js/Ink/Util/String/1/lib.js","../../src/js/Ink/Util/Url/1/lib.js","../../src/js/Ink/Util/Validator/1/lib.js"],"names":["window","document","paths","modules","modulesLoadOrder","modulesRequested","pendingRMs","modulesWaitingForDeps","apply","Function","prototype","isEmptyObject","o","k","hasOwnProperty","Ink","VERSION","_checkPendingRequireModules","I","F","dep","mod","cb","pRMs","toApply","length","left","args","remaining","push","i","setTimeout","getPath","key","noLib","split","curKey","root","path","slice","join","test","setPath","rootURI","replace","loadScript","uri","contentType","indexOf","givenUri","this","Error","scriptEl","createElement","setAttribute","onerror","error","head","getElementsByTagName","appendChild","_loadLater","namespace","ns","returnParentAndKey","levels","nsobj","parent","f","getModule","version","createModule","deps","modFn","modAll","Array","call","arguments","moduleContent","_version","isInkModule","t","requireModules","cbFn","undefined","_moduleRenames","warn","Ink.UI.Aux_1","getModulesLoadOrder","getModuleScripts","mlo","unshift","map","m","getModuleURL","createExt","moduleName","dependencies","bind","fn","context","innerArgs","finalArgs","concat","bindMethod","object","methodName","bindEvent","event","id","getElementById","ss","selector","from","Dom","Selector","select","s","extendObj","destination","sources","len","property","Object","log","console","Ajax","url","options","init","globalOptions","parameters","requestHeaders","xMLHttpRequestWithCredentials","XMLHttpRequest","userOptions","asynchronous","cors","validateCors","debug","delay","evalJS","method","postBody","sanitizeJSON","signRequest","timeout","useCredentials","xhrProxy","onComplete","onCreate","onException","onFailure","onHeaders","onInit","onSuccess","onTimeout","globalParameters","paramsObjToStr","safeCall","urlLocation","_locationFromURL","isHTTP","_locationIsHTTP","isCrossDomain","_locationIsCrossDomain","location","requestHasBody","search","transport","getTransport","request","createElementNS","href","match","protocol","widget","split1","split2","protocol1","protocol2","colonOrSlash","host1","host2","usingXDomainReq","XDomainRequest","ActiveXObject","e","setHeaders","headers","Accept","Accept-Language","navigator","language","X-Requested-With","X-Ink-Version","headerReqName","overrideMimeType","userAgent","Connection","headerName","setRequestHeader","optParams","p","a","params","toString","isNaN","encodeURIComponent","pop","setParams","getHeader","name","getResponseHeader","getAllHeaders","getAllResponseHeaders","getResponse","r","headerJSON","responseJSON","timeTaken","Date","startTime","requestedUrl","readyState","responseText","responseXML","status","statusText","abort","clearTimeout","delayTimeout","stoTimeout","ex","finish","runStateChange","rs","getTime","responseContent","response","curStatus","isSuccess","headerContentType","evalJSON","mimeType","xmlDoc","DOMParser","parseFromString","xml","onreadystatechange","destroy","handlerName","value","nodeType","crossDomain","open","withCredentials","onload","send","isJSON","str","strJSON","sanitize","JSON","parse","eval","load","callback","ping","JsonP","failureObj","callbackParam","internalCallback","randVar","parseInt","Math","random","Net","_cleanUp","_addScriptTag","_addParamsToGet","hasQuestionMark","sep","pKey","pValue","parts","_getScriptContainer","body","documentElement","rnd_seed","_scriptEl","type","src","scriptCtn","_removeScriptTag","parentNode","removeChild","Browser","IE","GECKO","OPERA","SAFARI","KONQUEROR","CHROME","model","cssPrefix","domPrefix","detectBrowser","setDimensions","setReferrer","myWidth","myHeight","innerWidth","innerHeight","clientWidth","clientHeight","windowWidth","windowHeight","referrer","escape","_sniffUserAgent","sAgent","toLowerCase","rVersion","re","RegExp","reVersion","alert","getCs","defaultView","getComputedStyle","Css","addRemoveClassName","elm","className","addRemState","addClassName","removeClassName","classList","add","hasClassName","remove","elmClassName","setClassName","all","has","contains","blinkClass","element","negate","Number","toggleClassName","forceAdd","toggle","setOpacity","val","style","opacity","filter","_camelCase","_","$1","toUpperCase","getStyle","currentStyle","charAt","css","parseFloat","setStyle","cssText","prop","styleFloat","cssFloat","show","forceDisplayProperty","display","hide","showHide","forceShow","_getRefTag","firstElementChild","child","firstChild","nextSibling","appendStyleTag","force","styles","oldStyle","l","innerHTML","defStyle","refTag","styleStr","styleSheet","createTextNode","insertBefore","appendStylesheet","media","rel","_loadingCSSFiles","_loadedCSSFiles","appendStylesheetCb","cbs","linkEl","headEl","imgEl","_url","callbacks","decToHex","dec","normalizeTo2","rDec","gDec","g","bDec","b","rgb","hexToDec","hex","substr","getPropertyFromStylesheet","rule","getRuleFromStylesheet","getPropertyFromStylesheet2","rules","getRulesFromStylesheet","x","sheet","ri","rf","styleSheets","si","sf","cssRules","selectorText","res","getPropertiesFromRule","props","steps","pre","pos","substring","borderTopLeftRadius","borderBottomRightRadius","borderTopRightRadius","borderBottomLeftRadius","changeFontSize","delta","op","minVal","maxVal","that","TypeError","el","els","fontSize","rect","elem","dimensions","getBoundingClientRect","top","offsetTop","offsetLeft","createContextualFragmentSupport","createRange","Range","createContextualFragment","deleteThisTbodyToken","browserCreatesTbodies","div","InkElement","isDOMElement","get","create","tag","properties","parEl","scrollTo","scrollIntoView","elmOffset","elmTop","elmLeft","offsetParent","y","offset","positionedOffset","valueTop","valueLeft","tagName","position","doc","ownerDocument","docElem","box","clientTop","clientLeft","scrollTop","pageYOffset","scrollLeft","pageXOffset","scroll","_getPropPx","cs","n","c","getPropertyValue","offset2","hasAttribute","attr","getAttribute","insertAfter","newElm","targetElm","insertTop","insertBottom","textContent","node","text","innerText","lastChild","childNodes","nodeValue","setTextContent","isLink","hasAttributeNS","isAncestorOf","ancestor","compareDocumentPosition","descendantOf","descendant","lastElementChild","previousSibling","nextElementSibling","sibling","previousElementSibling","elementWidth","offsetWidth","elementHeight","offsetHeight","elementLeft","elementTop","elementDimensions","outerDimensions","bbox","right","bottom","inViewport","dims","partial","margin","viewportWidth","viewportHeight","isHidden","w","h","isVisible","clonePosition","cloneTo","cloneFrom","ellipsizeText","overflow","whiteSpace","textOverflow","findUpwardsHaving","boolTest","findUpwardsByClass","tst","cls","findUpwardsByTag","nodeName","findUpwardsById","findUpwardsBySelector","sel","matchesSelector","getChildrenText","removeIt","j","part","nodes","jLen","_trimString","String","data","trim","getSelectValues","selectEl","values","_normalizeData","d","data2","fillSelect","container","skipEmpty","defaultValue","containerEl","optionEl","fillRadios","insertAfterEl","splitEl","inputEl","checked","fillChecks","parentIndexOf","parentEl","childEl","children","nextSiblings","elements","siblings","index","previousSiblings","childElementCount","_wrapElements","TABLE","html","TBODY","THEAD","TFOOT","TR","_getWrapper","wrapper","wrapFunc","tds","tbody","appendHTML","prependHTML","setHTML","wrap","target","nextNode","unwrap","wrapperSelector","replacement","replaceChild","removeTextNodeChildren","prevEl","toRemove","htmlToFragment","range","createDocumentFragment","selectNode","fragment","tempElement","current","InkDomSelector","dataset","attrs","attributes","curAttr","curAttrName","curAttrValue","total","moveCursorTo","setSelectionRange","createTextRange","collapse","moveEnd","moveStart","pageWidth","xScroll","scrollMaxX","scrollWidth","self","pageHeight","yScroll","scrollMaxY","scrollHeight","bean","definition","win","old","namespaceRegex","nameRegex","addEvent","removeEvent","W3C_MODEL","eventSupport","ONE","str2arr","isString","isFunction","standardNativeEvents","w3cNativeEvents","nativeEvents","hash","events","customEvents","isAncestor","check","related","relatedTarget","prefix","mouseenter","base","condition","mouseleave","mousewheel","Event","commonProps","mouseProps","mouseWheelProps","keyProps","textProps","touchProps","messageProps","stateProps","overOutRegex","typeFixers","reg","fix","newEvent","keyCode","which","rightClick","button","pageX","pageY","clientX","clientY","typeFixerMap","isNative","parentWindow","originalEvent","isBean","srcElement","fixer","preventDefault","returnValue","stopPropagation","cancelBubble","stop","stopped","stopImmediatePropagation","isImmediatePropagationStopped","clone","currentTarget","ne","targetElement","RegEntry","wrappedHandler","eargs","findTarget","eventElement","__beanDel","ft","handler","original","namespaces","customType","once","removeListener","eventType","inNamespaces","checkNamespaces","matches","checkElement","checkOriginal","checkHandler","registry","forAll","pfx","list","entries","entry","put","del","splice","removed","selectorEngine","setSelectorEngine","querySelectorAll","rootListener","propertyName","listeners","listener","custom","attachEvent","detachEvent","rm","originalFn","orgType","handlers","delegate","array","fireListener","evt","createEvent","dispatchEvent","fireEvent","createEventObject","off","typeSpec","isTypeStr","on","types","first","delfn","one","fire","names","beanDel","noConflict","cleanup","CollectGarbage","InkEvent","KEY_BACKSPACE","KEY_TAB","KEY_RETURN","KEY_ESC","KEY_SPACE","KEY_LEFT","KEY_UP","KEY_RIGHT","KEY_DOWN","KEY_DELETE","KEY_HOME","KEY_END","KEY_PAGEUP","KEY_PAGEDOWN","KEY_INSERT","throttle","func","wait","throttled","now","timeDiff","lastCall","ev","delegationTarget","fromElement","toElement","findElement","elmTagName","observe","eventName","callBack","useCapture","addEventListener","observeOnce","onceBack","stopObserving","observeMulti","observeDelegated","cursor","Selector_1","removeEventListener","cancel","stopDefault","pointer","pointerX","pointerY","touches","isLeftClick","isRightClick","isMiddleClick","getCharFromKeyboardEvent","changeCasing","fromCharCode","shiftOn","shiftKey","InkArray","isArrayIsh","obj","isArray","toArray","FormSerialize","serialize","form","out","emptyArrayToken","pairs","asPairs","emptyArray","outputUnchecked","forEach","pair","_resultsInArray","emit","serializeEl","elNodeName","elType","multiple","didEmit","thisOption","inputs","_isSerialized","fillIn","map2","_objToPairs","_fillInPairs","groupBy","reduce","_fillInOne","firstOne","firstNodeName","firstType","isSelectMulti","_fillInBoolean","min","checkAttr","input","isChecked","inArray","Loaded","_contexts","run","cbQueue","done","checkState","_checkState","poll","_poll","ael","rem","det","wet","csf","alreadyLoaded","frameElement","doScroll","where","_ready","rnative","createCache","cache","keys","Expr","cacheLength","shift","markFunction","expando","assert","Sizzle","results","seed","groups","nid","newContext","newSelector","preferredDoc","setDocument","documentIsHTML","rquickExpr","exec","support","getElementsByClassName","qsa","rbuggyQSA","tokenize","rescape","toSelector","rsibling","qsaError","removeAttribute","rtrim","siblingCheck","cur","diff","sourceIndex","MAX_NEGATIVE","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","parseOnly","matched","tokens","soFar","preFilters","cached","tokenCache","preFilter","rcomma","rcombinators","matchExpr","addCombinator","matcher","combinator","dir","checkNonElements","doneName","outerCache","dirkey","dirruns","cachedruns","elementMatcher","matchers","condense","unmatched","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","elems","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","relative","implicitRelative","matchContext","matchAnyContext","outermostContext","matcherFromGroupMatchers","elementMatchers","setMatchers","matcherCachedRuns","bySet","byElement","superMatcher","expandContext","setMatched","matchedCount","outermost","contextBackup","find","dirrunsUnique","uniqueSort","contexts","token","runescape","funescape","compile","setFilters","getText","isXML","recompare","sortInput","rbuggyMatches","classCache","compilerCache","hasDuplicate","sortOrder","strundefined","arr","push_native","whitespace","characterEncoding","identifier","operators","pseudos","rpseudo","ridentifier","ID","CLASS","NAME","TAG","ATTR","PSEUDO","CHILD","needsContext","rinputs","rheader","rattributeQuotes","escaped","high","createComment","getByName","pass","getElementsByName","sortDetached","div1","attrHandle","attrId","getAttributeNode","tmp","mozMatchesSelector","webkitMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","adown","bup","compare","aup","ap","bp","expr","ret","specified","msg","duplicates","detectDuplicates","sortStable","sort","selectors","createPseudo",">"," ","+","~","excess","unquoted","pattern","operator","result","what","last","simple","forward","ofType","nodeIndex","start","useCache","pseudo","idx","not","lang","elemLang","focus","activeElement","hasFocus","tabIndex","enabled","disabled","selected","selectedIndex","empty","header","eq","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","group","filters","arrayProto","testedObject","outKey","item","latestGroup","initial","sortMulti","constructor","keyValue","aKeys","shuffle","tmp1","rnd","floor","each","mapFn","filtered","some","intersect","arr1","arr2","shared","J","convert","unique","lastIndexOf","newArr","step","insert","rLen","output","iLen","Packer","fit","blocks","block","findNode","splitNode","used","down","GrowingPacker","growNode","canGrowDown","canGrowRight","shouldGrowRight","shouldGrowDown","growRight","growDown","sorts","area","max","height","msort","width","maxside","criteria","BinPack","binPack","bl","packer","sorter","dims2","fitted","unfitted","filled","Cookie","cookie","_Cookie","aCookie","aItem","decodeURIComponent","set","expires","domain","secure","sName","sExpires","sPath","sDomain","sSecure","oDate","sDate","valueOf","nDate","expiresString","toGMTString","hostname","cookieName","expiresDate","InkDate","_months","_m","_iMonth","month","janeiro","jan","fevereiro","fev","março","mar","abril","abr","maio","mai","junho","jun","julho","jul","agosto","ago","setembro","outubro","novembro","nov","dezembro","dez","_wDays","_d","_iWeek","week","segunda","seg","terça","ter","quarta","qua","quinta","qui","sexta","sex","sábado","sáb","domingo","dom","_daysInMonth","_y","nDays","format","_date","iFormat","escapeChar","jsDate","jsFirstDay","jsThisDay","jsHour","jsDay","getDate","getDay","suffixes","suffix","UTC","getFullYear","getMonth","jsYearStart","days","ceil","jsMonth","getYear","jsYear","getHours","jsMinute","getMinutes","jsSecond","getSeconds","getTimezoneOffset","jsMinZone","jsMinutes","jsDayName","jsMonthName","str_date","mList","objIndex","year","day","dayY","dayW","hour","hourD","sec","msec","ampm","diffM","diffH","date","pattr","_haveDatetime","_haveYear","_haveYDay","_haveDay","_haveMonth","_haveMonthDay","_haveOnlyDay","_haveWDay","_haveWeek","_haveWeekWDay","_haveOnlyWDay","_validDate","_noDate","_haveHour12","_haveHour24","_haveHour","_haveMin","_haveSec","_haveMSec","_haveMoreM","_haveMoreS","_haveDiffM","_haveDiffH","dList","gmt","aux","Dumper","_tab","_formatParam","param","formated","_outputFormat","_getTabs","numberOfTabs","tabs","_i","indent","_typeof","printDump","write","returnDump","alertDump","windowDump","dumperwindow","close","pattrText","funcOrVal","I18n","dict","testMode","append","_dicts","_dict","_testMode","_lang","_gLang","newTestMode","getKey","gLang","langGlobal","_gDict","pars","isObj","$2","$3","ntext","strSin","strPlur","count","ordinal","num","lastDig","ordDict","exceptions","byLastDigit","alias","_gDicts","appendGlobal","twoDigits","function_call","cx","dateToISOString","toISOString","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","toFixed","InkJson","_nativeJSON","_convertToUnicode","_escape","theString","\b","\t","\n","\f","\r","\"","\\","charCodeAt","_toUnicode","unicodeString","inInt","theUnicode","_stringifyValue","isFinite","toJSON","arrayString","objectString","stringify","convertToUnicode","reviver","walk","holder","v","lastIndex","SyntaxError","InkUtilString","_chars","_entities","_accentedChars","_accentedRemovedChars","_htmlUnsafeChars","<","&","'","ucFirst","string","firstWordOnly","replacer","stripTags","allowed","aAllowed","aNewAllowed","cleanedTag","strAllowed","reAllowed","aFoundTags","htmlEntitiesEncode","htmlEntitiesDecode","$0","utf8Encode","utfstring","shortString","words","resultstr","truncateString","utf8Decode","c2","c3","removeAccentedChars","newString","substrCount","haystack","needle","htmlEscapeUnsafe","chars","normalizeWhitespace","toUnicode","unescape","es","hexNum","escapeText","txt","whiteList","txt2","C","escapedCharRegex","unescapeText","strcmp","str1","str2","packetize","maxLen","sz","Url","_keyStr","getUrl","genQueryString","getQueryString","aParams","queryStr","aQueryStr","pairVar","getAnchor","anchor","getAnchorString","anchorStr","aAnchorStr","parseUrl","aURL","scheme","host","query","re1","re2","re3","regPort","tmpHost1","port","tmpHost2","tmpUserPass","user","urlObj","frag","currentScriptElement","aScripts","curScript","Validator","_countryCodes","_internacionalPT","_indicativosPT",21,22,231,232,233,234,235,236,238,239,241,242,243,244,245,249,251,252,253,254,255,256,258,259,261,262,263,265,266,268,269,271,272,273,274,275,276,277,278,279,281,282,283,284,285,286,289,291,292,295,296,91,93,96,92,707,760,800,808,30,"_internacionalCV","_indicativosCV",2,95,97,98,99,"_internacionalAO","_indicativosAO","_internacionalMZ","_indicativosMZ",82,84,"_internacionalTL","_indicativosTL",3,7,"_characterGroups","numbers","asciiAlpha","latin1Alpha","unicodeAlpha","space","dash","underscore","nicknamePunctuation","singleLineWhitespace","newline","asciiPunctuation","latin1Punctuation","unicodePunctuation","createRegExp","checkCharacterGroups","unicode","latin1","ascii","number","numb","decimalSep","thousandSep","negative","decimalPlaces","maxDigits","returnNumber","maxExcl","minExcl","_isLeapYear","yearRegExp","_dateParsers","yyyy-mm-dd","parser","yyyy/mm/dd","yy-mm-dd","yy/mm/dd","dd-mm-yyyy","dd/mm/yyyy","dd-mm-yy","dd/mm/yy","_isValidDate","validOneOrTwo","email","emailValido","mail","full","reHTTP","reUrl","isPTPhone","phone","aInd","strInd","re351","reSpecialChars","reInt","reValid","isPortuguesePhone","isCVPhone","re238","isAOPhone","re244","isMZPhone","re258","isTLPhone","re670","isPhone","codPostal","cp1","cp2","returnBothResults","cPostalSep","cPostal4","cPostal3","parserCPostal","cPostal","isDate","dateStr","yearIndex","monthIndex","dayIndex","dateParser","separator","isColor","valid","keyword","hexa","rgba","hsl","hsla","isIP","ipType","_creditCardSpecs","default","luhn","american express","diners club","discover","jcb","maestro","mastercard","visa","_luhn","checksum","dbl","isCreditCard","creditCardType","ccLength"],"mappings":"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","sourcesContent":["/**\n * Ink Core.\n * @module Ink_1\n * This module provides the necessary methods to create and load the modules using Ink.\n */\n\n;(function(window, document) {\n\n 'use strict';\n\n // skip redefinition of Ink core\n if ('Ink' in window) { return; }\n\n\n // internal data\n\n /*\n * NOTE:\n * invoke Ink.setPath('Ink', '/Ink/'); before requiring local modules\n */\n var paths = {};\n var modules = {};\n var modulesLoadOrder = [];\n var modulesRequested = {};\n var pendingRMs = [];\n var modulesWaitingForDeps = {};\n\n var apply = Function.prototype.apply;\n\n // auxiliary fns\n var isEmptyObject = function(o) {\n /*jshint unused:false */\n if (typeof o !== 'object') { return false; }\n for (var k in o) {\n if (o.hasOwnProperty(k)) {\n return false;\n }\n }\n return true;\n };\n\n /**\n * @namespace Ink_1\n */\n\n window.Ink = {\n /**\n * @property {String} VERSION\n **/\n VERSION: '3.1.2',\n _checkPendingRequireModules: function() {\n var I, F, o, dep, mod, cb, pRMs = [];\n var toApply = [];\n for (I = 0, F = pendingRMs.length; I < F; ++I) {\n o = pendingRMs[I];\n\n if (!o) { continue; }\n\n for (dep in o.left) {\n if (o.left.hasOwnProperty(dep)) {\n mod = modules[dep];\n if (mod) {\n o.args[o.left[dep] ] = mod;\n delete o.left[dep];\n --o.remaining;\n }\n }\n }\n\n if (o.remaining > 0) {\n pRMs.push(o);\n } else {\n cb = o.cb;\n if (!cb) { continue; }\n delete o.cb; // to make sure I won't call this more than once!\n toApply.push([cb, o.args]);\n }\n }\n\n pendingRMs = pRMs;\n\n for (var i = 0; i < toApply.length; i++) {\n toApply[i][0].apply(false, toApply[i][1]);\n }\n\n if (pendingRMs.length > 0) {\n setTimeout( function() { Ink._checkPendingRequireModules(); }, 0 );\n }\n },\n\n /**\n * Get the full path of a module.\n * This method looks up the paths given in setPath (and ultimately the default Ink's path).\n *\n * @method getPath\n * @param {String} key Name of the module you want to get the path\n * @param {Boolean} [noLib] Flag to skip appending 'lib.js' to the returned path.\n *\n * @return {String} The URI to the module, according to what you added in setPath for the given `key`.\n */\n getPath: function(key, noLib) {\n var split = key.split(/[._]/g);\n var curKey;\n var i;\n var root;\n var path;\n\n // Look for Ink.Dom.Element.1, Ink.Dom.Element, Ink.Dom, Ink in this order.\n for (i = split.length; i >= 0; i -= 1) {\n curKey = split.slice(0, i + 1).join('.'); // See comment in setPath\n if (paths[curKey]) {\n root = curKey;\n break;\n }\n }\n\n if (root in paths) {\n path = paths[root];\n } else {\n return null;\n }\n\n if (!/\\/$/.test(path)) {\n path += '/';\n }\n if (i < split.length) {\n // Add the rest of the path. For example, if we found\n // paths['Ink.Dom'] to be 'http://example.com/Ink/Dom/',\n // we now add '/Element/' to get the full path.\n path += split.slice(i + 1).join('/') + '/';\n }\n if (!noLib) {\n path += 'lib.js';\n }\n return path;\n },\n\n /**\n * Sets the URL path for a namespace.\n * Use this to customize where requireModules and createModule will load dependencies from.\n * This can be useful to set your own CDN for dynamic module loading or simply to change your module folder structure\n *\n * @method setPath\n *\n * @param {String} key Module or namespace\n * @param {String} rootURI Base URL path and schema to be appended to the module or namespace\n * @return {void}\n *\n * @example\n * Ink.setPath('Ink', 'http://my-cdn/Ink/');\n * Ink.setPath('Lol', 'http://my-cdn/Lol/');\n *\n * // Loads from http://my-cdn/Ink/Dom/Whatever/lib.js\n * Ink.requireModules(['Ink.Dom.Whatever'], function () { ... });\n * // Loads from http://my-cdn/Lol/Whatever/lib.js\n * Ink.requireModules(['Lol.Whatever'], function () { ... });\n */\n setPath: function(key, rootURI) {\n // Replacing version separator with dot because the difference\n // between a submodule and a version doesn't matter here.\n // It would also overcomplicate the implementation of getPath\n paths[key.replace(/_/, '.')] = rootURI;\n },\n\n /**\n * Loads a script URL.\n * This creates a `script` tag in the `head` of the document.\n * Reports errors by listening to 'error' and 'readystatechange' events.\n *\n * @method loadScript\n * @param {String} uri Can be an external URL or a module name\n * @param {String} [contentType]='text/javascript' The `type` attribute of the new script tag.\n * @return {Element} The newly created script element.\n */\n loadScript: function(uri, contentType) {\n /*jshint evil:true */\n\n if (uri.indexOf('/') === -1) {\n var givenUri = uri; // For the error message\n uri = this.getPath(uri);\n if (uri === null) {\n throw new Error('Could not load script \"' + givenUri + '\". ' +\n 'Path not found in the registry. Did you misspell ' +\n 'the name, or forgot to call setPath()?');\n }\n }\n\n var scriptEl = document.createElement('script');\n scriptEl.setAttribute('type', contentType || 'text/javascript');\n scriptEl.setAttribute('src', uri);\n\n if ('onerror' in scriptEl) {\n scriptEl.onerror = function () {\n Ink.error(['Failed to load script from ', uri, '.'].join(''));\n };\n }\n\n var head = document.head ||\n document.getElementsByTagName('head')[0];\n\n if (head) {\n return head.appendChild(scriptEl);\n }\n },\n\n _loadLater: function (dep) {\n setTimeout(function () {\n if (modules[dep] || modulesRequested[dep] ||\n modulesWaitingForDeps[dep]) {\n return;\n }\n modulesRequested[dep] = true;\n Ink.loadScript(dep);\n }, 0);\n },\n\n /**\n * Defines a module namespace.\n *\n * @method namespace\n * @param {String} ns Namespace to define.\n * @param {Boolean} [returnParentAndKey] Flag to change the return value to an array containing the namespace parent and the namespace key\n * @return {Object|Array} Returns the created namespace object\n */\n namespace: function(ns, returnParentAndKey) {\n if (!ns || !ns.length) { return null; }\n\n var levels = ns.split('.');\n var nsobj = window;\n var parent;\n\n for (var i = 0, f = levels.length; i < f; ++i) {\n nsobj[ levels[i] ] = nsobj[ levels[i] ] || {};\n parent = nsobj;\n nsobj = nsobj[ levels[i] ];\n }\n\n if (returnParentAndKey) {\n return [\n parent,\n levels[i-1]\n ];\n }\n\n return nsobj;\n },\n\n /**\n * Loads a module.\n * A synchronous method to get the module from the internal registry.\n * It assumes the module is defined and loaded already!\n *\n * @method getModule\n * @param {String} mod Module name\n * @param {Number} [version] Version number of the module\n * @return {Object|Function} Module object or function, depending how the module is defined\n */\n getModule: function(mod, version) {\n var key = version ? [mod, '_', version].join('') : mod;\n return modules[key];\n },\n\n /**\n * Creates a new module.\n * Use this to wrap your code and benefit from the module loading used throughout the Ink library\n *\n * @method createModule\n * @param {String} mod Module name, separated by dots. Like Ink.Dom.Selector, Ink.UI.Modal\n * @param {Number} version Version number\n * @param {Array} deps Array of module names which are dependencies of the module being created. The order in which they are passed here will define the order they will be passed to the callback function.\n * @param {Function} modFn The callback function to be executed when all the dependencies are resolved. The dependencies are passed as arguments, in the same order they were declared. The function itself should return the module.\n * @return {void}\n * @sample Ink_1_createModule.html\n *\n */\n createModule: function(mod, version, deps, modFn) { // define\n if (typeof mod !== 'string') {\n throw new Error('module name must be a string!');\n }\n\n // validate version correctness\n if (!(typeof version === 'number' || (typeof version === 'string' && version.length > 0))) {\n throw new Error('version number missing!');\n }\n\n var modAll = [mod, '_', version].join('');\n\n modulesWaitingForDeps[modAll] = true;\n\n var cb = function() {\n //console.log(['createModule(', mod, ', ', version, ', [', deps.join(', '), '], ', !!modFn, ')'].join(''));\n\n // make sure module in not loaded twice\n if (modules[modAll]) {\n //console.warn(['Ink.createModule ', modAll, ': module has been defined already.'].join(''));\n return;\n }\n\n\n // delete related pending tasks\n delete modulesRequested[modAll];\n delete modulesRequested[mod];\n\n\n // run module's supplied factory\n var args = Array.prototype.slice.call(arguments);\n var moduleContent = modFn.apply(window, args);\n modulesLoadOrder.push(modAll);\n // console.log('** loaded module ' + modAll + '**');\n\n\n // set version\n if (typeof moduleContent === 'object') { // Dom.Css Dom.Event\n moduleContent._version = version;\n }\n else if (typeof moduleContent === 'function') {\n moduleContent.prototype._version = version; // if constructor\n moduleContent._version = version; // if regular function\n }\n\n\n // add to global namespace...\n var isInkModule = mod.indexOf('Ink.') === 0;\n var t;\n if (isInkModule) {\n t = Ink.namespace(mod, true); // for mod 'Ink.Dom.Css', t[0] gets 'Ink.Dom' object and t[1] 'Css'\n }\n\n\n // versioned\n modules[ modAll ] = moduleContent; // in modules\n delete modulesWaitingForDeps[ modAll ];\n\n if (isInkModule) {\n t[0][ t[1] + '_' + version ] = moduleContent; // in namespace\n }\n\n\n // unversioned\n modules[ mod ] = moduleContent; // in modules\n\n if (isInkModule) {\n if (isEmptyObject( t[0][ t[1] ] )) {\n t[0][ t[1] ] = moduleContent; // in namespace\n }\n // else {\n // console.warn(['Ink.createModule ', modAll, ': module has been defined already with a different version!'].join(''));\n // }\n }\n\n\n if (this) { // there may be pending requires expecting this module, check...\n Ink._checkPendingRequireModules();\n }\n };\n\n this.requireModules(deps, cb);\n },\n\n /**\n * Requires modules asynchronously\n * Use this to get modules, even if they're not loaded yet\n *\n * @method requireModules\n * @param {Array} deps Array of module names. The order in which they are passed here will define the order they will be passed to the callback function.\n * @param {Function} cbFn The callback function to be executed when all the dependencies are resolved. The dependencies are passed as arguments, in the same order they were declared.\n * @return {void}\n * @sample Ink_1_requireModules.html\n */\n requireModules: function(deps, cbFn) { // require\n //console.log(['requireModules([', deps.join(', '), '], ', !!cbFn, ')'].join(''));\n var i, f, o, dep, mod;\n f = deps && deps.length;\n o = {\n args: new Array(f),\n left: {},\n remaining: f,\n cb: cbFn\n };\n\n if (!(typeof deps === 'object' && deps.length !== undefined)) {\n throw new Error('Dependency list should be an array!');\n }\n if (typeof cbFn !== 'function') {\n throw new Error('Callback should be a function!');\n }\n\n for (i = 0; i < f; ++i) {\n if (Ink._moduleRenames[deps[i]]) {\n Ink.warn(deps[i] + ' was renamed to ' + Ink._moduleRenames[deps[i]]);\n dep = Ink._moduleRenames[deps[i]];\n } else {\n dep = deps[i];\n }\n\n // Because trailing commas in oldIE bring us undefined values here\n if (!dep) {\n --o.remaining;\n continue;\n }\n\n mod = modules[dep];\n if (mod) {\n o.args[i] = mod;\n --o.remaining;\n continue;\n }\n else if (!modulesRequested[dep]) {\n Ink._loadLater(dep);\n }\n o.left[dep] = i;\n }\n\n if (o.remaining > 0) {\n pendingRMs.push(o);\n }\n else {\n cbFn.apply(true, o.args);\n }\n },\n\n _moduleRenames: {\n 'Ink.UI.Aux_1': 'Ink.UI.Common_1'\n },\n\n /**\n * Lists loaded module names.\n * The list is ordered by loaded time (oldest module comes first)\n *\n * @method getModulesLoadOrder\n * @return {Array} returns the order in which modules were resolved and correctly loaded\n */\n getModulesLoadOrder: function() {\n return modulesLoadOrder.slice();\n },\n\n /**\n * Builds the markup needed to load the modules.\n * This method builds the script tags needed to load the currently used modules\n *\n * @method getModuleScripts\n * @uses getModulesLoadOrder\n * @return {String} The script markup\n */\n getModuleScripts: function() {\n var mlo = this.getModulesLoadOrder();\n mlo.unshift('Ink_1');\n mlo = mlo.map(function(m) {\n return [''].join('');\n });\n\n return mlo.join('\\n');\n },\n\n /**\n * Creates an Ink.Ext module\n *\n * Does exactly the same as createModule but creates the module in the Ink.Ext namespace\n *\n * @method createExt\n * @uses createModule\n * @param {String} moduleName Extension name\n * @param {String} version Extension version\n * @param {Array} dependencies Extension dependencies\n * @param {Function} modFn Function returning the extension\n * @return {void}\n * @sample Ink_1_createExt.html\n */\n createExt: function (moduleName, version, dependencies, modFn) {\n return Ink.createModule('Ink.Ext.' + moduleName, version, dependencies, modFn);\n },\n\n /**\n * Function.prototype.bind alternative/fallback.\n * Creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called.\n *\n * @method bind\n * @param {Function} fn The function\n * @param {Object} context The value to be passed as the this parameter to the target function when the bound function is called. If used as false, it preserves the original context and just binds the arguments.\n * @param {Mixed} [more...] Additional arguments will be sent to the original function as prefix arguments.\n * @return {Function} A copy of `fn` bound to the given `context`. Calling this function causes a call to `fn` with the new `context` and any `more` arguments.\n * @sample Ink_1_bind.html\n */\n bind: function(fn, context) {\n var args = Array.prototype.slice.call(arguments, 2);\n return function() {\n var innerArgs = Array.prototype.slice.call(arguments);\n var finalArgs = args.concat(innerArgs);\n return fn.apply(context === false ? this : context, finalArgs);\n };\n },\n\n /**\n * Function.prototype.bind alternative for class methods\n * See Ink.bind. The difference between `bindMethod` and `bind` is that `bindMethod` fetches a method from an object. It can be useful, for instance, to bind a function which is a property of an object returned by another function.\n *\n * @method bindMethod\n * @uses bind\n * @param {Object} object The object that contains the method to bind\n * @param {String} methodName The name of the method that will be bound\n * @param {Mixed} [more...] Additional arguments will be sent to the new method as prefix arguments.\n * @return {Function} See Ink.bind.\n * @sample Ink_1_bindMethod.html\n */\n bindMethod: function (object, methodName) {\n return Ink.bind.apply(Ink,\n [object[methodName], object].concat([].slice.call(arguments, 2)));\n },\n\n /**\n * Function.prototype.bind alternative for event handlers.\n * Same as bind but keeps first argument of the call the original event.\n * Set `context` to `false` to preserve the original context of the function and just bind the arguments.\n *\n * @method bindEvent\n * @param {Function} fn The function\n * @param {Object} context The value to be passed as the this parameter to the target\n * @param {Mixed} [more...] Additional arguments will be sent to the original function as prefix arguments\n * @return {Function} A function which will always call `fn` with the given event (or window.event, in IE) as the first argument.\n * @sample Ink_1_bindEvent.html\n */\n bindEvent: function(fn, context) {\n var args = Array.prototype.slice.call(arguments, 2);\n return function(event) {\n var finalArgs = args.slice();\n finalArgs.unshift(event || window.event);\n return fn.apply(context === false ? this : context, finalArgs);\n };\n },\n\n /**\n * Shorter alias to document.getElementById.\n * Just calls `document.getElementById(id)`, unless `id` happens to be an element.\n * If `id` is an element, `Ink.i` just returns it.\n *\n * You can use this in situations where you want to accept an element id, but a raw element is also okay.\n *\n * @method i\n * @param {String} id Element ID\n * @return {DOMElement|null} The element returned by `document.getElementById(id)` if `id` was a string, and `id` otherwise.\n * @sample Ink_1_i.html\n */\n i: function(id) {\n if(typeof(id) === 'string') {\n return document.getElementById(id) || null;\n }\n return id;\n },\n\n /**\n * Alias for Ink.Dom.Selector\n *\n * Using sizzle-specific selectors is NOT encouraged!\n *\n * @method ss\n * @uses Ink.Dom.Selector.select\n * @param {String} selector CSS3 selector string\n * @param {DOMElement} [from=document] Context element. If set to a DOM element, the `selector` will only look for descendants of this DOM Element.\n * @return {Array} array of DOMElements\n * @sample Ink_1_ss.html\n */\n ss: function(selector, from)\n {\n if(typeof(Ink.Dom) === 'undefined' || typeof(Ink.Dom.Selector) === 'undefined') {\n throw new Error('This method requires Ink.Dom.Selector');\n }\n return Ink.Dom.Selector.select(selector, (from || document));\n },\n\n /**\n * Selects elements like `Ink.ss`, but only returns the first element found.\n *\n * Using sizzle-specific selectors is NOT encouraged!\n *\n * @method s\n * @uses Ink.Dom.Selector.select\n * @param {String} selector CSS3 selector string\n * @param {DOMElement} [from=document] Context element. If set to a DOM element, the `selector` will only look for descendants of this DOM Element.\n * @return {DOMElement} The first element found which matches the `selector`, or `null` if nothing is found.\n * @sample Ink_1_s.html\n */\n s: function(selector, from)\n {\n if(typeof(Ink.Dom) === 'undefined' || typeof(Ink.Dom.Selector) === 'undefined') {\n throw new Error('This method requires Ink.Dom.Selector');\n }\n return Ink.Dom.Selector.select(selector, (from || document))[0] || null;\n },\n\n /**\n * Extends an object with another\n * Copy all of the properties in one or more source objects over to the destination object, and return the destination object. It's in-order, so the last source will override properties of the same name in previous arguments.\n *\n * @method extendObj\n * @param {Object} destination The object that will receive the new/updated properties\n * @param {Object} source The object whose properties will be copied over to the destination object\n * @param {Object} [more...] Additional source objects. The last source will override properties of the same name in the previous defined sources\n * @return {Object} destination object, enriched with defaults from the sources\n * @sample Ink_1_extendObj.html\n */\n extendObj: function(destination/*, source... */) {\n var sources = [].slice.call(arguments, 1);\n\n for (var i = 0, len = sources.length; i < len; i++) {\n if (!sources[i]) { continue; }\n for (var property in sources[i]) {\n if(Object.prototype.hasOwnProperty.call(sources[i], property)) {\n destination[property] = sources[i][property];\n }\n }\n }\n\n return destination;\n },\n\n /**\n * Calls native console.log if available.\n *\n * @method log\n * @param {Mixed} [more...] Arguments to be evaluated\n * @return {void}\n * @sample Ink_1_log.html\n **/\n log: function () {\n // IE does not have console.log.apply in IE10 emulated mode\n var console = window.console;\n if (console && console.log) {\n apply.call(console.log, console, arguments);\n }\n },\n\n /**\n * Calls native console.warn if available.\n *\n * @method warn\n * @param {Mixed} [more...] Arguments to be evaluated\n * @return {void}\n * @sample Ink_1_warn.html\n **/\n warn: function () {\n // IE does not have console.log.apply in IE10 emulated mode\n var console = window.console;\n if (console && console.warn) {\n apply.call(console.warn, console, arguments);\n }\n },\n\n /**\n * Calls native console.error if available.\n *\n * @method error\n * @param {Mixed} [more...] Arguments to be evaluated\n * @return {void}\n * @sample Ink_1_error.html\n **/\n error: function () {\n // IE does not have console.log.apply in IE10 emulated mode\n var console = window.console;\n if (console && console.error) {\n apply.call(console.error, console, arguments);\n }\n }\n };\n\n\n // TODO for debug - to detect pending stuff\n /*\n var failCount = {}; // fail count per module name\n var maxFails = 3; // times\n var checkDelta = 0.5; //seconds\n\n var tmpTmr = setInterval(function() {\n var mk = Object.keys(modulesRequested);\n var l = mk.length;\n\n if (l > 0) {\n // console.log('** waiting for modules: ' + mk.join(', ') + ' **');\n\n for (var i = 0, f = mk.length, k, v; i < f; ++i) {\n k = mk[i];\n v = failCount[k];\n failCount[k] = (v === undefined) ? 1 : ++v;\n\n if (v >= maxFails) {\n console.error('** Loading of module ' + k + ' failed! **');\n delete modulesRequested[k];\n }\n }\n }\n else {\n // console.log('** Module loads complete. **');\n clearInterval(tmpTmr);\n }\n }, checkDelta*1000);\n */\n}(window, document));\n","/**\n * Cross Browser Ajax requests\n * @module Ink.Net.Ajax_1\n * @version 1\n */\n\nInk.createModule('Ink.Net.Ajax', '1', [], function() {\n 'use strict';\n\n /**\n * Creates a new XMLHttpRequest object\n *\n * @class Ink.Net.Ajax\n * @constructor\n *\n * @param {String} url Request URL\n * @param {Object} [options] Request options, containing:\n * @param {Boolean} [options.asynchronous=true] If false, the request synchronous.\n * @param {String} [options.contentType] Content-type header to be sent. Defaults to 'application/x-www-form-urlencoded'\n * @param {Boolean} [options.cors] Flag to activate CORS. Set this to true if you're doing a cross-origin request\n * @param {Boolean} [options.validateCors] If this is set to `true`, perform a CORS request automatically based on the URL being cross-domain or not.\n * @param {Number} [options.delay] Artificial delay. If the request is completed faster than this delay, wait the remaining time before executing the callbacks\n * @param {Boolean|String} [options.evalJS=true] If the request Content-type header is application/json, evaluates the response and populates responseJSON. Use 'force' if you want to force the response evaluation, no matter what Content-type it's using.\n * @param {String} [options.method='POST'] HTTP request method. POST by default.\n * @param {Object|String} [options.parameters] Request parameters to be sent with the request\n * @param {String} [options.postBody] POST request body. If not specified, it's filled with the contents from parameters\n * @param {Object} [options.requestHeaders] Key-value pairs for additional request headers\n * @param {Boolean} [options.sanitizeJSON] Flag to sanitize the content of responseText before evaluation\n * @xparam {Boolean} [options.signRequest=false] Send a \"X-Requested-With: XMLHttpRequest\" header in the request.\n * @param {Number} [options.timeout] Request timeout in seconds\n * @param {String} [options.xhrProxy] URI for proxy service hosted on the same server as the web app, that can fetch documents from other domains. The service must pipe all input and output untouched (some input sanitization is allowed, like clearing cookies). e.g., requesting http://example.org/doc can become /proxy/http%3A%2F%2Fexample.org%2Fdoc The proxy service will be used for cross-domain requests, if set, else a network error is returned as exception.\n * @param {Function} [options.onComplete] Callback executed after the request is completed, regardless of what happened during the request.\n * @param {Function} [options.onCreate] Callback executed after object initialization but before the request is made\n * @param {Function} [options.onException] Callback executed if an exception occurs. Receives the exception as a parameter.\n * @param {Function} [options.onFailure] Callback executed if the request fails (requests with status codes different from 2xx)\n * @param {Function} [options.onHeaders] Callback executed when headers of the response arrive.\n * @param {Function} [options.onInit] Callback executed before any initialization\n * @param {Function} [options.onSuccess] Callback executed if the request is successful (requests with 2xx status codes)\n * @param {Function} [options.onTimeout] Callback executed if the request times out\n *\n * @sample Ink_Net_Ajax_1.html \n */\n var Ajax = function(url, options){\n this.init(url, options);\n };\n\n /**\n * Options for all requests. These can then be overriden for individual ones.\n */\n Ajax.globalOptions = {\n parameters: {},\n requestHeaders: {}\n };\n\n\n // IE10 does not need XDomainRequest\n var xMLHttpRequestWithCredentials = 'XMLHttpRequest' in window && 'withCredentials' in (new XMLHttpRequest());\n\n\n\n Ajax.prototype = {\n\n init: function(url, userOptions) {\n if (!url) {\n throw new Error(\"new Ink.Net.Ajax: Pass a url as the first argument!\");\n }\n var options = Ink.extendObj({\n asynchronous: true,\n contentType: 'application/x-www-form-urlencoded',\n cors: false,\n validateCors: false,\n debug: false,\n delay: 0,\n evalJS: true,\n method: 'POST',\n parameters: null,\n postBody: '',\n requestHeaders: null,\n sanitizeJSON: false,\n signRequest: false,\n timeout: 0,\n useCredentials: false,\n xhrProxy: '',\n onComplete: null,\n onCreate: null,\n onException: null,\n onFailure: null,\n onHeaders: null,\n onInit: null,\n onSuccess: null,\n onTimeout: null\n }, Ajax.globalOptions);\n\n if (userOptions && typeof userOptions === 'object') {\n options = Ink.extendObj(options, userOptions);\n\n\n if (typeof userOptions.parameters === 'object') {\n options.parameters = Ink.extendObj(Ink.extendObj({}, Ajax.globalOptions.parameters), userOptions.parameters);\n } else if (userOptions.parameters !== null) {\n var globalParameters = this.paramsObjToStr(Ajax.globalOptions.parameters);\n if (globalParameters) {\n options.parameters = userOptions.parameters + '&' + globalParameters;\n }\n }\n\n options.requestHeaders = Ink.extendObj({}, Ajax.globalOptions.requestHeaders);\n options.requestHeaders = Ink.extendObj(options.requestHeaders, userOptions.requestHeaders);\n }\n\n this.options = options;\n\n this.safeCall('onInit');\n\n this.url = url;\n\n var urlLocation = this._locationFromURL(url);\n this.isHTTP = this._locationIsHTTP(urlLocation);\n this.isCrossDomain = this._locationIsCrossDomain(urlLocation, location);\n\n this.requestHasBody = options.method.search(/^get|head$/i) < 0;\n\n if (this.options.validateCors === true) {\n this.options.cors = this.isCrossDomain;\n }\n\n if(this.options.cors) {\n this.isCrossDomain = false;\n }\n\n this.transport = this.getTransport();\n\n this.request();\n },\n\n /**\n * Returns a location object from an URL\n *\n * @method _locationFromUrl\n * @param {String} url Input url\n * @return {Location} An `` element with `href` set to the given URL.\n * @private\n **/\n _locationFromURL: function (url) {\n var urlLocation = document.createElementNS ?\n document.createElementNS('http://www.w3.org/1999/xhtml', 'a') :\n document.createElement('a');\n urlLocation.setAttribute('href', url);\n return urlLocation;\n },\n\n /**\n * Checks whether a location is HTTP or HTTPS\n *\n * @method locationIsHttp\n * @param {Location} urlLocation Location object or `` element representing the current location.\n * @return {Boolean} `true` if the location is HTTP or HTTPS, `false` otherwise.\n * @private\n */\n _locationIsHTTP: function (urlLocation) {\n return urlLocation.href.match(/^https?:/i) ? true : false;\n },\n\n /**\n * Checks whether a location is cross-domain from ours.\n *\n * @method _locationIsCrossDomain\n * @param {Location} urlLocation A Location object or an `` elemnt.\n * @param {Location} [location=window.location] A location representing this one. This argument only exists for testing. Don't use it.\n * @return {Boolean} `true` if the locations are in different domains (in which case we need to perform a cross-domain request)\n * @private\n */\n _locationIsCrossDomain: function (urlLocation, location) {\n // TODO because of oldIE compatibility, we can only use .href (the full URL), and none of the other useful properties one can find in Location elements. So we should just pass pure strings around. Not only here.\n location = location || window.location;\n if (!Ajax.prototype._locationIsHTTP(urlLocation) || location.protocol === 'widget:' || typeof window.widget === 'object') {\n return false;\n } else {\n var split1 = urlLocation.href.split('//');\n var split2 = location.href.split('//');\n\n if (split1.length === 1 || split2.length === 1) {\n // This occurs when there's no protocol string in either URL\n // Only happens in IE7 because setting the \"href\" of a link doesn't make that link show you the full URL when the URI is relative to this host.\n // So we have our answer.\n // If there's no protocol string\n // We know for sure that our `urlLocation` is relative\n // In which case, they are in the same domain.\n return false;\n }\n\n var protocol1 = split1[0];\n var protocol2 = split2[0];\n\n var colonOrSlash = /:|\\//; // Finds colons or slashes, which are the end of hostnames (without ports)\n\n var host1 = split1[1].split(colonOrSlash)[0];\n var host2 = split2[1].split(colonOrSlash)[0];\n\n return protocol1 !== protocol2 ||\n host1 !== host2;\n }\n },\n\n /**\n * Creates the appropriate XMLHttpRequest object, depending on our browser and whether we're trying to perform a cross-domain request.\n *\n * @method getTransport\n * @return {Object} XMLHttpRequest object\n * @private\n */\n getTransport: function()\n {\n /*global XDomainRequest:false, ActiveXObject:false */\n if (!xMLHttpRequestWithCredentials && this.options.cors && 'XDomainRequest' in window) {\n this.usingXDomainReq = true;\n return new XDomainRequest();\n }\n else if (typeof XMLHttpRequest !== 'undefined') {\n return new XMLHttpRequest();\n }\n else if (typeof ActiveXObject !== 'undefined') {\n try {\n return new ActiveXObject('Msxml2.XMLHTTP');\n } catch (e) {\n return new ActiveXObject('Microsoft.XMLHTTP');\n }\n } else {\n return null;\n }\n },\n\n /**\n * Set the necessary headers for an ajax request.\n *\n * @method setHeaders\n * @return {void}\n */\n setHeaders: function()\n {\n if (this.transport) {\n try {\n var headers = {\n \"Accept\": \"text/javascript,text/xml,application/xml,application/xhtml+xml,text/html,application/json;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1\",\n \"Accept-Language\": navigator.language,\n \"X-Requested-With\": \"XMLHttpRequest\",\n \"X-Ink-Version\": \"3\"\n };\n if (this.options.cors) {\n if (!this.options.signRequest) {\n delete headers['X-Requested-With'];\n }\n delete headers['X-Ink-Version'];\n }\n\n if (this.options.requestHeaders && typeof this.options.requestHeaders === 'object') {\n for(var headerReqName in this.options.requestHeaders) {\n if (this.options.requestHeaders.hasOwnProperty(headerReqName)) {\n headers[headerReqName] = this.options.requestHeaders[headerReqName];\n }\n }\n }\n\n if (this.transport.overrideMimeType && (navigator.userAgent.match(/Gecko\\/(\\d{4})/) || [0,2005])[1] < 2005) {\n headers.Connection = 'close';\n }\n\n for (var headerName in headers) {\n if(headers.hasOwnProperty(headerName)) {\n this.transport.setRequestHeader(headerName, headers[headerName]);\n }\n }\n } catch(e) {}\n }\n },\n\n /**\n * Converts an object with parameters to a querystring\n *\n * @method paramsObjToStr\n * @param {Object} optParams Parameters object, example: `{ a: 2, b: 3 }`\n * @return {String} A query string. Example: `'a=2&b=3'`\n * @private\n */\n paramsObjToStr: function(optParams) {\n var k, m, p, a, params = [];\n if (typeof optParams === 'object') {\n for (p in optParams){\n if (optParams.hasOwnProperty(p)) {\n a = optParams[p];\n if (Object.prototype.toString.call(a) === '[object Array]' && !isNaN(a.length)) {\n for (k = 0, m = a.length; k < m; k++) {\n params = params.concat([\n encodeURIComponent(p), '[]', '=',\n encodeURIComponent(a[k]), '&'\n ]);\n }\n }\n else {\n params = params.concat([\n encodeURIComponent(p), '=',\n encodeURIComponent(a), '&'\n ]);\n }\n }\n }\n if (params.length > 0) {\n params.pop();\n }\n }\n else\n {\n return optParams;\n }\n return params.join('');\n },\n\n /**\n * Set the url parameters for a GET request\n *\n * @method setParams\n * @return {void}\n * @private\n */\n setParams: function()\n {\n var params = null, optParams = this.options.parameters;\n\n if(typeof optParams === \"object\"){\n params = this.paramsObjToStr(optParams);\n } else {\n params = '' + optParams;\n }\n\n if(params){\n if(this.url.indexOf('?') > -1) {\n this.url = this.url.split('#')[0] + '&' + params;\n } else {\n this.url = this.url.split('#')[0] + '?' + params;\n }\n }\n },\n\n /**\n * Gets an HTTP header from the response\n *\n * @method getHeader\n * @param {String} name Header name\n * @return {String} Header content\n * @public\n */\n getHeader: function(name)\n {\n if (this.usingXDomainReq && name === 'Content-Type') {\n return this.transport.contentType;\n }\n try{\n return this.transport.getResponseHeader(name);\n } catch(e) {\n return null;\n }\n },\n\n /**\n * Gets all the HTTP headers from the response\n *\n * @method getAllHeaders\n * @return {String} The headers, each separated by a newline\n * @public\n */\n getAllHeaders: function()\n {\n try {\n return this.transport.getAllResponseHeaders();\n } catch(e) {\n return null;\n }\n },\n\n /**\n * Gets the ajax response object\n *\n * @method getResponse\n * @return {Object} The response object\n * @public\n */\n getResponse: function(){\n // setup our own stuff\n var t = this.transport,\n r = {\n headerJSON: null,\n responseJSON: null,\n getHeader: this.getHeader,\n getAllHeaders: this.getAllHeaders,\n request: this,\n transport: t,\n timeTaken: new Date() - this.startTime,\n requestedUrl: this.url\n };\n\n // setup things expected from the native object\n r.readyState = t.readyState;\n try { r.responseText = t.responseText; } catch(e) {}\n try { r.responseXML = t.responseXML; } catch(e) {}\n try { r.status = t.status; } catch(e) { r.status = 0; }\n try { r.statusText = t.statusText; } catch(e) { r.statusText = ''; }\n\n return r;\n },\n\n /**\n * Aborts the request if still running. No callbacks are called\n *\n * @method abort\n * @return {void}\n * @public\n */\n abort: function(){\n if (this.transport) {\n clearTimeout(this.delayTimeout);\n clearTimeout(this.stoTimeout);\n try { this.transport.abort(); } catch(ex) {}\n this.finish();\n }\n },\n\n /**\n * Executes the state changing phase of an ajax request\n *\n * @method runStateChange\n * @return {void}\n * @public\n */\n runStateChange: function()\n {\n var rs = this.transport.readyState;\n if (rs === 3) {\n if (this.isHTTP) {\n this.safeCall('onHeaders');\n }\n } else if (rs === 4 || this.usingXDomainReq) {\n\n if (this.options.asynchronous && this.options.delay && (this.startTime + this.options.delay > new Date().getTime())) {\n this.delayTimeout = setTimeout(Ink.bind(this.runStateChange, this), this.options.delay + this.startTime - new Date().getTime());\n return;\n }\n\n var responseJSON,\n responseContent = this.transport.responseText,\n response = this.getResponse(),\n curStatus = this.transport.status;\n\n if (this.isHTTP && !this.options.asynchronous) {\n this.safeCall('onHeaders');\n }\n\n clearTimeout(this.stoTimeout);\n\n if (curStatus === 0) {\n // Status 0 indicates network error for http requests.\n // For http less requests, 0 is always returned.\n if (this.isHTTP) {\n this.safeCall('onException', new Error('Ink.Net.Ajax: network error! (HTTP status 0)'));\n } else {\n curStatus = responseContent ? 200 : 404;\n }\n }\n else if (curStatus === 304) {\n curStatus = 200;\n }\n var isSuccess = this.usingXDomainReq || 200 <= curStatus && curStatus < 300;\n\n var headerContentType = this.getHeader('Content-Type') || '';\n if (this.options.evalJS &&\n (headerContentType.indexOf(\"application/json\") >= 0 || this.options.evalJS === 'force')){\n try {\n responseJSON = this.evalJSON(responseContent, this.sanitizeJSON);\n\n if(responseJSON){\n responseContent = response.responseJSON = responseJSON;\n }\n } catch(e){\n if (isSuccess) {\n // If the request failed, then this is perhaps an error page\n // so don't notify error.\n this.safeCall('onException', e);\n }\n }\n }\n\n if (this.usingXDomainReq && headerContentType.indexOf('xml') !== -1 && 'DOMParser' in window) {\n // http://msdn.microsoft.com/en-us/library/ie/ff975278(v=vs.85).aspx\n var mimeType;\n switch (headerContentType) {\n case 'application/xml':\n case 'application/xhtml+xml':\n case 'image/svg+xml':\n mimeType = headerContentType;\n break;\n default:\n mimeType = 'text/xml';\n }\n var xmlDoc = (new DOMParser()).parseFromString( this.transport.responseText, mimeType);\n this.transport.responseXML = xmlDoc;\n response.responseXML = xmlDoc;\n }\n\n if (this.transport.responseXML != null && response.responseJSON == null && this.transport.responseXML.xml !== \"\"){\n responseContent = this.transport.responseXML;\n }\n\n if (curStatus || this.usingXDomainReq) {\n if (isSuccess) {\n this.safeCall('onSuccess', response, responseContent);\n } else {\n this.safeCall('onFailure', response, responseContent);\n }\n this.safeCall('on'+curStatus, response, responseContent);\n }\n this.finish(response, responseContent);\n }\n },\n\n /**\n * Last step after XHR is complete. Call onComplete and cleanup object\n *\n * @method finish\n * @param {Mixed} response Response object as returned from getResponse().\n * @param {Mixed} responseContent Content of the response.\n * @return {void}\n * @private\n */\n finish: function(response, responseContent){\n if (response) {\n this.safeCall('onComplete', response, responseContent);\n }\n clearTimeout(this.stoTimeout);\n\n if (this.transport) {\n // IE6 sometimes barfs on this one\n try{ this.transport.onreadystatechange = null; } catch(e){}\n\n if (typeof this.transport.destroy === 'function') {\n // Stuff for Samsung.\n this.transport.destroy();\n }\n\n // Let XHR be collected.\n this.transport = null;\n }\n },\n\n /**\n * Safely calls a callback function.\n * Verifies that the callback is well defined and traps errors\n *\n * If you pass in an error as the second argument, it gets thrown if there is no default listener.\n *\n * @method safeCall\n * @param {Function} handlerName Name of the handler we wish to call\n * @param {Error} error This error gets reported to the console using Ink.error if there's no listener to `handlerName`.\n * @param {Mixed} [args...] Arguments to get passed to the `handlerName` handler.\n * @return {void}\n * @private\n */\n safeCall: function(handlerName /*[error or rest...]*/) {\n var error = arguments[1] instanceof Error ? arguments[1] : null;\n if (typeof this.options[handlerName] === 'function') {\n try {\n this.options[handlerName].apply(this, [].slice.call(arguments, 1));\n } catch(ex) {\n Ink.error('Ink.Net.Ajax: an error was raised while executing ' + handlerName + '.', ex);\n }\n } else if (error) {\n Ink.error('Ink.Net.Ajax: ' + error);\n }\n },\n\n /**\n * Sets a new request header for the next http request\n *\n * @method setRequestHeader\n * @param {String} name Header name.\n * @param {String} value New header value.\n * @return {void}\n * @public\n */\n setRequestHeader: function(name, value){\n if (!this.options.requestHeaders) {\n this.options.requestHeaders = {};\n }\n this.options.requestHeaders[name] = value;\n },\n\n /**\n * Executes the request\n *\n * @method request\n * @return {void}\n * @private\n */\n request: function()\n {\n if(this.transport) {\n var params = null;\n if(this.requestHasBody) {\n if(this.options.postBody !== null && this.options.postBody !== '') {\n params = this.options.postBody;\n this.setParams();\n } else if (this.options.parameters !== null && this.options.parameters !== ''){\n params = this.options.parameters;\n }\n\n if (typeof params === \"object\" && !params.nodeType) {\n params = this.paramsObjToStr(params);\n } else if (typeof params !== \"object\" && params !== null){\n params = '' + params;\n }\n\n if(this.options.contentType) {\n this.setRequestHeader('Content-Type', this.options.contentType);\n }\n } else {\n this.setParams();\n }\n\n var url = this.url;\n var method = this.options.method;\n var crossDomain = this.isCrossDomain;\n\n if (crossDomain && this.options.xhrProxy) {\n this.setRequestHeader('X-Url', url);\n url = this.options.xhrProxy + encodeURIComponent(url);\n crossDomain = false;\n }\n\n try {\n this.transport.open(method, url, this.options.asynchronous);\n } catch(e) {\n this.safeCall('onException', e);\n return this.finish(this.getResponse(), null);\n }\n\n this.setHeaders();\n\n this.safeCall('onCreate');\n\n if(this.options.timeout && !isNaN(this.options.timeout)) {\n this.stoTimeout = setTimeout(Ink.bind(function() {\n if(this.options.onTimeout) {\n this.safeCall('onTimeout');\n this.abort();\n }\n }, this), (this.options.timeout * 1000));\n }\n\n if(this.options.useCredentials && !this.usingXDomainReq) {\n this.transport.withCredentials = true;\n }\n\n if(this.options.asynchronous && !this.usingXDomainReq) {\n this.transport.onreadystatechange = Ink.bind(this.runStateChange, this);\n }\n else if (this.usingXDomainReq) {\n this.transport.onload = Ink.bind(this.runStateChange, this);\n }\n\n try {\n if (crossDomain) {\n // Need explicit handling because Mozila aborts\n // the script and Chrome fails silently.per the spec\n Ink.error('Ink.Net.Ajax: You are attempting to request a URL which is cross-domain from this one. To do this, you *must* enable the `cors` option!');\n return;\n } else {\n this.startTime = new Date().getTime();\n this.transport.send(params);\n }\n } catch(e) {\n this.safeCall('onException', e);\n return this.finish(this.getResponse(), null);\n }\n\n if(!this.options.asynchronous) {\n this.runStateChange();\n }\n }\n },\n\n /**\n * Checks if a given string is valid JSON\n *\n * @method isJSON\n * @param {String} str String to be evaluated\n * @return {Boolean} True if the string is valid JSON\n * @public\n */\n isJSON: function(str)\n {\n if (typeof str !== \"string\" || !str){ return false; }\n str = str.replace(/\\\\./g, '@').replace(/\"[^\"\\\\\\n\\r]*\"/g, '');\n return (/^[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]*$/).test(str);\n },\n\n /**\n * Evaluates a given string as JSON\n *\n * @method evalJSON\n * @param {String} strJSON String to be evaluated\n * @param {Boolean} sanitize Flag to sanitize the content\n * @return {Object} JSON content as an object\n * @public\n */\n evalJSON: function(strJSON, sanitize)\n {\n if (strJSON && (!sanitize || this.isJSON(strJSON))) {\n try {\n if (typeof JSON !== \"undefined\" && typeof JSON.parse !== 'undefined'){\n return JSON.parse(strJSON);\n }\n /*jshint evil:true */\n return eval('(' + strJSON + ')');\n } catch(e) {\n throw new Error('Ink.Net.Ajax: Bad JSON string. ' + e);\n }\n }\n return null;\n }\n };\n\n /**\n * Loads content from a given url through an XMLHttpRequest.\n *\n * Shortcut function for simple AJAX use cases. Works with JSON, XML and plain text.\n *\n * @method load\n * @param {String} url Request URL\n * @param {Function} callback Callback to be executed if the request is successful\n * @return {Object} XMLHttpRequest object\n * @public\n *\n * @sample Ink_Net_Ajax_load.html \n */\n Ajax.load = function(url, callback){\n var isCrossDomain = Ajax.prototype._locationIsCrossDomain(window.location, Ajax.prototype._locationFromURL(url));\n return new Ajax(url, {\n method: 'GET',\n cors: isCrossDomain,\n onSuccess: function(response){\n callback(response.responseJSON || response.responseText, response);\n }\n });\n };\n\n /**\n * Loads content from a given url through an XMLHttpRequest.\n * Shortcut function for simple AJAX use cases.\n *\n * @method ping\n * @param {String} url Request url\n * @param {Function} callback Callback to be executed if the request is successful\n * @public\n * @return {Object} XMLHttpRequest object\n */\n Ajax.ping = function(url, callback){\n var isCrossDomain = Ajax.prototype._locationIsCrossDomain(window.location, Ajax.prototype._locationFromURL(url));\n return new Ajax(url, {\n method: 'HEAD',\n cors: isCrossDomain,\n onSuccess: function(response){\n if (typeof callback === 'function'){\n callback(response);\n }\n }\n });\n };\n\n\n return Ajax;\n});\n","/**\n * Cross Browser JsonP requests\n * @module Ink.Net.JsonP_1\n * @version 1\n */\n\nInk.createModule('Ink.Net.JsonP', '1', [], function() {\n\n 'use strict';\n\n /**\n * Executes a JSONP request\n *\n * @class Ink.Net.JsonP\n * @constructor\n *\n * @param {String} uri Request URL\n * @param {Object} options Request options\n * @param {Function} options.onSuccess Success callback. Called with the JSONP response.\n * @param {Function} [options.onFailure] Failure callback. Called when there is a timeout.\n * @param {Object} [options.failureObj] Object to be passed as argument to failure callback\n * @param {Number} [options.timeout] Timeout for the request, in seconds. defaults to 10.\n * @param {Object} [options.params] Object with URL parameters.\n * @param {String} [options.callbackParam] URL parameter which gets the name of the JSONP function to call. defaults to 'jsoncallback'.\n * @param {String} [options.randVar] (Advanced, not recommended unless you know what you're doing) A string to append to the callback name. By default, generate a random number. Use an empty string if you already passed the correct name in the internalCallback option.\n * @param {String} [options.internalCallback] (Advanced) Name of the callback function stored in the Ink.Net.JsonP object (before it's prefixed).\n *\n * @sample Ink_Net_JsonP_1.html \n */\n var JsonP = function(uri, options) {\n this.init(uri, options);\n };\n\n JsonP.prototype = {\n\n init: function(uri, options) {\n this.options = Ink.extendObj( {\n onSuccess: undefined,\n onFailure: undefined,\n failureObj: {},\n timeout: 10,\n params: {},\n callbackParam: 'jsoncallback',\n internalCallback: '_cb',\n randVar: false\n }, options || {});\n\n if(this.options.randVar !== false) {\n this.randVar = this.options.randVar;\n } else {\n this.randVar = parseInt(Math.random() * 100000, 10);\n }\n\n this.options.internalCallback += this.randVar;\n\n this.uri = uri;\n\n // prevent SAPO legacy onComplete - make it onSuccess\n if(typeof(this.options.onComplete) === 'function') {\n this.options.onSuccess = this.options.onComplete;\n }\n\n if (typeof this.uri !== 'string') {\n throw new Error('Ink.Net.JsonP: Please define an URI');\n }\n\n if (typeof this.options.onSuccess !== 'function') {\n throw new Error('Ink.Net.JsonP: please define a callback function on option onSuccess!');\n }\n\n Ink.Net.JsonP[this.options.internalCallback] = Ink.bind(function() {\n this.options.onSuccess(arguments[0]);\n this._cleanUp();\n }, this);\n\n this.timeout = setTimeout(Ink.bind(function () {\n this.abort();\n if(typeof this.options.onFailure === 'function'){\n this.options.onFailure(this.options.failureObj);\n }\n }, this),\n this.options.timeout * 1000);\n\n this._addScriptTag();\n },\n\n /**\n * Abort the request, avoiding onSuccess or onFailure being called.\n * @method abort\n * @return {void}\n **/\n abort: function () {\n Ink.Net.JsonP[this.options.internalCallback] = Ink.bindMethod(this, '_cleanUp');\n },\n\n _addParamsToGet: function(uri, params) {\n var hasQuestionMark = uri.indexOf('?') !== -1;\n var sep, pKey, pValue, parts = [uri];\n\n for (pKey in params) {\n if (params.hasOwnProperty(pKey)) {\n if (!hasQuestionMark) { sep = '?'; hasQuestionMark = true; }\n else { sep = '&'; }\n pValue = params[pKey];\n if (typeof pValue !== 'number' && !pValue) { pValue = ''; }\n parts = parts.concat([sep, pKey, '=', encodeURIComponent(pValue)]);\n }\n }\n\n return parts.join('');\n },\n\n _getScriptContainer: function() {\n return document.body ||\n document.getElementsByTagName('body')[0] ||\n document.getElementsByTagName('head')[0] ||\n document.documentElement;\n },\n\n _addScriptTag: function() {\n // enrich options will callback and random seed\n this.options.params[this.options.callbackParam] = 'Ink.Net.JsonP.' + this.options.internalCallback;\n this.options.params.rnd_seed = this.randVar;\n this.uri = this._addParamsToGet(this.uri, this.options.params);\n // create script tag\n this._scriptEl = document.createElement('script');\n this._scriptEl.type = 'text/javascript';\n this._scriptEl.src = this.uri;\n var scriptCtn = this._getScriptContainer();\n scriptCtn.appendChild(this._scriptEl);\n },\n\n _cleanUp: function () {\n if (this.timeout) {\n window.clearTimeout(this.timeout);\n }\n delete this.options.onSuccess;\n delete this.options.onFailure;\n delete Ink.Net.JsonP[this.options.internalCallback];\n this._removeScriptTag();\n },\n\n _removeScriptTag: function() {\n if (!this._scriptEl) { return; /* already removed */ }\n this._scriptEl.parentNode.removeChild(this._scriptEl);\n delete this._scriptEl;\n }\n };\n\n return JsonP;\n\n});\n","/**\n * Browser Detection and User Agent sniffing\n * @module Ink.Dom.Browser_1\n * @version 1\n */\nInk.createModule('Ink.Dom.Browser', '1', [], function() {\n 'use strict'; \n\n /**\n * @namespace Ink.Dom.Browser\n * @version 1\n * @static\n * @example\n * \n */\n var Browser = {\n /**\n * True if the browser is Internet Explorer\n *\n * @property IE\n * @type {Boolean}\n * @public\n * @static\n */\n IE: false,\n\n /**\n * True if the browser is Gecko based\n *\n * @property GECKO\n * @type {Boolean}\n * @public\n * @static\n */\n GECKO: false,\n\n /**\n * True if the browser is Opera\n *\n * @property OPERA\n * @type {Boolean}\n * @public\n * @static\n */\n OPERA: false,\n\n /**\n * True if the browser is Safari\n *\n * @property SAFARI\n * @type {Boolean}\n * @public\n * @static\n */\n SAFARI: false,\n\n /**\n * True if the browser is Konqueror\n *\n * @property KONQUEROR\n * @type {Boolean}\n * @public\n * @static\n */\n KONQUEROR: false,\n\n /**\n * True if browser is Chrome\n *\n * @property CHROME\n * @type {Boolean}\n * @public\n * @static\n */\n CHROME: false,\n\n /**\n * The specific browser model.\n * False if it is unavailable.\n *\n * @property model\n * @type {Boolean|String}\n * @public\n * @static\n */\n model: false,\n\n /**\n * The browser version.\n * False if it is unavailable.\n *\n * @property version\n * @type {Boolean|String}\n * @public\n * @static\n */\n version: false,\n\n /**\n * The user agent string.\n * False if it is unavailable.\n *\n * @property userAgent\n * @type {Boolean|String}\n * @public\n * @static\n */\n userAgent: false,\n\n /**\n * The CSS prefix (-moz-, -webkit-, -ms-, ...)\n * False if it is unavailable \n *\n * @property cssPrefix \n * @type {Boolean|String}\n * @public \n * @static \n */\n cssPrefix: false, \n\n /**\n * The DOM prefix (Moz, Webkit, ms, ...)\n * False if it is unavailable \n * @property domPrefix \n * @type {Boolean|String}\n * @public \n * @static \n */\n domPrefix: false,\n\n /**\n * Initialization function for the Browser object.\n *\n * Is called automatically when this module is loaded, and calls setDimensions, setBrowser and setReferrer.\n *\n * @method init\n * @return {void}\n * @public\n */\n init: function() {\n this.detectBrowser();\n this.setDimensions();\n this.setReferrer();\n },\n\n /**\n * Retrieves and stores window dimensions in this object. Called automatically when this module is loaded.\n *\n * @method setDimensions\n * @return {void}\n * @public\n */\n setDimensions: function() {\n //this.windowWidth=window.innerWidth !== null? window.innerWidth : document.documentElement && document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body !== null ? document.body.clientWidth : null;\n //this.windowHeight=window.innerHeight != null? window.innerHeight : document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body != null? document.body.clientHeight : null;\n var myWidth = 0, myHeight = 0;\n if ( typeof window.innerWidth=== 'number' ) {\n myWidth = window.innerWidth;\n myHeight = window.innerHeight;\n } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {\n myWidth = document.documentElement.clientWidth;\n myHeight = document.documentElement.clientHeight;\n } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {\n myWidth = document.body.clientWidth;\n myHeight = document.body.clientHeight;\n }\n this.windowWidth = myWidth;\n this.windowHeight = myHeight;\n },\n\n /**\n * Stores the referrer. Called automatically when this module is loaded.\n *\n * @method setReferrer\n * @return {void}\n * @public\n */\n setReferrer: function() {\n if (document.referrer && document.referrer.length) {\n this.referrer = window.escape(document.referrer);\n } else {\n this.referrer = false;\n }\n },\n\n /**\n * Detects the browser and stores the found properties. Called automatically when this module is loaded.\n *\n * @method detectBrowser\n * @return {void}\n * @public\n */\n detectBrowser: function() {\n this._sniffUserAgent(navigator.userAgent);\n },\n\n _sniffUserAgent: function (sAgent) {\n this.userAgent = sAgent;\n\n sAgent = sAgent.toLowerCase();\n\n if (/applewebkit\\//.test(sAgent)) {\n this.cssPrefix = '-webkit-';\n this.domPrefix = 'Webkit';\n if(/(chrome|crios)\\//.test(sAgent)) {\n // Chrome\n this.CHROME = true;\n this.model = 'chrome';\n this.version = sAgent.replace(/(.*)chrome\\/([^\\s]+)(.*)/, \"$2\");\n } else {\n // Safari\n this.SAFARI = true;\n this.model = 'safari';\n var rVersion = /version\\/([^) ]+)/;\n if (rVersion.test(sAgent)) {\n this.version = sAgent.match(rVersion)[1];\n } else {\n this.version = sAgent.replace(/(.*)applewebkit\\/([^\\s]+)(.*)/, \"$2\");\n }\n }\n } else if (/opera/.test(sAgent)) {\n // Opera\n this.OPERA = true;\n this.model = 'opera';\n this.version = sAgent.replace(/(.*)opera.([^\\s$]+)(.*)/, \"$2\");\n this.cssPrefix = '-o-';\n this.domPrefix = 'O';\n } else if (/konqueror/.test(sAgent)) {\n // Konqueroh\n this.KONQUEROR = true;\n this.model = 'konqueror';\n this.version = sAgent.replace(/(.*)konqueror\\/([^;]+);(.*)/, \"$2\");\n this.cssPrefix = '-khtml-';\n this.domPrefix = 'Khtml';\n } else if (/(msie|trident)/i.test(sAgent)) {\n // MSIE\n this.IE = true;\n this.model = 'ie';\n if (/rv:((?:\\d|\\.)+)/.test(sAgent)) { // IE 11\n this.version = sAgent.match(/rv:((?:\\d|\\.)+)/)[1];\n } else {\n this.version = sAgent.replace(/(.*)\\smsie\\s([^;]+);(.*)/, \"$2\");\n }\n this.cssPrefix = '-ms-';\n this.domPrefix = 'ms';\n } else if (/gecko/.test(sAgent)) {\n // GECKO\n // Supports only:\n // Camino, Chimera, Epiphany, Minefield (firefox 3), Firefox, Firebird, Phoenix, Galeon,\n // Iceweasel, K-Meleon, SeaMonkey, Netscape, Songbird, Sylera,\n this.cssPrefix = '-moz-';\n this.domPrefix = 'Moz';\n\n this.GECKO = true;\n\n var re = /(camino|chimera|epiphany|minefield|firefox|firebird|phoenix|galeon|iceweasel|k\\-meleon|seamonkey|netscape|songbird|sylera)/;\n if(re.test(sAgent)) {\n this.model = sAgent.match(re)[1];\n this.version = sAgent.replace(new RegExp(\"(.*)\"+this.model+\"\\/([^;\\\\s$]+)(.*)\"), \"$2\");\n } else {\n // probably is mozilla\n this.model = 'mozilla';\n var reVersion = /(.*)rv:([^)]+)(.*)/;\n if(reVersion.test(sAgent)) {\n this.version = sAgent.replace(reVersion, \"$2\");\n }\n }\n }\n },\n\n /**\n * Debug function which displays browser (and Ink.Dom.Browser) information as an alert message.\n *\n * @method debug\n * @return {void}\n * @public\n * @sample Ink_Dom_Browser_1_debug.html\n */\n debug: function() {\n /*global alert:false */\n var str = \"known browsers: (ie, gecko, opera, safari, konqueror) \\n\";\n str += [this.IE, this.GECKO, this.OPERA, this.SAFARI, this.KONQUEROR] +\"\\n\";\n str += \"cssPrefix -> \"+this.cssPrefix+\"\\n\";\n str += \"domPrefix -> \"+this.domPrefix+\"\\n\";\n str += \"model -> \"+this.model+\"\\n\";\n str += \"version -> \"+this.version+\"\\n\";\n str += \"\\n\";\n str += \"original UA -> \"+this.userAgent;\n\n alert(str);\n }\n };\n\n Browser.init();\n\n return Browser;\n});\n","/**\n * CSS Utilities and toolbox\n * @module Ink.Dom.Css_1\n * @version 1\n */\n\nInk.createModule( 'Ink.Dom.Css', 1, [], function() {\n\n 'use strict';\n\n // getComputedStyle feature detection.\n var getCs = (\"defaultView\" in document) && (\"getComputedStyle\" in document.defaultView) ? document.defaultView.getComputedStyle : window.getComputedStyle;\n\n /**\n * @namespace Ink.Dom.Css\n * @static\n */\n\n var Css = {\n /**\n * Adds of removes a class.\n * Depending on addRemState, this method either adds a class if it's true or removes if if false.\n *\n * @method addRemoveClassName\n * @param {DOMElement|string} elm DOM element or element id\n * @param {string} className class name to add or remove.\n * @param {boolean} addRemState Whether to add or remove. `true` to add, `false` to remove.\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_addRemoveClassName.html \n */\n addRemoveClassName: function(elm, className, addRemState) {\n if (addRemState) {\n return this.addClassName(elm, className);\n }\n this.removeClassName(elm, className);\n },\n\n /**\n * Adds a class to a given element\n *\n * @method addClassName\n * @param {Element|String} elm Element or element id\n * @param {String|Array} className Class or classes to add. Examples: 'my-class', ['my-class', 'other-class'], 'my-class other-class'\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_addClassName.html\n */\n addClassName: function(elm, className) {\n elm = Ink.i(elm);\n if (!elm || !className) { return null; }\n className = ('' + className).split(/[, ]+/);\n var i = 0;\n var len = className.length;\n\n for (; i < len; i++) {\n // remove whitespace and ignore on empty string\n if (className[i].replace(/^\\s+|\\s+$/g, '')) {\n if (typeof elm.classList !== \"undefined\") {\n elm.classList.add(className[i]);\n } else if (!Css.hasClassName(elm, className[i])) {\n elm.className += (elm.className ? ' ' : '') + className[i];\n }\n }\n }\n },\n\n /**\n * Removes a class from a given element\n *\n * @method removeClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String|Array} className Class names to remove. You can either use a space separated string of classnames, comma-separated list or an array\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_removeClassName.html \n */\n removeClassName: function(elm, className) {\n elm = Ink.i(elm);\n if (!elm || !className) { return null; }\n \n className = ('' + className).split(/[, ]+/);\n var i = 0;\n var len = className.length;\n\n if (typeof elm.classList !== \"undefined\"){\n for (; i < len; i++) {\n elm.classList.remove(className[i]);\n }\n } else {\n var elmClassName = elm.className || '';\n var re;\n for (; i < len; i++) {\n re = new RegExp(\"(^|\\\\s+)\" + className[i] + \"(\\\\s+|$)\");\n elmClassName = elmClassName.replace(re, ' ');\n }\n elm.className = (elmClassName\n .replace(/^\\s+/, '')\n .replace(/\\s+$/, ''));\n }\n },\n\n /**\n * Alias to addRemoveClassName. \n * Utility function, saves many if/elses.\n *\n * @method setClassName\n * @uses addRemoveClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String|Array} className Class names to add\\remove. Comma separated, space separated or simply an Array\n * @param {Boolean} [add]=false Flag to switch behavior from removal to addition. true to add, false to remove\n * @return {void}\n * @public\n */\n setClassName: function(elm, className, add) {\n this.addRemoveClassName(elm, className, add || false);\n },\n\n /**\n * Checks if an element has a class.\n * This method verifies if an element has ONE of a list of classes. If the last argument is flagged as true, instead checks if the element has ALL the classes\n * \n * @method hasClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String|Array} className Class name(s) to test\n * @param {Boolean} [all=false] Irrelevant if only one `className` is passed. If `true`, check if the element contains ALL the CSS classes. If `false`, check whether the element contains ANY of the given classes.\n * @return {Boolean} `true` if a given class is applied to a given element, `false` if it isn't.\n * @public\n * @sample Ink_Dom_Css_hasClassName.html \n */\n hasClassName: function(elm, className, all) {\n elm = Ink.i(elm);\n if (!elm || !className) { return false; }\n\n className = ('' + className).split(/[, ]+/);\n var i = 0;\n var len = className.length;\n var has;\n var re;\n\n for ( ; i < len; i++) {\n if (typeof elm.classList !== \"undefined\"){\n has = elm.classList.contains(className[i]);\n } else {\n var elmClassName = elm.className;\n if (elmClassName === className[i]) {\n has = true;\n } else {\n re = new RegExp(\"(^|\\\\s)\" + className[i] + \"(\\\\s|$)\");\n has = re.test(elmClassName);\n }\n }\n if (has && !all) { return true; } // return if looking for any class\n if (!has && all) { return false; } // return if looking for all classes\n }\n\n if (all) {\n // if we got here, all classes were found so far\n return true;\n } else {\n // if we got here with all == false, no class was found\n return false;\n }\n },\n\n /**\n * Blinks a class from an element\n * Add and removes the class from the element with a timeout, so it blinks\n *\n * @method blinkClass\n * @uses addRemoveClassName\n * @param {Element|String} element DOM element or element id\n * @param {String|Array} className Class name(s) to blink\n * @param {Number} timeout timeout in ms between adding and removing, default 100 ms\n * @param {Boolean} negate is true, class is removed then added\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_blinkClass.html \n */\n blinkClass: function(element, className, timeout, negate){\n element = Ink.i(element);\n Css.addRemoveClassName(element, className, !negate);\n setTimeout(function() {\n Css.addRemoveClassName(element, className, negate);\n }, Number(timeout) || 100);\n },\n\n /**\n * Toggles a class name from a given element\n *\n * @method toggleClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} className Class name\n * @param {Boolean} [forceAdd] Flag to force adding the the classe names if they don't exist yet.\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_toggleClassName.html \n */\n toggleClassName: function(elm, className, forceAdd) {\n if (!elm || !className) { return false; }\n\n if (typeof forceAdd !== 'undefined') {\n return Css.addRemoveClassName(elm, className, forceAdd);\n } else if (typeof elm.classList !== \"undefined\" && !/[, ]/.test(className)) {\n elm = Ink.i(elm);\n if (elm !== null){\n elm.classList.toggle(className);\n }\n } else {\n if (Css.hasClassName(elm, className)) {\n Css.removeClassName(elm, className);\n } else {\n Css.addClassName(elm, className);\n }\n }\n },\n\n /**\n * Sets the opacity of given element \n *\n * @method setOpacity\n * @param {DOMElement|String} elm DOM element or element id\n * @param {Number} value allows 0 to 1(default mode decimal) or percentage (warning using 0 or 1 will reset to default mode)\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_setOpacity.html \n */\n setOpacity: function(elm, value) {\n elm = Ink.i(elm);\n if (elm !== null){\n var val = 1;\n\n if (!isNaN(Number(value))){\n if (value <= 0) { val = 0; }\n else if (value <= 1) { val = value; }\n else if (value <= 100) { val = value / 100; }\n else { val = 1; }\n }\n\n if (typeof elm.style.opacity !== 'undefined') {\n elm.style.opacity = val;\n }\n else {\n elm.style.filter = \"alpha(opacity:\"+(val*100|0)+\")\";\n }\n }\n },\n\n /**\n * Converts a css property name to a string in camelcase to be used with CSSStyleDeclaration.\n * @method _camelCase\n * @private\n * @param {String} str String to convert\n * @return {String} Converted string\n */\n _camelCase: function(str) {\n return str ? str.replace(/-(\\w)/g, function (_, $1) {\n return $1.toUpperCase();\n }) : str;\n },\n\n\n /**\n * Gets the value for an element's style attribute\n *\n * @method getStyle\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} style Which css attribute to fetch\n * @return {Mixed} Style value\n * @public\n * @sample Ink_Dom_Css_getStyle.html \n */\n getStyle: function(elm, style) {\n elm = Ink.i(elm);\n if (elm !== null && elm.style) {\n style = style === 'float' ? 'cssFloat': this._camelCase(style);\n\n var value = elm.style[style];\n\n if (getCs && (!value || value === 'auto')) {\n var css = getCs(elm, null);\n value = css ? css[style] : null;\n }\n else if (!value && elm.currentStyle) {\n value = elm.currentStyle[style];\n if (value === 'auto' && (style === 'width' || style === 'height')) {\n value = elm[\"offset\" + style.charAt(0).toUpperCase() + style.slice(1)] + \"px\";\n }\n }\n\n if (style === 'opacity') {\n return value ? parseFloat(value, 10) : 1.0;\n }\n else if (style === 'borderTopWidth' || style === 'borderBottomWidth' ||\n style === 'borderRightWidth' || style === 'borderLeftWidth' ) {\n if (value === 'thin') { return '1px'; }\n else if (value === 'medium') { return '3px'; }\n else if (value === 'thick') { return '5px'; }\n }\n\n return value === 'auto' ? null : value;\n }\n },\n\n\n /**\n * Adds CSS rules to an element's style attribute.\n *\n * @method setStyle\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} style Which css attribute to set\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_setStyle.html \n */\n setStyle: function(elm, style) {\n elm = Ink.i(elm);\n if (elm === null) { return; }\n if (typeof style === 'string') {\n elm.style.cssText += '; '+style;\n\n if (style.indexOf('opacity') !== -1) {\n this.setOpacity(elm, style.match(/opacity:\\s*(\\d?\\.?\\d*)/)[1]);\n }\n }\n else {\n for (var prop in style) {\n if (style.hasOwnProperty(prop)){\n if (prop === 'opacity') {\n this.setOpacity(elm, style[prop]);\n }\n else if (prop === 'float' || prop === 'cssFloat') {\n if (typeof elm.style.styleFloat === 'undefined') {\n elm.style.cssFloat = style[prop];\n }\n else {\n elm.style.styleFloat = style[prop];\n }\n } else {\n elm.style[prop] = style[prop];\n }\n }\n }\n }\n },\n\n\n /**\n * Shows an element.\n * Internally it unsets the display property of an element. You can force a specific display property using forceDisplayProperty\n *\n * @method show\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} [forceDisplayProperty] Css display property to apply on show\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_show.html \n */\n show: function(elm, forceDisplayProperty) {\n elm = Ink.i(elm);\n if (elm !== null) {\n elm.style.display = forceDisplayProperty || '';\n }\n },\n\n /**\n * Hides an element.\n *\n * @method hide\n * @param {DOMElement|String} elm DOM element or element id\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_hide.html \n */\n hide: function(elm) {\n elm = Ink.i(elm);\n if (elm !== null) {\n elm.style.display = 'none';\n }\n },\n\n /**\n * Shows or hides an element.\n * If the show parameter is true, it shows the element. Otherwise, hides it.\n *\n * @method showHide\n * @param {DOMElement|String} elm DOM element or element id\n * @param {boolean} [show]=false Whether to show or hide `elm`.\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_showHide.html \n */\n showHide: function(elm, show) {\n elm = Ink.i(elm);\n if (elm) {\n elm.style.display = show ? '' : 'none';\n }\n },\n\n /**\n * Toggles an element visibility.\n * \n * @method toggle\n * @param {DOMElement|String} elm DOM element or element id\n * @param {Boolean} forceShow Forces showing if element is hidden\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_toggle.html \n */\n toggle: function(elm, forceShow) {\n elm = Ink.i(elm);\n if (elm !== null) {\n if (typeof forceShow !== 'undefined') {\n if (forceShow === true) {\n this.show(elm);\n } else {\n this.hide(elm);\n }\n } else {\n if (this.getStyle(elm,'display').toLowerCase() === 'none') {\n this.show(elm);\n }\n else {\n this.hide(elm);\n }\n }\n }\n },\n\n _getRefTag: function(head){\n if (head.firstElementChild) {\n return head.firstElementChild;\n }\n\n for (var child = head.firstChild; child; child = child.nextSibling){\n if (child.nodeType === 1){\n return child;\n }\n }\n return null;\n },\n\n /**\n * Injects style tags with rules to the page.\n *\n * @method appendStyleTag\n * @param {String} selector The css selector for the rule\n * @param {String} style The content of the style rule\n * @param {Object} options Options for the tag\n * @param {String} [options.type]='text/css' File type\n * @param {Boolean} [options.force]=false If true, the style tag will be appended to end of head\n * @return {void}\n * @public\n * \n * @sample Ink_Dom_Css_appendStyleTag.html \n */\n appendStyleTag: function(selector, style, options){\n options = Ink.extendObj({\n type: 'text/css',\n force: false\n }, options || {});\n\n var styles = document.getElementsByTagName(\"style\"),\n oldStyle = false, setStyle = true, i, l;\n\n for (i=0, l=styles.length; i= 0) {\n setStyle = false;\n }\n }\n\n if (setStyle) {\n var defStyle = document.createElement(\"style\"),\n head = document.getElementsByTagName(\"head\")[0],\n refTag = false, styleStr = '';\n\n defStyle.type = options.type;\n\n styleStr += selector +\" {\";\n styleStr += style;\n styleStr += \"} \";\n\n if (typeof defStyle.styleSheet !== \"undefined\") {\n defStyle.styleSheet.cssText = styleStr;\n } else {\n defStyle.appendChild(document.createTextNode(styleStr));\n }\n\n if (options.force){\n head.appendChild(defStyle);\n } else {\n refTag = this._getRefTag(head);\n if (refTag){\n head.insertBefore(defStyle, refTag);\n }\n }\n }\n },\n\n /**\n * Injects an external link tag.\n * This method add a stylesheet to the head of a page\n *\n * @method appendStylesheet\n * @param {String} path File path\n * @param {Object} options Options for the tag\n * @param {String} [options.media='screen'] Media type\n * @param {String} [options.type='text/css'] File type\n * @param {Boolean} [options.force=false] If true, tag will be appended to end of head\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_appendStylesheet.html \n */\n appendStylesheet: function(path, options){\n options = Ink.extendObj({\n media: 'screen',\n type: 'text/css',\n force: false\n }, options || {});\n\n var refTag,\n style = document.createElement(\"link\"),\n head = document.getElementsByTagName(\"head\")[0];\n\n style.media = options.media;\n style.type = options.type;\n style.href = path;\n style.rel = \"Stylesheet\";\n\n if (options.force){\n head.appendChild(style);\n }\n else {\n refTag = this._getRefTag(head);\n if (refTag){\n head.insertBefore(style, refTag);\n }\n }\n },\n\n /**\n * Injects an external link tag.\n * Loads CSS via LINK element inclusion in HEAD (skips append if already there)\n *\n * Works similarly to appendStylesheet but:\n * supports optional callback which gets invoked once the CSS has been applied\n *\n * @method appendStylesheetCb\n * @param {String} cssURI URI of the CSS to load, if empty ignores and just calls back directly\n * @param {Function(cssURI)} [callback] optional callback which will be called once the CSS is loaded\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_appendStylesheetCb.html \n */\n _loadingCSSFiles: {},\n _loadedCSSFiles: {},\n appendStylesheetCb: function(url, callback) {\n if (!url) {\n return callback(url);\n }\n\n if (this._loadedCSSFiles[url]) {\n return callback(url);\n }\n\n var cbs = this._loadingCSSFiles[url];\n if (cbs) {\n return cbs.push(callback);\n }\n\n this._loadingCSSFiles[url] = [callback];\n\n var linkEl = document.createElement('link');\n linkEl.type = 'text/css';\n linkEl.rel = 'stylesheet';\n linkEl.href = url;\n\n var headEl = document.getElementsByTagName('head')[0];\n headEl.appendChild(linkEl);\n\n var imgEl = document.createElement('img');\n /*\n var _self = this;\n (function(_url) {\n imgEl.onerror = function() {\n //var url = this;\n var url = _url;\n _self._loadedCSSFiles[url] = true;\n var callbacks = _self._loadingCSSFiles[url];\n for (var i = 0, f = callbacks.length; i < f; ++i) {\n callbacks[i](url);\n }\n delete _self._loadingCSSFiles[url];\n };\n })(url);\n */\n imgEl.onerror = Ink.bindEvent(function(event, _url) {\n //var url = this;\n var url = _url;\n this._loadedCSSFiles[url] = true;\n var callbacks = this._loadingCSSFiles[url];\n for (var i = 0, f = callbacks.length; i < f; ++i) {\n callbacks[i](url);\n }\n delete this._loadingCSSFiles[url];\n }, this, url);\n imgEl.src = url;\n },\n\n /**\n * Converts decimal to hexadecimal values\n * Useful to convert colors to their hexadecimal representation.\n *\n * @method decToHex\n * @param {String} dec Either a single decimal value, an rgb(r, g, b) string or an Object with r, g and b properties\n * @return {String} Hexadecimal value\n * @sample Ink_Dom_Css_decToHex.html \n */\n decToHex: function(dec) {\n var normalizeTo2 = function(val) {\n if (val.length === 1) {\n val = '0' + val;\n }\n val = val.toUpperCase();\n return val;\n };\n\n if (typeof dec === 'object') {\n var rDec = normalizeTo2(parseInt(dec.r, 10).toString(16));\n var gDec = normalizeTo2(parseInt(dec.g, 10).toString(16));\n var bDec = normalizeTo2(parseInt(dec.b, 10).toString(16));\n return rDec+gDec+bDec;\n }\n else {\n dec += '';\n var rgb = dec.match(/\\((\\d+),\\s?(\\d+),\\s?(\\d+)\\)/);\n if (rgb !== null) {\n return normalizeTo2(parseInt(rgb[1], 10).toString(16)) +\n normalizeTo2(parseInt(rgb[2], 10).toString(16)) +\n normalizeTo2(parseInt(rgb[3], 10).toString(16));\n }\n else {\n return normalizeTo2(parseInt(dec, 10).toString(16));\n }\n }\n },\n\n /**\n * Converts hexadecimal values to decimal\n * Useful to use with CSS colors\n *\n * @method hexToDec\n * @param {String} hex hexadecimal Value with 6, 3, 2 or 1 characters\n * @return {Number} Object with properties r, g, b if length of number is >= 3 or decimal value instead.\n * @sample Ink_Dom_Css_hexToDec.html \n */\n hexToDec: function(hex){\n if (hex.indexOf('#') === 0) {\n hex = hex.substr(1);\n }\n if (hex.length === 6) { // will return object RGB\n return {\n r: parseInt(hex.substr(0,2), 16),\n g: parseInt(hex.substr(2,2), 16),\n b: parseInt(hex.substr(4,2), 16)\n };\n }\n else if (hex.length === 3) { // will return object RGB\n return {\n r: parseInt(hex.charAt(0) + hex.charAt(0), 16),\n g: parseInt(hex.charAt(1) + hex.charAt(1), 16),\n b: parseInt(hex.charAt(2) + hex.charAt(2), 16)\n };\n }\n else if (hex.length <= 2) { // will return int\n return parseInt(hex, 16);\n }\n },\n\n /**\n * Get a single property from a stylesheet.\n * Use this to obtain the value of a CSS property (searched from loaded CSS documents)\n *\n * @method getPropertyFromStylesheet\n * @param {String} selector a CSS rule. must be an exact match\n * @param {String} property a CSS property\n * @return {String} value of the found property, or null if it wasn't matched\n */\n getPropertyFromStylesheet: function(selector, property) {\n var rule = this.getRuleFromStylesheet(selector);\n if (rule) {\n return rule.style[property];\n }\n return null;\n },\n\n getPropertyFromStylesheet2: function(selector, property) {\n var rules = this.getRulesFromStylesheet(selector);\n /*\n rules.forEach(function(rule) {\n var x = rule.style[property];\n if (x !== null && x !== undefined) {\n return x;\n }\n });\n */\n var x;\n for(var i=0, t=rules.length; i < t; i++) {\n x = rules[i].style[property];\n if (x !== null && x !== undefined) {\n return x;\n }\n }\n return null;\n },\n\n getRuleFromStylesheet: function(selector) {\n var sheet, rules, ri, rf, rule;\n var s = document.styleSheets;\n if (!s) {\n return null;\n }\n\n for (var si = 0, sf = document.styleSheets.length; si < sf; ++si) {\n sheet = document.styleSheets[si];\n rules = sheet.rules ? sheet.rules : sheet.cssRules;\n if (!rules) { return null; }\n\n for (ri = 0, rf = rules.length; ri < rf; ++ri) {\n rule = rules[ri];\n if (!rule.selectorText) { continue; }\n if (rule.selectorText === selector) {\n return rule;\n }\n }\n }\n\n return null;\n },\n\n getRulesFromStylesheet: function(selector) {\n var res = [];\n var sheet, rules, ri, rf, rule;\n var s = document.styleSheets;\n if (!s) { return res; }\n\n for (var si = 0, sf = document.styleSheets.length; si < sf; ++si) {\n sheet = document.styleSheets[si];\n rules = sheet.rules ? sheet.rules : sheet.cssRules;\n if (!rules) {\n return null;\n }\n\n for (ri = 0, rf = rules.length; ri < rf; ++ri) {\n rule = rules[ri];\n if (!rule.selectorText) { continue; }\n if (rule.selectorText === selector) {\n res.push(rule);\n }\n }\n }\n\n return res;\n },\n\n getPropertiesFromRule: function(selector) {\n var rule = this.getRuleFromStylesheet(selector);\n var props = {};\n var prop, i, f;\n\n /*if (typeof rule.style.length === 'snumber') {\n for (i = 0, f = rule.style.length; i < f; ++i) {\n prop = this._camelCase( rule.style[i] );\n props[prop] = rule.style[prop];\n }\n }\n else { // HANDLES IE 8, FIREFOX RULE JOINING... */\n rule = rule.style.cssText;\n var parts = rule.split(';');\n var steps, val, pre, pos;\n for (i = 0, f = parts.length; i < f; ++i) {\n if (parts[i].charAt(0) === ' ') {\n parts[i] = parts[i].substring(1);\n }\n steps = parts[i].split(':');\n prop = this._camelCase( steps[0].toLowerCase() );\n val = steps[1];\n if (val) {\n val = val.substring(1);\n\n if (prop === 'padding' || prop === 'margin' || prop === 'borderWidth') {\n\n if (prop === 'borderWidth') { pre = 'border'; pos = 'Width'; }\n else { pre = prop; pos = ''; }\n\n if (val.indexOf(' ') !== -1) {\n val = val.split(' ');\n props[pre + 'Top' + pos] = val[0];\n props[pre + 'Bottom'+ pos] = val[0];\n props[pre + 'Left' + pos] = val[1];\n props[pre + 'Right' + pos] = val[1];\n }\n else {\n props[pre + 'Top' + pos] = val;\n props[pre + 'Bottom'+ pos] = val;\n props[pre + 'Left' + pos] = val;\n props[pre + 'Right' + pos] = val;\n }\n }\n else if (prop === 'borderRadius') {\n if (val.indexOf(' ') !== -1) {\n val = val.split(' ');\n props.borderTopLeftRadius = val[0];\n props.borderBottomRightRadius = val[0];\n props.borderTopRightRadius = val[1];\n props.borderBottomLeftRadius = val[1];\n }\n else {\n props.borderTopLeftRadius = val;\n props.borderTopRightRadius = val;\n props.borderBottomLeftRadius = val;\n props.borderBottomRightRadius = val;\n }\n }\n else {\n props[prop] = val;\n }\n }\n }\n //}\n //console.log(props);\n\n return props;\n },\n\n /**\n * Change the font size of elements.\n * Changes the font size of the elements which match the given CSS rule\n * For this function to work, the CSS file must be in the same domain than the host page, otherwise JS can't access it.\n *\n * @method changeFontSize\n * @param {String} selector CSS selector rule\n * @param {Number} delta Number of pixels to change on font-size\n * @param {String} [op] Supported operations are '+' and '*'. defaults to '+'\n * @param {Number} [minVal] If result gets smaller than minVal, change does not occurr\n * @param {Number} [maxVal] If result gets bigger than maxVal, change does not occurr\n * @return {void}\n * @public\n */\n changeFontSize: function(selector, delta, op, minVal, maxVal) {\n var that = this;\n Ink.requireModules(['Ink.Dom.Selector_1'], function(Selector) {\n var e;\n if (typeof selector !== 'string') { e = '1st argument must be a CSS selector rule.'; }\n else if (typeof delta !== 'number') { e = '2nd argument must be a number.'; }\n else if (op !== undefined && op !== '+' && op !== '*') { e = '3rd argument must be one of \"+\", \"*\".'; }\n else if (minVal !== undefined && (typeof minVal !== 'number' || minVal <= 0)) { e = '4th argument must be a positive number.'; }\n else if (maxVal !== undefined && (typeof maxVal !== 'number' || maxVal < maxVal)) { e = '5th argument must be a positive number greater than minValue.'; }\n if (e) { throw new TypeError(e); }\n\n var val, el, els = Selector.select(selector);\n if (minVal === undefined) { minVal = 1; }\n op = (op === '*') ? function(a,b){return a*b;} : function(a,b){return a+b;};\n for (var i = 0, f = els.length; i < f; ++i) {\n el = els[i];\n val = parseFloat( that.getStyle(el, 'fontSize'));\n val = op(val, delta);\n if (val < minVal) { continue; }\n if (typeof maxVal === 'number' && val > maxVal) { continue; }\n el.style.fontSize = val + 'px';\n }\n });\n }\n\n };\n\n return Css;\n\n});\n","/**\n * DOM Traversal and manipulation\n * @module Ink.Dom.Element_1\n * @version 1\n */\n\nInk.createModule('Ink.Dom.Element', 1, [], function() {\n\n 'use strict';\n\n var createContextualFragmentSupport = (\n typeof document.createRange === 'function' &&\n typeof window.Range.prototype.createContextualFragment === 'function');\n\n var deleteThisTbodyToken = 'Ink.Dom.Element tbody: ' + Math.random();\n var browserCreatesTbodies = (function () {\n var div = document.createElement('div');\n div.innerHTML = '';\n return div.getElementsByTagName('tbody').length !== 0;\n }());\n\n function rect(elem){\n var dimensions = {};\n try {\n dimensions = elem.getBoundingClientRect();\n } catch(e){\n dimensions = { top: elem.offsetTop, left: elem.offsetLeft };\n }\n return dimensions;\n }\n\n /**\n * @namespace Ink.Dom.Element_1\n */\n\n var InkElement = {\n\n /**\n * Checks if something is a DOM Element.\n *\n * @method isDOMElement\n * @static\n * @param {Mixed} o The object to be checked.\n * @return {Boolean} True if it's a valid DOM Element.\n * @public\n * @example\n * var el = Ink.s('#element');\n * if( InkElement.isDOMElement( el ) === true ){\n * // It is a DOM Element.\n * } else {\n * // It is NOT a DOM Element.\n * }\n */\n isDOMElement: function(o) {\n return o !== null && typeof o === 'object' && 'nodeType' in o && o.nodeType === 1;\n },\n\n /**\n * Shortcut for `document.getElementById`\n *\n * @method get\n * @param {String|DOMElement} elm Either an ID of an element, or an element.\n * @return {DOMElement|null} The DOM element with the given id or null when it was not found\n * @public\n * @sample Ink_Dom_Element_1_get.html\n */\n get: function(elm) {\n if(typeof elm !== 'undefined') {\n if(typeof elm === 'string') {\n return document.getElementById(elm);\n }\n return elm;\n }\n return null;\n },\n\n /**\n * Creates a DOM element.\n *\n * Just a shortcut for `document.createElement(tag)`, but with the second argument you can call additional functions present in Ink.Dom.Element.\n *\n * @method create\n * @param {String} tag Tag name\n * @param {Object} properties Object with properties to be set on the element. You can also call other functions in Ink.Dom.Element like this\n * @return {Element} The newly created element.\n * @public\n * @sample Ink_Dom_Element_1_create.html\n */\n create: function(tag, properties) {\n var el = document.createElement(tag);\n //Ink.extendObj(el, properties);\n if (properties) {\n for(var property in properties) {\n if(properties.hasOwnProperty(property)) {\n if (property in InkElement) {\n InkElement[property](el, properties[property]);\n } else {\n if(property === 'className' || property === 'class') {\n el.className = properties.className || properties['class'];\n } else {\n el.setAttribute(property, properties[property]);\n }\n }\n }\n }\n }\n return el;\n },\n\n /**\n * Removes a DOM Element\n *\n * @method remove\n * @param {Element} elm The element to remove\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_remove.html\n */\n remove: function(elm) {\n elm = Ink.i(elm);\n var parEl;\n if (elm && (parEl = elm.parentNode)) {\n parEl.removeChild(elm);\n }\n },\n\n /**\n * Scrolls the window to an element\n *\n * @method scrollTo\n * @param {DOMElement|String} elm Element where to scroll\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_scrollTo.html\n */\n scrollTo: function(elm) {\n elm = InkElement.get(elm);\n if(elm) {\n if (elm.scrollIntoView) {\n return elm.scrollIntoView();\n }\n\n var elmOffset = {},\n elmTop = 0, elmLeft = 0;\n\n do {\n elmTop += elm.offsetTop || 0;\n elmLeft += elm.offsetLeft || 0;\n\n elm = elm.offsetParent;\n } while(elm);\n\n elmOffset = {x: elmLeft, y: elmTop};\n\n window.scrollTo(elmOffset.x, elmOffset.y);\n }\n },\n\n /**\n * Gets the top offset of an element\n *\n * @method offsetTop\n * @uses Ink.Dom.Browser\n *\n * @param {DOMElement|String} elm Target element\n * @return {Number} Offset from the target element to the top of the document.\n * @public\n * @sample Ink_Dom_Element_1_offsetTop.html\n */\n offsetTop: function(elm) {\n return InkElement.offset(elm)[1];\n },\n\n /**\n * Gets the left offset of an element\n *\n * @method offsetLeft\n * @uses Ink.Dom.Browser\n *\n * @param {DOMElement|String} elm Target element\n * @return {Number} Offset from the target element to the left of the document\n * @public\n * @sample Ink_Dom_Element_1_offsetLeft.html\n */\n offsetLeft: function(elm) {\n return InkElement.offset(elm)[0];\n },\n\n /**\n * Gets the relative offset of an element\n *\n * @method positionedOffset\n * @param {Element|String} element Target element\n * @return {Array} Array with the element offsetleft and offsettop relative to the closest positioned ancestor\n * @public\n * @sample Ink_Dom_Element_1_positionedOffset.html\n */\n positionedOffset: function(element) {\n var valueTop = 0, valueLeft = 0;\n element = InkElement.get(element);\n do {\n valueTop += element.offsetTop || 0;\n valueLeft += element.offsetLeft || 0;\n element = element.offsetParent;\n if (element) {\n if (element.tagName.toLowerCase() === 'body') { break; }\n\n var value = element.style.position;\n if (!value && element.currentStyle) {\n value = element.currentStyle.position;\n }\n if ((!value || value === 'auto') && typeof getComputedStyle !== 'undefined') {\n var css = getComputedStyle(element, null);\n value = css ? css.position : null;\n }\n if (value === 'relative' || value === 'absolute') { break; }\n }\n } while (element);\n return [valueLeft, valueTop];\n },\n\n /**\n * Gets the cumulative offset for an element\n *\n * Returns the top left position of the element on the page\n *\n * @method offset\n * @uses Ink.Dom.Browser\n *\n * @method offset\n * @param {DOMElement|String} elm Target element\n * @return {[Number, Number]} Array with pixel distance from the target element to the top left corner of the document\n * @public\n * @sample Ink_Dom_Element_1_offset.html\n */\n offset: function(elm) {\n /*jshint boss:true */\n elm = Ink.i(elm);\n var res = [0, 0];\n var doc = elm.ownerDocument,\n docElem = doc.documentElement,\n box = rect(elm),\n body = doc.body,\n clientTop = docElem.clientTop || body.clientTop || 0,\n clientLeft = docElem.clientLeft || body.clientLeft || 0,\n scrollTop = doc.pageYOffset || docElem.scrollTop || body.scrollTop,\n scrollLeft = doc.pageXOffset || docElem.scrollLeft || body.scrollLeft,\n top = box.top + scrollTop - clientTop,\n left = box.left + scrollLeft - clientLeft;\n res = [left, top];\n return res;\n },\n\n /**\n * Gets the scroll of the element\n *\n * @method scroll\n * @param {DOMElement|String} [elm] Target element or document.body\n * @returns {Array} offset values for x and y scroll\n * @public\n * @sample Ink_Dom_Element_1_scroll.html\n */\n scroll: function(elm) {\n elm = elm ? Ink.i(elm) : document.body;\n return [\n ( ( !window.pageXOffset ) ? elm.scrollLeft : window.pageXOffset ),\n ( ( !window.pageYOffset ) ? elm.scrollTop : window.pageYOffset )\n ];\n },\n\n _getPropPx: function(cs, prop) {\n var n, c;\n var val = cs.getPropertyValue ? cs.getPropertyValue(prop) : cs[prop];\n if (!val) { n = 0; }\n else {\n c = val.indexOf('px');\n if (c === -1) { n = 0; }\n else {\n n = parseFloat(val, 10);\n }\n }\n\n //console.log([prop, ' \"', val, '\" ', n].join(''));\n\n return n;\n },\n\n /**\n * Alias for offset()\n *\n * @method offset2\n * @param {Element} el Element to be passed to `offset()`\n * @return {void}\n * @public\n * @deprecated Kept for historic reasons. Use offset() instead.\n */\n offset2: function(el) {\n return InkElement.offset(el);\n },\n\n /**\n * Checks if an element has an attribute\n *\n * @method hasAttribute\n * @param {Object} elm Target element\n * @param {String} attr Attribute name\n * @return {Boolean} Boolean based on existance of attribute\n * @sample Ink_Dom_Element_1_hasAttribute.html\n */\n hasAttribute: function(elm, attr){\n elm = Ink.i(elm);\n return elm.hasAttribute ? elm.hasAttribute(attr) : !!elm.getAttribute(attr);\n },\n /**\n * Inserts an element right after another\n *\n * @method insertAfter\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertAfter.html\n */\n insertAfter: function(newElm, targetElm) {\n /*jshint boss:true */\n if (targetElm = InkElement.get(targetElm)) {\n if (targetElm.nextSibling !== null) {\n targetElm.parentNode.insertBefore(newElm, targetElm.nextSibling);\n } else {\n targetElm.parentNode.appendChild(newElm);\n }\n }\n },\n\n /**\n * Inserts an element before another\n *\n * @method insertBefore\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertBefore.html\n */\n insertBefore: function (newElm, targetElm) {\n /*jshint boss:true */\n if ( (targetElm = InkElement.get(targetElm)) ) {\n targetElm.parentNode.insertBefore(newElm, targetElm);\n }\n },\n\n /**\n * Inserts an element as the first child of another\n *\n * @method insertTop\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertTop.html\n */\n insertTop: function(newElm,targetElm) {\n /*jshint boss:true */\n if (targetElm = InkElement.get(targetElm)) {\n if (targetElm.firstChild) {\n targetElm.insertBefore(newElm, targetElm.firstChild);\n } else {\n targetElm.appendChild(newElm);\n }\n }\n },\n\n /**\n * Inserts an element as the last child of another\n *\n * @method insertBottom\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertBottom.html\n */\n insertBottom: function(newElm, targetElm) {\n /*jshint boss:true */\n targetElm = Ink.i(targetElm);\n targetElm.appendChild(newElm);\n },\n\n /**\n * Retrieves textContent from node\n *\n * @method textContent\n * @param {DOMNode} node Where to retreive text from. Can be any node type.\n * @return {String} The text\n * @public\n * @sample Ink_Dom_Element_1_textContent.html\n */\n textContent: function(node){\n node = Ink.i(node);\n var text, k, cs, m;\n\n switch(node && node.nodeType) {\n case 9: /*DOCUMENT_NODE*/\n // IE quirks mode does not have documentElement\n return InkElement.textContent(node.documentElement || node.body && node.body.parentNode || node.body);\n\n case 1: /*ELEMENT_NODE*/\n text = ('textContent' in node) ? node.textContent : node.innerText;\n if (typeof text !== 'undefined') {\n return text;\n }\n /* falls through */\n case 11: /*DOCUMENT_FRAGMENT_NODE*/\n text = node.textContent;\n if (typeof text !== 'undefined') {\n return text;\n }\n\n if (node.firstChild === node.lastChild) {\n // Common case: 0 or 1 children\n return InkElement.textContent(node.firstChild);\n }\n\n text = [];\n cs = node.childNodes;\n for (k = 0, m = cs.length; k < m; ++k) {\n text.push( InkElement.textContent( cs[k] ) );\n }\n return text.join('');\n\n case 3: /*TEXT_NODE*/\n case 4: /*CDATA_SECTION_NODE*/\n return node.nodeValue;\n }\n return '';\n },\n\n /**\n * Replaces text content of a DOM Node\n * This method removes any child node previously present\n *\n * @method setTextContent\n * @param {Element} node Target node where the text will be added.\n * @param {String} text Text to be added on the node.\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_setTextContent.html\n */\n setTextContent: function(node, text){\n node = Ink.i(node);\n switch(node && node.nodeType)\n {\n case 1: /*ELEMENT_NODE*/\n if ('innerText' in node) {\n node.innerText = text;\n break;\n }\n /* falls through */\n case 11: /*DOCUMENT_FRAGMENT_NODE*/\n if ('textContent' in node) {\n node.textContent = text;\n break;\n }\n /* falls through */\n case 9: /*DOCUMENT_NODE*/\n while(node.firstChild) {\n node.removeChild(node.firstChild);\n }\n if (text !== '') {\n var doc = node.ownerDocument || node;\n node.appendChild(doc.createTextNode(text));\n }\n break;\n\n case 3: /*TEXT_NODE*/\n case 4: /*CDATA_SECTION_NODE*/\n node.nodeValue = text;\n break;\n }\n },\n\n /**\n * Checks if an element is a link\n *\n * @method isLink\n * @param {Element} element Element to check if it's a link.\n * @return {Boolean} Whether the element is a link.\n * @public\n * @sample Ink_Dom_Element_1_isLink.html\n */\n isLink: function(element){\n var b = element && element.nodeType === 1 && ((/^a|area$/i).test(element.tagName) ||\n element.hasAttributeNS && element.hasAttributeNS('http://www.w3.org/1999/xlink','href'));\n return !!b;\n },\n\n /**\n * Checks if a node is an ancestor of another\n *\n * @method isAncestorOf\n * @param {DOMNode} ancestor Ancestor node\n * @param {DOMNode} node Descendant node\n * @return {Boolean} Whether `ancestor` is an ancestor of `node`\n * @public\n * @sample Ink_Dom_Element_1_isAncestorOf.html\n */\n isAncestorOf: function(ancestor, node){\n /*jshint boss:true */\n if (!node || !ancestor) {\n return false;\n }\n if (node.compareDocumentPosition) {\n return (ancestor.compareDocumentPosition(node) & 0x10) !== 0;/*Node.DOCUMENT_POSITION_CONTAINED_BY*/\n }\n while (node = node.parentNode){\n if (node === ancestor){\n return true;\n }\n }\n return false;\n },\n\n /**\n * Checks if a node is descendant of another\n *\n * @method descendantOf\n * @param {DOMNode} node The ancestor\n * @param {DOMNode} descendant The descendant\n * @return {Boolean} `true` if 'descendant' is descendant of 'node'\n * @public\n * @sample Ink_Dom_Element_1_descendantOf.html\n */\n descendantOf: function(node, descendant){\n return node !== descendant && InkElement.isAncestorOf(node, descendant);\n },\n\n /**\n * Get first child element of another\n * @method firstElementChild\n * @param {DOMElement} elm Parent node\n * @return {DOMElement} the Element child\n * @public\n * @sample Ink_Dom_Element_1_firstElementChild.html\n */\n firstElementChild: function(elm){\n if(!elm) {\n return null;\n }\n if ('firstElementChild' in elm) {\n return elm.firstElementChild;\n }\n var child = elm.firstChild;\n while(child && child.nodeType !== 1) {\n child = child.nextSibling;\n }\n return child;\n },\n\n /**\n * Get the last child element of another\n * @method lastElementChild\n * @param {DOMElement} elm Parent node\n * @return {DOMElement} the Element child\n * @public\n * @sample Ink_Dom_Element_1_lastElementChild.html\n */\n lastElementChild: function(elm){\n if(!elm) {\n return null;\n }\n if ('lastElementChild' in elm) {\n return elm.lastElementChild;\n }\n var child = elm.lastChild;\n while(child && child.nodeType !== 1) {\n child = child.previousSibling;\n }\n return child;\n },\n\n /**\n * Get the first sibling element after the node\n *\n * @method nextElementSibling\n * @param {DOMNode} node The current node\n * @return {DOMElement|Null} The first sibling element after node or null if none is found\n * @public\n * @sample Ink_Dom_Element_1_nextElementSibling.html \n */\n nextElementSibling: function(node){\n var sibling = null;\n\n if(!node){ return sibling; }\n\n if(\"nextElementSibling\" in node){\n return node.nextElementSibling;\n } else {\n sibling = node.nextSibling;\n\n // 1 === Node.ELEMENT_NODE\n while(sibling && sibling.nodeType !== 1){\n sibling = sibling.nextSibling;\n }\n\n return sibling;\n }\n },\n\n /**\n * Get the first sibling element before the node\n *\n * @method previousElementSibling\n * @param {DOMNode} node The current node\n * @return {DOMElement|Null} The first element sibling before node or null if none is found\n * @public\n * @sample Ink_Dom_Element_1_previousElementSibling.html \n */\n previousElementSibling: function(node){\n var sibling = null;\n\n if(!node){ return sibling; }\n\n if(\"previousElementSibling\" in node){\n return node.previousElementSibling;\n } else {\n sibling = node.previousSibling;\n\n // 1 === Node.ELEMENT_NODE\n while(sibling && sibling.nodeType !== 1){\n sibling = sibling.previousSibling;\n }\n\n return sibling;\n }\n },\n\n /**\n * Get an element's width in pixels.\n *\n * @method elementWidth\n * @param {DOMElement|String} element Target DOM element or target ID\n * @return {Number} The element's width\n * @public\n * @sample Ink_Dom_Element_1_elementWidth.html \n */\n elementWidth: function(element) {\n if(typeof element === \"string\") {\n element = document.getElementById(element);\n }\n return element.offsetWidth;\n },\n\n /**\n * Get an element's height in pixels.\n *\n * @method elementHeight\n * @param {DOMElement|String} element DOM element or target ID\n * @return {Number} The element's height\n * @public\n * @sample Ink_Dom_Element_1_elementHeight.html \n */\n elementHeight: function(element) {\n if(typeof element === \"string\") {\n element = document.getElementById(element);\n }\n return element.offsetHeight;\n },\n\n /**\n * Deprecated. Alias for offsetLeft()\n *\n * @method elementLeft\n * @param {DOMElement|String} element DOM element or target ID\n * @return {Number} Element's left position\n */\n elementLeft: function(element) {\n return InkElement.offsetLeft(element);\n },\n\n /**\n * Deprecated. Alias for offsetTop()\n *\n * @method elementTop\n * @param {DOMElement|string} element Target DOM element or target ID\n * @return {Number} element's top position\n */\n elementTop: function(element) {\n return InkElement.offsetTop(element);\n },\n\n /**\n * Get an element's dimensions in pixels.\n *\n * @method elementDimensions\n * @param {DOMElement|string} element DOM element or target ID\n * @return {Array} Array with element's width and height\n * @sample Ink_Dom_Element_1_elementDimensions.html \n */\n elementDimensions: function(element) {\n element = Ink.i(element);\n return [element.offsetWidth, element.offsetHeight];\n },\n\n /**\n * Get the outer dimensions of an element in pixels.\n *\n * @method outerDimensions\n * @uses Ink.Dom.Css\n *\n * @param {DOMElement} element Target element\n * @return {Array} Array with element width and height.\n * @sample Ink_Dom_Element_1_outerDimensions.html \n */\n outerDimensions: function (element) {\n var bbox = rect(element);\n\n var Css = Ink.getModule('Ink.Dom.Css_1');\n var getStyle = Ink.bindMethod(Css, 'getStyle', element);\n\n return [\n bbox.right - bbox.left + parseFloat(getStyle('marginLeft') || 0) + parseFloat(getStyle('marginRight') || 0), // w\n bbox.bottom - bbox.top + parseFloat(getStyle('marginTop') || 0) + parseFloat(getStyle('marginBottom') || 0) // h\n ];\n },\n\n /**\n * Check if an element is inside the viewport\n *\n * @method inViewport\n * @param {DOMElement} element DOM Element\n * @param {Object} [options] Options object. If you pass a Boolean value here, it is interpreted as `options.partial`\n * @param {Boolean} [options.partial]=false Return `true` even if it is only partially visible.\n * @param {Number} [options.margin]=0 Consider a margin all around the viewport with `opts.margin` width a dead zone.\n * @return {Boolean} Whether the element is inside the viewport.\n * @public\n * @sample Ink_Dom_Element_1_inViewport.html \n */\n inViewport: function (element, options) {\n var dims = rect(Ink.i(element));\n if (typeof options === 'boolean') {\n options = {partial: options, margin: 0};\n }\n options = Ink.extendObj({ partial: false, margin: 0}, options || {});\n if (options.partial) {\n return dims.bottom + options.margin > 0 && // from the top\n dims.left - options.margin < InkElement.viewportWidth() && // from the right\n dims.top - options.margin < InkElement.viewportHeight() && // from the bottom\n dims.right + options.margin > 0; // from the left\n } else {\n return dims.top + options.margin > 0 && // from the top\n dims.right - options.margin < InkElement.viewportWidth() && // from the right\n dims.bottom - options.margin < InkElement.viewportHeight() && // from the bottom\n dims.left + options.margin > 0; // from the left\n }\n },\n\n /**\n * Check if an element is hidden.\n * Taken from Mootools Element extras ( https://gist.github.com/cheeaun/73342 )\n * Does not take into account visibility:hidden\n * @method isHidden\n * @param {DOMElement} element Element to check\n * @return {Boolean} Whether the element is hidden\n * @sample Ink_Dom_Element_1_isHidden.html \n */\n isHidden: function (element) {\n var w = element.offsetWidth, \n h = element.offsetHeight,\n force = (element.tagName.toLowerCase() === 'tr');\n\n var Css = Ink.getModule('Ink.Dom.Css_1');\n\n return (w===0 && h===0 && !force) ? true :\n (w!==0 && h!==0 && !force) ? false :\n Css.getStyle(element, 'display').toLowerCase() === 'none';\n },\n\n /**\n * Check if an element is visible \n *\n * @method isVisible\n * @uses isHidden\n * @param {DOMElement} element Element to check\n * @return {Boolean} Whether the element is visible\n * @sample Ink_Dom_Element_1_isVisible.html \n */\n isVisible: function (element) {\n return !this.isHidden(element);\n },\n\n /**\n * Clones an element's position to another\n *\n * @method clonePosition\n * @param {Element} cloneTo element to be position cloned\n * @param {Element} cloneFrom element to get the cloned position\n * @return {Element} The element with positionClone\n * @public\n * @sample Ink_Dom_Element_1_clonePosition.html \n */\n clonePosition: function(cloneTo, cloneFrom){\n var pos = InkElement.offset(cloneFrom);\n cloneTo.style.left = pos[0]+'px';\n cloneTo.style.top = pos[1]+'px';\n\n return cloneTo;\n },\n\n /**\n * Text-overflow: ellipsis emulation\n * Slices off a piece of text at the end of the element and adds the ellipsis so all text fits inside.\n *\n * @method ellipsizeText\n * @param {Element} element Element to modify text content\n * @param {String} [ellipsis='\\u2026'] String to append to the chopped text\n * @return {void}\n * @public\n */\n ellipsizeText: function(element/*, ellipsis*/){\n if ((element = Ink.i(element))) {\n element.style.overflow = 'hidden';\n element.style.whiteSpace = 'nowrap';\n element.style.textOverflow = 'ellipsis';\n }\n },\n\n /**\n * Finds the closest ancestor element matching your test function\n *\n * @method findUpwardsHaving\n * @param {Element} element Element to base the search from\n * @param {Function} boolTest Testing function\n * @return {Element|false} The matched element or false if did not match\n * @public\n * @sample Ink_Dom_Element_1_findUpwardsHaving.html \n */\n findUpwardsHaving: function(element, boolTest) {\n while (element && element.nodeType === 1) {\n if (boolTest(element)) {\n return element;\n }\n element = element.parentNode;\n }\n return false;\n },\n\n /**\n * Finds the closest ancestor by class name\n *\n * @method findUpwardsByClass\n * @uses findUpwardsHaving\n * @param {DOMElement} element Element to base the search from\n * @param {String} className Class name to search\n * @returns {DOMElement|false} The matched element or false if did not match\n * @public\n * @sample Ink_Dom_Element_1_findUpwardsByClass.html \n */\n findUpwardsByClass: function(element, className) {\n var re = new RegExp(\"(^|\\\\s)\" + className + \"(\\\\s|$)\");\n var tst = function(el) {\n var cls = el.className;\n return cls && re.test(cls);\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Finds the closest ancestor by tag name\n *\n * @method findUpwardsByTag\n * @param {DOMElement} element Element to base the search from\n * @param {String} tag Tag to search\n * @returns {DOMElement|false} the matched element or false if did not match\n * @sample Ink_Dom_Element_1_findUpwardsByTag.html \n */\n findUpwardsByTag: function(element, tag) {\n tag = tag.toUpperCase();\n var tst = function(el) {\n return el.nodeName && el.nodeName.toUpperCase() === tag;\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Finds the closest ancestor by id\n *\n * @method findUpwardsById\n * @param {HtmlElement} element Element to base the search from\n * @param {String} id ID to search\n * @returns {HtmlElement|false} The matched element or false if did not match\n * @sample Ink_Dom_Element_1_findUpwardsById.html \n */\n findUpwardsById: function(element, id) {\n var tst = function(el) {\n return el.id === id;\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Finds the closest ancestor by CSS selector\n *\n * @method findUpwardsBySelector\n * @param {HtmlElement} element Element to base the search from\n * @param {String} sel CSS selector\n * @returns {HtmlElement|false} The matched element or false if did not match\n * @sample Ink_Dom_Element_1_findUpwardsBySelector.html \n */\n findUpwardsBySelector: function(element, sel) {\n var Selector = Ink.getModule('Ink.Dom.Selector', '1');\n if (!Selector) {\n throw new Error('This method requires Ink.Dom.Selector');\n }\n var tst = function(el) {\n return Selector.matchesSelector(el, sel);\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Gets the trimmed text of an element\n *\n * @method getChildrenText\n * @param {DOMElement} el Element to base the search from\n * @param {Boolean} [removeIt] Flag to remove the text from the element\n * @return {String} Text found\n * @sample Ink_Dom_Element_1_getChildrenText.html \n */\n getChildrenText: function(el, removeIt) {\n var node,\n j,\n part,\n nodes = el.childNodes,\n jLen = nodes.length,\n text = '';\n\n if (!el) {\n return text;\n }\n\n for (j = 0; j < jLen; ++j) {\n node = nodes[j];\n if (!node) { continue; }\n if (node.nodeType === 3) { // TEXT NODE\n part = InkElement._trimString( String(node.data) );\n if (part.length > 0) {\n text += part;\n if (removeIt) { el.removeChild(node); }\n }\n else { el.removeChild(node); }\n }\n }\n\n return text;\n },\n\n /**\n * String trim implementation\n * Used by getChildrenText\n *\n * function _trimString\n * param {String} text\n * return {String} trimmed text\n */\n _trimString: function(text) {\n return (String.prototype.trim) ? text.trim() : text.replace(/^\\s*/, '').replace(/\\s*$/, '');\n },\n\n /**\n * Gets value of a select element\n *\n * @method getSelectValues\n * @param {DOMElement|String} select element\n * @return {Array} The selected values\n * @sample Ink_Dom_Element_1_getSelectValues.html \n */\n getSelectValues: function (select) {\n var selectEl = Ink.i(select);\n var values = [];\n for (var i = 0; i < selectEl.options.length; ++i) {\n values.push( selectEl.options[i].value );\n }\n return values;\n },\n\n\n /* used by fills */\n _normalizeData: function(data) {\n var d, data2 = [];\n for (var i = 0, f = data.length; i < f; ++i) {\n d = data[i];\n\n if (!(d instanceof Array)) { // if not array, wraps primitive twice: val -> [val, val]\n d = [d, d];\n }\n else if (d.length === 1) { // if 1 element array: [val] -> [val, val]\n d.push(d[0]);\n }\n data2.push(d);\n }\n return data2;\n },\n\n\n /**\n * Fills a select element with options\n *\n * @method fillSelect\n * @param {DOMElement|String} container Select element which will get filled\n * @param {Array} data Data to populate the component\n * @param {Boolean} [skipEmpty] Flag to skip empty option\n * @param {String|Number} [defaultValue] Initial selected value\n * @return {void}\n * @public\n *\n * @sample Ink_Dom_Element_1_fillSelect.html \n */\n fillSelect: function(container, data, skipEmpty, defaultValue) {\n var containerEl = Ink.i(container);\n if (!containerEl) { return; }\n\n containerEl.innerHTML = '';\n var d, optionEl;\n\n if (!skipEmpty) {\n // add initial empty option\n optionEl = document.createElement('option');\n optionEl.setAttribute('value', '');\n containerEl.appendChild(optionEl);\n }\n\n data = InkElement._normalizeData(data);\n\n for (var i = 0, f = data.length; i < f; ++i) {\n d = data[i];\n\n optionEl = document.createElement('option');\n optionEl.setAttribute('value', d[0]);\n if (d.length > 2) {\n optionEl.setAttribute('extra', d[2]);\n }\n optionEl.appendChild( document.createTextNode(d[1]) );\n\n if (d[0] === defaultValue) {\n optionEl.setAttribute('selected', 'selected');\n }\n\n containerEl.appendChild(optionEl);\n }\n },\n\n\n /**\n * Creates a set of radio buttons from an array of data\n *\n * @method fillRadios\n * @param {Element|String} insertAfterEl Element after which the input elements will be created\n * @param {String} name Name for the form field ([] is added if not present as a suffix)\n * @param {Array} data Data to populate the component\n * @param {Boolean} [skipEmpty] Flag to skip creation of empty options\n * @param {String|Number} [defaultValue] Initial selected value\n * @param {String} [splitEl] Name of element to add after each input element (example: 'br')\n * @return {DOMElement} Wrapper element around the radio buttons\n */\n fillRadios: function(insertAfterEl, name, data, skipEmpty, defaultValue, splitEl) {\n insertAfterEl = Ink.i(insertAfterEl);\n var containerEl = document.createElement('span');\n InkElement.insertAfter(containerEl, insertAfterEl);\n\n data = InkElement._normalizeData(data);\n\n /*\n if (name.substring(name.length - 1) !== ']') {\n name += '[]';\n }\n */\n\n var d, inputEl;\n\n if (!skipEmpty) {\n // add initial empty option\n inputEl = document.createElement('input');\n inputEl.setAttribute('type', 'radio');\n inputEl.setAttribute('name', name);\n inputEl.setAttribute('value', '');\n containerEl.appendChild(inputEl);\n if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); }\n }\n\n for (var i = 0; i < data.length; ++i) {\n d = data[i];\n\n inputEl = document.createElement('input');\n inputEl.setAttribute('type', 'radio');\n inputEl.setAttribute('name', name);\n inputEl.setAttribute('value', d[0]);\n containerEl.appendChild(inputEl);\n containerEl.appendChild( document.createTextNode(d[1]) );\n if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); }\n\n if (d[0] === defaultValue) {\n inputEl.checked = true;\n }\n }\n\n return containerEl;\n },\n\n\n /**\n * Creates set of checkbox buttons\n *\n * @method fillChecks\n * @param {Element|String} insertAfterEl Element after which the input elements will be created\n * @param {String} name Name for the form field ([] is added if not present as a suffix)\n * @param {Array} data Data to populate the component\n * @param {String|Number} [defaultValue] Initial selected value\n * @param {String} [splitEl] Name of element to add after each input element (example: 'br')\n * @return {Element} Wrapper element around the checkboxes\n * @public\n */\n fillChecks: function(insertAfterEl, name, data, defaultValue, splitEl) {\n insertAfterEl = Ink.i(insertAfterEl);\n var containerEl = document.createElement('span');\n InkElement.insertAfter(containerEl, insertAfterEl);\n\n data = InkElement._normalizeData(data);\n\n if (name.substring(name.length - 1) !== ']') {\n name += '[]';\n }\n\n var d, inputEl;\n\n for (var i = 0; i < data.length; ++i) {\n d = data[i];\n\n inputEl = document.createElement('input');\n inputEl.setAttribute('type', 'checkbox');\n inputEl.setAttribute('name', name);\n inputEl.setAttribute('value', d[0]);\n containerEl.appendChild(inputEl);\n containerEl.appendChild( document.createTextNode(d[1]) );\n if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); }\n\n if (d[0] === defaultValue) {\n inputEl.checked = true;\n }\n }\n\n return containerEl;\n },\n\n\n /**\n * Gets the index of an element relative to a parent\n *\n * @method parentIndexOf\n * @param {Element} [parentEl] childEl's parent. Deprecated.\n * @param {Element} childEl Child Element to look for\n * @return {Number} The index of the childEl inside parentEl. Returns -1 if it's not a direct child\n * @public\n * @sample Ink_Dom_Element_1_parentIndexOf.html \n */\n parentIndexOf: function(parentEl, childEl) {\n if (!childEl) {\n // one argument form\n childEl = parentEl;\n parentEl = parentEl.parentNode;\n }\n if (!parentEl) { return false; }\n for (var i = 0, f = parentEl.children.length; i < f; ++i) {\n if (parentEl.children[i] === childEl) {\n return i;\n }\n }\n return false;\n },\n\n\n /**\n * Gets the next siblings of an element\n *\n * @method nextSiblings\n * @param {String|DOMElement} elm Element\n * @return {Array} Array of next sibling elements\n * @sample Ink_Dom_Element_1_nextSiblings.html \n */\n nextSiblings: function(elm) {\n elm = Ink.i(elm);\n if(typeof(elm) === 'object' && elm !== null && elm.nodeType && elm.nodeType === 1) {\n var elements = [],\n siblings = elm.parentNode.children,\n index = InkElement.parentIndexOf(elm.parentNode, elm);\n\n for(var i = ++index, len = siblings.length; i\" + html + \"
              \" + deleteThisTbodyToken + \"
              \";\n } else {\n div.innerHTML = \"\" + html + \"
              \";\n }\n return div.firstChild;\n },\n TBODY: function (div, html) {\n div.innerHTML = '' + html + '
              ';\n return div.firstChild.getElementsByTagName('tbody')[0];\n },\n THEAD: function (div, html) {\n div.innerHTML = '' + html + '
              ';\n return div.firstChild.getElementsByTagName('thead')[0];\n },\n TFOOT: function (div, html) {\n div.innerHTML = '' + html + '
              ';\n return div.firstChild.getElementsByTagName('tfoot')[0];\n },\n TR: function (div, html) {\n div.innerHTML = '' + html + '
              ';\n return div.firstChild.firstChild.firstChild;\n }\n },\n\n /**\n * Gets a wrapper DIV with a certain HTML content to be inserted inside another element.\n * This is necessary for appendHTML,prependHTML functions, because they need a container element to copy the children from.\n *\n * Works around IE table quirks\n * @method _getWrapper\n * @private\n * @param elm\n * @param html\n */\n _getWrapper: function (elm, html) {\n var nodeName = elm.nodeName && elm.nodeName.toUpperCase();\n var wrapper = document.createElement('div');\n var wrapFunc = InkElement._wrapElements[nodeName];\n\n if ( !wrapFunc ) {\n wrapper.innerHTML = html;\n return wrapper;\n }\n // special cases\n wrapper = wrapFunc(wrapper, html);\n // worst case: tbody auto-creation even when our HTML has a tbody.\n if (browserCreatesTbodies && nodeName === 'TABLE') {\n // terrible case. Deal with tbody creation too.\n var tds = wrapper.getElementsByTagName('td');\n for (var i = 0, len = tds.length; i < len; i++) {\n if (tds[i].innerHTML === deleteThisTbodyToken) {\n var tbody = tds[i].parentNode.parentNode;\n tbody.parentNode.removeChild(tbody);\n }\n }\n }\n return wrapper;\n },\n\n /**\n * Appends HTML to an element.\n * This method parses the html string and doesn't modify its contents\n *\n * @method appendHTML\n * @param {String|DOMElement} elm Element\n * @param {String} html Markup string\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_appendHTML.html \n */\n appendHTML: function(elm, html){\n elm = Ink.i(elm);\n if(elm !== null) {\n var wrapper = InkElement._getWrapper(elm, html);\n while (wrapper.firstChild) {\n elm.appendChild(wrapper.firstChild);\n }\n }\n },\n\n /**\n * Prepends HTML to an element.\n * This method parses the html string and doesn't modify its contents\n *\n * @method prependHTML\n * @param {String|Element} elm Element\n * @param {String} html Markup string to prepend\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_prependHTML.html \n */\n prependHTML: function(elm, html){\n elm = Ink.i(elm);\n if(elm !== null) {\n var wrapper = InkElement._getWrapper(elm, html);\n while (wrapper.lastChild) {\n elm.insertBefore(wrapper.lastChild, elm.firstChild);\n }\n }\n },\n\n /**\n * Sets the inner HTML of an element.\n *\n * @method setHTML\n * @param {String|DOMElement} elm Element\n * @param {String} html Markup string\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_setHTML.html \n */\n setHTML: function (elm, html) {\n elm = Ink.i(elm);\n if(elm !== null) {\n try {\n elm.innerHTML = html;\n } catch (e) {\n // Tables in IE7\n while (elm.firstChild) {\n elm.removeChild(elm.firstChild);\n }\n InkElement.appendHTML(elm, html);\n }\n }\n },\n\n /**\n * Wraps an element inside a container.\n *\n * The container may or may not be in the document yet.\n *\n * @method wrap\n * @param {String|Element} target Element to be wrapped\n * @param {String|Element} container Element to wrap the target\n * @return {Element} Container element\n * @public\n * @sample Ink_Dom_Element_1_wrap.html \n *\n * @example\n * before:\n *\n *
              \n *\n * call this function to wrap #target with a wrapper div.\n *\n * InkElement.wrap('target', InkElement.create('div', {id: 'container'});\n * \n * after: \n *\n *
              \n */\n wrap: function (target, container) {\n target = Ink.i(target);\n container = Ink.i(container);\n \n var nextNode = target.nextSibling;\n var parent = target.parentNode;\n\n container.appendChild(target);\n\n if (nextNode !== null) {\n parent.insertBefore(container, nextNode);\n } else {\n parent.appendChild(container);\n }\n\n return container;\n },\n\n /**\n * Places an element outside a wrapper.\n *\n * @method unwrap\n * @param {DOMElement} elem The element you're trying to unwrap. This should be an ancestor of the wrapper.\n * @param {String} [wrapperSelector] CSS Selector for the ancestor. Use this if your wrapper is not the direct parent of elem.\n * @return {void}\n * @sample Ink_Dom_Element_1_unwrap.html \n *\n * @example\n *\n * When you have this:\n *\n *
              \n *
              \n *
              \n *\n * If you do this:\n *\n * InkElement.unwrap('unwrapMe');\n *\n * You get this:\n *\n *
              \n *
              \n * \n **/\n unwrap: function (elem, wrapperSelector) {\n elem = Ink.i(elem);\n var wrapper;\n if (typeof wrapperSelector === 'string') {\n wrapper = InkElement.findUpwardsBySelector(elem, wrapperSelector);\n } else if (typeof wrapperSelector === 'object' && wrapperSelector.tagName) {\n wrapper = InkElement.findUpwardsHaving(elem, function (ancestor) {\n return ancestor === wrapperSelector;\n });\n } else {\n wrapper = elem.parentNode;\n }\n if (!wrapper || !wrapper.parentNode) { return; }\n\n InkElement.insertBefore(elem, wrapper);\n },\n\n /**\n * Replaces an element with another.\n *\n * @method replace\n * @param {Element} element The element to be replaced.\n * @param {Element} replacement The new element.\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_replace.html \n *\n * @example\n * var newelement1 = InkElement.create('div');\n * // ...\n * replace(Ink.i('element1'), newelement1);\n */\n replace: function (element, replacement) {\n element = Ink.i(element);\n if(element !== null) {\n element.parentNode.replaceChild(replacement, element);\n }\n },\n\n /**\n * Removes direct text children.\n * Useful to remove nasty layout gaps generated by whitespace on the markup.\n *\n * @method removeTextNodeChildren\n * @param {Element} el Element to remove text from\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_removeTextNodeChildren.html \n */\n removeTextNodeChildren: function(el) {\n el = Ink.i(el);\n if(el !== null) {\n var prevEl, toRemove, parent = el;\n el = el.firstChild;\n while (el) {\n toRemove = (el.nodeType === 3);\n prevEl = el;\n el = el.nextSibling;\n if (toRemove) {\n parent.removeChild(prevEl);\n }\n }\n }\n },\n\n /**\n * Creates a documentFragment from an HTML string.\n *\n * @method htmlToFragment\n * @param {String} html HTML string\n * @return {DocumentFragment} DocumentFragment containing all of the elements from the html string\n * @sample Ink_Dom_Element_1_htmlToFragment.html \n */\n htmlToFragment: (createContextualFragmentSupport ?\n function(html){\n var range;\n\n if(typeof html !== 'string'){ return document.createDocumentFragment(); }\n\n range = document.createRange();\n\n // set the context to document.body (firefox does this already, webkit doesn't)\n range.selectNode(document.body);\n\n return range.createContextualFragment(html);\n } : function (html) {\n var fragment = document.createDocumentFragment(),\n tempElement,\n current;\n\n if(typeof html !== 'string'){ return fragment; }\n\n tempElement = document.createElement('div');\n tempElement.innerHTML = html;\n\n // append child removes elements from the original parent\n while( (current = tempElement.firstChild) ){ // intentional assignment\n fragment.appendChild(current);\n }\n\n return fragment;\n }),\n\n _camelCase: function(str)\n {\n return str ? str.replace(/-(\\w)/g, function (_, $1){\n return $1.toUpperCase();\n }) : str;\n },\n\n /**\n * Gets data attributes from an element\n *\n * @method data\n * @param {String|DOMElement} selector Element or CSS selector\n * @return {Object} Object with the data-* properties. If no data-attributes are present, an empty object is returned.\n * @sample Ink_Dom_Element_1_data.html \n */\n data: function(selector) {\n var el;\n if (typeof selector !== 'object' && typeof selector !== 'string') {\n throw '[Ink.Dom.Element.data] :: Invalid selector defined';\n }\n\n if (typeof selector === 'object') {\n el = selector;\n }\n else {\n var InkDomSelector = Ink.getModule('Ink.Dom.Selector', 1);\n if (!InkDomSelector) {\n throw \"[Ink.Dom.Element.data] :: this method requires Ink.Dom.Selector - v1\";\n }\n el = InkDomSelector.select(selector);\n if (el.length <= 0) {\n throw \"[Ink.Dom.Element.data] :: Can't find any element with the specified selector\";\n }\n el = el[0];\n }\n\n var dataset = {};\n var attrs = el.attributes || [];\n\n var curAttr, curAttrName, curAttrValue;\n if (attrs) {\n for (var i = 0, total = attrs.length; i < total; ++i) {\n curAttr = attrs[i];\n curAttrName = curAttr.name;\n curAttrValue = curAttr.value;\n if (curAttrName && curAttrName.indexOf('data-') === 0) {\n dataset[InkElement._camelCase(curAttrName.replace('data-', ''))] = curAttrValue;\n }\n }\n }\n\n return dataset;\n },\n\n /**\n * Move the cursor on an input or textarea element.\n * @method moveCursorTo\n * @param {Element} el Input or Textarea element\n * @param {Number} t Index of the character to move the cursor to\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_moveCursorTo.html \n */\n moveCursorTo: function(el, t) {\n el = Ink.i(el);\n if(el !== null) {\n if (el.setSelectionRange) {\n el.setSelectionRange(t, t);\n //el.focus();\n }\n else {\n var range = el.createTextRange();\n range.collapse(true);\n range.moveEnd( 'character', t);\n range.moveStart('character', t);\n range.select();\n }\n }\n },\n\n /**\n * Get the page's width.\n * @method pageWidth\n * @return {Number} Page width in pixels\n * @sample Ink_Dom_Element_1_pageWidth.html \n */\n pageWidth: function() {\n var xScroll;\n\n if (window.innerWidth && window.scrollMaxX) {\n xScroll = window.innerWidth + window.scrollMaxX;\n } else if (document.body.scrollWidth > document.body.offsetWidth){\n xScroll = document.body.scrollWidth;\n } else {\n xScroll = document.body.offsetWidth;\n }\n\n var windowWidth;\n\n if (window.self.innerWidth) {\n if(document.documentElement.clientWidth){\n windowWidth = document.documentElement.clientWidth;\n } else {\n windowWidth = window.self.innerWidth;\n }\n } else if (document.documentElement && document.documentElement.clientWidth) {\n windowWidth = document.documentElement.clientWidth;\n } else if (document.body) {\n windowWidth = document.body.clientWidth;\n }\n\n if(xScroll < windowWidth){\n return xScroll;\n } else {\n return windowWidth;\n }\n },\n\n /**\n * Get the page's height.\n * @method pageHeight\n * @return {Number} Page height in pixels\n * @sample Ink_Dom_Element_1_pageHeight.html \n */\n pageHeight: function() {\n var yScroll;\n\n if (window.innerHeight && window.scrollMaxY) {\n yScroll = window.innerHeight + window.scrollMaxY;\n } else if (document.body.scrollHeight > document.body.offsetHeight){\n yScroll = document.body.scrollHeight;\n } else {\n yScroll = document.body.offsetHeight;\n }\n\n var windowHeight;\n\n if (window.self.innerHeight) {\n windowHeight = window.self.innerHeight;\n } else if (document.documentElement && document.documentElement.clientHeight) {\n windowHeight = document.documentElement.clientHeight;\n } else if (document.body) {\n windowHeight = document.body.clientHeight;\n }\n\n if(yScroll < windowHeight){\n return windowHeight;\n } else {\n return yScroll;\n }\n },\n\n /**\n * Get the viewport's width.\n * @method viewportWidth\n * @return {Number} Viewport width in pixels\n * @sample Ink_Dom_Element_1_viewportWidth.html \n */\n viewportWidth: function() {\n if(typeof window.innerWidth !== \"undefined\") {\n return window.innerWidth;\n }\n if (document.documentElement && typeof document.documentElement.offsetWidth !== \"undefined\") {\n return document.documentElement.offsetWidth;\n }\n },\n\n /**\n * Get the viewport's height.\n * @method viewportHeight\n * @return {Number} Viewport height in pixels\n * @sample Ink_Dom_Element_1_viewportHeight.html \n */\n viewportHeight: function() {\n if (typeof window.innerHeight !== \"undefined\") {\n return window.innerHeight;\n }\n if (document.documentElement && typeof document.documentElement.offsetHeight !== \"undefined\") {\n return document.documentElement.offsetHeight;\n }\n },\n\n /**\n * Get the scroll's width.\n * @method scrollWidth\n * @return {Number} Scroll width\n */\n scrollWidth: function() {\n if (typeof window.self.pageXOffset !== 'undefined') {\n return window.self.pageXOffset;\n }\n if (typeof document.documentElement !== 'undefined' && typeof document.documentElement.scrollLeft !== 'undefined') {\n return document.documentElement.scrollLeft;\n }\n return document.body.scrollLeft;\n },\n\n /**\n * Get the scroll's height.\n * @method scrollHeight\n * @return {Number} Scroll height\n */\n scrollHeight: function() {\n if (typeof window.self.pageYOffset !== 'undefined') {\n return window.self.pageYOffset;\n }\n if (typeof document.documentElement !== 'undefined' && typeof document.documentElement.scrollTop !== 'undefined') {\n return document.documentElement.scrollTop;\n }\n return document.body.scrollTop;\n }\n };\n\n return InkElement;\n\n});\n","/**\n * Event management\n * @module Ink.Dom.Event_1\n * @version 1\n */\n\nInk.createModule('Ink.Dom.Event', 1, [], function() {\n /* jshint\n asi:true,\n strict:false,\n laxcomma:true,\n eqeqeq:false,\n laxbreak:true,\n boss:true,\n curly:false,\n expr:true\n */\n\n /**\n * @namespace Ink.Dom.Event_1\n * @static\n */\n\n /*!\n * Bean - copyright (c) Jacob Thornton 2011-2012\n * https://github.com/fat/bean\n * MIT license\n */\n var bean = (function (name, context, definition) {\n return definition()\n })('bean', this, function (name, context) {\n name = name || 'bean'\n context = context || this\n\n var win = window\n , old = context[name]\n , namespaceRegex = /[^\\.]*(?=\\..*)\\.|.*/\n , nameRegex = /\\..*/\n , addEvent = 'addEventListener'\n , removeEvent = 'removeEventListener'\n , doc = document || {}\n , root = doc.documentElement || {}\n , W3C_MODEL = root[addEvent]\n , eventSupport = W3C_MODEL ? addEvent : 'attachEvent'\n , ONE = {} // singleton for quick matching making add() do one()\n\n , slice = Array.prototype.slice\n , str2arr = function (s, d) { return s.split(d || ' ') }\n , isString = function (o) { return typeof o == 'string' }\n , isFunction = function (o) { return typeof o == 'function' }\n\n // events that we consider to be 'native', anything not in this list will\n // be treated as a custom event\n , standardNativeEvents =\n 'click dblclick mouseup mousedown contextmenu ' + // mouse buttons\n 'mousewheel mousemultiwheel DOMMouseScroll ' + // mouse wheel\n 'mouseover mouseout mousemove selectstart selectend ' + // mouse movement\n 'keydown keypress keyup ' + // keyboard\n 'orientationchange ' + // mobile\n 'focus blur change reset select submit ' + // form elements\n 'load unload beforeunload resize move DOMContentLoaded ' + // window\n 'readystatechange message ' + // window\n 'error abort scroll ' // misc\n // element.fireEvent('onXYZ'... is not forgiving if we try to fire an event\n // that doesn't actually exist, so make sure we only do these on newer browsers\n , w3cNativeEvents =\n 'show ' + // mouse buttons\n 'input invalid ' + // form elements\n 'touchstart touchmove touchend touchcancel ' + // touch\n 'gesturestart gesturechange gestureend ' + // gesture\n 'textinput' + // TextEvent\n 'readystatechange pageshow pagehide popstate ' + // window\n 'hashchange offline online ' + // window\n 'afterprint beforeprint ' + // printing\n 'dragstart dragenter dragover dragleave drag drop dragend ' + // dnd\n 'loadstart progress suspend emptied stalled loadmetadata ' + // media\n 'loadeddata canplay canplaythrough playing waiting seeking ' + // media\n 'seeked ended durationchange timeupdate play pause ratechange ' + // media\n 'volumechange cuechange ' + // media\n 'checking noupdate downloading cached updateready obsolete ' // appcache\n\n // convert to a hash for quick lookups\n , nativeEvents = (function (hash, events, i) {\n for (i = 0; i < events.length; i++) events[i] && (hash[events[i]] = 1)\n return hash\n }({}, str2arr(standardNativeEvents + (W3C_MODEL ? w3cNativeEvents : ''))))\n\n // custom events are events that we *fake*, they are not provided natively but\n // we can use native events to generate them\n , customEvents = (function () {\n var isAncestor = 'compareDocumentPosition' in root\n ? function (element, container) {\n return container.compareDocumentPosition && (container.compareDocumentPosition(element) & 16) === 16\n }\n : 'contains' in root\n ? function (element, container) {\n container = container.nodeType === 9 || container === window ? root : container\n return container !== element && container.contains(element)\n }\n : function (element, container) {\n while (element = element.parentNode) if (element === container) return 1\n return 0\n }\n , check = function (event) {\n var related = event.relatedTarget\n return !related\n ? related == null\n : (related !== this && related.prefix !== 'xul' && !/document/.test(this.toString())\n && !isAncestor(related, this))\n }\n\n return {\n mouseenter: { base: 'mouseover', condition: check }\n , mouseleave: { base: 'mouseout', condition: check }\n , mousewheel: { base: /Firefox/.test(navigator.userAgent) ? 'DOMMouseScroll' : 'mousewheel' }\n }\n }())\n\n // we provide a consistent Event object across browsers by taking the actual DOM\n // event object and generating a new one from its properties.\n , Event = (function () {\n // a whitelist of properties (for different event types) tells us what to check for and copy\n var commonProps = str2arr('altKey attrChange attrName bubbles cancelable ctrlKey currentTarget ' +\n 'detail eventPhase getModifierState isTrusted metaKey relatedNode relatedTarget shiftKey ' +\n 'srcElement target timeStamp type view which propertyName path')\n , mouseProps = commonProps.concat(str2arr('button buttons clientX clientY dataTransfer ' +\n 'fromElement offsetX offsetY pageX pageY screenX screenY toElement movementX movementY region'))\n , mouseWheelProps = mouseProps.concat(str2arr('wheelDelta wheelDeltaX wheelDeltaY wheelDeltaZ ' +\n 'axis')) // 'axis' is FF specific\n , keyProps = commonProps.concat(str2arr('char charCode key keyCode keyIdentifier ' +\n 'keyLocation location isComposing code'))\n , textProps = commonProps.concat(str2arr('data'))\n , touchProps = commonProps.concat(str2arr('touches targetTouches changedTouches scale rotation'))\n , messageProps = commonProps.concat(str2arr('data origin source'))\n , stateProps = commonProps.concat(str2arr('state'))\n , overOutRegex = /over|out/\n // some event types need special handling and some need special properties, do that all here\n , typeFixers = [\n { // key events\n reg: /key/i\n , fix: function (event, newEvent) {\n newEvent.keyCode = event.keyCode || event.which\n return keyProps\n }\n }\n , { // mouse events\n reg: /click|mouse(?!(.*wheel|scroll))|menu|drag|drop/i\n , fix: function (event, newEvent, type) {\n newEvent.rightClick = event.which === 3 || event.button === 2\n newEvent.pos = { x: 0, y: 0 }\n if (event.pageX || event.pageY) {\n newEvent.clientX = event.pageX\n newEvent.clientY = event.pageY\n } else if (event.clientX || event.clientY) {\n newEvent.clientX = event.clientX + doc.body.scrollLeft + root.scrollLeft\n newEvent.clientY = event.clientY + doc.body.scrollTop + root.scrollTop\n }\n if (overOutRegex.test(type)) {\n newEvent.relatedTarget = event.relatedTarget\n || event[(type == 'mouseover' ? 'from' : 'to') + 'Element']\n }\n return mouseProps\n }\n }\n , { // mouse wheel events\n reg: /mouse.*(wheel|scroll)/i\n , fix: function () { return mouseWheelProps }\n }\n , { // TextEvent\n reg: /^text/i\n , fix: function () { return textProps }\n }\n , { // touch and gesture events\n reg: /^touch|^gesture/i\n , fix: function () { return touchProps }\n }\n , { // message events\n reg: /^message$/i\n , fix: function () { return messageProps }\n }\n , { // popstate events\n reg: /^popstate$/i\n , fix: function () { return stateProps }\n }\n , { // everything else\n reg: /.*/\n , fix: function () { return commonProps }\n }\n ]\n , typeFixerMap = {} // used to map event types to fixer functions (above), a basic cache mechanism\n\n , Event = function (event, element, isNative) {\n if (!arguments.length) return\n event = event || ((element.ownerDocument || element.document || element).parentWindow || win).event\n this.originalEvent = event\n this.isNative = isNative\n this.isBean = true\n\n if (!event) return\n\n var type = event.type\n , target = event.target || event.srcElement\n , i, l, p, props, fixer\n\n this.target = target && target.nodeType === 3 ? target.parentNode : target\n\n if (isNative) { // we only need basic augmentation on custom events, the rest expensive & pointless\n fixer = typeFixerMap[type]\n if (!fixer) { // haven't encountered this event type before, map a fixer function for it\n for (i = 0, l = typeFixers.length; i < l; i++) {\n if (typeFixers[i].reg.test(type)) { // guaranteed to match at least one, last is .*\n typeFixerMap[type] = fixer = typeFixers[i].fix\n break\n }\n }\n }\n\n props = fixer(event, this, type)\n for (i = props.length; i--;) {\n if (!((p = props[i]) in this) && p in event) this[p] = event[p]\n }\n }\n }\n\n // preventDefault() and stopPropagation() are a consistent interface to those functions\n // on the DOM, stop() is an alias for both of them together\n Event.prototype.preventDefault = function () {\n if (this.originalEvent.preventDefault) this.originalEvent.preventDefault()\n else this.originalEvent.returnValue = false\n }\n Event.prototype.stopPropagation = function () {\n if (this.originalEvent.stopPropagation) this.originalEvent.stopPropagation()\n else this.originalEvent.cancelBubble = true\n }\n Event.prototype.stop = function () {\n this.preventDefault()\n this.stopPropagation()\n this.stopped = true\n }\n // stopImmediatePropagation() has to be handled internally because we manage the event list for\n // each element\n // note that originalElement may be a Bean#Event object in some situations\n Event.prototype.stopImmediatePropagation = function () {\n if (this.originalEvent.stopImmediatePropagation) this.originalEvent.stopImmediatePropagation()\n this.isImmediatePropagationStopped = function () { return true }\n }\n Event.prototype.isImmediatePropagationStopped = function () {\n return this.originalEvent.isImmediatePropagationStopped && this.originalEvent.isImmediatePropagationStopped()\n }\n Event.prototype.clone = function (currentTarget) {\n //TODO: this is ripe for optimisation, new events are *expensive*\n // improving this will speed up delegated events\n var ne = new Event(this, this.element, this.isNative)\n ne.currentTarget = currentTarget\n return ne\n }\n\n return Event\n }())\n\n // if we're in old IE we can't do onpropertychange on doc or win so we use doc.documentElement for both\n , targetElement = function (element, isNative) {\n return !W3C_MODEL && !isNative && (element === doc || element === win) ? root : element\n }\n\n /**\n * Bean maintains an internal registry for event listeners. We don't touch elements, objects\n * or functions to identify them, instead we store everything in the registry.\n * Each event listener has a RegEntry object, we have one 'registry' for the whole instance.\n */\n , RegEntry = (function () {\n // each handler is wrapped so we can handle delegation and custom events\n var wrappedHandler = function (element, fn, condition, args) {\n var call = function (event, eargs) {\n return fn.apply(element, args ? slice.call(eargs, event ? 0 : 1).concat(args) : eargs)\n }\n , findTarget = function (event, eventElement) {\n return fn.__beanDel ? fn.__beanDel.ft(event.target, element) : eventElement\n }\n , handler = condition\n ? function (event) {\n var target = findTarget(event, this) // deleated event\n if (condition.apply(target, arguments)) {\n if (event) event.currentTarget = target\n return call(event, arguments)\n }\n }\n : function (event) {\n if (fn.__beanDel) event = event.clone(findTarget(event)) // delegated event, fix the fix\n return call(event, arguments)\n }\n handler.__beanDel = fn.__beanDel\n return handler\n }\n\n , RegEntry = function (element, type, handler, original, namespaces, args, root) {\n var customType = customEvents[type]\n , isNative\n\n if (type == 'unload') {\n // self clean-up\n handler = once(removeListener, element, type, handler, original)\n }\n\n if (customType) {\n if (customType.condition) {\n handler = wrappedHandler(element, handler, customType.condition, args)\n }\n type = customType.base || type\n }\n\n this.isNative = isNative = nativeEvents[type] && !!element[eventSupport]\n this.customType = !W3C_MODEL && !isNative && type\n this.element = element\n this.type = type\n this.original = original\n this.namespaces = namespaces\n this.eventType = W3C_MODEL || isNative ? type : 'propertychange'\n this.target = targetElement(element, isNative)\n this[eventSupport] = !!this.target[eventSupport]\n this.root = root\n this.handler = wrappedHandler(element, handler, null, args)\n }\n\n // given a list of namespaces, is our entry in any of them?\n RegEntry.prototype.inNamespaces = function (checkNamespaces) {\n var i, j, c = 0\n if (!checkNamespaces) return true\n if (!this.namespaces) return false\n for (i = checkNamespaces.length; i--;) {\n for (j = this.namespaces.length; j--;) {\n if (checkNamespaces[i] == this.namespaces[j]) c++\n }\n }\n return checkNamespaces.length === c\n }\n\n // match by element, original fn (opt), handler fn (opt)\n RegEntry.prototype.matches = function (checkElement, checkOriginal, checkHandler) {\n return this.element === checkElement &&\n (!checkOriginal || this.original === checkOriginal) &&\n (!checkHandler || this.handler === checkHandler)\n }\n\n return RegEntry\n }())\n\n , registry = (function () {\n // our map stores arrays by event type, just because it's better than storing\n // everything in a single array.\n // uses '$' as a prefix for the keys for safety and 'r' as a special prefix for\n // rootListeners so we can look them up fast\n var map = {}\n\n // generic functional search of our registry for matching listeners,\n // `fn` returns false to break out of the loop\n , forAll = function (element, type, original, handler, root, fn) {\n var pfx = root ? 'r' : '$'\n if (!type || type == '*') {\n // search the whole registry\n for (var t in map) {\n if (t.charAt(0) == pfx) {\n forAll(element, t.substr(1), original, handler, root, fn)\n }\n }\n } else {\n var i = 0, l, list = map[pfx + type], all = element == '*'\n if (!list) return\n for (l = list.length; i < l; i++) {\n if ((all || list[i].matches(element, original, handler)) && !fn(list[i], list, i, type)) return\n }\n }\n }\n\n , has = function (element, type, original, root) {\n // we're not using forAll here simply because it's a bit slower and this\n // needs to be fast\n var i, list = map[(root ? 'r' : '$') + type]\n if (list) {\n for (i = list.length; i--;) {\n if (!list[i].root && list[i].matches(element, original, null)) return true\n }\n }\n return false\n }\n\n , get = function (element, type, original, root) {\n var entries = []\n forAll(element, type, original, null, root, function (entry) {\n return entries.push(entry)\n })\n return entries\n }\n\n , put = function (entry) {\n var has = !entry.root && !this.has(entry.element, entry.type, null, false)\n , key = (entry.root ? 'r' : '$') + entry.type\n ;(map[key] || (map[key] = [])).push(entry)\n return has\n }\n\n , del = function (entry) {\n forAll(entry.element, entry.type, null, entry.handler, entry.root, function (entry, list, i) {\n list.splice(i, 1)\n entry.removed = true\n if (list.length === 0) delete map[(entry.root ? 'r' : '$') + entry.type]\n return false\n })\n }\n\n // dump all entries, used for onunload\n , entries = function () {\n var t, entries = []\n for (t in map) {\n if (t.charAt(0) == '$') entries = entries.concat(map[t])\n }\n return entries\n }\n\n return { has: has, get: get, put: put, del: del, entries: entries }\n }())\n\n // we need a selector engine for delegated events, use querySelectorAll if it exists\n // but for older browsers we need Qwery, Sizzle or similar\n , selectorEngine\n , setSelectorEngine = function (e) {\n if (!arguments.length) {\n selectorEngine = doc.querySelectorAll\n ? function (s, r) {\n return r.querySelectorAll(s)\n }\n : function () {\n throw new Error('Bean: No selector engine installed') // eeek\n }\n } else {\n selectorEngine = e\n }\n }\n\n // we attach this listener to each DOM event that we need to listen to, only once\n // per event type per DOM element\n , rootListener = function (event, type) {\n if (!W3C_MODEL && type && event && event.propertyName != '_on' + type) return\n\n var listeners = registry.get(this, type || event.type, null, false)\n , l = listeners.length\n , i = 0\n\n event = new Event(event, this, true)\n if (type) event.type = type\n\n // iterate through all handlers registered for this type, calling them unless they have\n // been removed by a previous handler or stopImmediatePropagation() has been called\n for (; i < l && !event.isImmediatePropagationStopped(); i++) {\n if (!listeners[i].removed) listeners[i].handler.call(this, event)\n }\n }\n\n // add and remove listeners to DOM elements\n , listener = W3C_MODEL\n ? function (element, type, add) {\n // new browsers\n element[add ? addEvent : removeEvent](type, rootListener, false)\n }\n : function (element, type, add, custom) {\n // IE8 and below, use attachEvent/detachEvent and we have to piggy-back propertychange events\n // to simulate event bubbling etc.\n var entry\n if (add) {\n registry.put(entry = new RegEntry(\n element\n , custom || type\n , function (event) { // handler\n rootListener.call(element, event, custom)\n }\n , rootListener\n , null\n , null\n , true // is root\n ))\n if (custom && element['_on' + custom] == null) element['_on' + custom] = 0\n entry.target.attachEvent('on' + entry.eventType, entry.handler)\n } else {\n entry = registry.get(element, custom || type, rootListener, true)[0]\n if (entry) {\n entry.target.detachEvent('on' + entry.eventType, entry.handler)\n registry.del(entry)\n }\n }\n }\n\n , once = function (rm, element, type, fn, originalFn) {\n // wrap the handler in a handler that does a remove as well\n return function () {\n fn.apply(this, arguments)\n rm(element, type, originalFn)\n }\n }\n\n , removeListener = function (element, orgType, handler, namespaces) {\n var type = orgType && orgType.replace(nameRegex, '')\n , handlers = registry.get(element, type, null, false)\n , removed = {}\n , i, l\n\n for (i = 0, l = handlers.length; i < l; i++) {\n if ((!handler || handlers[i].original === handler) && handlers[i].inNamespaces(namespaces)) {\n // TODO: this is problematic, we have a registry.get() and registry.del() that\n // both do registry searches so we waste cycles doing this. Needs to be rolled into\n // a single registry.forAll(fn) that removes while finding, but the catch is that\n // we'll be splicing the arrays that we're iterating over. Needs extra tests to\n // make sure we don't screw it up. @rvagg\n registry.del(handlers[i])\n if (!removed[handlers[i].eventType] && handlers[i][eventSupport])\n removed[handlers[i].eventType] = { t: handlers[i].eventType, c: handlers[i].type }\n }\n }\n // check each type/element for removed listeners and remove the rootListener where it's no longer needed\n for (i in removed) {\n if (removed.hasOwnProperty(i)) {\n if (!registry.has(element, removed[i].t, null, false)) {\n // last listener of this type, remove the rootListener\n listener(element, removed[i].t, false, removed[i].c)\n }\n }\n }\n }\n\n // set up a delegate helper using the given selector, wrap the handler function\n , delegate = function (selector, fn) {\n //TODO: findTarget (therefore $) is called twice, once for match and once for\n // setting e.currentTarget, fix this so it's only needed once\n var findTarget = function (target, root) {\n var i, array = isString(selector) ? selectorEngine(selector, root) : selector\n for (; target && target !== root; target = target.parentNode) {\n for (i = array.length; i--;) {\n if (array[i] === target) return target\n }\n }\n }\n , handler = function (e) {\n var match = findTarget(e.target, this)\n if (match) fn.apply(match, arguments)\n }\n\n // __beanDel isn't pleasant but it's a private function, not exposed outside of Bean\n handler.__beanDel = {\n ft : findTarget // attach it here for customEvents to use too\n , selector : selector\n }\n return handler\n }\n\n , fireListener = W3C_MODEL ? function (isNative, type, element) {\n // modern browsers, do a proper dispatchEvent()\n var evt = doc.createEvent(isNative ? 'HTMLEvents' : 'UIEvents')\n evt[isNative ? 'initEvent' : 'initUIEvent'](type, true, true, win, 1)\n element.dispatchEvent(evt)\n } : function (isNative, type, element) {\n // old browser use onpropertychange, just increment a custom property to trigger the event\n element = targetElement(element, isNative)\n isNative ? element.fireEvent('on' + type, doc.createEventObject()) : element['_on' + type]++\n }\n\n /**\n * Public API: off(), on(), add(), (remove()), one(), fire(), clone()\n */\n\n /**\n * off(element[, eventType(s)[, handler ]])\n */\n , off = function (element, typeSpec, fn) {\n var isTypeStr = isString(typeSpec)\n , k, type, namespaces, i\n\n if (isTypeStr && typeSpec.indexOf(' ') > 0) {\n // off(el, 't1 t2 t3', fn) or off(el, 't1 t2 t3')\n typeSpec = str2arr(typeSpec)\n for (i = typeSpec.length; i--;)\n off(element, typeSpec[i], fn)\n return element\n }\n\n type = isTypeStr && typeSpec.replace(nameRegex, '')\n if (type && customEvents[type]) type = customEvents[type].base\n\n if (!typeSpec || isTypeStr) {\n // off(el) or off(el, t1.ns) or off(el, .ns) or off(el, .ns1.ns2.ns3)\n if (namespaces = isTypeStr && typeSpec.replace(namespaceRegex, '')) namespaces = str2arr(namespaces, '.')\n removeListener(element, type, fn, namespaces)\n } else if (isFunction(typeSpec)) {\n // off(el, fn)\n removeListener(element, null, typeSpec)\n } else {\n // off(el, { t1: fn1, t2, fn2 })\n for (k in typeSpec) {\n if (typeSpec.hasOwnProperty(k)) off(element, k, typeSpec[k])\n }\n }\n\n return element\n }\n\n /**\n * on(element, eventType(s)[, selector], handler[, args ])\n */\n , on = function(element, events, selector, fn) {\n var originalFn, type, types, i, args, entry, first\n\n //TODO: the undefined check means you can't pass an 'args' argument, fix this perhaps?\n if (selector === undefined && typeof events == 'object') {\n //TODO: this can't handle delegated events\n for (type in events) {\n if (events.hasOwnProperty(type)) {\n on.call(this, element, type, events[type])\n }\n }\n return\n }\n\n if (!isFunction(selector)) {\n // delegated event\n originalFn = fn\n args = slice.call(arguments, 4)\n fn = delegate(selector, originalFn, selectorEngine)\n } else {\n args = slice.call(arguments, 3)\n fn = originalFn = selector\n }\n\n types = str2arr(events)\n\n // special case for one(), wrap in a self-removing handler\n if (this === ONE) {\n fn = once(off, element, events, fn, originalFn)\n }\n\n for (i = types.length; i--;) {\n // add new handler to the registry and check if it's the first for this element/type\n first = registry.put(entry = new RegEntry(\n element\n , types[i].replace(nameRegex, '') // event type\n , fn\n , originalFn\n , str2arr(types[i].replace(namespaceRegex, ''), '.') // namespaces\n , args\n , false // not root\n ))\n if (entry[eventSupport] && first) {\n // first event of this type on this element, add root listener\n listener(element, entry.eventType, true, entry.customType)\n }\n }\n\n return element\n }\n\n /**\n * add(element[, selector], eventType(s), handler[, args ])\n *\n * Deprecated: kept (for now) for backward-compatibility\n */\n , add = function (element, events, fn, delfn) {\n return on.apply(\n null\n , !isString(fn)\n ? slice.call(arguments)\n : [ element, fn, events, delfn ].concat(arguments.length > 3 ? slice.call(arguments, 5) : [])\n )\n }\n\n /**\n * one(element, eventType(s)[, selector], handler[, args ])\n */\n , one = function () {\n return on.apply(ONE, arguments)\n }\n\n /**\n * fire(element, eventType(s)[, args ])\n *\n * The optional 'args' argument must be an array, if no 'args' argument is provided\n * then we can use the browser's DOM event system, otherwise we trigger handlers manually\n */\n , fire = function (element, type, args) {\n var types = str2arr(type)\n , i, j, l, names, handlers\n\n for (i = types.length; i--;) {\n type = types[i].replace(nameRegex, '')\n if (names = types[i].replace(namespaceRegex, '')) names = str2arr(names, '.')\n if (!names && !args && element[eventSupport]) {\n fireListener(nativeEvents[type], type, element)\n } else {\n // non-native event, either because of a namespace, arguments or a non DOM element\n // iterate over all listeners and manually 'fire'\n handlers = registry.get(element, type, null, false)\n args = [false].concat(args)\n for (j = 0, l = handlers.length; j < l; j++) {\n if (handlers[j].inNamespaces(names)) {\n handlers[j].handler.apply(element, args)\n }\n }\n }\n }\n return element\n }\n\n /**\n * clone(dstElement, srcElement[, eventType ])\n *\n * TODO: perhaps for consistency we should allow the same flexibility in type specifiers?\n */\n , clone = function (element, from, type) {\n var handlers = registry.get(from, type, null, false)\n , l = handlers.length\n , i = 0\n , args, beanDel\n\n for (; i < l; i++) {\n if (handlers[i].original) {\n args = [ element, handlers[i].type ]\n if (beanDel = handlers[i].handler.__beanDel) args.push(beanDel.selector)\n args.push(handlers[i].original)\n on.apply(null, args)\n }\n }\n return element\n }\n\n , bean = {\n 'on' : on\n , 'add' : add\n , 'one' : one\n , 'off' : off\n , 'remove' : off\n , 'clone' : clone\n , 'fire' : fire\n , 'Event' : Event\n , 'setSelectorEngine' : setSelectorEngine\n , 'noConflict' : function () {\n context[name] = old\n return this\n }\n }\n\n // for IE, clean up on unload to avoid leaks\n if (win.attachEvent) {\n var cleanup = function () {\n var i, entries = registry.entries()\n for (i in entries) {\n if (entries[i].type && entries[i].type !== 'unload') off(entries[i].element, entries[i].type)\n }\n win.detachEvent('onunload', cleanup)\n win.CollectGarbage && win.CollectGarbage()\n }\n win.attachEvent('onunload', cleanup)\n }\n\n // initialize selector engine to internal default (qSA or throw Error)\n setSelectorEngine(Ink.ss)\n\n return bean\n });\n\n /**\n * Keep this declaration here and off Bean as it extends the Event\n * object and some properties are readonly in strict mode\n */\n 'use strict';\n\n var InkEvent = {\n\n KEY_BACKSPACE: 8,\n KEY_TAB: 9,\n KEY_RETURN: 13,\n KEY_ESC: 27,\n KEY_SPACE: 32,\n KEY_LEFT: 37,\n KEY_UP: 38,\n KEY_RIGHT: 39,\n KEY_DOWN: 40,\n KEY_DELETE: 46,\n KEY_HOME: 36,\n KEY_END: 35,\n KEY_PAGEUP: 33,\n KEY_PAGEDOWN: 34,\n KEY_INSERT: 45,\n \n /**\n * Creates a throttled version of a function.\n * Returns a function which calls `func`, waiting at least `wait` milliseconds between calls. This is useful for events such as `scroll` or `resize`, which can be triggered too many times per second, slowing down the browser with needless function calls.\n *\n * *note:* This does not delay the first function call to the function.\n *\n * @method throttle\n * @param {Function} func Function to call. Arguments and context are both passed.\n * @param {Number} [wait]=0 Milliseconds to wait between calls.\n * @return {Function} A function throttled which will only be called at most every `wait` milliseconds.\n * @sample Ink_Dom_Event_1_throttle.html \n **/\n throttle: function (func, wait) {\n wait = wait || 0;\n var lastCall = 0; // Warning: This breaks on Jan 1st 1970 0:00\n var timeout;\n function throttled() {\n var now = +new Date();\n var timeDiff = now - lastCall;\n if (timeDiff >= wait) {\n lastCall = now;\n return func.apply(this, [].slice.call(arguments));\n } else {\n var that = this;\n var args = [].slice.call(arguments);\n\n if (timeout) {\n // Clear the old timeout because that one has old arguments\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(function () {\n timeout = null;\n return throttled.apply(that, args);\n }, wait - timeDiff);\n }\n }\n return throttled;\n },\n\n /**\n * Gets the event's target element.\n *\n * @method element\n * @param {Object} ev Event object\n * @return {Element} The target\n * @public\n * @sample Ink_Dom_Event_1_element.html \n */\n element: function(ev) {\n var node = ev.delegationTarget ||\n ev.target ||\n // IE stuff\n (ev.type === 'mouseout' && ev.fromElement) ||\n (ev.type === 'mouseleave' && ev.fromElement) ||\n (ev.type === 'mouseover' && ev.toElement) ||\n (ev.type === 'mouseenter' && ev.toElement) ||\n ev.srcElement ||\n null;\n return node && (node.nodeType === 3 || node.nodeType === 4) ? node.parentNode : node;\n },\n\n /**\n * Gets the event's related target element.\n *\n * @method relatedTarget\n * @param {Object} ev event object\n * @return {DOMNode} The related target\n * @sample Ink_Dom_Event_1_relatedTarget.html \n */\n relatedTarget: function(ev){\n var node = ev.relatedTarget ||\n // IE stuff\n (ev.type === 'mouseout' && ev.toElement) ||\n (ev.type === 'mouseleave' && ev.toElement) ||\n (ev.type === 'mouseover' && ev.fromElement) ||\n (ev.type === 'mouseenter' && ev.fromElement) ||\n null;\n return node && (node.nodeType === 3 || node.nodeType === 4) ? node.parentNode : node;\n },\n\n /**\n * Find closest ancestor element by tag name related to the event target.\n * Navigate up the DOM tree, looking for a tag with the name `elmTagName`.\n *\n * If such tag is not found, `document` is returned.\n *\n * @method findElement\n * @param {Object} ev Event object\n * @param {String} elmTagName Tag name to find\n * @param {Boolean} [force]=false Flag to skip returning `document` and to return `false` instead.\n * @return {DOMElement} the first element which matches given tag name or the document element if the wanted tag is not found\n * @sample Ink_Dom_Event_1_findElement.html \n */\n findElement: function(ev, elmTagName, force)\n {\n var node = this.element(ev);\n while(true) {\n if(node.nodeName.toLowerCase() === elmTagName.toLowerCase()) {\n return node;\n } else {\n node = node.parentNode;\n if(!node) {\n if(force) {\n return false;\n }\n return document;\n }\n if(!node.parentNode){\n if(force){ return false; }\n return document;\n }\n }\n }\n },\n\n /**\n * Attaches an event to element\n *\n * @method observe\n * @param {DOMElement|String} element Element id or element\n * @param {String} eventName Event name\n * @param {Function} callBack Receives the event object as a parameter. If you're manually firing custom events, check it's eventName property to make sure you're handling the right event.\n * @param {Boolean} [useCapture] Flag to change event listening from bubbling to capture.\n * @return {Function} The event handler used. Hang on to this if you want to `stopObserving` later.\n * @sample Ink_Dom_Event_1_observe.html \n */\n observe: function(element, eventName, callBack, useCapture) {\n element = Ink.i(element);\n if(element) {\n if(element.addEventListener) {\n element.addEventListener(eventName, callBack, !!useCapture);\n } else {\n element.attachEvent('on' + eventName, (callBack = Ink.bind(callBack, element)));\n }\n return callBack;\n }\n },\n\n /**\n * Like observe, but listen to the event only once.\n *\n * @method observeOnce\n * @param {DOMElement|String} element Element id or element\n * @param {String} eventName Event name\n * @param {Function} callBack Receives the event object as a parameter. If you're manually firing custom events, check it's eventName property to make sure you're handling the right event.\n * @param {Boolean} [useCapture] Flag to change event listening from bubbling to capture.\n * @return {Function} The event handler used. Hang on to this if you want to `stopObserving` later.\n * @sample Ink_Dom_Event_1_observeOnce.html \n */\n observeOnce: function (element, eventName, callBack, useCapture) {\n var onceBack = function () {\n InkEvent.stopObserving(element, eventName, handler);\n return callBack.apply(this, arguments);\n };\n var handler = InkEvent.observe(element, eventName, onceBack, useCapture);\n return handler;\n },\n\n /**\n * Attaches an event to a selector or array of elements.\n *\n * @method observeMulti\n * @param {Array|String} elements Array of elements which are going to be observed. A selector is acceptable too.\n * @param {String} eventName Event name\n * @param {Function} callBack Receives the event object as a parameter. If you're manually firing custom events, check it's eventName property to make sure you're handling the right event.\n * @param {Boolean} [useCapture] Flag change event listening from bubbling to capture.\n * @return {Function} The used callback.\n * @sample Ink_Dom_Event_1_observeMulti.html \n */\n observeMulti: function (elements, eventName, callBack, useCapture) {\n if (typeof elements === 'string') {\n elements = Ink.ss(elements);\n } else if ( /* is an element */ elements && elements.nodeType === 1) {\n elements = [elements];\n }\n if (!elements[0]) { return false; }\n\n for (var i = 0, len = elements.length; i < len; i++) {\n this.observe(elements[i], eventName, callBack, useCapture);\n }\n return callBack;\n },\n\n /**\n * Observes an event on an element and its descendants matching the selector.\n *\n * Requires Ink.Dom.Selector if you need to use a selector.\n *\n * @method observeDelegated\n * @param {Element|String} element Element to observe.\n * @param {String} eventName Event name to observe.\n * @param {String} selector Child element selector. When null, finds any element.\n * @param {Function} callback Callback to be called when the event is fired\n * @return {Function} The used callback, for ceasing to listen to the event later.\n * @public\n * @sample Ink_Dom_Event_1_observeDelegated.html \n **/\n observeDelegated: function (element, eventName, selector, callback) {\n return InkEvent.observe(element, eventName, function (event) {\n var fromElement = InkEvent.element(event);\n if (!fromElement || fromElement === element) { return; }\n\n var cursor = fromElement;\n\n // Go up the document tree until we hit the element itself.\n while (cursor !== element && cursor !== document && cursor) {\n if (Ink.Dom.Selector_1.matchesSelector(cursor, selector)) {\n event.delegationTarget = cursor;\n return callback(event);\n }\n cursor = cursor.parentNode;\n }\n });\n },\n\n /**\n * Removes an event attached to an element.\n *\n * @method stopObserving\n * @param {DOMElement|String} element Element id or element\n * @param {String} eventName Event name\n * @param {Function} callBack Callback function\n * @param {Boolean} [useCapture] Set to true if the event was being observed with useCapture set to true as well.\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stopObserving.html \n */\n stopObserving: function(element, eventName, callBack, useCapture) {\n element = Ink.i(element);\n\n if(element) {\n if(element.removeEventListener) {\n element.removeEventListener(eventName, callBack, !!useCapture);\n } else {\n element.detachEvent('on' + eventName, callBack);\n }\n }\n },\n\n /**\n * Stops event propagation and bubbling.\n *\n * @method stop\n * @param {Object} event Event handle\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stop.html \n */\n stop: function(event)\n {\n if(event.cancelBubble !== null) {\n event.cancelBubble = true;\n }\n if(event.stopPropagation) {\n event.stopPropagation();\n }\n if(event.preventDefault) {\n event.preventDefault();\n }\n if(window.attachEvent) {\n event.returnValue = false;\n }\n if(event.cancel !== null) {\n event.cancel = true;\n }\n },\n\n /**\n * Stops event propagation.\n *\n * @method stopPropagation\n * @param {Object} event Event handle\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stopPropagation.html \n */\n stopPropagation: function(event) {\n if(event.cancelBubble !== null) {\n event.cancelBubble = true;\n }\n if(event.stopPropagation) {\n event.stopPropagation();\n }\n },\n\n /**\n * Stops event default behaviour.\n *\n * @method stopDefault\n * @param {Object} event Event handle\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stopDefault.html \n */\n stopDefault: function(event)\n {\n if(event.preventDefault) {\n event.preventDefault();\n }\n if(window.attachEvent) {\n event.returnValue = false;\n }\n if(event.cancel !== null) {\n event.cancel = true;\n }\n },\n\n /**\n * Gets the pointer's coordinates from the event object.\n *\n * @method pointer\n * @param {Object} ev Event object\n * @return {Object} An object with the mouse X and Y position\n * @public\n * @sample Ink_Dom_Event_1_pointer.html \n */\n pointer: function(ev)\n {\n return {\n x: this.pointerX(ev),\n y: this.pointerY(ev)\n };\n },\n\n /**\n * Gets the pointer's X coordinate.\n *\n * @method pointerX\n * @param {Object} ev Event object\n * @return {Number} Mouse X position\n * @public\n */\n pointerX: function(ev)\n {\n return (ev.touches && ev.touches[0] && ev.touches[0].clientX) ||\n (ev.pageX) ||\n (ev.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));\n },\n\n /**\n * Gets the pointer's Y coordinate.\n *\n * @method pointerY\n * @param {Object} ev Event object\n * @return {Number} Mouse Y position\n * @public\n */\n pointerY: function(ev)\n {\n return (ev.touches && ev.touches[0] && ev.touches[0].clientY) ||\n (ev.pageY) ||\n (ev.clientY + (document.documentElement.scrollTop || document.body.scrollTop));\n },\n\n /**\n * Checks if an event is a left click.\n *\n * @method isLeftClick\n * @param {Object} ev Event object\n * @return {Boolean} True if the event is a left click\n * @public\n * @sample Ink_Dom_Event_1_isLeftClick.html \n */\n isLeftClick: function(ev) {\n if (window.addEventListener) {\n if(ev.button === 0){\n return true;\n } else if(ev.type === 'touchend' && ev.button === null){\n // [todo] do the above check for pointerEvents too\n return true;\n }\n }\n else {\n if(ev.button === 1){ return true; }\n }\n return false;\n },\n\n /**\n * Checks if an event is a right click.\n *\n * @method isRightClick\n * @param {Object} ev Event object\n * @return {Boolean} True if the event is a right click\n * @public\n * @sample Ink_Dom_Event_1_isRightClick.html \n */\n isRightClick: function(ev) {\n return (ev.button === 2);\n },\n\n /**\n * Checks if an event is a middle click.\n *\n * @method isMiddleClick\n * @param {Object} ev Event object\n * @return {Boolean} True if the event is a middle click\n * @public\n * @sample Ink_Dom_Event_1_isMiddleClick.html \n */\n isMiddleClick: function(ev) {\n if (window.addEventListener) {\n return (ev.button === 1);\n }\n else {\n return (ev.button === 4);\n }\n return false;\n },\n\n /**\n * Gets character from an event.\n *\n * @method getCharFromKeyboardEvent\n * @param {Object} event Keyboard event\n * @param {Boolean} [changeCasing] If true uppercases, if false lowercases, otherwise keeps casing\n * @return {String} Character representation of pressed key combination\n * @public\n * @sample Ink_Dom_Event_1_getCharFromKeyboardEvent.html \n */\n getCharFromKeyboardEvent: function(event, changeCasing) {\n var k = event.keyCode;\n var c = String.fromCharCode(k);\n\n var shiftOn = event.shiftKey;\n if (k >= 65 && k <= 90) { // A-Z\n if (typeof changeCasing === 'boolean') {\n shiftOn = changeCasing;\n }\n return (shiftOn) ? c : c.toLowerCase();\n }\n else if (k >= 96 && k <= 105) { // numpad digits\n return String.fromCharCode( 48 + (k-96) );\n }\n switch (k) {\n case 109: case 189: return '-';\n case 107: case 187: return '+';\n }\n return c;\n },\n\n debug: function(){}\n};\n\n/**\n * Lets you attach event listeners to both elements and objects.\n * http://github.com/fat/bean#on\n *\n * @method on\n * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object\n * @param {String} eventType An Event (or multiple events, space separated) to listen to\n * @param {String} [selector] A CSS DOM Element selector string to bind the listener to child elements matching the selector\n * @param {Function} [handler] The callback function\n * @param {Object} [args...] Additional arguments to pass to the callback function when triggered\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_on.html \n */\n\n/**\n * Alias for `on` but will only be executed once.\n * bean.one() is an alias for bean.on() except that the handler will only be executed once and then removed for the event type(s).\n * http://github.com/fat/bean#one\n *\n * @method one\n * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object\n * @param {String} eventType An Event (or multiple events, space separated) to listen to\n * @param {String} [selector] A CSS DOM Element selector string to bind the listener to child elements matching the selector\n * @param {Function} [handler] The callback function\n * @param [args...] Additional arguments to pass to the callback function when triggered\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_one.html \n */\n\n/**\n * Removes event handlers.\n * bean.off() is how you get rid of handlers once you no longer want them active. It's also a good idea to call off on elements before you remove them from your DOM; this gives Bean a chance to clean up some things and prevents memory leaks.\n * http://github.com/fat/bean#off\n *\n * @method off\n * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object\n * @param {String} eventType An Event (or multiple events, space separated) to remove\n * @param {Function} [handler] The specific callback function to remove\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_off.html \n */\n\n/**\n * Clones events from one object to another\n * bean.clone() is a method for cloning events from one DOM element or object to another.\n * http://github.com/fat/bean#clone\n *\n * @method clone\n * @param {DOMElement|Object} destElement An HTML DOM element or any JavaScript Object to copy events to\n * @param {String} srcElement An HTML DOM element or any JavaScript Object to copy events from\n * @param {String} [eventType] An Event (or multiple events, space separated) to clone\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_clone.html \n */\n\n/**\n * Triggers events.\n * http://github.com/fat/bean#fire\n *\n * @method fire\n * @param {DOMElement|Object} destElement An HTML DOM element or any JavaScript Object fire the event on\n * @param {String} eventType An Event (or multiple events, space separated) to fire\n * @param [args...] Additional arguments to pass to the callback function when triggered\n *\n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_fire.html \n */\n\nreturn Ink.extendObj(InkEvent, bean);\n\n});\n","/**\n * @module Ink.Dom.FormSerialize_1\n * Two way serialization of form data and javascript objects.\n * Valid applications are ad hoc AJAX/syndicated submission of forms, restoring form values from server side state, etc.\n */\n\nInk.createModule('Ink.Dom.FormSerialize', 1, ['Ink.Util.Array_1', 'Ink.Dom.Element_1', 'Ink.Dom.Selector_1'], function (InkArray, InkElement, Selector) {\n 'use strict';\n\n // Check whether something is not a string or a DOM element, but still has length.\n function isArrayIsh(obj) {\n return obj != null &&\n (!InkElement.isDOMElement(obj)) &&\n (InkArray.isArray(obj) || (typeof obj !== 'string' && typeof obj.length === 'number'));\n }\n\n function toArray(obj) {\n if (isArrayIsh(obj)) { return obj; }\n else { return [obj]; }\n }\n\n /**\n * @namespace Ink.Dom.FormSerialize\n * @static\n **/\n var FormSerialize = {\n\n /**\n * Serializes a form element into a JS object\n * It turns field *names* (not IDs!) into keys and field values into values.\n *\n * note: Multi-select and checkboxes with multiple values will result in arrays\n *\n * @method serialize\n * @param {DOMElement|String} form Form element to extract data\n * @param {Object} [options] Options object, containing:\n * @param {Boolean} [options.outputUnchecked=false] Whether to emit unchecked checkboxes and unselected radio buttons.\n * @return {Object} Map of fieldName -> String|String[]|Boolean\n * @sample Ink_Dom_FormSerialize_serialize.html \n */\n serialize: function(form, options) {\n options = options || {};\n var out = {};\n var emptyArrayToken = {}; // A hack so that empty select[multiple] elements appear although empty.\n\n var pairs = this.asPairs(form, { elements: true, emptyArray: emptyArrayToken, outputUnchecked: options.outputUnchecked });\n if (pairs == null) { return pairs; }\n InkArray.forEach(pairs, function (pair) {\n var name = pair[0].replace(/\\[\\]$/, '');\n var value = pair[1];\n var el = pair[2];\n\n if (value === emptyArrayToken) {\n out[name] = []; // It's an empty select[multiple]\n } else if (!(FormSerialize._resultsInArray(el) || /\\[\\]$/.test(pair[0]))) {\n out[name] = value;\n } else {\n out[name] = out[name] || [];\n out[name].push(value);\n }\n });\n\n return out;\n },\n\n /**\n * Like `serialize`, but returns an array of [fieldName, value] pairs.\n *\n * @method asPairs\n * @param {DOMElement|String} form Form element\n * @param {Object} [options] Options object, containing:\n * @param {Boolean} [options.elements] Instead of returning an array of [fieldName, value] pairs, return an array of [fieldName, value, fieldElement] triples.\n * @param {Boolean} [options.emptyArray] What to emit as the value of an empty select[multiple]. If you don't pass this option, nothing comes out.\n * @param {Boolean} [options.outputUnchecked=false] Whether to emit unchecked checkboxes and unselected radio buttons.\n * @return {Array} Array of [fieldName, value] pairs.\n **/\n asPairs: function (form, options) {\n var out = [];\n options = options || {};\n\n function emit(name, val, el) {\n if (options.elements) {\n out.push([name, val, el]);\n } else {\n out.push([name, val]);\n }\n }\n\n function serializeEl(el) {\n var elNodeName = el.nodeName.toLowerCase();\n var elType = (el.type + '').toLowerCase();\n\n if (elNodeName === 'select' && el.multiple) {\n var didEmit = false;\n InkArray.forEach(Selector.select('option:checked', el), function (thisOption) {\n emit(el.name, thisOption.value, el);\n didEmit = true;\n });\n if (!didEmit && 'emptyArray' in options) {\n emit(el.name, options.emptyArray, el);\n }\n } else if (elNodeName === 'input' && (elType === 'checkbox' || elType === 'radio') && options.outputUnchecked) {\n // It's an empty checkbox and we wouldn't emit it otherwise but the user asked for it using outputUnchecked\n emit(el.name, null, el);\n } else {\n emit(el.name, el.value, el);\n }\n }\n\n if ((form = Ink.i(form))) {\n var inputs = InkArray.filter(form.elements, function (elm) {\n return FormSerialize._isSerialized(elm, options);\n });\n for (var i = 0, len = inputs.length; i < len; i++) {\n serializeEl(inputs[i]);\n }\n return out;\n }\n\n return null;\n },\n\n /**\n * Sets form elements' values with values from an object\n *\n * Note: You can't set the values of an input with `type=\"file\"` (browser prohibits it)\n *\n * @method fillIn \n * @param {Element|String} form Form element to be populated\n * @param {Object|Array} map2 Mapping of fields to values contained in fields. Can be a hash (keys as names, strings or arrays for values), or an array of [name, value] pairs.\n * @return {void}\n * @sample Ink_Dom_FormSerialize_fillIn.html \n */\n fillIn: function(form, map2) {\n if (!(form = Ink.i(form))) { return null; }\n\n var pairs;\n\n if (typeof map2 === 'object' && !isArrayIsh(map2)) {\n pairs = FormSerialize._objToPairs(map2);\n } else if (isArrayIsh(map2)) {\n pairs = map2;\n } else {\n return null;\n }\n\n return FormSerialize._fillInPairs(form, pairs);\n },\n\n _objToPairs: function (obj) {\n var pairs = [];\n var val;\n for (var name in obj) if (obj.hasOwnProperty(name)) {\n val = toArray(obj[name]);\n for (var i = 0, len = val.length; i < len; i++) {\n pairs.push([name, val[i]]);\n }\n if (len === 0) {\n pairs.push([name, []]);\n }\n }\n return pairs;\n },\n\n _fillInPairs: function (form, pairs) {\n pairs = InkArray.groupBy(pairs, {\n key: function (pair) { return pair[0].replace(/\\[\\]$/, ''); }\n });\n\n // For each chunk...\n pairs = InkArray.map(pairs, function (pair) {\n // Join the items in the chunk by concatenating the values together and leaving the names alone\n var values = InkArray.reduce(pair, function (left, right) {\n return [null, left[1].concat([right[1]])];\n }, [null, []])[1];\n return [pair[0][0], values];\n });\n\n var name;\n var inputs;\n var values;\n for (var i = 0, len = pairs.length; i < len; i++) {\n name = pairs[i][0];\n\n if (name in form) {\n inputs = form[name];\n } else if ((name + '[]') in form) {\n inputs = form[name + '[]'];\n name = name + '[]';\n } else {\n continue;\n }\n\n inputs = toArray(inputs);\n values = pairs[i][1];\n\n FormSerialize._fillInOne(name, inputs, values);\n }\n },\n\n _fillInOne: function (name, inputs, values) {\n var firstOne = inputs[0];\n var firstNodeName = firstOne.nodeName.toLowerCase();\n var firstType = firstOne.getAttribute('type');\n firstType = firstType && firstType.toLowerCase();\n var isSelectMulti = firstNodeName === 'select' && InkElement.hasAttribute(firstOne, 'multiple');\n\n if (firstType === 'checkbox' || firstType === 'radio') {\n FormSerialize._fillInBoolean(inputs, values, 'checked');\n } else if (isSelectMulti) {\n FormSerialize._fillInBoolean(inputs[0].options, values, 'selected');\n } else {\n if (inputs.length !== values.length) {\n Ink.warn('Form had ' + inputs.length + ' inputs named \"' + name + '\", but received ' + values.length + ' values.');\n }\n\n for (var i = 0, len = Math.min(inputs.length, values.length); i < len; i += 1) {\n inputs[i].value = values[i];\n }\n }\n },\n\n _fillInBoolean: function (inputs, values, checkAttr /* 'selected' or 'checked' */) {\n InkArray.forEach(inputs, function (input) {\n var isChecked = InkArray.inArray(input.value, values);\n input[checkAttr] = isChecked;\n });\n },\n\n /**\n * Whether FormSerialize.serialize() should produce an array when looking at this element.\n * @method _resultsInArray\n * @private\n * @param element\n **/\n _resultsInArray: function (element) {\n var type = element.getAttribute('type');\n var nodeName = element.nodeName.toLowerCase();\n\n return type === 'checkbox' ||\n (nodeName === 'select' && InkElement.hasAttribute(element, 'multiple'));\n },\n\n _isSerialized: function (element, options) {\n options = options || {};\n if (!InkElement.isDOMElement(element)) { return false; }\n if (!InkElement.hasAttribute(element, 'name')) { return false; }\n\n var nodeName = element.nodeName.toLowerCase();\n\n if (!nodeName || nodeName === 'fieldset') { return false; }\n\n if (element.type === 'checkbox' || element.type === 'radio') {\n if (options.outputUnchecked) { return true; }\n return !!element.checked;\n }\n\n return true;\n }\n };\n\n return FormSerialize;\n});\n","/**\n * Execute code only when the DOM is loaded.\n * @module Ink.Dom.Loaded_1\n * @version 1\n */\n \nInk.createModule('Ink.Dom.Loaded', 1, [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Dom.Loaded_1\n **/\n var Loaded = {\n\n /**\n * Callbacks and their contexts. Array of 2-arrays.\n *\n * []\n *\n * @attribute _contexts Array\n * @private\n * \n */\n _contexts: [], // Callbacks' queue\n\n /**\n * Specify a function to execute when the DOM is fully loaded.\n *\n * @method run\n * @param {Object} [win]=window Window object to attach/add the event\n * @param {Function} fn Callback function to be executed after the DOM is ready\n * @return {void}\n * @public\n * @sample Ink_Dom_Loaded_run.html \n */\n run: function(win, fn) {\n if (!fn) {\n fn = win;\n win = window;\n }\n\n var context;\n\n for (var i = 0, len = this._contexts.length; i < len; i++) {\n if (this._contexts[i][0] === win) {\n context = this._contexts[i][1];\n break;\n }\n }\n if (!context) {\n context = {\n cbQueue: [],\n win: win,\n doc: win.document,\n root: win.document.documentElement,\n done: false,\n top: true\n };\n context.handlers = {\n checkState: Ink.bindEvent(this._checkState, this, context),\n poll: Ink.bind(this._poll, this, context)\n };\n this._contexts.push(\n [win, context] // Javascript Objects cannot map different windows to\n // different values.\n );\n }\n\n var ael = context.doc.addEventListener;\n context.add = ael ? 'addEventListener' : 'attachEvent';\n context.rem = ael ? 'removeEventListener' : 'detachEvent';\n context.pre = ael ? '' : 'on';\n context.det = ael ? 'DOMContentLoaded' : 'onreadystatechange';\n context.wet = context.pre + 'load';\n\n var csf = context.handlers.checkState;\n var alreadyLoaded = (\n /complete|loaded/.test(context.doc.readyState) &&\n context.win.location.toString() !== 'about:blank'); // https://code.google.com/p/chromium/issues/detail?id=32357\n\n if (alreadyLoaded){\n setTimeout(Ink.bind(function () {\n fn.call(context.win, 'lazy');\n }, this), 0);\n } else {\n context.cbQueue.push(fn);\n\n context.doc[context.add]( context.det , csf );\n context.win[context.add]( context.wet , csf );\n\n var frameElement = 1;\n try{\n frameElement = context.win.frameElement;\n } catch(e) {}\n if ( !ael && context.root && context.root.doScroll ) { // IE HACK\n try {\n context.top = !frameElement;\n } catch(e) { }\n if (context.top) {\n this._poll(context);\n }\n }\n }\n },\n\n /**\n * Function that will be running the callbacks after the page is loaded\n *\n * @method _checkState\n * @param {Event} event Triggered event\n * @private\n */\n _checkState: function(event, context) {\n if ( !event || (event.type === 'readystatechange' && !/complete|loaded/.test(context.doc.readyState))) {\n return;\n }\n var where = (event.type === 'load') ? context.win : context.doc;\n where[context.rem](context.pre+event.type, context.handlers.checkState, false);\n this._ready(context);\n },\n\n /**\n * Polls the load progress of the page to see if it has already loaded or not\n *\n * @method _poll\n * @private\n */\n\n /**\n * (old IE only) wait until a doScroll() call does not throw an error\n *\n * @method _poll\n * @private\n */\n _poll: function(context) {\n try {\n context.root.doScroll('left');\n } catch(e) {\n return setTimeout(context.handlers.poll, 50);\n }\n this._ready(context);\n },\n\n /**\n * Function that runs the callbacks from the queue when the document is ready.\n *\n * @method _ready\n * @private\n */\n _ready: function(context) {\n if (!context.done) {\n context.done = true;\n for (var i = 0; i < context.cbQueue.length; ++i) {\n context.cbQueue[i].call(context.win);\n }\n context.cbQueue = [];\n }\n }\n };\n\n return Loaded;\n\n});\n","/**\n * CSS selector engine\n * @module Ink.Dom.Selector_1\n * @version 1\n */\n \nInk.createModule('Ink.Dom.Selector', 1, [], function() {\n /*jshint forin:false, eqnull:true, noempty:false, expr:true, boss:true, maxdepth:false*/\n\t'use strict';\n\n/*!\n * Sizzle CSS Selector Engine\n * Copyright 2013 jQuery Foundation and other contributors\n * Released under the MIT license\n * http://sizzlejs.com/\n */\n\nvar i,\n\tcachedruns,\n\tExpr,\n\tgetText,\n\tisXML,\n\tcompile,\n\toutermostContext,\n\trecompare,\n\tsortInput,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + -(new Date()),\n\tpreferredDoc = window.document,\n\tsupport = {},\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\thasDuplicate = false,\n\tsortOrder = function() { return 0; },\n\n\t// General-purpose constants\n\tstrundefined = typeof undefined,\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Array methods\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf if we can't use a native one\n\tindexOf = arr.indexOf || function( elem ) {\n\t\tvar i = 0,\n\t\t\tlen = this.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( this[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\toperators = \"([*^$|!~]?=)\",\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:\" + operators + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\n\t// Prefer arguments quoted,\n\t// then not containing pseudos/brackets,\n\t// then attribute selectors/non-parenthetical expressions,\n\t// then anything else\n\t// These preferences are here to reduce the number of selectors\n\t// needing tokenize in the PSEUDO preFilter\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes.replace( 3, 8 ) + \")*)|.*)\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([\\\\x20\\\\t\\\\r\\\\n\\\\f>+~])\" + whitespace + \"*\" ),\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"NAME\": new RegExp( \"^\\\\[name=['\\\"]?(\" + characterEncoding + \")['\\\"]?\\\\]\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trsibling = /[\\x20\\t\\r\\n\\f]*[+~]/,\n\n\trnative = /^[^{]+\\{\\s*\\[native code/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trescape = /'|\\\\/g,\n\trattributeQuotes = /\\=[\\x20\\t\\r\\n\\f]*([^'\"\\]]*)[\\x20\\t\\r\\n\\f]*\\]/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = /\\\\([\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|.)/g,\n\tfunescape = function( _, escaped ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\treturn high !== high ?\n\t\t\tescaped :\n\t\t\t// BMP codepoint\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\n/*\n * For feature detection\n * @param {Function} fn The function to test for native support\n */\nfunction isNative( fn ) {\n\treturn rnative.test( fn + \"\" );\n}\n\n/*\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar cache,\n\t\tkeys = [];\n\n\treturn (cache = function( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key += \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key ] = value);\n\t});\n}\n\n/*\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/*\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( documentIsHTML && !seed ) {\n\n\t\t// Shortcuts\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && !rbuggyQSA.test(selector) ) {\n\t\t\told = true;\n\t\t\tnid = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType === 9 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/*\n * Detect xml\n * @param {Element|Object} elem An element or a document\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/*\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar doc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\n\t// Support tests\n\tdocumentIsHTML = !isXML( doc );\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Check if attributes should be retrieved by attribute nodes\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.innerHTML = \"\";\n\t\tvar type = typeof div.lastChild.getAttribute(\"multiple\");\n\t\t// IE8 returns a string for some attributes even when not present\n\t\treturn type !== \"boolean\" && type !== \"string\";\n\t});\n\n\t// Check if getElementsByClassName can be trusted\n\tsupport.getElementsByClassName = assert(function( div ) {\n\t\t// Opera can't find a second classname (in 9.6)\n\t\tdiv.innerHTML = \"\";\n\t\tif ( !div.getElementsByClassName || !div.getElementsByClassName(\"e\").length ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Safari 3.2 caches class attributes and doesn't catch changes\n\t\tdiv.lastChild.className = \"e\";\n\t\treturn div.getElementsByClassName(\"e\").length === 2;\n\t});\n\n\t// Check if getElementsByName privileges form controls or returns elements by ID\n\t// If so, assume (for broader support) that getElementById returns elements by name\n\tsupport.getByName = assert(function( div ) {\n\t\t// Inject content\n\t\tdiv.id = expando + 0;\n\t\t// Support: Windows 8 Native Apps\n\t\t// Assigning innerHTML with \"name\" attributes throws uncatchable exceptions\n\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx\n\t\tdiv.appendChild( document.createElement(\"a\") ).setAttribute( \"name\", expando );\n\t\tdiv.appendChild( document.createElement(\"i\") ).setAttribute( \"name\", expando );\n\t\tdocElem.appendChild( div );\n\n\t\t// Test\n\t\tvar pass = doc.getElementsByName &&\n\t\t\t// buggy browsers will return fewer than the correct 2\n\t\t\tdoc.getElementsByName( expando ).length === 2 +\n\t\t\t// buggy browsers will return more than the correct 0\n\t\t\tdoc.getElementsByName( expando + 0 ).length;\n\n\t\t// Cleanup\n\t\tdocElem.removeChild( div );\n\n\t\treturn pass;\n\t});\n\n\t// Support: Webkit<537.32\n\t// Detached nodes confoundingly follow *each other*\n\tsupport.sortDetached = assert(function( div1 ) {\n\t\treturn div1.compareDocumentPosition &&\n\t\t\t// Should return 1, but Webkit returns 4 (following)\n\t\t\t(div1.compareDocumentPosition( document.createElement(\"div\") ) & 1);\n\t});\n\n\t// IE6/7 return modified attributes\n\tExpr.attrHandle = assert(function( div ) {\n\t\tdiv.innerHTML = \"
              \";\n\t\treturn div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&\n\t\t\tdiv.firstChild.getAttribute(\"href\") === \"#\";\n\t}) ?\n\t\t{} :\n\t\t{\n\t\t\t\"href\": function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"href\", 2 );\n\t\t\t},\n\t\t\t\"type\": function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"type\");\n\t\t\t}\n\t\t};\n\n\t// ID find and filter\n\tif ( support.getByName ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\n\t\t\t\treturn m ?\n\t\t\t\t\tm.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode(\"id\").value === id ?\n\t\t\t\t\t\t[m] :\n\t\t\t\t\t\tundefined :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t}\n\t\t} :\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Name\n\tExpr.find[\"NAME\"] = support.getByName && function( tag, context ) {\n\t\tif ( typeof context.getElementsByName !== strundefined ) {\n\t\t\treturn context.getElementsByName( name );\n\t\t}\n\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21),\n\t// no need to also add to buggyMatches since matches checks buggyQSA\n\t// A support test would require too much code (would include document ready)\n\trbuggyQSA = [ \":focus\" ];\n\n\tif ( (support.qsa = isNative(doc.querySelectorAll)) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdiv.innerHTML = \"\";\n\n\t\t\t// IE8 - Some boolean attributes are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:checked|disabled|ismap|multiple|readonly|selected|value)\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Opera 10-12/IE8 - ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tif ( div.querySelectorAll(\"[i^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:\\\"\\\"|'')\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = isNative(docElem.contains) || docElem.compareDocumentPosition ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t// Document order sorting\n\tsortOrder = docElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );\n\n\t\tif ( compare ) {\n\t\t\t// Disconnected nodes\n\t\t\tif ( compare & 1 ||\n\t\t\t\t(recompare && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t\tif ( a === doc || contains(preferredDoc, a) ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( b === doc || contains(preferredDoc, b) ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\t// Maintain original order\n\t\t\t\treturn sortInput ?\n\t\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t\t0;\n\t\t\t}\n\n\t\t\treturn compare & 4 ? -1 : 1;\n\t\t}\n\n\t\t// Not directly comparable, sort on existence of method\n\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\t} else if ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\t// rbuggyQSA always contains :focus, so no need for an existence check\n\tif ( support.matchesSelector && documentIsHTML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) {\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch(e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [elem] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\tvar val;\n\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tif ( documentIsHTML ) {\n\t\tname = name.toLowerCase();\n\t}\n\tif ( (val = Expr.attrHandle[ name ]) ) {\n\t\treturn val( elem );\n\t}\n\tif ( !documentIsHTML || support.attributes ) {\n\t\treturn elem.getAttribute( name );\n\t}\n\treturn ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?\n\t\tname :\n\t\tval && val.specified ? val.value : null;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n// Document sorting and removing duplicates\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\t// Compensate for sort limitations\n\trecompare = !support.sortDetached;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\treturn results;\n};\n\n/*\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns Returns -1 if a precedes b, 1 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n// Returns a function to use in pseudos for input types\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n// Returns a function to use in pseudos for buttons\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n// Returns a function to use in pseudos for positionals\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/*\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( ; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (see #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[5] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[4] ) {\n\t\t\t\tmatch[2] = match[4];\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeName ) {\n\t\t\tif ( nodeName === \"*\" ) {\n\t\t\t\treturn function() { return true; };\n\t\t\t}\n\n\t\t\tnodeName = nodeName.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\")) || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\n\t\t\t// not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t// Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === elem.type );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( tokens = [] );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar data, cache, outerCache,\n\t\t\t\tdirkey = dirruns + \" \" + doneName;\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {\n\t\t\t\t\t\t\tif ( (data = cache[1]) === true || data === cachedruns ) {\n\t\t\t\t\t\t\t\treturn data === true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcache = outerCache[ dir ] = [ dirkey ];\n\t\t\t\t\t\t\tcache[1] = matcher( elem, context, xml ) || cachedruns;\n\t\t\t\t\t\t\tif ( cache[1] === true ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\t// A counter to specify which element is currently being matched\n\tvar matcherCachedRuns = 0,\n\t\tbySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, expandContext ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tsetMatched = [],\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\toutermost = expandContext != null,\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", expandContext && context.parentNode || context ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t\tcachedruns = matcherCachedRuns;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t\tcachedruns = ++matcherCachedRuns;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !group ) {\n\t\t\tgroup = tokenize( selector );\n\t\t}\n\t\ti = group.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( group[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\t}\n\treturn cached;\n};\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tmatch = tokenize( selector );\n\n\tif ( !seed ) {\n\t\t// Try to minimize operations if there is only one group\n\t\tif ( match.length === 1 ) {\n\n\t\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t\ttokens = match[0] = match[0].slice( 0 );\n\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\t\tcontext.nodeType === 9 && documentIsHTML &&\n\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\t\tif ( !context ) {\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\n\t\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t\t}\n\n\t\t\t// Fetch a seed set for right-to-left matching\n\t\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\ttoken = tokens[i];\n\n\t\t\t\t// Abort if we hit a combinator\n\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\t\tif ( (seed = find(\n\t\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\t\trsibling.test( tokens[0].type ) && context.parentNode || context\n\t\t\t\t\t)) ) {\n\n\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\tcompile( selector, match )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector )\n\t);\n\treturn results;\n}\n\n// Deprecated\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\n// Check sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Initialize with the default document\nsetDocument();\n\n// Always assume the presence of duplicates if sort doesn't\n// pass them to our comparison function (as in Google Chrome).\n[0, 0].sort( sortOrder );\nsupport.detectDuplicates = hasDuplicate;\n\n// EXPOSE\n/*if ( typeof define === \"function\" && define.amd ) {\n\tdefine(function() { return Sizzle; });\n} else {\n\twindow.Sizzle = Sizzle;\n}*/\n// EXPOSE\n\n/**\n * @namespace Ink.Dom.Selector\n * @static\n */\n\n/**\n * Alias for the Sizzle selector engine\n *\n * @method select\n * @param {String} selector CSS selector to search for elements\n * @param {DOMElement} [context] By default the search is done in the document element. However, you can specify an element as search context\n * @param {Array} [results] By default this is considered an empty array. But if you want to merge it with other searches you did, pass their result array through here.\n * @return {Array} Array of resulting DOM Elements\n * @sample Ink_Dom_Selector_select.html\n */\n\n/**\n * Filters elements that match a CSS selector.\n *\n * @method matches\n * @param {String} selector CSS selector to search for elements\n * @param {Array} matches Elements to be 'matched' with\n * @return {Array} Elements that matched\n * @sample Ink_Dom_Selector_matches.html\n */\n\n/**\n * Checks if an element matches a given selector\n *\n * @method matchesSelector\n * @param {DOMElement} element Element to test\n * @param {String} selector CSS selector to test the element with\n * @return {Boolean} True if element matches the CSS selector\n * @sample Ink_Dom_Selector_matchesSelector.html \n */\n\nreturn {\n select: Sizzle,\n matches: Sizzle.matches,\n matchesSelector: Sizzle.matchesSelector\n};\n\n\n}); //( window );\n","/**\n * Array Utilities\n * @module Ink.Util.Array_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Array', '1', [], function() {\n\n 'use strict';\n\n var arrayProto = Array.prototype;\n\n /**\n * @namespace Ink.Util.Array_1\n */\n\n var InkArray = {\n\n /**\n * Checks if a value is an array\n *\n * @method isArray\n * @param {Mixed} testedObject The object we want to check\n * @return {Boolean} Whether the given value is a javascript Array.\n **/\n isArray: Array.isArray || function (testedObject) {\n return {}.toString.call(testedObject) === '[object Array]';\n },\n\n /**\n * Loops through an array, grouping similar items together.\n * @method groupBy\n * @param {Array} arr The input array.\n * @param {Object} [options] Options object, containing:\n * @param {Function} [options.key] A function which computes the group key by which the items are grouped.\n * @param {Boolean} [options.pairs] Set to `true` if you want to output an array of `[key, [group...]]` pairs instead of an array of groups.\n * @return {Array} An array containing arrays of chunks.\n *\n * @example\n * InkArray.groupBy([1, 1, 2, 2, 3, 1]) // -> [ [1, 1], [2, 2], [3], [1] ]\n * InkArray.groupBy([1.1, 1.2, 2.1], { key: Math.floor }) // -> [ [1.1, 1.2], [2.1] ]\n * InkArray.groupBy([1.1, 1.2, 2.1], { key: Math.floor, pairs: true }) // -> [ [1, [1.1, 1.2]], [2, [2.1]] ]\n *\n **/\n groupBy: function (arr, options) {\n options = options || {};\n var ret = [];\n var latestGroup;\n function eq(a, b) {\n return outKey(a) === outKey(b);\n }\n function outKey(item) {\n if (typeof options.key === 'function') {\n return options.key(item);\n } else {\n return item;\n }\n }\n\n for (var i = 0, len = arr.length; i < len; i++) {\n latestGroup = [arr[i]];\n\n // Chunkin'\n while ((i + 1 < len) && eq(arr[i], arr[i + 1])) {\n latestGroup.push(arr[i + 1]);\n i++;\n }\n\n if (options.pairs) {\n ret.push([outKey(arr[i]), latestGroup]);\n } else {\n ret.push(latestGroup);\n }\n }\n return ret;\n },\n\n /**\n * Replacement for Array.prototype.reduce.\n *\n * Uses Array.prototype.reduce if available.\n *\n * Produces a single result from a list of values by calling an \"aggregator\" function.\n *\n * Falls back to Array.prototype.reduce if available.\n *\n * @method reduce\n * @param {Array} array Input array to be reduced.\n * @param {Function} callback `function (previousValue, currentValue, index, all) { return {Mixed} }` to execute for each value.\n * @param {Mixed} initial Object used as the first argument to the first call of `callback`\n * @return {Mixed} Reduced array.\n *\n * @example\n * var sum = InkArray.reduce([1, 2, 3], function (a, b) { return a + b; }); // -> 6\n */\n reduce: function (array, callback, initial) {\n if (arrayProto.reduce) {\n return arrayProto.reduce.apply(array, arrayProto.slice.call(arguments, 1));\n }\n\n // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Polyfill\n var t = Object( array ), len = t.length >>> 0, k = 0, value;\n if ( arguments.length >= 3 ) {\n value = initial;\n } else {\n while ( k < len && !(k in t) ) k++;\n if ( k >= len )\n throw new TypeError('Reduce of empty array with no initial value');\n value = t[ k++ ];\n }\n for ( ; k < len ; k++ ) {\n if ( k in t ) {\n value = callback( value, t[k], k, t );\n }\n }\n return value;\n },\n\n /**\n * Checks if a value exists in array\n *\n * @method inArray\n * @public\n * @static\n * @param {Mixed} value Value to check\n * @param {Array} arr Array to search in\n * @return {Boolean} True if value exists in the array\n * @sample Ink_Util_Array_inArray.html\n */\n inArray: function(value, arr) {\n if (typeof arr === 'object') {\n for (var i = 0, f = arr.length; i < f; ++i) {\n if (arr[i] === value) {\n return true;\n }\n }\n }\n return false;\n },\n\n /**\n * Sorts an array of objects by an object property\n *\n * @method sortMulti\n * @param {Array} arr Array of objects to sort\n * @param {String} key Property to sort by\n * @return {Array|Boolean} False if it's not an array, returns a sorted array if it's an array.\n * @public\n * @static\n * @sample Ink_Util_Array_sortMulti.html\n */\n sortMulti: function(arr, key) {\n if (typeof arr === 'undefined' || arr.constructor !== Array) { return false; }\n if (typeof key !== 'string') { return arr.sort(); }\n if (arr.length > 0) {\n if (typeof(arr[0][key]) === 'undefined') { return false; }\n arr.sort(function(a, b){\n var x = a[key];\n var y = b[key];\n return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n });\n }\n return arr;\n },\n\n /**\n * Gets the indexes of a value in an array\n *\n * @method keyValue\n * @param {String} value Value to search for.\n * @param {Array} arr Array to run the search in.\n * @param {Boolean} [first] Flag to stop the search at the first match. It also returns an index number instead of an array of indexes.\n * @return {Boolean|Number|Array} False for no matches. Array of matches or first match index.\n * @public\n * @static\n * @sample Ink_Util_Array_keyValue.html\n */\n keyValue: function(value, arr, first) {\n if (typeof value !== 'undefined' && typeof arr === 'object' && this.inArray(value, arr)) {\n var aKeys = [];\n for (var i = 0, f = arr.length; i < f; ++i) {\n if (arr[i] === value) {\n if (typeof first !== 'undefined' && first === true) {\n return i;\n } else {\n aKeys.push(i);\n }\n }\n }\n return aKeys;\n }\n return false;\n },\n\n /**\n * Shuffles an array.\n *\n * @method shuffle\n * @param {Array} arr Array to shuffle\n * @return {Array|Boolean} Shuffled Array or false if not an array.\n * @public\n * @static\n * @sample Ink_Util_Array_shuffle.html\n */\n shuffle: function(arr) {\n if (typeof(arr) !== 'undefined' && arr.constructor !== Array) { return false; }\n var total = arr.length,\n tmp1 = false,\n rnd = false;\n\n while (total--) {\n rnd = Math.floor(Math.random() * (total + 1));\n tmp1 = arr[total];\n arr[total] = arr[rnd];\n arr[rnd] = tmp1;\n }\n return arr;\n },\n\n /**\n * Runs a function through each of the elements of an array.\n *\n * Uses Array.prototype.forEach if available.\n *\n * @method forEach\n * @param {Array} array The array to be cycled/iterated\n * @param {Function} callback The function receives as arguments the value, index and array.\n * @param {Mixed} context The value of `this` inside the `callback` you passed.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Array_forEach.html\n */\n forEach: function(array, callback, context) {\n if (arrayProto.forEach) {\n return arrayProto.forEach.call(array, callback, context);\n }\n for (var i = 0, len = array.length >>> 0; i < len; i++) {\n callback.call(context, array[i], i, array);\n }\n },\n\n /**\n * Alias for backwards compatibility. See forEach\n *\n * @method each\n * @param {Mixed} [forEachArguments] (see forEach)\n * @return {void} (see forEach)\n */\n each: function () {\n InkArray.forEach.apply(InkArray, arrayProto.slice.call(arguments));\n },\n\n /**\n * Runs a function for each item in the array.\n * Uses Array.prototype.map if available.\n * That function will receive each item as an argument and its return value will change the corresponding array item.\n * @method map\n * @param {Array} array The array to map over\n * @param {Function} mapFn The map function. Will take `(item, index, array)` as arguments and the `this` value will be the `context` argument you pass to this function.\n * @param {Object} [context] Object to be `this` in the map function.\n * @return {Array} A copy of the original array, with all of its items processed by the map function.\n *\n * @sample Ink_Util_Array_map.html\n */\n map: function (array, mapFn, context) {\n if (arrayProto.map) {\n return arrayProto.map.call(array, mapFn, context);\n }\n var mapped = new Array(len);\n for (var i = 0, len = array.length >>> 0; i < len; i++) {\n mapped[i] = mapFn.call(context, array[i], i, array);\n }\n return mapped;\n },\n\n /**\n * Filters an array based on a truth test.\n * This method runs a test function on all the array values and returns a new array with all the values that pass the test.\n * @method filter\n * @param {Array} array The array to filter\n * @param {Function} test A test function taking `(item, index, array)`\n * @param {Object} [context] Object to be `this` in the test function.\n * @return {Array} Returns the filtered array\n *\n * @sample Ink_Util_Array_filter.html\n */\n filter: function (array, test, context) {\n if (arrayProto.filter) {\n return arrayProto.filter.call(array, test, context);\n }\n var filtered = [],\n val = null;\n for (var i = 0, len = array.length; i < len; i++) {\n val = array[i]; // it might be mutated\n if (test.call(context, val, i, array)) {\n filtered.push(val);\n }\n }\n return filtered;\n },\n\n /**\n * Checks if some element in the array passes a truth test\n *\n * @method some\n * @param {Array} arr The array to iterate through\n * @param {Function} cb The callback to be called on the array's elements. It receives the value, the index and the array as arguments.\n * @param {Object} context Object of the callback function\n * @return {Boolean} True if the callback returns true at any point, false otherwise\n * @public\n * @static\n * @sample Ink_Util_Array_some.html\n */\n some: function(arr, cb, context){\n\n if (arr === null){\n throw new TypeError('First argument is invalid.');\n }\n\n var t = Object(arr);\n var len = t.length >>> 0;\n if (typeof cb !== \"function\"){ throw new TypeError('Second argument must be a function.'); }\n\n for (var i = 0; i < len; i++) {\n if (i in t && cb.call(context, t[i], i, t)){ return true; }\n }\n\n return false;\n },\n\n /**\n * Compares the values of two arrays and return the matches\n *\n * @method intersect\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n * @return {Array} Empty array if one of the arrays is false (or do not intersect) | Array with the intersected values\n * @public\n * @static\n * @sample Ink_Util_Array_intersect.html\n */\n intersect: function(arr1, arr2) {\n if (!arr1 || !arr2 || arr1 instanceof Array === false || arr2 instanceof Array === false) {\n return [];\n }\n\n var shared = [];\n for (var i = 0, I = arr1.length; i 0) {\n for (x = start; x < stop; x += step) {\n r.push(x);\n }\n } else {\n for (x = start; x > stop; x += step) {\n r.push(x);\n }\n }\n\n return r;\n },\n\n /**\n * Inserts a value on a specified index\n *\n * @method insert\n * @param {Array} arr Array where the value will be inserted\n * @param {Number} idx Index of the array where the value should be inserted\n * @param {Mixed} value Value to be inserted\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Array_insert.html\n */\n insert: function(arr, idx, value) {\n arr.splice(idx, 0, value);\n },\n\n /**\n * Removes a range of values from the array\n *\n * @method remove\n * @param {Array} arr Array where the value will be removed\n * @param {Number} from Index of the array where the removal will start removing.\n * @param {Number} rLen Number of items to be removed from the index onwards.\n * @return {Array} An array with the remaining values\n * @public\n * @static\n * @sample Ink_Util_Array_remove.html\n */\n remove: function(arr, from, rLen){\n var output = [];\n\n for(var i = 0, iLen = arr.length; i < iLen; i++){\n if(i >= from && i < from + rLen){\n continue;\n }\n\n output.push(arr[i]);\n }\n\n return output;\n }\n };\n\n return InkArray;\n\n});\n","/**\n * Binary Packing algorithm implementation\n * @module Ink.Util.BinPack_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.BinPack', '1', [], function() {\n\n 'use strict';\n\n /*jshint boss:true */\n\n // https://github.com/jakesgordon/bin-packing/\n\n /*\n Copyright (c) 2011, 2012, 2013 Jake Gordon and contributors\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\n\n\n var Packer = function(w, h) {\n this.init(w, h);\n };\n\n Packer.prototype = {\n\n init: function(w, h) {\n this.root = { x: 0, y: 0, w: w, h: h };\n },\n\n fit: function(blocks) {\n var n, node, block;\n for (n = 0; n < blocks.length; ++n) {\n block = blocks[n];\n if (node = this.findNode(this.root, block.w, block.h)) {\n block.fit = this.splitNode(node, block.w, block.h);\n }\n }\n },\n\n findNode: function(root, w, h) {\n if (root.used) {\n return this.findNode(root.right, w, h) || this.findNode(root.down, w, h);\n }\n else if ((w <= root.w) && (h <= root.h)) {\n return root;\n }\n else {\n return null;\n }\n },\n\n splitNode: function(node, w, h) {\n node.used = true;\n node.down = { x: node.x, y: node.y + h, w: node.w, h: node.h - h };\n node.right = { x: node.x + w, y: node.y, w: node.w - w, h: h };\n return node;\n }\n\n };\n\n\n\n var GrowingPacker = function() {};\n\n GrowingPacker.prototype = {\n\n fit: function(blocks) {\n var n, node, block, len = blocks.length;\n var w = len > 0 ? blocks[0].w : 0;\n var h = len > 0 ? blocks[0].h : 0;\n this.root = { x: 0, y: 0, w: w, h: h };\n for (n = 0; n < len ; n++) {\n block = blocks[n];\n if (node = this.findNode(this.root, block.w, block.h)) {\n block.fit = this.splitNode(node, block.w, block.h);\n }\n else {\n block.fit = this.growNode(block.w, block.h);\n }\n }\n },\n\n findNode: function(root, w, h) {\n if (root.used) {\n return this.findNode(root.right, w, h) || this.findNode(root.down, w, h);\n }\n else if ((w <= root.w) && (h <= root.h)) {\n return root;\n }\n else {\n return null;\n }\n },\n\n splitNode: function(node, w, h) {\n node.used = true;\n node.down = { x: node.x, y: node.y + h, w: node.w, h: node.h - h };\n node.right = { x: node.x + w, y: node.y, w: node.w - w, h: h };\n return node;\n },\n\n growNode: function(w, h) {\n var canGrowDown = (w <= this.root.w);\n var canGrowRight = (h <= this.root.h);\n\n var shouldGrowRight = canGrowRight && (this.root.h >= (this.root.w + w)); // attempt to keep square-ish by growing right when height is much greater than width\n var shouldGrowDown = canGrowDown && (this.root.w >= (this.root.h + h)); // attempt to keep square-ish by growing down when width is much greater than height\n\n if (shouldGrowRight) {\n return this.growRight(w, h);\n }\n else if (shouldGrowDown) {\n return this.growDown(w, h);\n }\n else if (canGrowRight) {\n return this.growRight(w, h);\n }\n else if (canGrowDown) {\n return this.growDown(w, h);\n }\n else {\n return null; // need to ensure sensible root starting size to avoid this happening\n }\n },\n\n growRight: function(w, h) {\n this.root = {\n used: true,\n x: 0,\n y: 0,\n w: this.root.w + w,\n h: this.root.h,\n down: this.root,\n right: { x: this.root.w, y: 0, w: w, h: this.root.h }\n };\n var node;\n if (node = this.findNode(this.root, w, h)) {\n return this.splitNode(node, w, h);\n }\n else {\n return null;\n }\n },\n\n growDown: function(w, h) {\n this.root = {\n used: true,\n x: 0,\n y: 0,\n w: this.root.w,\n h: this.root.h + h,\n down: { x: 0, y: this.root.h, w: this.root.w, h: h },\n right: this.root\n };\n var node;\n if (node = this.findNode(this.root, w, h)) {\n return this.splitNode(node, w, h);\n }\n else {\n return null;\n }\n }\n\n };\n\n\n\n var sorts = {\n random: function() { return Math.random() - 0.5; },\n w: function(a, b) { return b.w - a.w; },\n h: function(a, b) { return b.h - a.h; },\n a: function(a, b) { return b.area - a.area; },\n max: function(a, b) { return Math.max(b.w, b.h) - Math.max(a.w, a.h); },\n min: function(a, b) { return Math.min(b.w, b.h) - Math.min(a.w, a.h); },\n height: function(a, b) { return sorts.msort(a, b, ['h', 'w']); },\n width: function(a, b) { return sorts.msort(a, b, ['w', 'h']); },\n area: function(a, b) { return sorts.msort(a, b, ['a', 'h', 'w']); },\n maxside: function(a, b) { return sorts.msort(a, b, ['max', 'min', 'h', 'w']); },\n msort: function(a, b, criteria) { /* sort by multiple criteria */\n var diff, n;\n for (n = 0; n < criteria.length; ++n) {\n diff = sorts[ criteria[n] ](a, b);\n if (diff !== 0) {\n return diff;\n }\n }\n return 0;\n }\n };\n\n\n\n // end of Jake's code\n\n\n\n // aux, used to display blocks in unfitted property\n var toString = function() {\n return [this.w, ' x ', this.h].join('');\n };\n\n\n\n /**\n * Binary Packing algorithm implementation\n *\n * Based on the work of Jake Gordon\n *\n * see https://github.com/jakesgordon/bin-packing/\n *\n * @namespace Ink.Util.BinPack\n * @version 1\n * @static\n */\n var BinPack = {\n\n /**\n * @method binPack\n * @param {Object} o Options\n * @param {Array} o.blocks Array of items with width and height integer attributes.\n * @param {Array} [o.dimensions] Flag to fix container dimensions\n * @param {String} [o.sorter] Sorting function. One of: random, height, width, area, maxside\n * @return {Object} Returns an object containing container dimensions, filled ratio, fitted blocks, unfitted blocks and all blocks\n * @static\n */\n binPack: function(o) {\n var i, f, bl;\n\n\n\n // calculate area if not there already\n for (i = 0, f = o.blocks.length; i < f; ++i) {\n bl = o.blocks[i];\n if (! ('area' in bl) ) {\n bl.area = bl.w * bl.h;\n }\n }\n\n\n\n // apply algorithm\n var packer = o.dimensions ? new Packer(o.dimensions[0], o.dimensions[1]) : new GrowingPacker();\n\n if (!o.sorter) { o.sorter = 'maxside'; }\n\n o.blocks.sort( sorts[ o.sorter ] );\n\n packer.fit(o.blocks);\n\n var dims2 = [packer.root.w, packer.root.h];\n\n\n\n // layout is done here, generating report data...\n var fitted = [];\n var unfitted = [];\n\n for (i = 0, f = o.blocks.length; i < f; ++i) {\n bl = o.blocks[i];\n if (bl.fit) {\n fitted.push(bl);\n }\n else {\n bl.toString = toString; // TO AID SERIALIZATION\n unfitted.push(bl);\n }\n }\n\n var area = dims2[0] * dims2[1];\n var fit = 0;\n for (i = 0, f = fitted.length; i < f; ++i) {\n bl = fitted[i];\n fit += bl.area;\n }\n\n return {\n dimensions: dims2,\n filled: fit / area,\n blocks: o.blocks,\n fitted: fitted,\n unfitted: unfitted\n };\n }\n };\n\n\n\n return BinPack;\n\n});","/**\n * Cookie Utilities\n * @module Ink.Util.Cookie_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Cookie', '1', [], function() {\n 'use strict';\n\n /**\n * @namespace Ink.Util.Cookie_1\n */\n var Cookie = {\n\n /**\n * Gets an object with the current page cookies, or a specific cookie if you specify the `name`.\n *\n * @method get\n * @param {String} [name] The cookie name.\n * @return {String|Object} If the name is specified, it returns the value of that key. Otherwise it returns the full cookie object\n * @public\n * @static\n * @sample Ink_Util_Cookie_get.html\n */\n get: function(name)\n {\n var cookie = document.cookie || false;\n\n var _Cookie = {};\n\n if(cookie) {\n cookie = cookie.replace(new RegExp(\"; \", \"g\"), ';');\n\n var aCookie = cookie.split(';');\n var aItem = [];\n if(aCookie.length > 0) {\n for(var i=0; i < aCookie.length; i++) {\n aItem = aCookie[i].split('=');\n if(aItem.length === 2) {\n _Cookie[aItem[0]] = decodeURIComponent(aItem[1]);\n }\n }\n }\n if(name) {\n if(typeof(_Cookie[name]) !== 'undefined') {\n return _Cookie[name];\n } else {\n return null;\n }\n }\n }\n return _Cookie;\n },\n\n /**\n * Sets a cookie.\n *\n * @method set\n * @param {String} name Cookie name.\n * @param {String} value Cookie value.\n * @param {Number} [expires] Number of seconds the cookie will be valid for.\n * @param {String} [path] Path for the cookie. Defaults to '/'.\n * @param {String} [domain] Domain for the cookie. Defaults to current hostname.\n * @param {Boolean} [secure] Flag for secure. Default 'false'.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Cookie_set.html\n */\n set: function(name, value, expires, path, domain, secure)\n {\n var sName;\n if(!name || value===false || typeof(name) === 'undefined' || typeof(value) === 'undefined') {\n return false;\n } else {\n sName = name+'='+encodeURIComponent(value);\n }\n var sExpires = false;\n var sPath = false;\n var sDomain = false;\n var sSecure = false;\n\n if(expires && typeof(expires) !== 'undefined' && !isNaN(expires)) {\n var oDate = new Date();\n var sDate = (parseInt(Number(oDate.valueOf()), 10) + (Number(parseInt(expires, 10)) * 1000));\n\n var nDate = new Date(sDate);\n var expiresString = nDate.toGMTString();\n\n var re = new RegExp(\"([^\\\\s]+)(\\\\s\\\\d\\\\d)\\\\s(\\\\w\\\\w\\\\w)\\\\s(.*)\");\n expiresString = expiresString.replace(re, \"$1$2-$3-$4\");\n\n sExpires = 'expires='+expiresString;\n } else {\n if(typeof(expires) !== 'undefined' && !isNaN(expires) && Number(parseInt(expires, 10))===0) {\n sExpires = '';\n } else {\n sExpires = 'expires=Thu, 01-Jan-2037 00:00:01 GMT';\n }\n }\n\n if(path && typeof(path) !== 'undefined') {\n sPath = 'path='+path;\n } else {\n sPath = 'path=/';\n }\n\n if(domain) {\n sDomain = 'domain='+domain;\n } else if (/\\./.test(window.location.hostname)) {\n // When trying to set domain=localhost or any other domain\n // without dots, setting the cookie fails.\n // Anyways, the cookies are bound to the current domain by default so let it be.\n sDomain = 'domain='+window.location.hostname;\n }\n\n if(secure && typeof(secure) !== 'undefined') {\n sSecure = secure;\n } else {\n sSecure = false;\n }\n\n document.cookie = sName +\n '; ' + sExpires +\n '; ' + sPath +\n (sDomain ? '; ' + sDomain : '') +\n '; ' + sSecure;\n },\n\n /**\n * Deletes a cookie.\n *\n * @method remove\n * @param {String} cookieName Cookie name.\n * @param {String} [path] Path of the cookie. Defaults to '/'.\n * @param {String} [domain] Domain of the cookie. Defaults to current hostname.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Cookie_remove.html\n */\n remove: function(cookieName, path, domain) {\n var expiresDate = -1;\n\n this.set(cookieName, 'deleted', expiresDate, path, domain);\n }\n };\n\n return Cookie;\n\n});\n","/**\n * Date utility functions\n * @module Ink.Util.Date_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Date', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Date_1 \n */\n var InkDate = {\n\n /**\n * Function that returns the string representation of the month [PT only]\n *\n * @method _months\n * @param {Number} index Month javascript (0 to 11)\n * @return {String} The month's name\n * @private\n * @static\n * @example\n * console.log( InkDate._months(0) ); // Result: Janeiro\n */\n _months: function(index){\n var _m = ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];\n return _m[index];\n },\n\n /**\n * Function that returns the month [PT only] ( 0 to 11 )\n *\n * @method _iMonth\n * @param {String} month Month javascript (0 to 11)\n * @return {Number} The month's number\n * @private\n * @static\n * @example\n * console.log( InkDate._iMonth('maio') ); // Result: 4\n */\n _iMonth : function( month )\n {\n if ( Number( month ) ) { return +month - 1; }\n return {\n 'janeiro' : 0 ,\n 'jan' : 0 ,\n 'fevereiro' : 1 ,\n 'fev' : 1 ,\n 'março' : 2 ,\n 'mar' : 2 ,\n 'abril' : 3 ,\n 'abr' : 3 ,\n 'maio' : 4 ,\n 'mai' : 4 ,\n 'junho' : 5 ,\n 'jun' : 5 ,\n 'julho' : 6 ,\n 'jul' : 6 ,\n 'agosto' : 7 ,\n 'ago' : 7 ,\n 'setembro' : 8 ,\n 'set' : 8 ,\n 'outubro' : 9 ,\n 'out' : 9 ,\n 'novembro' : 10 ,\n 'nov' : 10 ,\n 'dezembro' : 11 ,\n 'dez' : 11\n }[ month.toLowerCase( ) ];\n } ,\n\n /**\n * Function that returns the representation the day of the week [PT Only]\n *\n * @method _wDays\n * @param {Number} index Week's day index\n * @return {String} The week's day name\n * @private\n * @static\n * @example\n * console.log( InkDate._wDays(0) ); // Result: Domingo\n */\n _wDays: function(index){\n var _d = ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'];\n return _d[index];\n },\n\n /**\n * Function that returns day of the week in javascript 1 to 7\n *\n * @method _iWeek\n * @param {String} week Week's day name\n * @return {Number} The week's day index\n * @private\n * @static\n * @example\n * console.log( InkDate._iWeek('quarta') ); // Result: 3\n */\n _iWeek: function( week )\n {\n if ( Number( week ) ) { return +week || 7; }\n return {\n 'segunda' : 1 ,\n 'seg' : 1 ,\n 'terça' : 2 ,\n 'ter' : 2 ,\n 'quarta' : 3 ,\n 'qua' : 3 ,\n 'quinta' : 4 ,\n 'qui' : 4 ,\n 'sexta' : 5 ,\n 'sex' : 5 ,\n 'sábado' : 6 ,\n 'sáb' : 6 ,\n 'domingo' : 7 ,\n 'dom' : 7\n }[ week.toLowerCase( ) ];\n },\n\n /**\n * Function that returns the number of days of a given month (m) on a given year (y)\n *\n * @method _daysInMonth\n * @param {Number} _m Month\n * @param {Number} _y Year\n * @return {Number} Number of days of a give month on a given year\n * @private\n * @static\n * @example\n * console.log( InkDate._daysInMonth(2,2013) ); // Result: 28\n */\n _daysInMonth: function(_m,_y){\n var nDays;\n\n if(_m===1 || _m===3 || _m===5 || _m===7 || _m===8 || _m===10 || _m===12)\n {\n nDays= 31;\n }\n else if ( _m===4 || _m===6 || _m===9 || _m===11)\n {\n nDays = 30;\n }\n else\n {\n if((_y%400===0) || (_y%4===0 && _y%100!==0))\n {\n nDays = 29;\n }\n else\n {\n nDays = 28;\n }\n }\n return nDays;\n },\n\n /**\n * Formats a date object.\n * This works exactly as php date() function. http://php.net/manual/en/function.date.php\n *\n * @method get\n * @param {String} format The format in which the date it will be formatted.\n * @param {Date} [_date] The date to format. Can receive unix timestamp or a date object. Defaults to current time.\n * @return {String} Formatted date\n * @public\n * @static\n * @sample Ink_Util_Date_get.html \n */\n get: function(format, _date){\n /*jshint maxcomplexity:65 */\n if(typeof(format) === 'undefined' || format === ''){\n format = \"Y-m-d\";\n }\n\n\n var iFormat = format.split(\"\");\n var result = new Array(iFormat.length);\n var escapeChar = \"\\\\\";\n var jsDate;\n\n if (typeof(_date) === 'undefined'){\n jsDate = new Date();\n } else if (typeof(_date)==='number'){\n jsDate = new Date(_date*1000);\n } else {\n jsDate = new Date(_date);\n }\n\n var jsFirstDay, jsThisDay, jsHour;\n /* This switch is presented in the same order as in php date function (PHP 5.2.2) */\n for (var i = 0; i < iFormat.length; i++) {\n switch(iFormat[i]) {\n case escapeChar:\n result[i] = iFormat[i+1];\n i++;\n break;\n\n\n /* DAY */\n case \"d\": /* Day of the month, 2 digits with leading zeros; ex: 01 to 31 */\n var jsDay = jsDate.getDate();\n result[i] = (String(jsDay).length > 1) ? jsDay : \"0\" + jsDay;\n break;\n\n case \"D\": /* A textual representation of a day, three letters; Seg to Dom */\n result[i] = this._wDays(jsDate.getDay()).substring(0, 3);\n break;\n\n case \"j\": /* Day of the month without leading zeros; ex: 1 to 31 */\n result[i] = jsDate.getDate();\n break;\n\n case \"l\": /* A full textual representation of the day of the week; Domingo to Sabado */\n result[i] = this._wDays(jsDate.getDay());\n break;\n\n case \"N\": /* ISO-8601 numeric representation of the day of the week; 1 (Segunda) to 7 (Domingo) */\n result[i] = jsDate.getDay() || 7;\n break;\n\n case \"S\": /* English ordinal suffix for the day of the month, 2 characters; st, nd, rd or th. Works well with j */\n var temp = jsDate.getDate();\n var suffixes = [\"st\", \"nd\", \"rd\"];\n var suffix = \"\";\n\n if (temp >= 11 && temp <= 13) {\n result[i] = \"th\";\n } else {\n result[i] = (suffix = suffixes[String(temp).substr(-1) - 1]) ? (suffix) : (\"th\");\n }\n break;\n\n case \"w\": /* Numeric representation of the day of the week; 0 (for Sunday) through 6 (for Saturday) */\n result[i] = jsDate.getDay();\n break;\n\n case \"z\": /* The day of the year (starting from 0); 0 to 365 */\n jsFirstDay = Date.UTC(jsDate.getFullYear(), 0, 0);\n jsThisDay = Date.UTC(jsDate.getFullYear(), jsDate.getMonth(), jsDate.getDate());\n result[i] = Math.floor((jsThisDay - jsFirstDay) / (1000 * 60 * 60 * 24));\n break;\n\n /* WEEK */\n case \"W\": /* ISO-8601 week number of year, weeks starting on Monday; ex: 42 (the 42nd week in the year) */\n var jsYearStart = new Date( jsDate.getFullYear( ) , 0 , 1 );\n jsFirstDay = jsYearStart.getDay() || 7;\n\n var days = Math.floor( ( jsDate - jsYearStart ) / ( 24 * 60 * 60 * 1000 ) + 1 );\n\n result[ i ] = Math.ceil( ( days - ( 8 - jsFirstDay ) ) / 7 ) + 1;\n break;\n\n\n /* MONTH */\n case \"F\": /* A full textual representation of a month, such as Janeiro or Marco; Janeiro a Dezembro */\n result[i] = this._months(jsDate.getMonth());\n break;\n\n case \"m\": /* Numeric representation of a month, with leading zeros; 01 to 12 */\n var jsMonth = String(jsDate.getMonth() + 1);\n result[i] = (jsMonth.length > 1) ? jsMonth : \"0\" + jsMonth;\n break;\n\n case \"M\": /* A short textual representation of a month, three letters; Jan a Dez */\n result[i] = this._months(jsDate.getMonth()).substring(0,3);\n break;\n\n case \"n\": /* Numeric representation of a month, without leading zeros; 1 a 12 */\n result[i] = jsDate.getMonth() + 1;\n break;\n\n case \"t\": /* Number of days in the given month; ex: 28 */\n result[i] = this._daysInMonth(jsDate.getMonth()+1,jsDate.getYear());\n break;\n\n /* YEAR */\n case \"L\": /* Whether it's a leap year; 1 if it is a leap year, 0 otherwise. */\n var jsYear = jsDate.getFullYear();\n result[i] = (jsYear % 4) ? false : ( (jsYear % 100) ? true : ( (jsYear % 400) ? false : true ) );\n break;\n\n case \"o\": /* ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. */\n throw '\"o\" not implemented!';\n\n case \"Y\": /* A full numeric representation of a year, 4 digits; 1999 */\n result[i] = jsDate.getFullYear();\n break;\n\n case \"y\": /* A two digit representation of a year; 99 */\n result[i] = String(jsDate.getFullYear()).substring(2);\n break;\n\n /* TIME */\n case \"a\": /* Lowercase Ante meridiem and Post meridiem; am or pm */\n result[i] = (jsDate.getHours() < 12) ? \"am\" : \"pm\";\n break;\n\n case \"A\": /* Uppercase Ante meridiem and Post meridiem; AM or PM */\n result[i] = (jsDate.getHours < 12) ? \"AM\" : \"PM\";\n break;\n\n case \"B\": /* Swatch Internet time; 000 through 999 */\n throw '\"B\" not implemented!';\n\n case \"g\": /* 12-hour format of an hour without leading zeros; 1 to 12 */\n jsHour = jsDate.getHours();\n result[i] = (jsHour <= 12) ? jsHour : (jsHour - 12);\n break;\n\n case \"G\": /* 24-hour format of an hour without leading zeros; 1 to 23 */\n result[i] = String(jsDate.getHours());\n break;\n\n case \"h\": /* 12-hour format of an hour with leading zeros; 01 to 12 */\n jsHour = String(jsDate.getHours());\n jsHour = (jsHour <= 12) ? jsHour : (jsHour - 12);\n result[i] = (jsHour.length > 1) ? jsHour : \"0\" + jsHour;\n break;\n\n case \"H\": /* 24-hour format of an hour with leading zeros; 01 to 24 */\n jsHour = String(jsDate.getHours());\n result[i] = (jsHour.length > 1) ? jsHour : \"0\" + jsHour;\n break;\n\n case \"i\": /* Minutes with leading zeros; 00 to 59 */\n var jsMinute = String(jsDate.getMinutes());\n result[i] = (jsMinute.length > 1) ? jsMinute : \"0\" + jsMinute;\n break;\n\n case \"s\": /* Seconds with leading zeros; 00 to 59; */\n var jsSecond = String(jsDate.getSeconds());\n result[i] = (jsSecond.length > 1) ? jsSecond : \"0\" + jsSecond;\n break;\n\n case \"u\": /* Microseconds */\n throw '\"u\" not implemented!';\n\n\n /* TIMEZONE */\n\n case \"e\": /* Timezone identifier */\n throw '\"e\" not implemented!';\n\n case \"I\": /* \"1\" if Daylight Savings Time, \"0\" otherwise. Works only on the northern hemisphere */\n jsFirstDay = new Date(jsDate.getFullYear(), 0, 1);\n result[i] = (jsDate.getTimezoneOffset() !== jsFirstDay.getTimezoneOffset()) ? (1) : (0);\n break;\n\n case \"O\": /* Difference to Greenwich time (GMT) in hours */\n var jsMinZone = jsDate.getTimezoneOffset();\n var jsMinutes = jsMinZone % 60;\n jsHour = String(((jsMinZone - jsMinutes) / 60) * -1);\n\n if (jsHour.charAt(0) !== \"-\") {\n jsHour = \"+\" + jsHour;\n }\n\n jsHour = (jsHour.length === 3) ? (jsHour) : (jsHour.replace(/([+\\-])(\\d)/, \"$1\" + 0 + \"$2\"));\n result[i] = jsHour + jsMinutes + \"0\";\n break;\n\n case \"P\": /* Difference to Greenwich time (GMT) with colon between hours and minutes */\n throw '\"P\" not implemented!';\n\n case \"T\": /* Timezone abbreviation */\n throw '\"T\" not implemented!';\n\n case \"Z\": /* Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. */\n result[i] = jsDate.getTimezoneOffset() * 60;\n break;\n\n\n /* FULL DATE/TIME */\n\n case \"c\": /* ISO 8601 date */\n throw '\"c\" not implemented!';\n\n case \"r\": /* RFC 2822 formatted date */\n var jsDayName = this._wDays(jsDate.getDay()).substr(0, 3);\n var jsMonthName = this._months(jsDate.getMonth()).substr(0, 3);\n result[i] = jsDayName + \", \" + jsDate.getDate() + \" \" + jsMonthName + this.get(\" Y H:i:s O\",jsDate);\n break;\n\n case \"U\": /* Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) */\n result[i] = Math.floor(jsDate.getTime() / 1000);\n break;\n\n default:\n result[i] = iFormat[i];\n }\n }\n\n return result.join('');\n\n },\n\n /**\n * Creates a date object based on a format string.\n * This works exactly as php date() function. http://php.net/manual/en/function.date.php\n *\n * @method set\n * @param {String} [format] The format in which the date will be formatted. Defaults to 'Y-m-d'\n * @param {String} str_date The date formatted.\n * @return {Date} Date object based on the formatted date and format\n * @public\n * @static\n * @sample Ink_Util_Date_set.html \n */\n set : function( format , str_date ) {\n if ( typeof str_date === 'undefined' ) { return ; }\n if ( typeof format === 'undefined' || format === '' ) { format = \"Y-m-d\"; }\n\n var iFormat = format.split(\"\");\n var result = new Array( iFormat.length );\n var escapeChar = \"\\\\\";\n var mList;\n\n var objIndex = {\n year : undefined ,\n month : undefined ,\n day : undefined ,\n dayY : undefined ,\n dayW : undefined ,\n week : undefined ,\n hour : undefined ,\n hourD : undefined ,\n min : undefined ,\n sec : undefined ,\n msec : undefined ,\n ampm : undefined ,\n diffM : undefined ,\n diffH : undefined ,\n date : undefined\n };\n\n var matches = 0;\n\n /* This switch is presented in the same order as in php date function (PHP 5.2.2) */\n for ( var i = 0; i < iFormat.length; i++) {\n switch( iFormat[ i ] ) {\n case escapeChar:\n result[i] = iFormat[ i + 1 ];\n i++;\n break;\n\n /* DAY */\n case \"d\": /* Day of the month, 2 digits with leading zeros; ex: 01 to 31 */\n result[ i ] = '(\\\\d{2})';\n objIndex.day = { original : i , match : matches++ };\n break;\n\n case \"j\": /* Day of the month without leading zeros; ex: 1 to 31 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.day = { original : i , match : matches++ };\n break;\n\n case \"D\": /* A textual representation of a day, three letters; Seg to Dom */\n result[ i ] = '([\\\\wá]{3})';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"l\": /* A full textual representation of the day of the week; Domingo to Sabado */\n result[i] = '([\\\\wá]{5,7})';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"N\": /* ISO-8601 numeric representation of the day of the week; 1 (Segunda) to 7 (Domingo) */\n result[ i ] = '(\\\\d)';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"w\": /* Numeric representation of the day of the week; 0 (for Sunday) through 6 (for Saturday) */\n result[ i ] = '(\\\\d)';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"S\": /* English ordinal suffix for the day of the month, 2 characters; st, nd, rd or th. Works well with j */\n result[ i ] = '\\\\w{2}';\n break;\n\n case \"z\": /* The day of the year (starting from 0); 0 to 365 */\n result[ i ] = '(\\\\d{1,3})';\n objIndex.dayY = { original : i , match : matches++ };\n break;\n\n /* WEEK */\n case \"W\": /* ISO-8601 week number of year, weeks starting on Monday; ex: 42 (the 42nd week in the year) */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.week = { original : i , match : matches++ };\n break;\n\n /* MONTH */\n case \"F\": /* A full textual representation of a month, such as Janeiro or Marco; Janeiro a Dezembro */\n result[ i ] = '([\\\\wç]{4,9})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"M\": /* A short textual representation of a month, three letters; Jan a Dez */\n result[ i ] = '(\\\\w{3})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"m\": /* Numeric representation of a month, with leading zeros; 01 to 12 */\n result[ i ] = '(\\\\d{2})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"n\": /* Numeric representation of a month, without leading zeros; 1 a 12 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"t\": /* Number of days in the given month; ex: 28 */\n result[ i ] = '\\\\d{2}';\n break;\n\n /* YEAR */\n case \"L\": /* Whether it's a leap year; 1 if it is a leap year, 0 otherwise. */\n result[ i ] = '\\\\w{4,5}';\n break;\n\n case \"o\": /* ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. */\n throw '\"o\" not implemented!';\n\n case \"Y\": /* A full numeric representation of a year, 4 digits; 1999 */\n result[ i ] = '(\\\\d{4})';\n objIndex.year = { original : i , match : matches++ };\n break;\n\n case \"y\": /* A two digit representation of a year; 99 */\n result[ i ] = '(\\\\d{2})';\n if ( typeof objIndex.year === 'undefined' || iFormat[ objIndex.year.original ] !== 'Y' ) {\n objIndex.year = { original : i , match : matches++ };\n }\n break;\n\n /* TIME */\n case \"a\": /* Lowercase Ante meridiem and Post meridiem; am or pm */\n result[ i ] = '(am|pm)';\n objIndex.ampm = { original : i , match : matches++ };\n break;\n\n case \"A\": /* Uppercase Ante meridiem and Post meridiem; AM or PM */\n result[ i ] = '(AM|PM)';\n objIndex.ampm = { original : i , match : matches++ };\n break;\n\n case \"B\": /* Swatch Internet time; 000 through 999 */\n throw '\"B\" not implemented!';\n\n case \"g\": /* 12-hour format of an hour without leading zeros; 1 to 12 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.hourD = { original : i , match : matches++ };\n break;\n\n case \"G\": /* 24-hour format of an hour without leading zeros; 1 to 23 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.hour = { original : i , match : matches++ };\n break;\n\n case \"h\": /* 12-hour format of an hour with leading zeros; 01 to 12 */\n result[ i ] = '(\\\\d{2})';\n objIndex.hourD = { original : i , match : matches++ };\n break;\n\n case \"H\": /* 24-hour format of an hour with leading zeros; 01 to 24 */\n result[ i ] = '(\\\\d{2})';\n objIndex.hour = { original : i , match : matches++ };\n break;\n\n case \"i\": /* Minutes with leading zeros; 00 to 59 */\n result[ i ] = '(\\\\d{2})';\n objIndex.min = { original : i , match : matches++ };\n break;\n\n case \"s\": /* Seconds with leading zeros; 00 to 59; */\n result[ i ] = '(\\\\d{2})';\n objIndex.sec = { original : i , match : matches++ };\n break;\n\n case \"u\": /* Microseconds */\n throw '\"u\" not implemented!';\n\n /* TIMEZONE */\n case \"e\": /* Timezone identifier */\n throw '\"e\" not implemented!';\n\n case \"I\": /* \"1\" if Daylight Savings Time, \"0\" otherwise. Works only on the northern hemisphere */\n result[i] = '\\\\d';\n break;\n\n case \"O\": /* Difference to Greenwich time (GMT) in hours */\n result[ i ] = '([-+]\\\\d{4})';\n objIndex.diffH = { original : i , match : matches++ };\n break;\n\n case \"P\": /* Difference to Greenwich time (GMT) with colon between hours and minutes */\n throw '\"P\" not implemented!';\n\n case \"T\": /* Timezone abbreviation */\n throw '\"T\" not implemented!';\n\n case \"Z\": /* Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. */\n result[ i ] = '(\\\\-?\\\\d{1,5})';\n objIndex.diffM = { original : i , match : matches++ };\n break;\n\n /* FULL DATE/TIME */\n case \"c\": /* ISO 8601 date */\n throw '\"c\" not implemented!';\n\n case \"r\": /* RFC 2822 formatted date */\n result[ i ] = '([\\\\wá]{3}, \\\\d{1,2} \\\\w{3} \\\\d{4} \\\\d{2}:\\\\d{2}:\\\\d{2} [+\\\\-]\\\\d{4})';\n objIndex.date = { original : i , match : matches++ };\n break;\n\n case \"U\": /* Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) */\n result[ i ] = '(\\\\d{1,13})';\n objIndex.date = { original : i , match : matches++ };\n break;\n\n default:\n result[ i ] = iFormat[ i ];\n }\n }\n\n var pattr = new RegExp( result.join('') );\n\n try {\n mList = str_date.match( pattr );\n if ( !mList ) { return; }\n }\n catch ( e ) { return ; }\n\n var _haveDatetime = typeof objIndex.date !== 'undefined';\n\n var _haveYear = typeof objIndex.year !== 'undefined';\n\n var _haveYDay = typeof objIndex.dayY !== 'undefined';\n\n var _haveDay = typeof objIndex.day !== 'undefined';\n var _haveMonth = typeof objIndex.month !== 'undefined';\n var _haveMonthDay = _haveMonth && _haveDay;\n var _haveOnlyDay = !_haveMonth && _haveDay;\n\n var _haveWDay = typeof objIndex.dayW !== 'undefined';\n var _haveWeek = typeof objIndex.week !== 'undefined';\n var _haveWeekWDay = _haveWeek && _haveWDay;\n var _haveOnlyWDay = !_haveWeek && _haveWDay;\n\n var _validDate = _haveYDay || _haveMonthDay || !_haveYear && _haveOnlyDay || _haveWeekWDay || !_haveYear && _haveOnlyWDay;\n var _noDate = !_haveYear && !_haveYDay && !_haveDay && !_haveMonth && !_haveWDay && !_haveWeek;\n\n var _haveHour12 = typeof objIndex.hourD !== 'undefined' && typeof objIndex.ampm !== 'undefined';\n var _haveHour24 = typeof objIndex.hour !== 'undefined';\n var _haveHour = _haveHour12 || _haveHour24;\n\n var _haveMin = typeof objIndex.min !== 'undefined';\n var _haveSec = typeof objIndex.sec !== 'undefined';\n var _haveMSec = typeof objIndex.msec !== 'undefined';\n\n var _haveMoreM = !_noDate || _haveHour;\n var _haveMoreS = _haveMoreM || _haveMin;\n\n var _haveDiffM = typeof objIndex.diffM !== 'undefined';\n var _haveDiffH = typeof objIndex.diffH !== 'undefined';\n //var _haveGMT = _haveDiffM || _haveDiffH;\n var hour;\n var min;\n\n if ( _haveDatetime ) {\n if ( iFormat[ objIndex.date.original ] === 'U' ) {\n return new Date( +mList[ objIndex.date.match + 1 ] * 1000 );\n }\n\n var dList = mList[ objIndex.date.match + 1 ].match( /\\w{3}, (\\d{1,2}) (\\w{3}) (\\d{4}) (\\d{2}):(\\d{2}):(\\d{2}) ([+\\-]\\d{4})/ );\n hour = +dList[ 4 ] + ( +dList[ 7 ].slice( 0 , 3 ) );\n min = +dList[ 5 ] + ( dList[ 7 ].slice( 0 , 1 ) + dList[ 7 ].slice( 3 ) ) / 100 * 60;\n\n return new Date( dList[ 3 ] , this._iMonth( dList[ 2 ] ) , dList[ 1 ] , hour , min , dList[ 6 ] );\n }\n\n var _d = new Date( );\n var year;\n var month;\n var day;\n var sec;\n var msec;\n var gmt;\n\n if ( !_validDate && !_noDate ) { return ; }\n\n if ( _validDate ) {\n if ( _haveYear ) {\n var _y = _d.getFullYear( ) - 50 + '';\n year = mList[ objIndex.year.match + 1 ];\n if ( iFormat[ objIndex.year.original ] === 'y' ) {\n year = +_y.slice( 0 , 2 ) + ( year >= ( _y ).slice( 2 ) ? 0 : 1 ) + year;\n }\n } else {\n year = _d.getFullYear();\n }\n\n if ( _haveYDay ) {\n month = 0;\n day = mList[ objIndex.dayY.match + 1 ];\n } else if ( _haveDay ) {\n if ( _haveMonth ) {\n month = this._iMonth( mList[ objIndex.month.match + 1 ] );\n } else {\n month = _d.getMonth( );\n }\n\n day = mList[ objIndex.day.match + 1 ];\n } else {\n month = 0;\n\n var week;\n if ( _haveWeek ) {\n week = mList[ objIndex.week.match + 1 ];\n } else {\n week = this.get( 'W' , _d );\n }\n\n day = ( week - 2 ) * 7 + ( 8 - ( ( new Date( year , 0 , 1 ) ).getDay( ) || 7 ) ) + this._iWeek( mList[ objIndex.week.match + 1 ] );\n }\n\n if ( month === 0 && day > 31 ) {\n var aux = new Date( year , month , day );\n month = aux.getMonth( );\n day = aux.getDate( );\n }\n }\n else {\n year = _d.getFullYear( );\n month = _d.getMonth( );\n day = _d.getDate( );\n }\n\n if ( _haveHour12 ) { hour = +mList[ objIndex.hourD.match + 1 ] + ( mList[ objIndex.ampm.match + 1 ] === 'pm' ? 12 : 0 ); }\n else if ( _haveHour24 ) { hour = mList[ objIndex.hour.match + 1 ]; }\n else if ( _noDate ) { hour = _d.getHours( ); }\n else { hour = '00'; }\n\n if ( _haveMin ) { min = mList[ objIndex.min.match + 1 ]; }\n else if ( !_haveMoreM ) { min = _d.getMinutes( ); }\n else { min = '00'; }\n\n if ( _haveSec ) { sec = mList[ objIndex.sec.match + 1 ]; }\n else if ( !_haveMoreS ) { sec = _d.getSeconds( ); }\n else { sec = '00'; }\n\n if ( _haveMSec ) { msec = mList[ objIndex.msec.match + 1 ]; }\n else { msec = '000'; }\n\n if ( _haveDiffH ) { gmt = mList[ objIndex.diffH.match + 1 ]; }\n else if ( _haveDiffM ) { gmt = String( -1 * mList[ objIndex.diffM.match + 1 ] / 60 * 100 ).replace( /^(\\d)/ , '+$1' ).replace( /(^[\\-+])(\\d{3}$)/ , '$10$2' ); }\n else { gmt = '+0000'; }\n\n return new Date( year, month, day, hour, min, sec );\n }\n };\n\n\n return InkDate;\n\n});\n","/**\n * Dump/Profiling Utilities\n * @module Ink.Util.Dumper_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Dumper', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Dumper_1 \n */\n\n var Dumper = {\n\n /**\n * Hex code for the 'tab'\n * \n * @property _tab\n * @type {String}\n * @private\n * @readOnly\n * @static\n *\n */\n _tab: '\\xA0\\xA0\\xA0\\xA0',\n\n /**\n * Function that returns the argument passed formatted\n *\n * @method _formatParam\n * @param {Mixed} param The thing to format.\n * @return {String} The argument passed formatted\n * @private\n * @static\n */\n _formatParam: function(param)\n {\n var formated = '';\n\n switch(typeof(param)) {\n case 'string':\n formated = '(string) '+param;\n break;\n case 'number':\n formated = '(number) '+param;\n break;\n case 'boolean':\n formated = '(boolean) '+param;\n break;\n case 'object':\n if(param !== null) {\n if(param.constructor === Array) {\n formated = 'Array \\n{\\n' + this._outputFormat(param, 0) + '\\n}';\n } else {\n formated = 'Object \\n{\\n' + this._outputFormat(param, 0) + '\\n}';\n }\n } else {\n formated = 'null';\n }\n break;\n default:\n formated = false;\n }\n\n return formated;\n },\n\n /**\n * Function that returns the tabs concatenated\n *\n * @method _getTabs\n * @param {Number} numberOfTabs Number of Tabs\n * @return {String} Tabs concatenated\n * @private\n * @static\n */\n _getTabs: function(numberOfTabs)\n {\n var tabs = '';\n for(var _i = 0; _i < numberOfTabs; _i++) {\n tabs += this._tab;\n }\n return tabs;\n },\n\n /**\n * Function that formats the parameter to display.\n *\n * @method _outputFormat\n * @param {Mixed} param The thing to format.\n * @param {Number} indent Indentation level.\n * @return {String} The parameter passed formatted to displat\n * @private\n * @static\n */\n _outputFormat: function(param, indent)\n {\n var formated = '';\n //var _strVal = false;\n var _typeof = false;\n for(var key in param) {\n if(param[key] !== null) {\n if(typeof(param[key]) === 'object' && (param[key].constructor === Array || param[key].constructor === Object)) {\n if(param[key].constructor === Array) {\n _typeof = 'Array';\n } else if(param[key].constructor === Object) {\n _typeof = 'Object';\n }\n formated += this._tab + this._getTabs(indent) + '[' + key + '] => '+_typeof+'\\n';\n formated += this._tab + this._getTabs(indent) + '{\\n';\n formated += this._outputFormat(param[key], indent + 1) + this._tab + this._getTabs(indent) + '}\\n';\n } else if(param[key].constructor === Function) {\n continue;\n } else {\n formated = formated + this._tab + this._getTabs(indent) + '[' + key + '] => ' + param[key] + '\\n';\n }\n } else {\n formated = formated + this._tab + this._getTabs(indent) + '[' + key + '] => null \\n';\n }\n }\n return formated;\n },\n\n /**\n * Prints variable structure.\n *\n * @method printDump\n * @param {Mixed} param Variable to be dumped.\n * @param {DOMElement|String} [target] Element to print the dump on.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Dumper_printDump.html \n */\n printDump: function(param, target)\n {\n /*jshint evil:true */\n if(!target || typeof(target) === 'undefined') {\n document.write('
              '+this._formatParam(param)+'
              ');\n } else {\n if(typeof(target) === 'string') {\n document.getElementById(target).innerHTML = '
              ' + this._formatParam(param) + '
              ';\n } else if(typeof(target) === 'object') {\n target.innerHTML = '
              '+this._formatParam(param)+'
              ';\n } else {\n throw \"TARGET must be an element or an element ID\";\n }\n }\n },\n\n /**\n * Get a variable's structure.\n *\n * @method returnDump\n * @param {Mixed} param Variable to get the structure.\n * @return {String} The variable's structure.\n * @public\n * @static\n * @sample Ink_Util_Dumper_returnDump.html \n */\n returnDump: function(param)\n {\n return this._formatParam(param);\n },\n\n /**\n * Alert a variable's structure.\n *\n * @method alertDump\n * @param {Mixed} param Variable to be dumped.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Dumper_alertDump.html \n */\n alertDump: function(param)\n {\n window.alert(this._formatParam(param).replace(/()(Array|Object)(<\\/b>)/g, \"$2\"));\n },\n\n /**\n * Prints the variable structure to a new window.\n *\n * @method windowDump\n * @param {Mixed} param Variable to be dumped.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Dumper_windowDump.html \n */\n windowDump: function(param)\n {\n var dumperwindow = 'dumperwindow_'+(Math.random() * 10000);\n var win = window.open('',\n dumperwindow,\n 'width=400,height=300,left=50,top=50,status,menubar,scrollbars,resizable'\n );\n win.document.open();\n win.document.write('
              '+this._formatParam(param)+'
              ');\n win.document.close();\n win.focus();\n }\n\n };\n\n return Dumper;\n\n});\n","/**\n * Internationalization Utilities \n * @module Ink.Util.I18n_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.I18n', '1', [], function () {\n 'use strict';\n\n var pattrText = /\\{(?:(\\{.*?})|(?:%s:)?(\\d+)|(?:%s)?|([\\w-]+))}/g;\n\n var funcOrVal = function( ret , args ) {\n if ( typeof ret === 'function' ) {\n return ret.apply(this, args);\n } else if (typeof ret !== undefined) {\n return ret;\n } else {\n return '';\n }\n };\n\n /**\n * You can use this module to internationalize your applications. It roughly emulates GNU gettext's API.\n *\n * @class Ink.Util.I18n\n * @constructor\n *\n * @param {Object} dict Object mapping language codes (in the form of `pt_PT`, `pt_BR`, `fr`, `en_US`, etc.) to their `dictionaries`\n * @param {String} [lang='pt_PT'] language code of the target language\n * @param {Boolean} [testMode=false] Sets the test mode (see `testMode()`) on construction.\n *\n * @sample Ink_Util_I18n_1.html\n */\n var I18n = function( dict , lang , testMode ) {\n if ( !( this instanceof I18n ) ) { return new I18n( dict , lang , testMode ); }\n\n this.reset( )\n .lang( lang )\n .testMode( testMode )\n .append( dict || { } , lang );\n };\n\n I18n.prototype = {\n reset: function( ) {\n this._dicts = [ ];\n this._dict = { };\n this._testMode = false;\n this._lang = this._gLang;\n\n return this;\n },\n /**\n * Adds translation strings for the helper to use.\n *\n * @method append\n * @param {Object} dict Object containing language objects identified by their language code\n * @return {I18n} (itself)\n *\n * @sample Ink_Util_I18n_1_append.html\n */\n append: function( dict ) {\n this._dicts.push( dict );\n\n this._dict = Ink.extendObj(this._dict , dict[ this._lang ] );\n\n return this;\n },\n /**\n * Gets or sets the language.\n * If there are more dictionaries available in cache, they will be loaded.\n *\n * @method lang\n * @param {String} [lang] Language code to set this instance to. Omit this argument if you want to get the language code instead.\n * @return {String|I18n} The language code, if called without arguments, or this I18n instance if called with an argument.\n */\n lang: function( lang ) {\n if ( !arguments.length ) { return this._lang; }\n\n if ( lang && this._lang !== lang ) {\n this._lang = lang;\n\n this._dict = { };\n\n for ( var i = 0, l = this._dicts.length; i < l; i++ ) {\n this._dict = Ink.extendObj( this._dict , this._dicts[ i ][ lang ] || { } );\n }\n }\n\n return this;\n },\n /**\n * Sets or unsets test mode.\n * In test mode, unknown strings are wrapped in `[ ... ]`. This is useful for debugging your application and to make sure all your translation keys are in place.\n *\n * @method testMode\n * @param {Boolean} [newTestMode] Flag to set the test mode state. Omit this argument to *get* the current testMode instead.\n * @return {String|I18n} The current testMode, if called without arguments, or this I18n instance if called with an argument.\n *\n */\n testMode: function( newTestMode ) {\n if ( !arguments.length ) { return !!this._testMode; }\n\n if ( newTestMode !== undefined ) { this._testMode = !!newTestMode; }\n\n return this;\n },\n\n /**\n * Gest a key from the current dictionary\n *\n * @method getKey\n * @param {String} key Key you wish to get from the dictionary.\n * @return {Mixed} The object which happened to be in the current language dictionary on the given key.\n *\n * @sample Ink_Util_I18n_1_getKey.html\n */\n getKey: function( key ) {\n var ret;\n var gLang = this._gLang;\n var lang = this._lang;\n \n if ( key in this._dict ) {\n ret = this._dict[ key ];\n } else {\n I18n.langGlobal( lang );\n \n ret = this._gDict[ key ];\n \n I18n.langGlobal( gLang );\n }\n \n return ret;\n },\n\n /**\n * Translates a string.\n * Given a translation key, return a translated string, with replaced parameters.\n * When a translated string is not available, the original string is returned unchanged.\n *\n * @method text\n * @param {String} str Key to look for in i18n dictionary (which is returned verbatim if unknown)\n * @param {Object} [namedParms] Named replacements. Replaces {named} with values in this object.\n * @param {String} [args] Replacement #1 (replaces first {} and all {1})\n * @param {String} [arg2] Replacement #2 (replaces second {} and all {2})\n * @param {String} [argn...] Replacement #n (replaces nth {} and all {n})\n *\n * @return {String} Translated string.\n *\n * @sample Ink_Util_I18n_1_text.html\n */\n text: function( str /*, replacements...*/ ) {\n if ( typeof str !== 'string' ) { return; } // Backwards-compat\n\n var pars = Array.prototype.slice.call( arguments , 1 );\n var idx = 0;\n var isObj = typeof pars[ 0 ] === 'object';\n\n var original = this.getKey( str );\n if ( original === undefined ) { original = this._testMode ? '[' + str + ']' : str; }\n if ( typeof original === 'number' ) { original += ''; }\n\n if (typeof original === 'string') {\n original = original.replace( pattrText , function( m , $1 , $2 , $3 ) {\n var ret =\n $1 ? $1 :\n $2 ? pars[ $2 - ( isObj ? 0 : 1 ) ] :\n $3 ? pars[ 0 ][ $3 ] || '' :\n pars[ (idx++) + ( isObj ? 1 : 0 ) ];\n return funcOrVal( ret , [idx].concat(pars) );\n });\n return original;\n }\n \n return (\n typeof original === 'function' ? original.apply( this , pars ) :\n original instanceof Array ? funcOrVal( original[ pars[ 0 ] ] , pars ) :\n typeof original === 'object' ? funcOrVal( original[ pars[ 0 ] ] , pars ) :\n '');\n },\n\n /**\n * Translates and pluralizes text.\n * Given a singular string, a plural string and a number, translates either the singular or plural string.\n *\n * @method ntext\n *\n * @param {String} strSin Word to use when count is 1\n * @param {String} strPlur Word to use otherwise\n * @param {Number} count Number which defines which word to use\n * @param {Mixed} [args...] Extra arguments, to be passed to `text()`\n *\n * @return {String} Pluralized text string.\n *\n * @sample Ink_Util_I18n_1_ntext.html\n */\n ntext: function( strSin , strPlur , count ) {\n var pars = Array.prototype.slice.apply( arguments );\n var original;\n\n if ( pars.length === 2 && typeof strPlur === 'number' ) {\n original = this.getKey( strSin );\n if ( !( original instanceof Array ) ) { return ''; }\n\n pars.splice( 0 , 1 );\n original = original[ strPlur === 1 ? 0 : 1 ];\n } else {\n pars.splice( 0 , 2 );\n original = count === 1 ? strSin : strPlur;\n }\n\n return this.text.apply( this , [ original ].concat( pars ) );\n },\n\n /**\n * Gets the ordinal suffix of a number.\n *\n * This works by using transforms (in the form of Objects or Functions) passed into the function or found in the special key `_ordinals` in the active language dictionary.\n *\n * @method ordinal\n *\n * @param {Number} num Input number\n * @param {Object|Function} [options]={} Dictionaries for translating. Each of these options' fallback is found in the current language's dictionary. The lookup order is the following: `exceptions`, `byLastDigit`, `default`. Each of these may be either an `Object` or a `Function`. If it's a function, it is called (with `number` and `digit` for any function except for byLastDigit, which is called with the `lastDigit` of the number in question), and if the function returns a string, that is used. If it's an object, the property is looked up using `obj[prop]`. If what is found is a string, it is used directly.\n * @param {Object|Function} [options.byLastDigit]={} If the language requires the last digit to be considered, mappings of last digits to ordinal suffixes can be created here.\n * @param {Object|Function} [options.exceptions]={} Map unique, special cases to their ordinal suffixes.\n *\n * @returns {String} Ordinal suffix for `num`.\n *\n * @sample Ink_Util_I18n_1_ordinal.html\n **/\n ordinal: function( num ) {\n if ( num === undefined ) { return ''; }\n\n var lastDig = +num.toString( ).slice( -1 );\n\n var ordDict = this.getKey( '_ordinals' );\n if ( ordDict === undefined ) { return ''; }\n\n if ( typeof ordDict === 'string' ) { return ordDict; }\n\n var ret;\n\n if ( typeof ordDict === 'function' ) {\n ret = ordDict( num , lastDig );\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n if ( 'exceptions' in ordDict ) {\n ret = typeof ordDict.exceptions === 'function' ? ordDict.exceptions( num , lastDig ) :\n num in ordDict.exceptions ? funcOrVal( ordDict.exceptions[ num ] , [num , lastDig] ) :\n undefined;\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n if ( 'byLastDigit' in ordDict ) {\n ret = typeof ordDict.byLastDigit === 'function' ? ordDict.byLastDigit( lastDig , num ) :\n lastDig in ordDict.byLastDigit ? funcOrVal( ordDict.byLastDigit[ lastDig ] , [lastDig , num] ) :\n undefined;\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n if ( 'default' in ordDict ) {\n ret = funcOrVal( ordDict['default'] , [ num , lastDig ] );\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n return '';\n },\n\n /**\n * Create an alias.\n *\n * Returns an alias to this I18n instance. It contains the I18n methods documented here, but is also a function. If you call it, it just calls `text()`. This is commonly assigned to \"_\".\n *\n * @method alias\n * @returns {Function} an alias to `text()` on this instance. You can also access the rest of the translation API through this alias.\n *\n * @sample Ink_Util_I18n_1_alias.html\n */\n alias: function( ) {\n var ret = Ink.bind( I18n.prototype.text , this );\n ret.ntext = Ink.bind( I18n.prototype.ntext , this );\n ret.append = Ink.bind( I18n.prototype.append , this );\n ret.ordinal = Ink.bind( I18n.prototype.ordinal , this );\n ret.testMode = Ink.bind( I18n.prototype.testMode , this );\n\n return ret;\n }\n };\n\n /**\n * Resets I18n global state (global dictionaries, and default language for instances)\n *\n * @method reset\n * @return {void}\n * @static\n *\n **/\n I18n.reset = function( ) {\n I18n.prototype._gDicts = [ ];\n I18n.prototype._gDict = { };\n I18n.prototype._gLang = 'pt_PT';\n };\n I18n.reset( );\n\n /**\n * Adds a dictionary to be used in all I18n instances for the corresponding language.\n *\n * @method appendGlobal\n * @static\n *\n * @param {Object} dict Dictionary to be added\n * @param {String} lang Language fo the dictionary being added\n * @return {void}\n *\n */\n I18n.appendGlobal = function( dict , lang ) {\n if ( lang ) {\n if ( !( lang in dict ) ) {\n var obj = { };\n\n obj[ lang ] = dict;\n\n dict = obj;\n }\n\n if ( lang !== I18n.prototype._gLang ) { I18n.langGlobal( lang ); }\n }\n\n I18n.prototype._gDicts.push( dict );\n\n Ink.extendObj( I18n.prototype._gDict , dict[ I18n.prototype._gLang ] );\n };\n\n /**\n * Gets or sets the current default language of I18n instances.\n *\n * @method langGlobal\n * @param {String} [lang] the new language for all I18n instances. Omit this argument if you wish to *get* the current default language instead.\n *\n * @static\n *\n * @return {String} language code, or nothing if not used as a setter.\n */\n I18n.langGlobal = function( lang ) {\n if ( !arguments.length ) { return I18n.prototype._gLang; }\n\n if ( lang && I18n.prototype._gLang !== lang ) {\n I18n.prototype._gLang = lang;\n\n I18n.prototype._gDict = { };\n\n for ( var i = 0, l = I18n.prototype._gDicts.length; i < l; i++ ) {\n Ink.extendObj( I18n.prototype._gDict , I18n.prototype._gDicts[ i ][ lang ] || { } );\n }\n }\n };\n\n return I18n;\n});","/**\n * JSON Utilities\n * @module Ink.Util.Json_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Json', '1', [], function() {\n 'use strict';\n\n var function_call = Function.prototype.call;\n var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n\n function twoDigits(n) {\n var r = '' + n;\n if (r.length === 1) {\n return '0' + r;\n } else {\n return r;\n }\n }\n\n var dateToISOString = Date.prototype.toISOString ?\n Ink.bind(function_call, Date.prototype.toISOString) :\n function(date) {\n // Adapted from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString\n return date.getUTCFullYear() +\n '-' + twoDigits( date.getUTCMonth() + 1 ) +\n '-' + twoDigits( date.getUTCDate() ) +\n 'T' + twoDigits( date.getUTCHours() ) +\n ':' + twoDigits( date.getUTCMinutes() ) +\n ':' + twoDigits( date.getUTCSeconds() ) +\n '.' + String( (date.getUTCMilliseconds()/1000).toFixed(3) ).slice( 2, 5 ) +\n 'Z';\n };\n\n /**\n * Use this class to convert JSON strings to JavaScript objects\n * `.parse()` and also to do the opposite operation `.stringify()`.\n * Internally, the standard JSON implementation is used if available\n * Otherwise, the functions mimic the standard implementation.\n *\n * Here's how to produce JSON from an existing object:\n * \n * Ink.requireModules(['Ink.Util.Json_1'], function (Json) {\n * var obj = {\n * key1: 'value1',\n * key2: 'value2',\n * keyArray: ['arrayValue1', 'arrayValue2', 'arrayValue3']\n * };\n * Json.stringify(obj); // The above object as a JSON string\n * });\n *\n * And here is how to parse JSON:\n *\n * Ink.requireModules(['Ink.Util.Json_1'], function (Json) {\n * var source = '{\"key\": \"value\", \"array\": [true, null, false]}';\n * Json.parse(source); // The above JSON string as an object\n * });\n *\n * @namespace Ink.Util.Json_1 \n * @static\n * \n */\n var InkJson = {\n _nativeJSON: window.JSON || null,\n\n _convertToUnicode: false,\n\n // Escape characters so as to embed them in JSON strings\n _escape: function (theString) {\n var _m = { '\\b': '\\\\b', '\\t': '\\\\t', '\\n': '\\\\n', '\\f': '\\\\f', '\\r': '\\\\r', '\"': '\\\\\"', '\\\\': '\\\\\\\\' };\n\n if (/[\"\\\\\\x00-\\x1f]/.test(theString)) {\n theString = theString.replace(/([\\x00-\\x1f\\\\\"])/g, function(a, b) {\n var c = _m[b];\n if (c) {\n return c;\n }\n c = b.charCodeAt();\n return '\\\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);\n });\n }\n\n return theString;\n },\n\n // A character conversion map\n _toUnicode: function (theString)\n {\n if(!this._convertToUnicode) {\n return this._escape(theString);\n } else {\n var unicodeString = '';\n var inInt = false;\n var theUnicode = false;\n var i = 0;\n var total = theString.length;\n while(i < total) {\n inInt = theString.charCodeAt(i);\n if( (inInt >= 32 && inInt <= 126) ||\n //(inInt >= 48 && inInt <= 57) ||\n //(inInt >= 65 && inInt <= 90) ||\n //(inInt >= 97 && inInt <= 122) ||\n inInt === 8 ||\n inInt === 9 ||\n inInt === 10 ||\n inInt === 12 ||\n inInt === 13 ||\n inInt === 32 ||\n inInt === 34 ||\n inInt === 47 ||\n inInt === 58 ||\n inInt === 92) {\n\n if(inInt === 34 || inInt === 92 || inInt === 47) {\n theUnicode = '\\\\'+theString.charAt(i);\n } else if(inInt === 8) {\n theUnicode = '\\\\b';\n } else if(inInt === 9) {\n theUnicode = '\\\\t';\n } else if(inInt === 10) {\n theUnicode = '\\\\n';\n } else if(inInt === 12) {\n theUnicode = '\\\\f';\n } else if(inInt === 13) {\n theUnicode = '\\\\r';\n } else {\n theUnicode = theString.charAt(i);\n }\n } else {\n if(this._convertToUnicode) {\n theUnicode = theString.charCodeAt(i).toString(16)+''.toUpperCase();\n while (theUnicode.length < 4) {\n theUnicode = '0' + theUnicode;\n }\n theUnicode = '\\\\u' + theUnicode;\n } else {\n theUnicode = theString.charAt(i);\n }\n }\n unicodeString += theUnicode;\n\n i++;\n }\n\n return unicodeString;\n }\n\n },\n\n _stringifyValue: function(param) {\n if (typeof param === 'string') {\n return '\"' + this._toUnicode(param) + '\"';\n } else if (typeof param === 'number' && (isNaN(param) || !isFinite(param))) { // Unusable numbers go null\n return 'null';\n } else if (typeof param === 'undefined' || param === null) { // And so does undefined\n return 'null';\n } else if (typeof param.toJSON === 'function') {\n var t = param.toJSON();\n if (typeof t === 'string') {\n return '\"' + this._escape(t) + '\"';\n } else {\n return this._escape(t.toString());\n }\n } else if (typeof param === 'number' || typeof param === 'boolean') { // These ones' toString methods return valid JSON.\n return '' + param;\n } else if (typeof param === 'function') {\n return 'null'; // match JSON.stringify\n } else if (param.constructor === Date) {\n return '\"' + this._escape(dateToISOString(param)) + '\"';\n } else if (param.constructor === Array) {\n var arrayString = '';\n for (var i = 0, len = param.length; i < len; i++) {\n if (i > 0) {\n arrayString += ',';\n }\n arrayString += this._stringifyValue(param[i]);\n }\n return '[' + arrayString + ']';\n } else { // Object\n var objectString = '';\n for (var k in param) {\n if ({}.hasOwnProperty.call(param, k)) {\n if (objectString !== '') {\n objectString += ',';\n }\n objectString += '\"' + this._escape(k) + '\": ' + this._stringifyValue(param[k]);\n }\n }\n return '{' + objectString + '}';\n }\n },\n\n /**\n * Serializes a JSON object into a string.\n *\n * @method stringify\n * @param {Object} input Data to be serialized into JSON\n * @param {Boolean} convertToUnicode When `true`, converts string contents to unicode \\uXXXX\n * @return {String} Serialized string\n *\n * @sample Ink_Util_Json_stringify.html \n */\n stringify: function(input, convertToUnicode) {\n this._convertToUnicode = !!convertToUnicode;\n if(!this._convertToUnicode && this._nativeJSON) {\n return this._nativeJSON.stringify(input);\n }\n return this._stringifyValue(input); // And recurse.\n },\n \n /**\n * Parses a JSON text through a function\n * \n * @method parse\n * @param text {String} Input string\n * @param reviver {Function} Function receiving `(key, value)`, and `this`=(containing object), used to walk objects.\n * \n * @return {Object} JSON object\n *\n * @sample Ink_Util_Json_parse.html \n */\n /* From https://github.com/douglascrockford/JSON-js/blob/master/json.js */\n parse: function (text, reviver) {\n /*jshint evil:true*/\n\n// The parse method takes a text and an optional reviver function, and returns\n// a JavaScript value if the text is a valid JSON text.\n\n var j;\n\n function walk(holder, key) {\n\n// The walk method is used to recursively walk the resulting structure so\n// that modifications can be made.\n\n var k, v, value = holder[key];\n if (value && typeof value === 'object') {\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = walk(value, k);\n if (v !== undefined) {\n value[k] = v;\n } else {\n delete value[k];\n }\n }\n }\n }\n return reviver.call(holder, key, value);\n }\n\n\n// Parsing happens in four stages. In the first stage, we replace certain\n// Unicode characters with escape sequences. JavaScript handles many characters\n// incorrectly, either silently deleting them, or treating them as line endings.\n\n text = String(text);\n cx.lastIndex = 0;\n if (cx.test(text)) {\n text = text.replace(cx, function (a) {\n return '\\\\u' +\n ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n });\n }\n\n// In the second stage, we run the text against regular expressions that look\n// for non-JSON patterns. We are especially concerned with '()' and 'new'\n// because they can cause invocation, and '=' because it can cause mutation.\n// But just to be safe, we want to reject all unexpected forms.\n\n// We split the second stage into 4 regexp operations in order to work around\n// crippling inefficiencies in IE's and Safari's regexp engines. First we\n// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we\n// replace all simple value tokens with ']' characters. Third, we delete all\n// open brackets that follow a colon or comma or that begin the text. Finally,\n// we look to see that the remaining characters are only whitespace or ']' or\n// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.\n\n if (/^[\\],:{}\\s]*$/\n .test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')\n .replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']')\n .replace(/(?:^|:|,)(?:\\s*\\[)+/g, ''))) {\n\n// In the third stage we use the eval function to compile the text into a\n// JavaScript structure. The '{' operator is subject to a syntactic ambiguity\n// in JavaScript: it can begin a block or an object literal. We wrap the text\n// in parens to eliminate the ambiguity.\n\n j = eval('(' + text + ')');\n\n// In the optional fourth stage, we recursively walk the new structure, passing\n// each name/value pair to a reviver function for possible transformation.\n\n return typeof reviver === 'function' ?\n walk({'': j}, '') :\n j;\n }\n\n// If the text is not JSON parseable, then a SyntaxError is thrown.\n\n throw new SyntaxError('JSON.parse');\n }\n };\n\n return InkJson;\n});\n","/**\n * String Utilities\n * @module Ink.Util.String_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.String', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.String_1 \n */\n var InkUtilString = {\n\n /**\n * List of special chars\n * \n * @property _chars\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _chars: ['&','à','á','â','ã','ä','å','æ','ç','è','é',\n 'ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô',\n 'õ','ö','ø','ù','ú','û','ü','ý','þ','ÿ','À',\n 'Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë',\n 'Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö',\n 'Ø','Ù','Ú','Û','Ü','Ý','Þ','€','\\\"','ß','<',\n '>','¢','£','¤','¥','¦','§','¨','©','ª','«',\n '¬','\\xad','®','¯','°','±','²','³','´','µ','¶',\n '·','¸','¹','º','»','¼','½','¾'],\n\n /**\n * List of the special characters' html entities\n * \n * @property _entities\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _entities: ['amp','agrave','aacute','acirc','atilde','auml','aring',\n 'aelig','ccedil','egrave','eacute','ecirc','euml','igrave',\n 'iacute','icirc','iuml','eth','ntilde','ograve','oacute',\n 'ocirc','otilde','ouml','oslash','ugrave','uacute','ucirc',\n 'uuml','yacute','thorn','yuml','Agrave','Aacute','Acirc',\n 'Atilde','Auml','Aring','AElig','Ccedil','Egrave','Eacute',\n 'Ecirc','Euml','Igrave','Iacute','Icirc','Iuml','ETH','Ntilde',\n 'Ograve','Oacute','Ocirc','Otilde','Ouml','Oslash','Ugrave',\n 'Uacute','Ucirc','Uuml','Yacute','THORN','euro','quot','szlig',\n 'lt','gt','cent','pound','curren','yen','brvbar','sect','uml',\n 'copy','ordf','laquo','not','shy','reg','macr','deg','plusmn',\n 'sup2','sup3','acute','micro','para','middot','cedil','sup1',\n 'ordm','raquo','frac14','frac12','frac34'],\n\n /**\n * List of accented chars\n * \n * @property _accentedChars\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _accentedChars:['à','á','â','ã','ä','å',\n 'è','é','ê','ë',\n 'ì','í','î','ï',\n 'ò','ó','ô','õ','ö',\n 'ù','ú','û','ü',\n 'ç','ñ',\n 'À','Á','Â','Ã','Ä','Å',\n 'È','É','Ê','Ë',\n 'Ì','Í','Î','Ï',\n 'Ò','Ó','Ô','Õ','Ö',\n 'Ù','Ú','Û','Ü',\n 'Ç','Ñ'],\n\n /**\n * List of the accented chars (above), but without the accents\n * \n * @property _accentedRemovedChars\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _accentedRemovedChars:['a','a','a','a','a','a',\n 'e','e','e','e',\n 'i','i','i','i',\n 'o','o','o','o','o',\n 'u','u','u','u',\n 'c','n',\n 'A','A','A','A','A','A',\n 'E','E','E','E',\n 'I','I','I','I',\n 'O','O','O','O','O',\n 'U','U','U','U',\n 'C','N'],\n /**\n * Object that contains the basic HTML unsafe chars, as keys, and their HTML entities as values\n * \n * @property _htmlUnsafeChars\n * @type {Object}\n * @private\n * @readOnly\n * @static\n */\n _htmlUnsafeChars:{'<':'<','>':'>','&':'&','\"':'"',\"'\":'''},\n\n /**\n * Capitalizes a word.\n * If param as more than one word, it converts first letter of all words that have more than 2 letters\n *\n * @method ucFirst\n * @param {String} string String to capitalize.\n * @param {Boolean} [firstWordOnly]=false Flag to capitalize only the first word.\n * @return {String} Camel cased string.\n * @public\n * @static\n * @sample Ink_Util_String_ucFirst.html \n */\n ucFirst: function(string, firstWordOnly) {\n var replacer = firstWordOnly ? /(^|\\s)(\\w)(\\S{2,})/ : /(^|\\s)(\\w)(\\S{2,})/g;\n return string ? String(string).replace(replacer, function(_, $1, $2, $3){\n return $1 + $2.toUpperCase() + $3.toLowerCase();\n }) : string;\n },\n\n /**\n * Trims whitespace from strings\n *\n * @method trim\n * @param {String} string String to be trimmed\n * @return {String} Trimmed string\n * @public\n * @static\n * @sample Ink_Util_String_trim.html \n */\n trim: function(string)\n {\n if (typeof string === 'string') {\n return string.replace(/^\\s+|\\s+$|\\n+$/g, '');\n }\n return string;\n },\n\n /**\n * Strips HTML tags from strings\n *\n * @method stripTags\n * @param {String} string String to strip tags from.\n * @param {String} allowed Comma separated list of allowed tags.\n * @return {String} Stripped string\n * @public\n * @static\n * @sample Ink_Util_String_stripTags.html \n */\n stripTags: function(string, allowed)\n {\n if (allowed && typeof allowed === 'string') {\n var aAllowed = InkUtilString.trim(allowed).split(',');\n var aNewAllowed = [];\n var cleanedTag = false;\n for(var i=0; i < aAllowed.length; i++) {\n if(InkUtilString.trim(aAllowed[i]) !== '') {\n cleanedTag = InkUtilString.trim(aAllowed[i].replace(/(<|\\>)/g, '').replace(/\\s/, ''));\n aNewAllowed.push('(<'+cleanedTag+'\\\\s[^>]+>|<(\\\\s|\\\\/)?(\\\\s|\\\\/)?'+cleanedTag+'>)');\n }\n }\n var strAllowed = aNewAllowed.join('|');\n var reAllowed = new RegExp(strAllowed, \"i\");\n\n var aFoundTags = string.match(new RegExp(\"<[^>]*>\", \"g\"));\n\n for(var j=0; j < aFoundTags.length; j++) {\n if(!aFoundTags[j].match(reAllowed)) {\n string = string.replace((new RegExp(aFoundTags[j], \"gm\")), '');\n }\n }\n return string;\n } else {\n return string.replace(/<[^\\>]+\\>/g, '');\n }\n },\n\n /**\n * Encodes string into HTML entities.\n *\n * @method htmlEntitiesEncode\n * @param {String} string Input string.\n * @return {String} HTML encoded string.\n * @public\n * @static\n * @sample Ink_Util_String_htmlEntitiesEncode.html \n */\n htmlEntitiesEncode: function(string)\n {\n if (string && string.replace) {\n var re = false;\n for (var i = 0; i < InkUtilString._chars.length; i++) {\n re = new RegExp(InkUtilString._chars[i], \"gm\");\n string = string.replace(re, '&' + InkUtilString._entities[i] + ';');\n }\n }\n return string;\n },\n\n /**\n * Decodes string from HTML entities.\n *\n * @method htmlEntitiesDecode\n * @param {String} string String to be decoded\n * @return {String} Decoded string\n * @public\n * @static\n * @sample Ink_Util_String_htmlEntitiesDecode.html \n */\n htmlEntitiesDecode: function(string)\n {\n if (string && string.replace) {\n var re = false;\n for (var i = 0; i < InkUtilString._entities.length; i++) {\n re = new RegExp(\"&\"+InkUtilString._entities[i]+\";\", \"gm\");\n string = string.replace(re, InkUtilString._chars[i]);\n }\n string = string.replace(/&#[^;]+;?/g, function($0){\n if ($0.charAt(2) === 'x') {\n return String.fromCharCode(parseInt($0.substring(3), 16));\n }\n else {\n return String.fromCharCode(parseInt($0.substring(2), 10));\n }\n });\n }\n return string;\n },\n\n /**\n * Encode a string to UTF-8.\n *\n * @method utf8Encode\n * @param {String} string String to be encoded\n * @return {String} string UTF-8 encoded string\n * @public\n * @static\n */\n utf8Encode: function(string) {\n /*jshint bitwise:false*/\n string = string.replace(/\\r\\n/g,\"\\n\");\n var utfstring = \"\";\n\n for (var n = 0; n < string.length; n++) {\n\n var c = string.charCodeAt(n);\n\n if (c < 128) {\n utfstring += String.fromCharCode(c);\n }\n else if((c > 127) && (c < 2048)) {\n utfstring += String.fromCharCode((c >> 6) | 192);\n utfstring += String.fromCharCode((c & 63) | 128);\n }\n else {\n utfstring += String.fromCharCode((c >> 12) | 224);\n utfstring += String.fromCharCode(((c >> 6) & 63) | 128);\n utfstring += String.fromCharCode((c & 63) | 128);\n }\n\n }\n return utfstring;\n },\n\n /**\n * Truncates a string without breaking words. Inserts an ellipsis HTML entity at the end of the string if it's too long.\n *\n * @method shortString\n * @param {String} str String to truncate\n * @param {Number} n Number of chars of the short string\n * @return {String} Truncated string, or the original `str` if it's shorter than `n`\n * @public\n * @static\n * @sample Ink_Util_String_shortString.html \n */\n shortString: function(str,n) {\n var words = str.split(' ');\n var resultstr = '';\n for(var i = 0; i < words.length; i++ ){\n if((resultstr + words[i] + ' ').length>=n){\n resultstr += '…';\n break;\n }\n resultstr += words[i] + ' ';\n }\n return resultstr;\n },\n\n /**\n * Truncates a string, breaking words and adding ... at the end.\n *\n * @method truncateString\n * @param {String} str String to truncate\n * @param {Number} length Limit for the returned string, ellipsis included.\n * @return {String} Truncated String\n * @public\n * @static\n * @sample Ink_Util_String_truncateString.html \n */\n truncateString: function(str, length) {\n if(str.length - 1 > length) {\n return str.substr(0, length - 1) + \"\\u2026\";\n } else {\n return str;\n }\n },\n\n /**\n * Decodes a string from UTF-8.\n *\n * @method utf8Decode\n * @param {String} string String to be decoded\n * @return {String} Decoded string\n * @public\n * @static\n */\n utf8Decode: function(string) {\n /*jshint bitwise:false*/\n var ret = \"\";\n var i = 0, c = 0, c2 = 0, c3 = 0;\n\n while ( i < string.length ) {\n\n c = string.charCodeAt(i);\n\n if (c < 128) {\n ret += String.fromCharCode(c);\n i++;\n }\n else if((c > 191) && (c < 224)) {\n c2 = string.charCodeAt(i+1);\n ret += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n i += 2;\n }\n else {\n c2 = string.charCodeAt(i+1);\n c3 = string.charCodeAt(i+2);\n ret += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n i += 3;\n }\n\n }\n return ret;\n },\n\n /**\n * Removes all accented characters from a string.\n *\n * @method removeAccentedChars\n * @param {String} string String to remove accents from\n * @return {String} String without accented chars\n * @public\n * @static\n * @sample Ink_Util_String_removeAccentedChars.html \n */\n removeAccentedChars: function(string)\n {\n var newString = string;\n var re = false;\n for (var i = 0; i < InkUtilString._accentedChars.length; i++) {\n re = new RegExp(InkUtilString._accentedChars[i], \"gm\");\n newString = newString.replace(re, '' + InkUtilString._accentedRemovedChars[i] + '');\n }\n return newString;\n },\n\n /**\n * Count the number of occurrences of a specific needle in a haystack\n *\n * @method substrCount\n * @param {String} haystack String to search in\n * @param {String} needle String to search for\n * @return {Number} Number of occurrences\n * @public\n * @static\n * @sample Ink_Util_String_substrCount.html \n */\n substrCount: function(haystack,needle)\n {\n return haystack ? haystack.split(needle).length - 1 : 0;\n },\n\n /**\n * Eval a JSON - We recommend you Ink.Util.Json\n *\n * @method evalJSON\n * @param {String} strJSON JSON string to eval\n * @param {Boolean} sanitize Flag to sanitize input\n * @return {Object} JS Object\n * @public\n * @static\n */\n evalJSON: function(strJSON, sanitize) {\n /* jshint evil:true */\n if( (typeof sanitize === 'undefined' || sanitize === null) || InkUtilString.isJSON(strJSON)) {\n try {\n if(typeof(JSON) !== \"undefined\" && typeof(JSON.parse) !== 'undefined'){\n return JSON.parse(strJSON);\n }\n return eval('('+strJSON+')');\n } catch(e) {\n throw new Error('ERROR: Bad JSON string...');\n }\n }\n },\n\n /**\n * Checks if a string is a valid JSON object (string encoded)\n *\n * @method isJSON\n * @param {String} str String to check\n * @return {Boolean} Return whether it's JSON.\n * @public\n * @static\n */\n isJSON: function(str)\n {\n str = str.replace(/\\\\./g, '@').replace(/\"[^\"\\\\\\n\\r]*\"/g, '');\n return (/^[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]*$/).test(str);\n },\n\n /**\n * Escapes unsafe html chars as HTML entities\n *\n * @method htmlEscapeUnsafe\n * @param {String} str String to escape\n * @return {String} Escaped string\n * @public\n * @static\n * @sample Ink_Util_String_htmlEscapeUnsafe.html \n */\n htmlEscapeUnsafe: function(str){\n var chars = InkUtilString._htmlUnsafeChars;\n return str !== null ? String(str).replace(/[<>&'\"]/g,function(c){return chars[c];}) : str;\n },\n\n /**\n * Normalizes whitespace in string.\n * String is trimmed and sequences of whitespaces are collapsed.\n *\n * @method normalizeWhitespace\n * @param {String} str String to normalize\n * @return {String} Normalized string\n * @public\n * @static\n * @sample Ink_Util_String_normalizeWhitespace.html \n */\n normalizeWhitespace: function(str){\n return str !== null ? InkUtilString.trim(String(str).replace(/\\s+/g,' ')) : str;\n },\n\n /**\n * Converts string to unicode.\n *\n * @method toUnicode\n * @param {String} str String to convert\n * @return {String} Unicoded String\n * @public\n * @static\n * @sample Ink_Util_String_toUnicode.html \n */\n toUnicode: function(str) {\n if (typeof str === 'string') {\n var unicodeString = '';\n var inInt = false;\n var theUnicode = false;\n var total = str.length;\n var i=0;\n\n while(i < total)\n {\n inInt = str.charCodeAt(i);\n if( (inInt >= 32 && inInt <= 126) ||\n inInt === 8 ||\n inInt === 9 ||\n inInt === 10 ||\n inInt === 12 ||\n inInt === 13 ||\n inInt === 32 ||\n inInt === 34 ||\n inInt === 47 ||\n inInt === 58 ||\n inInt === 92) {\n\n /*\n if(inInt == 34 || inInt == 92 || inInt == 47) {\n theUnicode = '\\\\'+str.charAt(i);\n } else {\n }\n */\n if(inInt === 8) {\n theUnicode = '\\\\b';\n } else if(inInt === 9) {\n theUnicode = '\\\\t';\n } else if(inInt === 10) {\n theUnicode = '\\\\n';\n } else if(inInt === 12) {\n theUnicode = '\\\\f';\n } else if(inInt === 13) {\n theUnicode = '\\\\r';\n } else {\n theUnicode = str.charAt(i);\n }\n } else {\n theUnicode = str.charCodeAt(i).toString(16)+''.toUpperCase();\n while (theUnicode.length < 4) {\n theUnicode = '0' + theUnicode;\n }\n theUnicode = '\\\\u' + theUnicode;\n }\n unicodeString += theUnicode;\n\n i++;\n }\n return unicodeString;\n }\n },\n\n /**\n * Escapes a unicode character.\n *\n * @method escape\n * @param {String} c Character to escape\n * @return {String} Escaped character. Returns \\xXX if hex smaller than 0x100, otherwise \\uXXXX\n * @public\n * @static\n * @sample Ink_Util_String_escape.html \n */\n escape: function(c) {\n var hex = (c).charCodeAt(0).toString(16).split('');\n if (hex.length < 3) {\n while (hex.length < 2) { hex.unshift('0'); }\n hex.unshift('x');\n }\n else {\n while (hex.length < 4) { hex.unshift('0'); }\n hex.unshift('u');\n }\n\n hex.unshift('\\\\');\n return hex.join('');\n },\n\n /**\n * Unescapes a unicode character escape sequence\n *\n * @method unescape\n * @param {String} es Escape sequence\n * @return {String} String un-unicoded\n * @public\n * @static\n * @sample Ink_Util_String_unescape.html \n */\n unescape: function(es) {\n var idx = es.lastIndexOf('0');\n idx = idx === -1 ? 2 : Math.min(idx, 2);\n //console.log(idx);\n var hexNum = es.substring(idx);\n //console.log(hexNum);\n var num = parseInt(hexNum, 16);\n return String.fromCharCode(num);\n },\n\n /**\n * Escapes unicode characters in a string as unicode character entities (`\\x##`, where the `##` are hex digits).\n *\n * @method escapeText\n * @param {String} txt String with characters outside the ASCII printable range (32 < charCode < 127)\n * @param {Array} [whiteList] Whitelist of characters which should NOT be escaped\n * @return {String} String escaped with unicode character entities.\n * @public\n * @static\n * @sample Ink_Util_String_escapeText.html \n */\n escapeText: function(txt, whiteList) {\n if (whiteList === undefined) {\n whiteList = ['[', ']', '\\'', ','];\n }\n var txt2 = [];\n var c, C;\n for (var i = 0, f = txt.length; i < f; ++i) {\n c = txt[i];\n C = c.charCodeAt(0);\n if (C < 32 || C > 126 && whiteList.indexOf(c) === -1) {\n c = InkUtilString.escape(c);\n }\n txt2.push(c);\n }\n return txt2.join('');\n },\n\n /**\n * Regex to check escaped strings\n *\n * @property escapedCharRegex\n * @type {Regex}\n * @public\n * @readOnly\n * @static\n */\n escapedCharRegex: /(\\\\x[0-9a-fA-F]{2})|(\\\\u[0-9a-fA-F]{4})/g,\n\n /**\n * Removes unicode entities (in the format \"\\x##\" or \"\\u####\", where \"#\" is a hexadecimal digit)\n *\n * @method unescapeText\n * @param {String} txt Text you intend to remove unicode character entities.\n * @return {String} Unescaped string\n * @public\n * @static\n * @sample Ink_Util_String_unescapeText.html \n */\n unescapeText: function(txt) {\n /*jshint boss:true */\n var m;\n while (m = InkUtilString.escapedCharRegex.exec(txt)) {\n m = m[0];\n txt = txt.replace(m, InkUtilString.unescape(m));\n InkUtilString.escapedCharRegex.lastIndex = 0;\n }\n return txt;\n },\n\n /**\n * Compares two strings.\n *\n * @method strcmp\n * @param {String} str1 First String\n * @param {String} str2 Second String\n * @return {Number} 0 if given strings are equal, 1 if str1 is greater than str2, and -1 if str2 is greater than str1.\n * @public\n * @static\n * @sample Ink_Util_String_strcmp.html \n */\n strcmp: function(str1, str2) {\n return ((str1 === str2) ? 0 : ((str1 > str2) ? 1 : -1));\n },\n\n /**\n * Splits a string into smaller chunks\n *\n * @method packetize\n * @param {String} str String to divide\n * @param {Number} maxLen Maximum chunk size (in characters)\n * @return {Array} Chunks of the original string\n * @public\n * @static\n * @sample Ink_Util_String_packetize.html \n */\n packetize: function(str, maxLen) {\n var len = str.length;\n var parts = new Array( Math.ceil(len / maxLen) );\n var chars = str.split('');\n var sz, i = 0;\n while (len) {\n sz = Math.min(maxLen, len);\n parts[i++] = chars.splice(0, sz).join('');\n len -= sz;\n }\n return parts;\n }\n };\n\n return InkUtilString;\n\n});\n","/**\n * URL Utilities\n * @module Ink.Util.Url_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Url', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Url_1\n */\n var Url = {\n\n /**\n * Auxiliary string for encoding\n *\n * @property _keyStr\n * @type {String}\n * @readOnly\n * @private\n */\n _keyStr : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n\n\n /**\n * Gets URL of current page\n *\n * @method getUrl\n * @return {String} Current URL\n * @public\n * @static\n * @sample Ink_Util_Url_getUrl.html \n */\n getUrl: function()\n {\n return window.location.href;\n },\n\n /**\n * Generates an URL string.\n *\n * @method genQueryString\n * @param {String} uri Base URL\n * @param {Object} params Object to transform to query string\n * @return {String} URI with query string set\n * @public\n * @static\n * @sample Ink_Util_Url_genQueryString.html \n */\n genQueryString: function(uri, params) {\n var hasQuestionMark = uri.indexOf('?') !== -1;\n var sep, pKey, pValue, parts = [uri];\n\n for (pKey in params) {\n if (params.hasOwnProperty(pKey)) {\n if (!hasQuestionMark) {\n sep = '?';\n hasQuestionMark = true;\n } else {\n sep = '&';\n }\n pValue = params[pKey];\n if (typeof pValue !== 'number' && !pValue) {\n pValue = '';\n }\n parts = parts.concat([sep, encodeURIComponent(pKey), '=', encodeURIComponent(pValue)]);\n }\n }\n\n return parts.join('');\n },\n\n /**\n * Gets an object from an URL encoded string.\n *\n * @method getQueryString\n * @param {String} [str] URL String. When not specified it uses the current URL.\n * @return {Object} Key-Value pair object\n * @public\n * @static\n * @sample Ink_Util_Url_getQueryString.html \n */\n getQueryString: function(str)\n {\n var url;\n if(str && typeof(str) !== 'undefined') {\n url = str;\n } else {\n url = this.getUrl();\n }\n var aParams = {};\n if(url.match(/\\?(.+)/i)) {\n var queryStr = url.replace(/^(.*)\\?([^\\#]+)(\\#(.*))?/g, \"$2\");\n if(queryStr.length > 0) {\n var aQueryStr = queryStr.split(/[;&]/);\n for(var i=0; i < aQueryStr.length; i++) {\n var pairVar = aQueryStr[i].split('=');\n aParams[decodeURIComponent(pairVar[0])] = (typeof(pairVar[1]) !== 'undefined' && pairVar[1]) ? decodeURIComponent(pairVar[1]) : false;\n }\n }\n }\n return aParams;\n },\n\n /**\n * Gets the URL hash value\n *\n * @method getAnchor\n * @param {String} [str] URL String. Defaults to current page URL.\n * @return {String|Boolean} Hash in the URL. If there's no hash, returns false.\n * @public\n * @static\n * @sample Ink_Util_Url_getAnchor.html \n */\n getAnchor: function(str)\n {\n var url;\n if(str && typeof(str) !== 'undefined') {\n url = str;\n } else {\n url = this.getUrl();\n }\n var anchor = false;\n if(url.match(/#(.+)/)) {\n anchor = url.replace(/([^#]+)#(.*)/, \"$2\");\n }\n return anchor;\n },\n\n /**\n * Gets the anchor string of an URL\n *\n * @method getAnchorString\n * @param {String} [string] URL to parse. Defaults to current URL.\n * @return {Object} Key-value pair object of the URL's hashtag 'variables'\n * @public\n * @static\n * @sample Ink_Util_Url_getAnchorString.html \n */\n getAnchorString: function(string)\n {\n var url;\n if(string && typeof(string) !== 'undefined') {\n url = string;\n } else {\n url = this.getUrl();\n }\n var aParams = {};\n if(url.match(/#(.+)/i)) {\n var anchorStr = url.replace(/^([^#]+)#(.*)?/g, \"$2\");\n if(anchorStr.length > 0) {\n var aAnchorStr = anchorStr.split(/[;&]/);\n for(var i=0; i < aAnchorStr.length; i++) {\n var pairVar = aAnchorStr[i].split('=');\n aParams[decodeURIComponent(pairVar[0])] = (typeof(pairVar[1]) !== 'undefined' && pairVar[1]) ? decodeURIComponent(pairVar[1]) : false;\n }\n }\n }\n return aParams;\n },\n\n\n /**\n * Parses URL string into URL parts\n *\n * @method parseUrl\n * @param {String} url URL to be parsed\n * @return {Object} Parsed URL as a key-value object.\n * @public\n * @static\n * @sample Ink_Util_Url_parseUrl.html \n */\n parseUrl: function(url) {\n var aURL = {};\n if(url && typeof url === 'string') {\n if(url.match(/^([^:]+):\\/\\//i)) {\n var re = /^([^:]+):\\/\\/([^\\/]*)\\/?([^\\?#]*)\\??([^#]*)#?(.*)/i;\n if(url.match(re)) {\n aURL.scheme = url.replace(re, \"$1\");\n aURL.host = url.replace(re, \"$2\");\n aURL.path = '/'+url.replace(re, \"$3\");\n aURL.query = url.replace(re, \"$4\") || false;\n aURL.fragment = url.replace(re, \"$5\") || false;\n }\n } else {\n var re1 = new RegExp(\"^([^\\\\?]+)\\\\?([^#]+)#(.*)\", \"i\");\n var re2 = new RegExp(\"^([^\\\\?]+)\\\\?([^#]+)#?\", \"i\");\n var re3 = new RegExp(\"^([^\\\\?]+)\\\\??\", \"i\");\n if(url.match(re1)) {\n aURL.scheme = false;\n aURL.host = false;\n aURL.path = url.replace(re1, \"$1\");\n aURL.query = url.replace(re1, \"$2\");\n aURL.fragment = url.replace(re1, \"$3\");\n } else if(url.match(re2)) {\n aURL.scheme = false;\n aURL.host = false;\n aURL.path = url.replace(re2, \"$1\");\n aURL.query = url.replace(re2, \"$2\");\n aURL.fragment = false;\n } else if(url.match(re3)) {\n aURL.scheme = false;\n aURL.host = false;\n aURL.path = url.replace(re3, \"$1\");\n aURL.query = false;\n aURL.fragment = false;\n }\n }\n if(aURL.host) {\n var regPort = /^(.*?)\\\\:(\\\\d+)$/i;\n // check for port\n if(aURL.host.match(regPort)) {\n var tmpHost1 = aURL.host;\n aURL.host = tmpHost1.replace(regPort, \"$1\");\n aURL.port = tmpHost1.replace(regPort, \"$2\");\n } else {\n aURL.port = false;\n }\n // check for user and pass\n if(aURL.host.match(/@/i)) {\n var tmpHost2 = aURL.host;\n aURL.host = tmpHost2.split('@')[1];\n var tmpUserPass = tmpHost2.split('@')[0];\n if(tmpUserPass.match(/\\:/)) {\n aURL.user = tmpUserPass.split(':')[0];\n aURL.pass = tmpUserPass.split(':')[1];\n } else {\n aURL.user = tmpUserPass;\n aURL.pass = false;\n }\n }\n }\n }\n return aURL;\n },\n\n /**\n * Formats an URL object into an URL string.\n *\n * @method format\n * @param {String|Location|Object} urlObj Window.location, a.href, or parseUrl object to format\n * @return {String} Full URL.\n */\n format: function (urlObj) {\n var protocol = '';\n var host = '';\n var path = '';\n var frag = '';\n var query = '';\n\n if (typeof urlObj.protocol === 'string') {\n protocol = urlObj.protocol + '//'; // here it comes with the colon\n } else if (typeof urlObj.scheme === 'string') {\n protocol = urlObj.scheme + '://';\n }\n\n host = urlObj.host || urlObj.hostname || '';\n path = urlObj.path || '';\n\n if (typeof urlObj.query === 'string') {\n query = urlObj.query;\n } else if (typeof urlObj.search === 'string') {\n query = urlObj.search.replace(/^\\?/, '');\n }\n if (typeof urlObj.fragment === 'string') {\n frag = urlObj.fragment;\n } else if (typeof urlObj.hash === 'string') {\n frag = urlObj.hash.replace(/#$/, '');\n }\n\n return [\n protocol,\n host,\n path,\n query && '?' + query,\n frag && '#' + frag\n ].join('');\n },\n\n /**\n * Gets the last loaded script element\n *\n * @method currentScriptElement\n * @param {String} [match] String to match against the script src attribute\n * @return {DOMElement|Boolean} Returns the `script` DOM Element or false if unable to find it.\n * @public\n * @static\n * @sample Ink_Util_Url_currentScriptElement.html \n */\n currentScriptElement: function(match)\n {\n var aScripts = document.getElementsByTagName('script');\n if(typeof(match) === 'undefined') {\n if(aScripts.length > 0) {\n return aScripts[(aScripts.length - 1)];\n } else {\n return false;\n }\n } else {\n var curScript = false;\n var re = new RegExp(\"\"+match+\"\", \"i\");\n for(var i=0, total = aScripts.length; i < total; i++) {\n curScript = aScripts[i];\n if(re.test(curScript.src)) {\n return curScript;\n }\n }\n return false;\n }\n }\n };\n\n return Url;\n\n});\n","/**\n * Validation Utilities\n * @module Ink.Util.Validator_1\n * @version 1\n */\n \nInk.createModule('Ink.Util.Validator', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Validator_1 \n */\n var Validator = {\n\n /**\n * List of country codes avaible for the isPhone method\n *\n * @property _countryCodes\n * @type {Array}\n * @private\n * @static\n * @readOnly\n */\n _countryCodes : [\n 'AO',\n 'CV',\n 'MZ',\n 'PT'\n ],\n\n /**\n * International number for portugal\n *\n * @property _internacionalPT\n * @type {Number}\n * @private\n * @static\n * @readOnly\n *\n */\n _internacionalPT: 351,\n\n /**\n * List of all portuguese number prefixes\n *\n * @property _indicativosPT\n * @type {Object}\n * @private\n * @static\n * @readOnly\n *\n */\n _indicativosPT: {\n 21: 'lisboa',\n 22: 'porto',\n 231: 'mealhada',\n 232: 'viseu',\n 233: 'figueira da foz',\n 234: 'aveiro',\n 235: 'arganil',\n 236: 'pombal',\n 238: 'seia',\n 239: 'coimbra',\n 241: 'abrantes',\n 242: 'ponte de sôr',\n 243: 'santarém',\n 244: 'leiria',\n 245: 'portalegre',\n 249: 'torres novas',\n 251: 'valença',\n 252: 'vila nova de famalicão',\n 253: 'braga',\n 254: 'peso da régua',\n 255: 'penafiel',\n 256: 'são joão da madeira',\n 258: 'viana do castelo',\n 259: 'vila real',\n 261: 'torres vedras',\n 262: 'caldas da raínha',\n 263: 'vila franca de xira',\n 265: 'setúbal',\n 266: 'évora',\n 268: 'estremoz',\n 269: 'santiago do cacém',\n 271: 'guarda',\n 272: 'castelo branco',\n 273: 'bragança',\n 274: 'proença-a-nova',\n 275: 'covilhã',\n 276: 'chaves',\n 277: 'idanha-a-nova',\n 278: 'mirandela',\n 279: 'moncorvo',\n 281: 'tavira',\n 282: 'portimão',\n 283: 'odemira',\n 284: 'beja',\n 285: 'moura',\n 286: 'castro verde',\n 289: 'faro',\n 291: 'funchal, porto santo',\n 292: 'corvo, faial, flores, horta, pico',\n 295: 'angra do heroísmo, graciosa, são jorge, terceira',\n 296: 'ponta delgada, são miguel, santa maria',\n\n 91 : 'rede móvel 91 (Vodafone / Yorn)',\n 93 : 'rede móvel 93 (Optimus)',\n 96 : 'rede móvel 96 (TMN)',\n 92 : 'rede móvel 92 (TODOS)',\n //925 : 'rede móvel 925 (TMN 925)',\n //926 : 'rede móvel 926 (TMN 926)',\n //927 : 'rede móvel 927 (TMN 927)',\n //922 : 'rede móvel 922 (Phone-ix)',\n\n 707: 'número único',\n 760: 'número único',\n 800: 'número grátis',\n 808: 'chamada local',\n 30: 'voip'\n },\n /**\n * International number for Cabo Verde\n *\n * @property _internacionalCV\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalCV: 238,\n\n /**\n * List of all Cabo Verde number prefixes\n *\n * @property _indicativosCV\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosCV: {\n 2: 'fixo',\n 91: 'móvel 91',\n 95: 'móvel 95',\n 97: 'móvel 97',\n 98: 'móvel 98',\n 99: 'móvel 99'\n },\n /**\n * International number for Angola\n *\n * @property _internacionalAO\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalAO: 244,\n\n /**\n * List of all Angola number prefixes\n *\n * @property _indicativosAO\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosAO: {\n 2: 'fixo',\n 91: 'móvel 91',\n 92: 'móvel 92'\n },\n /**\n * International number for Mozambique\n *\n * @property _internacionalMZ\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalMZ: 258,\n\n /**\n * List of all Mozambique number prefixes\n *\n * @property _indicativosMZ\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosMZ: {\n 2: 'fixo',\n 82: 'móvel 82',\n 84: 'móvel 84'\n },\n\n /**\n * International number for Timor\n *\n * @property _internacionalTL\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalTL: 670,\n\n /**\n * List of all Timor number prefixes\n *\n * @property _indicativosTL\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosTL: {\n 3: 'fixo',\n 7: 'móvel 7'\n },\n\n /**\n * Regular expression groups for several groups of characters\n *\n * http://en.wikipedia.org/wiki/C0_Controls_and_Basic_Latin\n * http://en.wikipedia.org/wiki/Plane_%28Unicode%29#Basic_Multilingual_Plane\n * http://en.wikipedia.org/wiki/ISO_8859-1\n *\n * @property _characterGroups\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _characterGroups: {\n numbers: ['0-9'],\n asciiAlpha: ['a-zA-Z'],\n latin1Alpha: ['a-zA-Z', '\\u00C0-\\u00FF'],\n unicodeAlpha: ['a-zA-Z', '\\u00C0-\\u00FF', '\\u0100-\\u1FFF', '\\u2C00-\\uD7FF'],\n /* whitespace characters */\n space: [' '],\n dash: ['-'],\n underscore: ['_'],\n nicknamePunctuation: ['_.-'],\n\n singleLineWhitespace: ['\\t '],\n newline: ['\\n'],\n whitespace: ['\\t\\n\\u000B\\f\\r\\u00A0 '],\n\n asciiPunctuation: ['\\u0021-\\u002F', '\\u003A-\\u0040', '\\u005B-\\u0060', '\\u007B-\\u007E'],\n latin1Punctuation: ['\\u0021-\\u002F', '\\u003A-\\u0040', '\\u005B-\\u0060', '\\u007B-\\u007E', '\\u00A1-\\u00BF', '\\u00D7', '\\u00F7'],\n unicodePunctuation: ['\\u0021-\\u002F', '\\u003A-\\u0040', '\\u005B-\\u0060', '\\u007B-\\u007E', '\\u00A1-\\u00BF', '\\u00D7', '\\u00F7', '\\u2000-\\u206F', '\\u2E00-\\u2E7F', '\\u3000-\\u303F']\n },\n\n /**\n * Creates a regular expression for several character groups.\n *\n * @method createRegExp\n *\n * @param {Object} groups\n * Groups to build regular expressions for. Possible keys are:\n *\n * - **numbers**: 0-9\n * - **asciiAlpha**: a-z, A-Z\n * - **latin1Alpha**: asciiAlpha, plus printable characters in latin-1\n * - **unicodeAlpha**: unicode alphanumeric characters.\n * - **space**: ' ', the space character.\n * - **dash**: dash character.\n * - **underscore**: underscore character.\n * - **nicknamePunctuation**: dash, dot, underscore\n * - **singleLineWhitespace**: space and tab (whitespace which only spans one line).\n * - **newline**: newline character ('\\n')\n * - **whitespace**: whitespace characters in the ASCII character set.\n * - **asciiPunctuation**: punctuation characters in the ASCII character set.\n * - **latin1Punctuation**: punctuation characters in latin-1.\n * - **unicodePunctuation**: punctuation characters in unicode.\n *\n * @returns {RegExp} A regular expression with the given groups.\n */\n createRegExp: function (groups) {\n var re = '^[';\n for (var key in groups) if (groups.hasOwnProperty(key)) {\n if (!(key in Validator._characterGroups)) {\n throw new Error('group ' + key + ' is not a valid character group');\n } else if (groups[key]) {\n re += Validator._characterGroups[key].join('');\n }\n }\n if (re === '^[') {\n // No changes\n return new RegExp('$^'); // match nothing\n }\n return new RegExp(re + ']*?$');\n },\n\n /**\n * Checks if a field has the required groups.\n *\n * @method checkCharacterGroups\n * @param {String} s The validation string\n * @param {Object} [groups={}] What groups are included. See `createRegExp`\n * @return {Boolean} Whether this is a valid string (all groups pass).\n * @sample Ink_Util_Validator_checkCharacterGroups.html \n */\n checkCharacterGroups: function (s, groups) {\n return Validator.createRegExp(groups).test(s);\n },\n\n /**\n * Checks if a field contains unicode printable characters.\n *\n * @method unicode\n * @param {String} s The validation string\n * @param {Object} [options={}] Optional configuration object. See createRegexp\n * @return {Boolean} Whether this is a valid unicode string.\n */\n unicode: function (s, options) {\n return Validator.checkCharacterGroups(s, Ink.extendObj({\n unicodeAlpha: true}, options));\n },\n\n /**\n * Checks if a field only contains latin-1 alphanumeric characters. \n * Takes options for allowing singleline whitespace, cross-line whitespace and punctuation.\n *\n * @method latin1\n *\n * @param {String} s The validation string\n * @param {Object} [options={}] Optional configuration object. See createRegexp\n * @return {Boolean} Whether this is a valid latin1 string.\n * @sample Ink_Util_Validator_latin1.html \n */\n latin1: function (s, options) {\n return Validator.checkCharacterGroups(s, Ink.extendObj({\n latin1Alpha: true}, options));\n },\n\n /**\n * Checks if a field only contains only ASCII alphanumeric characters. \n * Takes options for allowing singleline whitespace, cross-line whitespace and punctuation.\n *\n * @method ascii\n *\n * @param {String} s The validation string\n * @param {Object} [options={}] Optional configuration object. See createRegexp\n * @return {Boolean} Whether this is a valid ascii string.\n * @sample Ink_Util_Validator_ascii.html \n */\n ascii: function (s, options) {\n return Validator.checkCharacterGroups(s, Ink.extendObj({\n asciiAlpha: true}, options));\n },\n\n /**\n * Checks if a number is a valid\n *\n * @method number\n * @param {String} numb The number\n * @param {Object} [options] Further options\n * @param {String} [options.decimalSep='.'] Allow decimal separator.\n * @param {String} [options.thousandSep=\",\"] Strip this character from the number.\n * @param {String} [options.negative=false] Allow negative numbers.\n * @param {String} [options.decimalPlaces=null] Maximum number of decimal places. Use `0` for an integer number.\n * @param {Number} [options.max=null] Maximum number\n * @param {Number} [options.min=null] Minimum number\n * @param {Boolean}[options.returnNumber=false] When this option is `true`, return the number itself when the value is valid.\n * @return {Boolean|Number} `false` when invalid, `true` when valid. If `options.returnNumber` is `true`, return the parsed, valid number or `false`.\n * @sample Ink_Util_Validator_number.html \n */\n number: function (numb, options) {\n numb = numb + '';\n options = Ink.extendObj({\n decimalSep: '.',\n thousandSep: '',\n negative: true,\n decimalPlaces: null,\n maxDigits: null,\n max: null,\n min: null,\n returnNumber: false\n }, options || {});\n // smart recursion thing sets up aliases for options.\n if (options.thousandSep) {\n numb = numb.replace(new RegExp('\\\\' + options.thousandSep, 'g'), '');\n options.thousandSep = '';\n return Validator.number(numb, options);\n }\n if (options.negative === false) {\n options.min = 0;\n options.negative = true;\n return Validator.number(numb, options);\n }\n if (options.decimalSep !== '.') {\n numb = numb.replace(new RegExp('\\\\' + options.decimalSep, 'g'), '.');\n }\n\n if (!/^(-)?(\\d+)?(\\.\\d+)?$/.test(numb) || numb === '') {\n return false; // forbidden character found\n }\n \n var split;\n if (options.decimalSep && numb.indexOf(options.decimalSep) !== -1) {\n split = numb.split(options.decimalSep);\n if (options.decimalPlaces !== null &&\n split[1].length > options.decimalPlaces) {\n return false;\n }\n } else {\n split = ['' + numb, ''];\n }\n \n if (options.maxDigits!== null) {\n if (split[0].replace(/-/g, '').length > options.maxDigits) {\n return split;\n }\n }\n \n // Now look at the actual float\n var ret = parseFloat(numb);\n \n if (options.maxExcl !== null && ret >= options.maxExcl ||\n options.minExcl !== null && ret <= options.minExcl) {\n return false;\n }\n if (options.max !== null && ret > options.max ||\n options.min !== null && ret < options.min) {\n return false;\n }\n \n if (options.returnNumber) {\n return ret;\n } else {\n return true;\n }\n },\n\n /**\n * Checks if a year is Leap \"Bissexto\"\n *\n * @method _isLeapYear\n * @param {Number} year Year to be checked\n * @return {Boolean} True if it is a leap year.\n * @private\n * @static\n * @example\n * Ink.requireModules(['Ink.Util.Validator_1'], function( InkValidator ){\n * console.log( InkValidator._isLeapYear( 2004 ) ); // Result: true\n * console.log( InkValidator._isLeapYear( 2006 ) ); // Result: false\n * });\n */\n _isLeapYear: function(year){\n var yearRegExp = /^\\d{4}$/;\n\n if(yearRegExp.test(year)){\n return ((year%4) ? false: ((year%100) ? true : ((year%400)? false : true)) );\n }\n\n return false;\n },\n\n /**\n * Object with the date formats available for validation\n *\n * @property _dateParsers\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _dateParsers: {\n 'yyyy-mm-dd': {day:5, month:3, year:1, sep: '-', parser: /^(\\d{4})(\\-)(\\d{1,2})(\\-)(\\d{1,2})$/},\n 'yyyy/mm/dd': {day:5, month:3, year:1, sep: '/', parser: /^(\\d{4})(\\/)(\\d{1,2})(\\/)(\\d{1,2})$/},\n 'yy-mm-dd': {day:5, month:3, year:1, sep: '-', parser: /^(\\d{2})(\\-)(\\d{1,2})(\\-)(\\d{1,2})$/},\n 'yy/mm/dd': {day:5, month:3, year:1, sep: '/', parser: /^(\\d{2})(\\/)(\\d{1,2})(\\/)(\\d{1,2})$/},\n 'dd-mm-yyyy': {day:1, month:3, year:5, sep: '-', parser: /^(\\d{1,2})(\\-)(\\d{1,2})(\\-)(\\d{4})$/},\n 'dd/mm/yyyy': {day:1, month:3, year:5, sep: '/', parser: /^(\\d{1,2})(\\/)(\\d{1,2})(\\/)(\\d{4})$/},\n 'dd-mm-yy': {day:1, month:3, year:5, sep: '-', parser: /^(\\d{1,2})(\\-)(\\d{1,2})(\\-)(\\d{2})$/},\n 'dd/mm/yy': {day:1, month:3, year:5, sep: '/', parser: /^(\\d{1,2})(\\/)(\\d{1,2})(\\/)(\\d{2})$/}\n },\n\n /**\n * Gets the number of days in a given month of a given year\n *\n * @method _daysInMonth\n * @param {Number} _m Month (1 to 12)\n * @param {Number} _y Year\n * @return {Number} Returns the number of days in a given month of a given year\n * @private\n * @static\n * @example\n * Ink.requireModules(['Ink.Util.Validator_1'], function( InkValidator ){\n * console.log( InkValidator._daysInMonth( 2, 2004 ) ); // Result: 29\n * console.log( InkValidator._daysInMonth( 2, 2006 ) ); // Result: 28\n * });\n */\n _daysInMonth: function(_m,_y){\n var nDays=0;\n\n _m = parseInt(_m, 10);\n _y = parseInt(_y, 10);\n\n if(_m===1 || _m===3 || _m===5 || _m===7 || _m===8 || _m===10 || _m===12) {\n nDays= 31;\n } else if ( _m===4 || _m===6 || _m===9 || _m===11) {\n nDays = 30;\n } else if (_m===2) {\n if((_y%400===0) || (_y%4===0 && _y%100!==0)) {\n nDays = 29;\n } else {\n nDays = 28;\n }\n }\n\n return nDays;\n },\n\n\n\n /**\n * Checks if a date is valid\n *\n * @method _isValidDate\n * @param {Number} year Year fragment of your date.\n * @param {Number} month Month fragment of your date.\n * @param {Number} day Day fragment of your date.\n * @return {Boolean} True if valid\n * @private\n * @static\n * @example\n * Ink.requireModules(['Ink.Util.Validator_1'], function( InkValidator ){\n * console.log( InkValidator._isValidDate( 2004, 2, 29 ) ); // Result: true\n * console.log( InkValidator._isValidDate( 2006, 2, 29 ) ); // Result: false\n * });\n */\n _isValidDate: function(year, month, day){\n var yearRegExp = /^\\d{4}$/;\n var validOneOrTwo = /^\\d{1,2}$/;\n if(yearRegExp.test(year) && validOneOrTwo.test(month) && validOneOrTwo.test(day)){\n if(month>=1 && month<=12 && day>=1 && this._daysInMonth(month,year)>=day){\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if an email address is valid\n *\n * @method email\n * @param {String} email String containing the e-mail.\n * @return {Boolean} `true` if it's a valid e-mail address.\n * @public\n * @static\n * @sample Ink_Util_Validator_mail.html \n */\n email: function(email)\n {\n var emailValido = new RegExp(\"^[_a-z0-9-]+((\\\\.|\\\\+)[_a-z0-9-]+)*@([\\\\w]*-?[\\\\w]*\\\\.)+[a-z]{2,4}$\", \"i\");\n return !!emailValido.test(email);\n },\n\n /**\n * Deprecated. Alias for email(). Use it instead.\n *\n * @method mail\n * @public\n * @param {String} mail See `email`\n * @returns {Boolean} See `email`\n * @static\n * @private\n */\n mail: function (mail) { return Validator.email(mail); },\n\n /**\n * Checks if an url is valid\n *\n * @method url\n * @param {String} url URL to be checked\n * @param {Boolean} [full] If true, validates a full URL (one that should start with 'http')\n * @return {Boolean} True if valid\n * @public\n * @static\n * @sample Ink_Util_Validator_url.html \n */\n url: function(url, full)\n {\n if(typeof full === \"undefined\" || full === false) {\n var reHTTP = new RegExp(\"(^(http\\\\:\\\\/\\\\/|https\\\\:\\\\/\\\\/)(.+))\", \"i\");\n if(reHTTP.test(url) === false) {\n url = 'http://'+url;\n }\n }\n\n var reUrl = new RegExp(\"^(http:\\\\/\\\\/|https:\\\\/\\\\/)([\\\\w]*(-?[\\\\w]*)*\\\\.)+[a-z]{2,4}\", \"i\");\n if(reUrl.test(url) === false) {\n return false;\n } else {\n return true;\n }\n },\n\n /**\n * Checks if a phone is valid in Portugal\n *\n * @method isPTPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Portuguese Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isPTPhone.html\n */\n isPTPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosPT) {\n if(typeof(this._indicativosPT[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n\n var re351 = /^(00351|\\+351)/;\n if(re351.test(phone)) {\n phone = phone.replace(re351, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{9}/i;\n if(phone.length === 9 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Alias function for isPTPhone\n *\n * @method isPortuguesePhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Portuguese Phone\n * @public\n * @static\n */\n isPortuguesePhone: function(phone)\n {\n return this.isPTPhone(phone);\n },\n\n /**\n * Checks if a phone is valid in Cabo Verde\n *\n * @method isCVPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Cape Verdean Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isCVPhone.html \n */\n isCVPhone: function(phone)\n {\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosCV) {\n if(typeof(this._indicativosCV[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n\n var re238 = /^(00238|\\+238)/;\n if(re238.test(phone)) {\n phone = phone.replace(re238, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{7}/i;\n if(phone.length === 7 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a phone is valid in Angola\n *\n * @method isAOPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Angolan Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isAOPhone.html \n */\n isAOPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosAO) {\n if(typeof(this._indicativosAO[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n\n var re244 = /^(00244|\\+244)/;\n if(re244.test(phone)) {\n phone = phone.replace(re244, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{9}/i;\n if(phone.length === 9 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a phone is valid in Mozambique\n *\n * @method isMZPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Mozambican Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isMZPhone.html \n */\n isMZPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosMZ) {\n if(typeof(this._indicativosMZ[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n var re258 = /^(00258|\\+258)/;\n if(re258.test(phone)) {\n phone = phone.replace(re258, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{8,9}/i;\n if((phone.length === 9 || phone.length === 8) && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n if(phone.indexOf('2') === 0 && phone.length === 8) {\n return true;\n } else if(phone.indexOf('8') === 0 && phone.length === 9) {\n return true;\n }\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a phone is valid in Timor\n *\n * @method isTLPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid phone from Timor-Leste\n * @public\n * @static\n * @sample Ink_Util_Validator_isTLPhone.html \n */\n isTLPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosTL) {\n if(typeof(this._indicativosTL[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n var re670 = /^(00670|\\+670)/;\n if(re670.test(phone)) {\n phone = phone.replace(re670, \"\");\n }\n\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{7}/i;\n if(phone.length === 7 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a number is a phone number.\n * This method validates the number in all country codes available the ones set in the second param\n *\n * @method isPhone\n * @param {String} phone Phone number to validate\n * @param {String|Array} [countryCode] Country code or array of countries to validate\n * @return {Boolean} True if it's a valid phone in any country available\n * @public\n * @static\n * @sample Ink_Util_Validator_isPhone.html\n */\n isPhone: function(){\n var index;\n\n if(arguments.length===0){\n return false;\n }\n\n var phone = arguments[0];\n\n if(arguments.length>1){\n if(arguments[1].constructor === Array){\n var func;\n for(index=0; index= 0 && match[i-1] <= 100){\n valid = true;\n } else {\n return false;\n }\n }\n // check 0 to 255 values\n if(i===1 || i===3 || i===5 && (typeof match[i+1] === \"undefined\" || match[i+1] === \"\")){\n if(typeof match[i] !== \"undefined\" && match[i] >= 0 && match[i] <= 255){\n valid = true;\n } else {\n return false;\n }\n }\n }\n }\n\n // hsl range check\n if((match = hsl.exec(str)) !== null || (match = hsla.exec(str)) !== null){\n i = match.length;\n while(i--){\n // check percentage values\n if(i===3 || i===5){\n if(typeof match[i-1] !== \"undefined\" && typeof match[i] !== \"undefined\" && match[i] !== \"\" &&\n match[i-1] >= 0 && match[i-1] <= 100){\n valid = true;\n } else {\n return false;\n }\n }\n // check 0 to 360 value\n if(i===1){\n if(typeof match[i] !== \"undefined\" && match[i] >= 0 && match[i] <= 360){\n valid = true;\n } else {\n return false;\n }\n }\n }\n }\n\n return valid;\n },\n\n /**\n * Checks if the value is a valid IP. \n *\n * @method isIP\n * @param {String} value Value to be checked\n * @param {String} ipType Type of IP to be validated. The values are: ipv4, ipv6. By default is ipv4.\n * @return {Boolean} True if the value is a valid IP address. False if not.\n * @sample Ink_Util_Validator_isIP.html \n */\n isIP: function( value, ipType ){\n if( typeof value !== 'string' ){\n return false;\n }\n\n ipType = (ipType || 'ipv4').toLowerCase();\n\n switch( ipType ){\n case 'ipv4':\n return (/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/).test(value);\n case 'ipv6':\n return (/^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/).test(value);\n default:\n return false;\n }\n },\n\n /**\n * Credit Card specifications, to be used in the credit card verification.\n *\n * @property _creditCardSpecs\n * @type {Object}\n * @private\n */\n _creditCardSpecs: {\n 'default': {\n 'length': '13,14,15,16,17,18,19',\n 'prefix': /^.+/,\n 'luhn': true\n },\n\n 'american express': {\n 'length': '15',\n 'prefix': /^3[47]/,\n 'luhn' : true\n },\n\n 'diners club': {\n 'length': '14,16',\n 'prefix': /^36|55|30[0-5]/,\n 'luhn' : true\n },\n\n 'discover': {\n 'length': '16',\n 'prefix': /^6(?:5|011)/,\n 'luhn' : true\n },\n\n 'jcb': {\n 'length': '15,16',\n 'prefix': /^3|1800|2131/,\n 'luhn' : true\n },\n\n 'maestro': {\n 'length': '16,18',\n 'prefix': /^50(?:20|38)|6(?:304|759)/,\n 'luhn' : true\n },\n\n 'mastercard': {\n 'length': '16',\n 'prefix': /^5[1-5]/,\n 'luhn' : true\n },\n\n 'visa': {\n 'length': '13,16',\n 'prefix': /^4/,\n 'luhn' : true\n }\n },\n\n /**\n * Luhn function, to be used when validating credit card numbers\n * @method _luhn\n * @private\n * @param {Number} num Given credit card number\n * @returns {Boolean} Whether the credit card number is valid.\n */\n _luhn: function (num){\n\n num = parseInt(num,10);\n\n if ( (typeof num !== 'number') && (num % 1 !== 0) ){\n // Luhn can only be used on nums!\n return false;\n }\n\n num = num+'';\n // Check num length\n var length = num.length;\n\n // Checksum of the card num\n var i;\n var checksum = 0;\n\n for (i = length - 1; i >= 0; i -= 2)\n {\n // Add up every 2nd digit, starting from the right\n checksum += parseInt(num.substr(i, 1),10);\n }\n\n for (i = length - 2; i >= 0; i -= 2)\n {\n // Add up every 2nd digit doubled, starting from the right\n var dbl = parseInt(num.substr(i, 1) * 2,10);\n\n // Subtract 9 from the dbl where value is greater than 10\n checksum += (dbl >= 10) ? (dbl - 9) : dbl;\n }\n\n // If the checksum is a multiple of 10, the number is valid\n return (checksum % 10 === 0);\n },\n\n /**\n * Checks if a number is of a specific credit card type\n * @method isCreditCard\n * @param {String} num Number to be validates\n * @param {String|Array} creditCardType Credit card type or list of types. See _creditCardSpecs for the list of supported values.\n * @return {Boolean} Whether the number is of that credit card type (or at least one of `creditCardType` if you pass in an array).\n * @sample Ink_Util_Validator_isCreditCard.html \n */\n isCreditCard: function(num, creditCardType){\n\n if ( /\\d+/.test(num) === false ){\n return false;\n }\n\n if ( typeof creditCardType === 'undefined' ){\n creditCardType = 'default';\n }\n else if ( creditCardType instanceof Array ){\n var i, ccLength = creditCardType.length;\n for ( i=0; i < ccLength; i++ ){\n // Test each type for validity\n if (this.isCreditCard(num, creditCardType[i]) ){\n return true;\n }\n }\n\n return false;\n }\n\n // Check card type\n creditCardType = creditCardType.toLowerCase();\n\n if ( typeof this._creditCardSpecs[creditCardType] === 'undefined' ){\n return false;\n }\n\n // Check card number length\n var length = num.length+'';\n\n // Validate the card length by the card type\n if ( this._creditCardSpecs[creditCardType]['length'].split(\",\").indexOf(length) === -1 ){\n return false;\n }\n\n // Check card number prefix\n if ( !this._creditCardSpecs[creditCardType]['prefix'].test(num) ){\n return false;\n }\n\n // No Luhn check required\n if (this._creditCardSpecs[creditCardType]['luhn'] === false){\n return true;\n }\n\n return this._luhn(num);\n }\n };\n\n return Validator;\n\n});\n"]} \ No newline at end of file +{"version":3,"file":"ink.min.js","sources":["../../src/js/Ink/1/lib.js","../../src/js/Ink/Net/Ajax/1/lib.js","../../src/js/Ink/Net/JsonP/1/lib.js","../../src/js/Ink/Dom/Browser/1/lib.js","../../src/js/Ink/Dom/Css/1/lib.js","../../src/js/Ink/Dom/Element/1/lib.js","../../src/js/Ink/Dom/Event/1/lib.js","../../src/js/Ink/Dom/FormSerialize/1/lib.js","../../src/js/Ink/Dom/Loaded/1/lib.js","../../src/js/Ink/Dom/Selector/1/lib.js","../../src/js/Ink/Util/Array/1/lib.js","../../src/js/Ink/Util/BinPack/1/lib.js","../../src/js/Ink/Util/Cookie/1/lib.js","../../src/js/Ink/Util/Date/1/lib.js","../../src/js/Ink/Util/Dumper/1/lib.js","../../src/js/Ink/Util/I18n/1/lib.js","../../src/js/Ink/Util/Json/1/lib.js","../../src/js/Ink/Util/String/1/lib.js","../../src/js/Ink/Util/Url/1/lib.js","../../src/js/Ink/Util/Validator/1/lib.js"],"names":["window","document","paths","modules","modulesLoadOrder","modulesRequested","pendingRMs","modulesWaitingForDeps","apply","Function","prototype","isEmptyObject","o","k","hasOwnProperty","Ink","VERSION","_checkPendingRequireModules","I","F","dep","mod","cb","pRMs","toApply","length","left","args","remaining","push","i","setTimeout","getPath","key","noLib","split","curKey","root","path","slice","join","test","setPath","rootURI","replace","loadScript","uri","contentType","indexOf","givenUri","this","Error","scriptEl","createElement","setAttribute","onerror","error","head","getElementsByTagName","appendChild","_loadLater","namespace","ns","returnParentAndKey","levels","nsobj","parent","f","getModule","version","createModule","deps","modFn","modAll","Array","call","arguments","moduleContent","_version","isInkModule","t","requireModules","cbFn","undefined","_moduleRenames","warn","Ink.UI.Aux_1","getModulesLoadOrder","getModuleScripts","mlo","unshift","map","m","getModuleURL","createExt","moduleName","dependencies","bind","fn","context","innerArgs","finalArgs","concat","bindMethod","object","methodName","bindEvent","event","id","getElementById","ss","selector","from","Dom","Selector","select","s","extendObj","destination","sources","len","property","Object","log","console","Ajax","url","options","init","globalOptions","parameters","requestHeaders","xMLHttpRequestWithCredentials","XMLHttpRequest","userOptions","asynchronous","cors","validateCors","debug","delay","evalJS","method","postBody","sanitizeJSON","signRequest","timeout","useCredentials","xhrProxy","onComplete","onCreate","onException","onFailure","onHeaders","onInit","onSuccess","onTimeout","globalParameters","paramsObjToStr","safeCall","urlLocation","_locationFromURL","isHTTP","_locationIsHTTP","isCrossDomain","_locationIsCrossDomain","location","requestHasBody","search","transport","getTransport","request","createElementNS","href","match","protocol","widget","split1","split2","protocol1","protocol2","colonOrSlash","host1","host2","usingXDomainReq","XDomainRequest","ActiveXObject","e","setHeaders","headers","Accept","Accept-Language","navigator","language","X-Requested-With","X-Ink-Version","headerReqName","overrideMimeType","userAgent","Connection","headerName","setRequestHeader","optParams","p","a","params","toString","isNaN","encodeURIComponent","pop","setParams","getHeader","name","getResponseHeader","getAllHeaders","getAllResponseHeaders","getResponse","r","headerJSON","responseJSON","timeTaken","Date","startTime","requestedUrl","readyState","responseText","responseXML","status","statusText","abort","clearTimeout","delayTimeout","stoTimeout","ex","finish","runStateChange","rs","getTime","responseContent","response","curStatus","isSuccess","headerContentType","evalJSON","mimeType","xmlDoc","DOMParser","parseFromString","xml","onreadystatechange","destroy","handlerName","value","nodeType","crossDomain","open","withCredentials","onload","send","isJSON","str","strJSON","sanitize","JSON","parse","eval","load","callback","ping","JsonP","failureObj","callbackParam","internalCallback","randVar","parseInt","Math","random","Net","_cleanUp","_addScriptTag","_addParamsToGet","hasQuestionMark","sep","pKey","pValue","parts","_getScriptContainer","body","documentElement","rnd_seed","_scriptEl","type","src","scriptCtn","_removeScriptTag","parentNode","removeChild","Browser","IE","GECKO","OPERA","SAFARI","KONQUEROR","CHROME","model","cssPrefix","domPrefix","detectBrowser","setDimensions","setReferrer","myWidth","myHeight","innerWidth","innerHeight","clientWidth","clientHeight","windowWidth","windowHeight","referrer","escape","_sniffUserAgent","sAgent","toLowerCase","rVersion","re","RegExp","reVersion","alert","getCs","defaultView","getComputedStyle","Css","addRemoveClassName","elm","className","addRemState","addClassName","removeClassName","classList","add","hasClassName","remove","elmClassName","setClassName","all","has","contains","blinkClass","element","negate","Number","toggleClassName","forceAdd","toggle","setOpacity","val","style","opacity","filter","_camelCase","_","$1","toUpperCase","getStyle","currentStyle","charAt","css","parseFloat","setStyle","cssText","prop","styleFloat","cssFloat","show","forceDisplayProperty","display","hide","showHide","forceShow","_getRefTag","firstElementChild","child","firstChild","nextSibling","appendStyleTag","force","styles","oldStyle","l","innerHTML","defStyle","refTag","styleStr","styleSheet","createTextNode","insertBefore","appendStylesheet","media","rel","_loadingCSSFiles","_loadedCSSFiles","appendStylesheetCb","cbs","linkEl","headEl","imgEl","_url","callbacks","decToHex","dec","normalizeTo2","rDec","gDec","g","bDec","b","rgb","hexToDec","hex","substr","getPropertyFromStylesheet","rule","getRuleFromStylesheet","getPropertyFromStylesheet2","rules","getRulesFromStylesheet","x","sheet","ri","rf","styleSheets","si","sf","cssRules","selectorText","res","getPropertiesFromRule","props","steps","pre","pos","substring","borderTopLeftRadius","borderBottomRightRadius","borderTopRightRadius","borderBottomLeftRadius","changeFontSize","delta","op","minVal","maxVal","that","TypeError","el","els","fontSize","rect","elem","dimensions","getBoundingClientRect","top","offsetTop","offsetLeft","createContextualFragmentSupport","createRange","Range","createContextualFragment","deleteThisTbodyToken","browserCreatesTbodies","div","InkElement","isDOMElement","get","create","tag","properties","parEl","scrollTo","scrollIntoView","elmOffset","elmTop","elmLeft","offsetParent","y","offset","positionedOffset","valueTop","valueLeft","tagName","position","doc","ownerDocument","docElem","box","clientTop","clientLeft","scrollTop","pageYOffset","scrollLeft","pageXOffset","scroll","_getPropPx","cs","n","c","getPropertyValue","offset2","hasAttribute","attr","getAttribute","insertAfter","newElm","targetElm","insertTop","insertBottom","textContent","node","text","innerText","lastChild","childNodes","nodeValue","setTextContent","isLink","hasAttributeNS","isAncestorOf","ancestor","compareDocumentPosition","descendantOf","descendant","lastElementChild","previousSibling","nextElementSibling","sibling","previousElementSibling","elementWidth","offsetWidth","elementHeight","offsetHeight","elementLeft","elementTop","elementDimensions","outerDimensions","bbox","right","bottom","inViewport","dims","partial","margin","viewportWidth","viewportHeight","isHidden","w","h","isVisible","clonePosition","cloneTo","cloneFrom","ellipsizeText","overflow","whiteSpace","textOverflow","findUpwardsHaving","boolTest","findUpwardsByClass","tst","cls","findUpwardsByTag","nodeName","findUpwardsById","findUpwardsBySelector","sel","matchesSelector","getChildrenText","removeIt","j","part","nodes","jLen","_trimString","String","data","trim","getSelectValues","selectEl","values","_normalizeData","d","data2","fillSelect","container","skipEmpty","defaultValue","containerEl","optionEl","fillRadios","insertAfterEl","splitEl","inputEl","checked","fillChecks","parentIndexOf","parentEl","childEl","children","nextSiblings","elements","siblings","index","previousSiblings","childElementCount","_wrapElements","TABLE","html","TBODY","THEAD","TFOOT","TR","_getWrapper","wrapper","wrapFunc","tds","tbody","appendHTML","prependHTML","setHTML","wrap","target","nextNode","unwrap","wrapperSelector","replacement","replaceChild","removeTextNodeChildren","prevEl","toRemove","htmlToFragment","range","createDocumentFragment","selectNode","fragment","tempElement","current","InkDomSelector","dataset","attrs","attributes","curAttr","curAttrName","curAttrValue","total","moveCursorTo","setSelectionRange","createTextRange","collapse","moveEnd","moveStart","pageWidth","xScroll","scrollMaxX","scrollWidth","self","pageHeight","yScroll","scrollMaxY","scrollHeight","bean","definition","win","old","namespaceRegex","nameRegex","addEvent","removeEvent","W3C_MODEL","eventSupport","ONE","str2arr","isString","isFunction","standardNativeEvents","w3cNativeEvents","nativeEvents","hash","events","customEvents","isAncestor","check","related","relatedTarget","prefix","mouseenter","base","condition","mouseleave","mousewheel","Event","commonProps","mouseProps","mouseWheelProps","keyProps","textProps","touchProps","messageProps","stateProps","overOutRegex","typeFixers","reg","fix","newEvent","keyCode","which","rightClick","button","pageX","pageY","clientX","clientY","typeFixerMap","isNative","parentWindow","originalEvent","isBean","srcElement","fixer","preventDefault","returnValue","stopPropagation","cancelBubble","stop","stopped","stopImmediatePropagation","isImmediatePropagationStopped","clone","currentTarget","ne","targetElement","RegEntry","wrappedHandler","eargs","findTarget","eventElement","__beanDel","ft","handler","original","namespaces","customType","once","removeListener","eventType","inNamespaces","checkNamespaces","matches","checkElement","checkOriginal","checkHandler","registry","forAll","pfx","list","entries","entry","put","del","splice","removed","selectorEngine","setSelectorEngine","querySelectorAll","rootListener","propertyName","listeners","listener","custom","attachEvent","detachEvent","rm","originalFn","orgType","handlers","delegate","array","fireListener","evt","createEvent","dispatchEvent","fireEvent","createEventObject","off","typeSpec","isTypeStr","on","types","first","delfn","one","fire","names","beanDel","noConflict","cleanup","CollectGarbage","InkEvent","KEY_BACKSPACE","KEY_TAB","KEY_RETURN","KEY_ESC","KEY_SPACE","KEY_LEFT","KEY_UP","KEY_RIGHT","KEY_DOWN","KEY_DELETE","KEY_HOME","KEY_END","KEY_PAGEUP","KEY_PAGEDOWN","KEY_INSERT","throttle","func","wait","throttled","now","timeDiff","lastCall","ev","delegationTarget","fromElement","toElement","findElement","elmTagName","observe","eventName","callBack","useCapture","addEventListener","observeOnce","onceBack","stopObserving","observeMulti","observeDelegated","cursor","Selector_1","removeEventListener","cancel","stopDefault","pointer","pointerX","pointerY","touches","isLeftClick","isRightClick","isMiddleClick","getCharFromKeyboardEvent","changeCasing","fromCharCode","shiftOn","shiftKey","InkArray","isArrayIsh","obj","isArray","toArray","FormSerialize","serialize","form","out","emptyArrayToken","pairs","asPairs","emptyArray","outputUnchecked","forEach","pair","_resultsInArray","emit","serializeEl","elNodeName","elType","multiple","didEmit","thisOption","inputs","_isSerialized","fillIn","map2","_objToPairs","_fillInPairs","groupBy","reduce","_fillInOne","firstOne","firstNodeName","firstType","isSelectMulti","_fillInBoolean","min","checkAttr","input","isChecked","inArray","Loaded","_contexts","run","cbQueue","done","checkState","_checkState","poll","_poll","ael","rem","det","wet","csf","alreadyLoaded","frameElement","doScroll","where","_ready","rnative","createCache","cache","keys","Expr","cacheLength","shift","markFunction","expando","assert","Sizzle","results","seed","groups","nid","newContext","newSelector","preferredDoc","setDocument","documentIsHTML","rquickExpr","exec","support","getElementsByClassName","qsa","rbuggyQSA","tokenize","rescape","toSelector","rsibling","qsaError","removeAttribute","rtrim","siblingCheck","cur","diff","sourceIndex","MAX_NEGATIVE","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","parseOnly","matched","tokens","soFar","preFilters","cached","tokenCache","preFilter","rcomma","rcombinators","matchExpr","addCombinator","matcher","combinator","dir","checkNonElements","doneName","outerCache","dirkey","dirruns","cachedruns","elementMatcher","matchers","condense","unmatched","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","elems","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","relative","implicitRelative","matchContext","matchAnyContext","outermostContext","matcherFromGroupMatchers","elementMatchers","setMatchers","matcherCachedRuns","bySet","byElement","superMatcher","expandContext","setMatched","matchedCount","outermost","contextBackup","find","dirrunsUnique","uniqueSort","contexts","token","runescape","funescape","compile","setFilters","getText","isXML","recompare","sortInput","rbuggyMatches","classCache","compilerCache","hasDuplicate","sortOrder","strundefined","arr","push_native","whitespace","characterEncoding","identifier","operators","pseudos","rpseudo","ridentifier","ID","CLASS","NAME","TAG","ATTR","PSEUDO","CHILD","needsContext","rinputs","rheader","rattributeQuotes","escaped","high","createComment","getByName","pass","getElementsByName","sortDetached","div1","attrHandle","attrId","getAttributeNode","tmp","mozMatchesSelector","webkitMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","adown","bup","compare","aup","ap","bp","expr","ret","specified","msg","duplicates","detectDuplicates","sortStable","sort","selectors","createPseudo",">"," ","+","~","excess","unquoted","pattern","operator","result","what","last","simple","forward","ofType","nodeIndex","start","useCache","pseudo","idx","not","lang","elemLang","focus","activeElement","hasFocus","tabIndex","enabled","disabled","selected","selectedIndex","empty","header","eq","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","group","filters","arrayProto","testedObject","outKey","item","latestGroup","initial","sortMulti","constructor","keyValue","aKeys","shuffle","tmp1","rnd","floor","each","mapFn","filtered","some","intersect","arr1","arr2","shared","J","convert","unique","lastIndexOf","newArr","step","insert","rLen","output","iLen","Packer","fit","blocks","block","findNode","splitNode","used","down","GrowingPacker","growNode","canGrowDown","canGrowRight","shouldGrowRight","shouldGrowDown","growRight","growDown","sorts","area","max","height","msort","width","maxside","criteria","BinPack","binPack","bl","packer","sorter","dims2","fitted","unfitted","filled","Cookie","cookie","_Cookie","aCookie","aItem","decodeURIComponent","set","expires","domain","secure","sName","sExpires","sPath","sDomain","sSecure","oDate","sDate","valueOf","nDate","expiresString","toGMTString","hostname","cookieName","expiresDate","InkDate","_months","_m","_iMonth","month","janeiro","jan","fevereiro","fev","março","mar","abril","abr","maio","mai","junho","jun","julho","jul","agosto","ago","setembro","outubro","novembro","nov","dezembro","dez","_wDays","_d","_iWeek","week","segunda","seg","terça","ter","quarta","qua","quinta","qui","sexta","sex","sábado","sáb","domingo","dom","_daysInMonth","_y","nDays","format","_date","iFormat","escapeChar","jsDate","jsFirstDay","jsThisDay","jsHour","jsDay","getDate","getDay","suffixes","suffix","UTC","getFullYear","getMonth","jsYearStart","days","ceil","jsMonth","getYear","jsYear","getHours","jsMinute","getMinutes","jsSecond","getSeconds","getTimezoneOffset","jsMinZone","jsMinutes","jsDayName","jsMonthName","str_date","mList","objIndex","year","day","dayY","dayW","hour","hourD","sec","msec","ampm","diffM","diffH","date","pattr","_haveDatetime","_haveYear","_haveYDay","_haveDay","_haveMonth","_haveMonthDay","_haveOnlyDay","_haveWDay","_haveWeek","_haveWeekWDay","_haveOnlyWDay","_validDate","_noDate","_haveHour12","_haveHour24","_haveHour","_haveMin","_haveSec","_haveMSec","_haveMoreM","_haveMoreS","_haveDiffM","_haveDiffH","dList","gmt","aux","Dumper","_tab","_formatParam","param","formated","_outputFormat","_getTabs","numberOfTabs","tabs","_i","indent","_typeof","printDump","write","returnDump","alertDump","windowDump","dumperwindow","close","pattrText","funcOrVal","I18n","dict","testMode","append","_dicts","_dict","_testMode","_lang","_gLang","newTestMode","getKey","gLang","langGlobal","_gDict","pars","isObj","$2","$3","ntext","strSin","strPlur","count","ordinal","num","lastDig","ordDict","exceptions","byLastDigit","alias","_gDicts","appendGlobal","twoDigits","function_call","cx","dateToISOString","toISOString","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","toFixed","InkJson","_nativeJSON","_convertToUnicode","_escape","theString","\b","\t","\n","\f","\r","\"","\\","charCodeAt","_toUnicode","unicodeString","inInt","theUnicode","_stringifyValue","isFinite","toJSON","arrayString","objectString","stringify","convertToUnicode","reviver","walk","holder","v","lastIndex","SyntaxError","InkUtilString","_chars","_entities","_accentedChars","_accentedRemovedChars","_htmlUnsafeChars","<","&","'","ucFirst","string","firstWordOnly","replacer","stripTags","allowed","aAllowed","aNewAllowed","cleanedTag","strAllowed","reAllowed","aFoundTags","htmlEntitiesEncode","htmlEntitiesDecode","$0","utf8Encode","utfstring","shortString","words","resultstr","truncateString","utf8Decode","c2","c3","removeAccentedChars","newString","substrCount","haystack","needle","htmlEscapeUnsafe","chars","normalizeWhitespace","toUnicode","unescape","es","hexNum","escapeText","txt","whiteList","txt2","C","escapedCharRegex","unescapeText","strcmp","str1","str2","packetize","maxLen","sz","Url","_keyStr","getUrl","genQueryString","getQueryString","aParams","queryStr","aQueryStr","pairVar","getAnchor","anchor","getAnchorString","anchorStr","aAnchorStr","parseUrl","aURL","scheme","host","query","re1","re2","re3","regPort","tmpHost1","port","tmpHost2","tmpUserPass","user","urlObj","frag","currentScriptElement","aScripts","curScript","Validator","_countryCodes","_internacionalPT","_indicativosPT",21,22,231,232,233,234,235,236,238,239,241,242,243,244,245,249,251,252,253,254,255,256,258,259,261,262,263,265,266,268,269,271,272,273,274,275,276,277,278,279,281,282,283,284,285,286,289,291,292,295,296,91,93,96,92,707,760,800,808,30,"_internacionalCV","_indicativosCV",2,95,97,98,99,"_internacionalAO","_indicativosAO","_internacionalMZ","_indicativosMZ",82,84,"_internacionalTL","_indicativosTL",3,7,"_characterGroups","numbers","asciiAlpha","latin1Alpha","unicodeAlpha","space","dash","underscore","nicknamePunctuation","singleLineWhitespace","newline","asciiPunctuation","latin1Punctuation","unicodePunctuation","createRegExp","checkCharacterGroups","unicode","latin1","ascii","number","numb","decimalSep","thousandSep","negative","decimalPlaces","maxDigits","returnNumber","maxExcl","minExcl","_isLeapYear","yearRegExp","_dateParsers","yyyy-mm-dd","parser","yyyy/mm/dd","yy-mm-dd","yy/mm/dd","dd-mm-yyyy","dd/mm/yyyy","dd-mm-yy","dd/mm/yy","_isValidDate","validOneOrTwo","email","emailValido","mail","full","reHTTP","reUrl","isPTPhone","phone","aInd","strInd","re351","reSpecialChars","reInt","reValid","isPortuguesePhone","isCVPhone","re238","isAOPhone","re244","isMZPhone","re258","isTLPhone","re670","isPhone","codPostal","cp1","cp2","returnBothResults","cPostalSep","cPostal4","cPostal3","parserCPostal","cPostal","isDate","dateStr","yearIndex","monthIndex","dayIndex","dateParser","separator","isColor","valid","keyword","hexa","rgba","hsl","hsla","isIP","ipType","_creditCardSpecs","default","luhn","american express","diners club","discover","jcb","maestro","mastercard","visa","_luhn","checksum","dbl","isCreditCard","creditCardType","ccLength"],"mappings":"CAME,SAASA,EAAQC,GAEf,YAGA,MAAI,OAASD,IAAb,CASA,GAAIE,MACAC,KACAC,KACAC,KACAC,KACAC,KAEAC,EAAQC,SAASC,UAAUF,MAG3BG,EAAgB,SAASC,GAEzB,GAAiB,gBAANA,GAAkB,OAAO,CACpC,KAAK,GAAIC,KAAKD,GACV,GAAIA,EAAEE,eAAeD,GACjB,OAAO,CAGf,QAAO,EAOXb,GAAOe,KAIHC,QAAS,QACTC,4BAA6B,WACzB,GAAIC,GAAGC,EAAGP,EAAGQ,EAAKC,EAAKC,EAAIC,KACvBC,IACJ,KAAKN,EAAI,EAAGC,EAAIb,EAAWmB,OAAYN,EAAJD,IAASA,EAGxC,GAFAN,EAAIN,EAAWY,GAEf,CAEA,IAAKE,IAAOR,GAAEc,KACNd,EAAEc,KAAKZ,eAAeM,KACtBC,EAAMlB,EAAQiB,GACVC,IACAT,EAAEe,KAAKf,EAAEc,KAAKN,IAASC,QAChBT,GAAEc,KAAKN,KACZR,EAAEgB,WAKhB,IAAIhB,EAAEgB,UAAY,EACdL,EAAKM,KAAKjB,OACP,CAEH,GADAU,EAAKV,EAAEU,IACFA,EAAM,eACJV,GAAEU,GACTE,EAAQK,MAAMP,EAAIV,EAAEe,QAI5BrB,EAAaiB,CAEb,KAAK,GAAIO,GAAI,EAAGA,EAAIN,EAAQC,OAAQK,IAChCN,EAAQM,GAAG,GAAGtB,OAAM,EAAOgB,EAAQM,GAAG,GAGtCxB,GAAWmB,OAAS,GACpBM,WAAY,WAAahB,IAAIE,+BAAkC,IAcvEe,QAAS,SAASC,EAAKC,GACnB,GAAIC,GAAQF,EAAIE,MAAM,SAClBC,EACAN,EACAO,EACAC,CAGJ,KAAKR,EAAIK,EAAMV,OAAQK,GAAK,EAAGA,GAAK,EAEhC,GADAM,EAASD,EAAMI,MAAM,EAAGT,EAAI,GAAGU,KAAK,KAChCtC,EAAMkC,GAAS,CACfC,EAAOD,CACP,OAIR,MAAIC,KAAQnC,IACRoC,EAAOpC,EAAMmC,GAKZ,MAAMI,KAAKH,KACZA,GAAQ,KAERR,EAAIK,EAAMV,SAIVa,GAAQH,EAAMI,MAAMT,EAAI,GAAGU,KAAK,KAAO,KAEtCN,IACDI,GAAQ,UAELA,GAfI,MAsCfI,QAAS,SAAST,EAAKU,GAInBzC,EAAM+B,EAAIW,QAAQ,IAAK,MAAQD,GAanCE,WAAY,SAASC,EAAKC,GAGtB,GAAyB,KAArBD,EAAIE,QAAQ,KAAa,CACzB,GAAIC,GAAWH,CAEf,IADAA,EAAMI,KAAKlB,QAAQc,GACP,OAARA,EACA,KAAM,IAAIK,OAAM,0BAA4BF,EAAW,8FAM/D,GAAIG,GAAWnD,EAASoD,cAAc,SACtCD,GAASE,aAAa,OAAQP,GAAe,mBAC7CK,EAASE,aAAa,MAAOR,GAEzB,WAAaM,KACbA,EAASG,QAAU,WACfxC,IAAIyC,OAAO,8BAA+BV,EAAK,KAAKN,KAAK,MAIjE,IAAIiB,GAAOxD,EAASwD,MAChBxD,EAASyD,qBAAqB,QAAQ,EAE1C,OAAID,GACOA,EAAKE,YAAYP,GAD5B,QAKJQ,WAAY,SAAUxC,GAClBW,WAAW,WACH5B,EAAQiB,IAAQf,EAAiBe,IAC7Bb,EAAsBa,KAG9Bf,EAAiBe,IAAO,EACxBL,IAAI8B,WAAWzB,KAChB,IAWPyC,UAAW,SAASC,EAAIC,GACpB,IAAKD,IAAOA,EAAGrC,OAAU,MAAO,KAMhC,KAAK,GAJDuC,GAASF,EAAG3B,MAAM,KAClB8B,EAAQjE,EACRkE,EAEKpC,EAAI,EAAGqC,EAAIH,EAAOvC,OAAY0C,EAAJrC,IAASA,EACxCmC,EAAOD,EAAOlC,IAAOmC,EAAOD,EAAOlC,QACnCoC,EAASD,EACTA,EAAQA,EAAOD,EAAOlC,GAG1B,OAAIiC,IAEIG,EACAF,EAAOlC,EAAE,IAIVmC,GAaXG,UAAW,SAAS/C,EAAKgD,GACrB,GAAIpC,GAAMoC,GAAWhD,EAAK,IAAKgD,GAAS7B,KAAK,IAAMnB,CACnD,OAAOlB,GAAQ8B,IAgBnBqC,aAAc,SAASjD,EAAKgD,EAASE,EAAMC,GACvC,GAAmB,gBAARnD,GACP,KAAM,IAAI8B,OAAM,gCAIpB,MAAyB,gBAAZkB,IAA4C,gBAAZA,IAAwBA,EAAQ5C,OAAS,GAClF,KAAM,IAAI0B,OAAM,0BAGpB,IAAIsB,IAAUpD,EAAK,IAAKgD,GAAS7B,KAAK,GAEtCjC,GAAsBkE,IAAU,CAEhC,IAAInD,GAAK,WAIL,IAAInB,EAAQsE,GAAZ,OAOOpE,GAAiBoE,SACjBpE,GAAiBgB,EAIxB,IAAIM,GAAO+C,MAAMhE,UAAU6B,MAAMoC,KAAKC,WAClCC,EAAgBL,EAAMhE,MAAMR,EAAQ2B,EACxCvB,GAAiByB,KAAK4C,GAKO,gBAAlBI,GACPA,EAAcC,SAAWT,EAEK,kBAAlBQ,KACZA,EAAcnE,UAAUoE,SAAWT,EACnCQ,EAAcC,SAAWT,EAK7B,IAAIU,GAAsC,IAAxB1D,EAAI2B,QAAQ,QAC1BgC,CACAD,KACAC,EAAIjE,IAAI8C,UAAUxC,GAAK,IAK3BlB,EAASsE,GAAWI,QACbtE,GAAuBkE,GAE1BM,IACAC,EAAE,GAAIA,EAAE,GAAK,IAAMX,GAAYQ,GAKnC1E,EAASkB,GAAQwD,EAEbE,GACIpE,EAAeqE,EAAE,GAAIA,EAAE,OACvBA,EAAE,GAAIA,EAAE,IAAOH,GAQnB3B,MACAnC,IAAIE,+BAIZiC,MAAK+B,eAAeV,EAAMjD,IAa9B2D,eAAgB,SAASV,EAAMW,GAE3B,GAAIpD,GAAGqC,EAAGvD,EAAGQ,EAAKC,CASlB,IARA8C,EAAII,GAAQA,EAAK9C,OACjBb,GACIe,KAAM,GAAI+C,OAAMP,GAChBzC,QACAE,UAAWuC,EACX7C,GAAI4D,GAGc,gBAATX,IAAqCY,SAAhBZ,EAAK9C,OACnC,KAAM,IAAI0B,OAAM,sCAEpB,IAAoB,kBAAT+B,GACP,KAAM,IAAI/B,OAAM,iCAGpB,KAAKrB,EAAI,EAAOqC,EAAJrC,IAASA,EACbf,IAAIqE,eAAeb,EAAKzC,KACxBf,IAAIsE,KAAKd,EAAKzC,GAAK,mBAAqBf,IAAIqE,eAAeb,EAAKzC,KAChEV,EAAML,IAAIqE,eAAeb,EAAKzC,KAE9BV,EAAMmD,EAAKzC,GAIVV,GAKLC,EAAMlB,EAAQiB,GACVC,GACAT,EAAEe,KAAKG,GAAKT,IACVT,EAAEgB,YAGEvB,EAAiBe,IACvBL,IAAI6C,WAAWxC,GAEnBR,EAAEc,KAAKN,GAAOU,MAbRlB,EAAEgB,SAgBRhB,GAAEgB,UAAY,EACdtB,EAAWuB,KAAKjB,GAGhBsE,EAAK1E,OAAM,EAAMI,EAAEe,OAI3ByD,gBACIE,eAAgB,mBAUpBC,oBAAqB,WACjB,MAAOnF,GAAiBmC,SAW5BiD,iBAAkB,WACd,GAAIC,GAAMvC,KAAKqC,qBAMf,OALAE,GAAIC,QAAQ,SACZD,EAAMA,EAAIE,IAAI,SAASC,GACnB,OAAQ,OAAQ,mCAAoC7E,IAAI8E,aAAaD,GAAI,UAAW,QAAQpD,KAAK,MAG9FiD,EAAIjD,KAAK,OAiBpBsD,UAAW,SAAUC,EAAY1B,EAAS2B,EAAcxB,GACpD,MAAOzD,KAAIuD,aAAa,WAAayB,EAAY1B,EAAS2B,EAAcxB,IAc5EyB,KAAM,SAASC,EAAIC,GACf,GAAIxE,GAAO+C,MAAMhE,UAAU6B,MAAMoC,KAAKC,UAAW,EACjD,OAAO,YACH,GAAIwB,GAAY1B,MAAMhE,UAAU6B,MAAMoC,KAAKC,WACvCyB,EAAY1E,EAAK2E,OAAOF,EAC5B,OAAOF,GAAG1F,MAAM2F,KAAY,EAAQjD,KAAOiD,EAASE,KAgB5DE,WAAY,SAAUC,EAAQC,GAC1B,MAAO1F,KAAIkF,KAAKzF,MAAMO,KACjByF,EAAOC,GAAaD,GAAQF,UAAU/D,MAAMoC,KAAKC,UAAW,MAerE8B,UAAW,SAASR,EAAIC,GACpB,GAAIxE,GAAO+C,MAAMhE,UAAU6B,MAAMoC,KAAKC,UAAW,EACjD,OAAO,UAAS+B,GACZ,GAAIN,GAAY1E,EAAKY,OAErB,OADA8D,GAAUX,QAAQiB,GAAS3G,EAAO2G,OAC3BT,EAAG1F,MAAM2F,KAAY,EAAQjD,KAAOiD,EAASE,KAgB5DvE,EAAG,SAAS8E,GACR,MAAkB,gBAAT,GACE3G,EAAS4G,eAAeD,IAAO,KAEnCA,GAeXE,GAAI,SAASC,EAAUC,GAEnB,GAAuB,mBAAbjG,KAAO,KAAkD,mBAAtBA,KAAIkG,IAAY,SACzD,KAAM,IAAI9D,OAAM,wCAEpB,OAAOpC,KAAIkG,IAAIC,SAASC,OAAOJ,EAAWC,GAAQ/G,IAetDmH,EAAG,SAASL,EAAUC,GAElB,GAAuB,mBAAbjG,KAAO,KAAkD,mBAAtBA,KAAIkG,IAAY,SACzD,KAAM,IAAI9D,OAAM,wCAEpB,OAAOpC,KAAIkG,IAAIC,SAASC,OAAOJ,EAAWC,GAAQ/G,GAAW,IAAM,MAcvEoH,UAAW,SAASC,GAGhB,IAAK,GAFDC,MAAahF,MAAMoC,KAAKC,UAAW,GAE9B9C,EAAI,EAAG0F,EAAMD,EAAQ9F,OAAY+F,EAAJ1F,EAASA,IAC3C,GAAKyF,EAAQzF,GACb,IAAK,GAAI2F,KAAYF,GAAQzF,GACtB4F,OAAOhH,UAAUI,eAAe6D,KAAK4C,EAAQzF,GAAI2F,KAChDH,EAAYG,GAAYF,EAAQzF,GAAG2F,GAK/C,OAAOH,IAWXK,IAAK,WAED,GAAIC,GAAU5H,EAAO4H,OACjBA,IAAWA,EAAQD,KACnBnH,EAAMmE,KAAKiD,EAAQD,IAAKC,EAAShD,YAYzCS,KAAM,WAEF,GAAIuC,GAAU5H,EAAO4H,OACjBA,IAAWA,EAAQvC,MACnB7E,EAAMmE,KAAKiD,EAAQvC,KAAMuC,EAAShD,YAY1CpB,MAAO,WAEH,GAAIoE,GAAU5H,EAAO4H,OACjBA,IAAWA,EAAQpE,OACnBhD,EAAMmE,KAAKiD,EAAQpE,MAAOoE,EAAShD,eAoCjD5E,OAAQC,UCjrBVc,IAAIuD,aAAa,eAAgB,OAAS,WACtC,YAmCA,IAAIuD,MAAO,SAASC,EAAKC,GACrB7E,KAAK8E,KAAKF,EAAKC,GAMnBF,MAAKI,eACDC,cACAC,kBAKJ,IAAIC,+BAAgC,kBAAoBpI,SAAU,mBAAqB,IAAKqI,eAitB5F,OA7sBAR,MAAKnH,WAEDsH,KAAM,SAASF,EAAKQ,GAChB,IAAKR,EACD,KAAM,IAAI3E,OAAM,sDAEpB,IAAI4E,GAAUhH,IAAIsG,WACdkB,cAAc,EACdxF,YAAc,oCACdyF,MAAM,EACNC,cAAc,EACdC,OAAO,EACPC,MAAO,EACPC,QAAQ,EACRC,OAAQ,OACRX,WAAY,KACZY,SAAU,GACVX,eAAgB,KAChBY,cAAc,EACdC,aAAa,EACbC,QAAS,EACTC,gBAAgB,EAChBC,SAAU,GACVC,WAAY,KACZC,SAAU,KACVC,YAAa,KACbC,UAAW,KACXC,UAAW,KACXC,OAAQ,KACRC,UAAW,KACXC,UAAW,MACZ9B,KAAKI,cAER,IAAIK,GAAsC,gBAAhBA,GAA0B,CAIhD,GAHAP,EAAUhH,IAAIsG,UAAUU,EAASO,GAGK,gBAA3BA,GAAYJ,WACnBH,EAAQG,WAAanH,IAAIsG,UAAUtG,IAAIsG,aAAcQ,KAAKI,cAAcC,YAAaI,EAAYJ,gBAC9F,IAA+B,OAA3BI,EAAYJ,WAAqB,CACxC,GAAI0B,GAAmB1G,KAAK2G,eAAehC,KAAKI,cAAcC,WAC1D0B,KACA7B,EAAQG,WAAaI,EAAYJ,WAAa,IAAM0B,GAI5D7B,EAAQI,eAAiBpH,IAAIsG,aAAcQ,KAAKI,cAAcE,gBAC9DJ,EAAQI,eAAiBpH,IAAIsG,UAAUU,EAAQI,eAAgBG,EAAYH,gBAG/EjF,KAAK6E,QAAUA,EAEf7E,KAAK4G,SAAS,UAEd5G,KAAK4E,IAAMA,CAEX,IAAIiC,GAAc7G,KAAK8G,iBAAiBlC,EACxC5E,MAAK+G,OAAS/G,KAAKgH,gBAAgBH,GACnC7G,KAAKiH,cAAgBjH,KAAKkH,uBAAuBL,EAAaM,UAE9DnH,KAAKoH,eAAiBvC,EAAQc,OAAO0B,OAAO,eAAiB,EAEzDrH,KAAK6E,QAAQU,gBAAiB,IAC9BvF,KAAK6E,QAAQS,KAAOtF,KAAKiH,eAG1BjH,KAAK6E,QAAQS,OACZtF,KAAKiH,eAAgB,GAGzBjH,KAAKsH,UAAYtH,KAAKuH,eAEtBvH,KAAKwH,WAWTV,iBAAkB,SAAUlC,GACxB,GAAIiC,GAAe9J,SAAS0K,gBACxB1K,SAAS0K,gBAAgB,+BAAgC,KACzD1K,SAASoD,cAAc,IAE3B,OADA0G,GAAYzG,aAAa,OAAQwE,GAC1BiC,GAWXG,gBAAiB,SAAUH,GACvB,MAAOA,GAAYa,KAAKC,MAAM,cAAe,GAAO,GAYxDT,uBAAwB,SAAUL,EAAaM,GAG3C,GADAA,EAAWA,GAAYrK,OAAOqK,SACzBxC,KAAKnH,UAAUwJ,gBAAgBH,IAAsC,YAAtBM,EAASS,UAAmD,gBAAlB9K,QAAO+K,OAE9F,CACH,GAAIC,GAASjB,EAAYa,KAAKzI,MAAM,MAChC8I,EAASZ,EAASO,KAAKzI,MAAM,KAEjC,IAAsB,IAAlB6I,EAAOvJ,QAAkC,IAAlBwJ,EAAOxJ,OAO9B,OAAO,CAGX,IAAIyJ,GAAYF,EAAO,GACnBG,EAAYF,EAAO,GAEnBG,EAAe,OAEfC,EAAQL,EAAO,GAAG7I,MAAMiJ,GAAc,GACtCE,EAAQL,EAAO,GAAG9I,MAAMiJ,GAAc,EAE1C,OAAOF,KAAcC,GACjBE,IAAUC,EAxBd,OAAO,GAmCfb,aAAc,WAGV,IAAKrC,+BAAiClF,KAAK6E,QAAQS,MAAQ,kBAAoBxI,QAE3E,MADAkD,MAAKqI,iBAAkB,EAChB,GAAIC,eAEV,IAA8B,mBAAnBnD,gBACZ,MAAO,IAAIA,eAEV,IAA6B,mBAAlBoD,eAOZ,MAAO,KANP,KACI,MAAO,IAAIA,eAAc,kBAC3B,MAAOC,GACL,MAAO,IAAID,eAAc,uBAarCE,WAAY,WAER,GAAIzI,KAAKsH,UACL,IACI,GAAIoB,IACAC,OAAU,8KACVC,kBAAmBC,UAAUC,SAC7BC,mBAAoB,iBACpBC,gBAAiB,IASrB,IAPIhJ,KAAK6E,QAAQS,OACRtF,KAAK6E,QAAQiB,mBACP4C,GAAQ,0BAEZA,GAAQ,kBAGf1I,KAAK6E,QAAQI,gBAAyD,gBAAhCjF,MAAK6E,QAAQI,eACnD,IAAI,GAAIgE,KAAiBjJ,MAAK6E,QAAQI,eAC9BjF,KAAK6E,QAAQI,eAAerH,eAAeqL,KAC3CP,EAAQO,GAAiBjJ,KAAK6E,QAAQI,eAAegE,GAK7DjJ,MAAKsH,UAAU4B,mBAAqBL,UAAUM,UAAUxB,MAAM,oBAAsB,EAAE,OAAO,GAAK,OAClGe,EAAQU,WAAa,QAGzB,KAAK,GAAIC,KAAcX,GAChBA,EAAQ9K,eAAeyL,IACtBrJ,KAAKsH,UAAUgC,iBAAiBD,EAAYX,EAAQW,IAG9D,MAAMb,MAYhB7B,eAAgB,SAAS4C,GACrB,GAAI5L,GAAG+E,EAAG8G,EAAGC,EAAGC,IAChB,IAAyB,gBAAdH,GA0BP,MAAOA,EAzBP,KAAKC,IAAKD,GACN,GAAIA,EAAU3L,eAAe4L,GAEzB,GADAC,EAAIF,EAAUC,GAC4B,mBAAtChF,OAAOhH,UAAUmM,SAASlI,KAAKgI,IAA4BG,MAAMH,EAAElL,QASnEmL,EAASA,EAAOtG,QACZyG,mBAAmBL,GAAI,IACvBK,mBAAmBJ,GAAI,UAV3B,KAAK9L,EAAI,EAAG+E,EAAI+G,EAAElL,OAAYmE,EAAJ/E,EAAOA,IAC7B+L,EAASA,EAAOtG,QACZyG,mBAAmBL,GAAI,KAAQ,IAC/BK,mBAAmBJ,EAAE9L,IAAK,KAoBlD,OARQ+L,GAAOnL,OAAS,GAChBmL,EAAOI,MAORJ,EAAOpK,KAAK,KAUvByK,UAAW,WAEP,GAAIL,GAAS,KAAMH,EAAYvJ,KAAK6E,QAAQG,UAGxC0E,GADoB,gBAAdH,GACGvJ,KAAK2G,eAAe4C,GAEpB,GAAKA,EAGfG,IAEK1J,KAAK4E,IADN5E,KAAK4E,IAAI9E,QAAQ,KAAO,GACZE,KAAK4E,IAAI3F,MAAM,KAAK,GAAK,IAAMyK,EAE/B1J,KAAK4E,IAAI3F,MAAM,KAAK,GAAK,IAAMyK,IAatDM,UAAW,SAASC,GAEhB,GAAIjK,KAAKqI,iBAA4B,iBAAT4B,EACxB,MAAOjK,MAAKsH,UAAUzH,WAE1B,KACI,MAAOG,MAAKsH,UAAU4C,kBAAkBD,GAC1C,MAAMzB,GACJ,MAAO,QAWf2B,cAAe,WAEX,IACI,MAAOnK,MAAKsH,UAAU8C,wBACxB,MAAM5B,GACJ,MAAO,QAWf6B,YAAa,WAET,GAAIvI,GAAI9B,KAAKsH,UACTgD,GACIC,WAAY,KACZC,aAAc,KACdR,UAAWhK,KAAKgK,UAChBG,cAAenK,KAAKmK,cACpB3C,QAASxH,KACTsH,UAAWxF,EACX2I,UAAW,GAAIC,MAAS1K,KAAK2K,UAC7BC,aAAc5K,KAAK4E,IAI3B0F,GAAEO,WAAa/I,EAAE+I,UACjB,KAAMP,EAAEQ,aAAehJ,EAAEgJ,aAAgB,MAAMtC,IAC/C,IAAM8B,EAAES,YAAejJ,EAAEiJ,YAAgB,MAAMvC,IAC/C,IAAM8B,EAAEU,OAAelJ,EAAEkJ,OAAgB,MAAMxC,GAAK8B,EAAEU,OAAa,EACnE,IAAMV,EAAEW,WAAenJ,EAAEmJ,WAAgB,MAAMzC,GAAK8B,EAAEW,WAAa,GAEnE,MAAOX,IAUXY,MAAO,WACH,GAAIlL,KAAKsH,UAAW,CAChB6D,aAAanL,KAAKoL,cAClBD,aAAanL,KAAKqL,WAClB,KAAMrL,KAAKsH,UAAU4D,QAAW,MAAMI,IACtCtL,KAAKuL,WAWbC,eAAgB,WAEZ,GAAIC,GAAKzL,KAAKsH,UAAUuD,UACxB,IAAW,IAAPY,EACIzL,KAAK+G,QACL/G,KAAK4G,SAAS,iBAEf,IAAW,IAAP6E,GAAYzL,KAAKqI,gBAAiB,CAEzC,GAAIrI,KAAK6E,QAAQQ,cAAgBrF,KAAK6E,QAAQY,OAAUzF,KAAK2K,UAAY3K,KAAK6E,QAAQY,OAAQ,GAAIiF,OAAOgB,UAErG,YADA1L,KAAKoL,aAAevM,WAAWhB,IAAIkF,KAAK/C,KAAKwL,eAAgBxL,MAAOA,KAAK6E,QAAQY,MAAQzF,KAAK2K,WAAY,GAAID,OAAOgB,WAIzH,IAAIlB,GACAmB,EAAkB3L,KAAKsH,UAAUwD,aACjCc,EAAW5L,KAAKqK,cAChBwB,EAAY7L,KAAKsH,UAAU0D,MAE3BhL,MAAK+G,SAAW/G,KAAK6E,QAAQQ,cAC7BrF,KAAK4G,SAAS,aAGlBuE,aAAanL,KAAKqL,YAEA,IAAdQ,EAGI7L,KAAK+G,OACL/G,KAAK4G,SAAS,cAAe,GAAI3G,OAAM,iDAEvC4L,EAAYF,EAAkB,IAAM,IAGrB,MAAdE,IACLA,EAAY,IAEhB,IAAIC,GAAY9L,KAAKqI,iBAA0BwD,GAAP,KAAgC,IAAZA,EAExDE,EAAoB/L,KAAKgK,UAAU,iBAAmB,EAC1D,IAAIhK,KAAK6E,QAAQa,SACZqG,EAAkBjM,QAAQ,qBAAuB,GAA6B,UAAxBE,KAAK6E,QAAQa,QAChE,IACI8E,EAAexK,KAAKgM,SAASL,EAAiB3L,KAAK6F,cAEhD2E,IACCmB,EAAkBC,EAASpB,aAAeA,GAEhD,MAAMhC,GACAsD,GAGA9L,KAAK4G,SAAS,cAAe4B,GAK7C,GAAIxI,KAAKqI,iBAAwD,KAArC0D,EAAkBjM,QAAQ,QAAiB,aAAehD,QAAQ,CAE1F,GAAImP,EACJ,QAAQF,GACJ,IAAK,kBACL,IAAK,wBACL,IAAK,gBACDE,EAAWF,CACX,MACJ,SACIE,EAAW,WAEnB,GAAIC,IAAS,GAAKC,YAAaC,gBAAiBpM,KAAKsH,UAAUwD,aAAcmB,EAC7EjM,MAAKsH,UAAUyD,YAAcmB,EAC7BN,EAASb,YAAemB,EAGM,MAA9BlM,KAAKsH,UAAUyD,aAAgD,MAAzBa,EAASpB,cAA2D,KAAnCxK,KAAKsH,UAAUyD,YAAYsB,MAClGV,EAAkB3L,KAAKsH,UAAUyD,cAGjCc,GAAa7L,KAAKqI,mBACdyD,EACA9L,KAAK4G,SAAS,YAAagF,EAAUD,GAErC3L,KAAK4G,SAAS,YAAagF,EAAUD,GAEzC3L,KAAK4G,SAAS,KAAKiF,EAAWD,EAAUD,IAE5C3L,KAAKuL,OAAOK,EAAUD,KAa9BJ,OAAQ,SAASK,EAAUD,GAMvB,GALIC,GACA5L,KAAK4G,SAAS,aAAcgF,EAAUD,GAE1CR,aAAanL,KAAKqL,YAEdrL,KAAKsH,UAAW,CAEhB,IAAKtH,KAAKsH,UAAUgF,mBAAqB,KAAQ,MAAM9D,IAEjB,kBAA3BxI,MAAKsH,UAAUiF,SAEtBvM,KAAKsH,UAAUiF,UAInBvM,KAAKsH,UAAY,OAiBzBV,SAAU,SAAS4F,GACf,GAAIlM,GAAQoB,UAAU,YAAczB,OAAQyB,UAAU,GAAK,IAC3D,IAAyC,kBAA9B1B,MAAK6E,QAAQ2H,GACpB,IACIxM,KAAK6E,QAAQ2H,GAAalP,MAAM0C,QAASX,MAAMoC,KAAKC,UAAW,IACjE,MAAM4J,GACJzN,IAAIyC,MAAM,qDAAuDkM,EAAc,IAAKlB,OAEjFhL,IACPzC,IAAIyC,MAAM,iBAAmBA,IAarCgJ,iBAAkB,SAASW,EAAMwC,GACxBzM,KAAK6E,QAAQI,iBACdjF,KAAK6E,QAAQI,mBAEjBjF,KAAK6E,QAAQI,eAAegF,GAAQwC,GAUxCjF,QAAS,WAEL,GAAGxH,KAAKsH,UAAW,CACf,GAAIoC,GAAS,IACV1J,MAAKoH,gBACyB,OAA1BpH,KAAK6E,QAAQe,UAA+C,KAA1B5F,KAAK6E,QAAQe,UAC9C8D,EAAS1J,KAAK6E,QAAQe,SACtB5F,KAAK+J,aAC8B,OAA5B/J,KAAK6E,QAAQG,YAAmD,KAA5BhF,KAAK6E,QAAQG,aACxD0E,EAAS1J,KAAK6E,QAAQG,YAGJ,gBAAX0E,IAAwBA,EAAOgD,SAEb,gBAAXhD,IAAkC,OAAXA,IACrCA,EAAS,GAAKA,GAFdA,EAAS1J,KAAK2G,eAAe+C,GAK9B1J,KAAK6E,QAAQhF,aACZG,KAAKsJ,iBAAiB,eAAgBtJ,KAAK6E,QAAQhF,cAGvDG,KAAK+J,WAGT,IAAInF,GAAM5E,KAAK4E,IACXe,EAAS3F,KAAK6E,QAAQc,OACtBgH,EAAc3M,KAAKiH,aAEnB0F,IAAe3M,KAAK6E,QAAQoB,WAC5BjG,KAAKsJ,iBAAiB,QAAS1E,GAC/BA,EAAM5E,KAAK6E,QAAQoB,SAAW4D,mBAAmBjF,GACjD+H,GAAc,EAGlB,KACI3M,KAAKsH,UAAUsF,KAAKjH,EAAQf,EAAK5E,KAAK6E,QAAQQ,cAChD,MAAMmD,GAEJ,MADAxI,MAAK4G,SAAS,cAAe4B,GACtBxI,KAAKuL,OAAOvL,KAAKqK,cAAe,MAG3CrK,KAAKyI,aAELzI,KAAK4G,SAAS,YAEX5G,KAAK6E,QAAQkB,UAAY6D,MAAM5J,KAAK6E,QAAQkB,WAC3C/F,KAAKqL,WAAaxM,WAAWhB,IAAIkF,KAAK,WAC/B/C,KAAK6E,QAAQ4B,YACZzG,KAAK4G,SAAS,aACd5G,KAAKkL,UAEVlL,MAA+B,IAAvBA,KAAK6E,QAAQkB,UAGzB/F,KAAK6E,QAAQmB,iBAAmBhG,KAAKqI,kBACpCrI,KAAKsH,UAAUuF,iBAAkB,GAGlC7M,KAAK6E,QAAQQ,eAAiBrF,KAAKqI,gBAClCrI,KAAKsH,UAAUgF,mBAAqBzO,IAAIkF,KAAK/C,KAAKwL,eAAgBxL,MAE7DA,KAAKqI,kBACVrI,KAAKsH,UAAUwF,OAASjP,IAAIkF,KAAK/C,KAAKwL,eAAgBxL,MAG1D,KACI,GAAI2M,EAIA,WADA9O,KAAIyC,MAAM,0IAGVN,MAAK2K,WAAY,GAAID,OAAOgB,UAC5B1L,KAAKsH,UAAUyF,KAAKrD,GAE1B,MAAMlB,GAEJ,MADAxI,MAAK4G,SAAS,cAAe4B,GACtBxI,KAAKuL,OAAOvL,KAAKqK,cAAe,MAGvCrK,KAAK6E,QAAQQ,cACbrF,KAAKwL,mBAajBwB,OAAQ,SAASC,GAEb,MAAmB,gBAARA,IAAqBA,GAChCA,EAAMA,EAAIvN,QAAQ,OAAQ,KAAKA,QAAQ,iBAAkB,IAClD,uCAAyCH,KAAK0N,KAFR,GAcjDjB,SAAU,SAASkB,QAASC,UAExB,GAAID,WAAaC,UAAYnN,KAAKgN,OAAOE,UACrC,IACI,MAAqB,mBAAVE,OAA+C,mBAAfA,MAAKC,MACrCD,KAAKC,MAAMH,SAGfI,KAAK,IAAMJ,QAAU,KAC9B,MAAM1E,GACJ,KAAM,IAAIvI,OAAM,kCAAoCuI,GAG5D,MAAO,QAiBf7D,KAAK4I,KAAO,SAAS3I,EAAK4I,GACtB,GAAIvG,GAAgBtC,KAAKnH,UAAU0J,uBAAuBpK,OAAOqK,SAAUxC,KAAKnH,UAAUsJ,iBAAiBlC,GAC3G,OAAO,IAAID,MAAKC,GACZe,OAAQ,MACRL,KAAM2B,EACNT,UAAW,SAASoF,GAChB4B,EAAS5B,EAASpB,cAAgBoB,EAASd,aAAcc,OAerEjH,KAAK8I,KAAO,SAAS7I,EAAK4I,GACtB,GAAIvG,GAAgBtC,KAAKnH,UAAU0J,uBAAuBpK,OAAOqK,SAAUxC,KAAKnH,UAAUsJ,iBAAiBlC,GAC3G,OAAO,IAAID,MAAKC,GACZe,OAAQ,OACRL,KAAM2B,EACNT,UAAW,SAASoF,GACQ,kBAAb4B,IACPA,EAAS5B,OAOlBjH,OCnwBX9G,IAAIuD,aAAa,gBAAiB,OAAS,WAEvC,YAqBA,IAAIsM,GAAQ,SAAS9N,EAAKiF,GACtB7E,KAAK8E,KAAKlF,EAAKiF,GAuHnB,OApHA6I,GAAMlQ,WAEFsH,KAAM,SAASlF,EAAKiF,GA2BhB,GA1BA7E,KAAK6E,QAAUhH,IAAIsG,WACfqC,UAAoBvE,OACpBoE,UAAoBpE,OACpB0L,cACA5H,QAAoB,GACpB2D,UACAkE,cAAoB,eACpBC,iBAAoB,MACpBC,SAAoB,GACrBjJ,OAGC7E,KAAK8N,QADN9N,KAAK6E,QAAQiJ,WAAY,EACT9N,KAAK6E,QAAQiJ,QAEbC,SAAyB,IAAhBC,KAAKC,SAAmB,IAGpDjO,KAAK6E,QAAQgJ,kBAAoB7N,KAAK8N,QAEtC9N,KAAKJ,IAAMA,EAG4B,kBAA7BI,MAAK6E,QAAkB,aAC7B7E,KAAK6E,QAAQ2B,UAAYxG,KAAK6E,QAAQqB,YAGlB,gBAAblG,MAAKJ,IACZ,KAAM,IAAIK,OAAM,sCAGpB,IAAsC,kBAA3BD,MAAK6E,QAAQ2B,UACpB,KAAM,IAAIvG,OAAM,wEAGpBpC,KAAIqQ,IAAIR,MAAM1N,KAAK6E,QAAQgJ,kBAAoBhQ,IAAIkF,KAAK,WACpD/C,KAAK6E,QAAQ2B,UAAU9E,UAAU,IACjC1B,KAAKmO,YACNnO,MAEHA,KAAK+F,QAAUlH,WAAWhB,IAAIkF,KAAK,WAC/B/C,KAAKkL,QACgC,kBAA3BlL,MAAK6E,QAAQwB,WACnBrG,KAAK6E,QAAQwB,UAAUrG,KAAK6E,QAAQ8I,aAEzC3N,MACoB,IAAvBA,KAAK6E,QAAQkB,SAEb/F,KAAKoO,iBAQTlD,MAAO,WACHrN,IAAIqQ,IAAIR,MAAM1N,KAAK6E,QAAQgJ,kBAAoBhQ,IAAIwF,WAAWrD,KAAM,aAGxEqO,gBAAiB,SAASzO,EAAK8J,GAC3B,GAAI4E,GAAuC,KAArB1O,EAAIE,QAAQ,KAC9ByO,EAAKC,EAAMC,EAAQC,GAAS9O,EAEhC,KAAK4O,IAAQ9E,GACLA,EAAO9L,eAAe4Q,KACjBF,EACmBC,EAAM,KADNA,EAAM,IAAMD,GAAkB,GAEtDG,EAAS/E,EAAO8E,GACM,gBAAXC,IAAwBA,IAAaA,EAAS,IACzDC,EAAQA,EAAMtL,QAAQmL,EAAKC,EAAM,IAAK3E,mBAAmB4E,KAIjE,OAAOC,GAAMpP,KAAK,KAGtBqP,oBAAqB,WACjB,MAAO5R,UAAS6R,MACZ7R,SAASyD,qBAAqB,QAAQ,IACtCzD,SAASyD,qBAAqB,QAAQ,IACtCzD,SAAS8R,iBAGjBT,cAAe,WAEXpO,KAAK6E,QAAQ6E,OAAO1J,KAAK6E,QAAQ+I,eAAiB,iBAAmB5N,KAAK6E,QAAQgJ,iBAClF7N,KAAK6E,QAAQ6E,OAAOoF,SAAW9O,KAAK8N,QACpC9N,KAAKJ,IAAMI,KAAKqO,gBAAgBrO,KAAKJ,IAAKI,KAAK6E,QAAQ6E,QAEvD1J,KAAK+O,UAAYhS,SAASoD,cAAc,UACxCH,KAAK+O,UAAUC,KAAO,kBACtBhP,KAAK+O,UAAUE,IAAMjP,KAAKJ,GAC1B,IAAIsP,GAAYlP,KAAK2O,qBACrBO,GAAUzO,YAAYT,KAAK+O,YAG/BZ,SAAU,WACFnO,KAAK+F,SACLjJ,OAAOqO,aAAanL,KAAK+F,eAEtB/F,MAAK6E,QAAQ2B,gBACbxG,MAAK6E,QAAQwB,gBACbxI,KAAIqQ,IAAIR,MAAM1N,KAAK6E,QAAQgJ,kBAClC7N,KAAKmP,oBAGTA,iBAAkB,WACTnP,KAAK+O,YACV/O,KAAK+O,UAAUK,WAAWC,YAAYrP,KAAK+O,iBACpC/O,MAAK+O,aAIbrB,IChJX7P,IAAIuD,aAAa,kBAAmB,OAAS,WACzC,YAeA,IAAIkO,IASAC,IAAI,EAUJC,OAAO,EAUPC,OAAO,EAUPC,QAAQ,EAURC,WAAW,EAUXC,QAAQ,EAWRC,OAAO,EAWP1O,SAAS,EAWTgI,WAAW,EAWX2G,WAAW,EAUXC,WAAW,EAWXjL,KAAM,WACF9E,KAAKgQ,gBACLhQ,KAAKiQ,gBACLjQ,KAAKkQ,eAUTD,cAAe,WAGX,GAAIE,GAAU,EAAGC,EAAW,CACK,iBAArBtT,QAAOuT,YACfF,EAAUrT,OAAOuT,WACjBD,EAAWtT,OAAOwT,aACXvT,SAAS8R,kBAAqB9R,SAAS8R,gBAAgB0B,aAAexT,SAAS8R,gBAAgB2B,eACtGL,EAAUpT,SAAS8R,gBAAgB0B,YACnCH,EAAWrT,SAAS8R,gBAAgB2B,cAC7BzT,SAAS6R,OAAU7R,SAAS6R,KAAK2B,aAAexT,SAAS6R,KAAK4B,gBACrEL,EAAUpT,SAAS6R,KAAK2B,YACxBH,EAAWrT,SAAS6R,KAAK4B,cAE7BxQ,KAAKyQ,YAAcN,EACnBnQ,KAAK0Q,aAAeN,GAUxBF,YAAa,WAELlQ,KAAK2Q,SADL5T,SAAS4T,UAAY5T,SAAS4T,SAASpS,OACvBzB,OAAO8T,OAAO7T,SAAS4T,WAEvB,GAWxBX,cAAe,WACXhQ,KAAK6Q,gBAAgBhI,UAAUM,YAGnC0H,gBAAiB,SAAUC,GAKvB,GAJA9Q,KAAKmJ,UAAY2H,EAEjBA,EAASA,EAAOC,cAEZ,gBAAgBxR,KAAKuR,GAGrB,GAFA9Q,KAAK8P,UAAY,WACjB9P,KAAK+P,UAAY,SACd,mBAAmBxQ,KAAKuR,GAEvB9Q,KAAK4P,QAAS,EACd5P,KAAK6P,MAAQ,SACb7P,KAAKmB,QAAU2P,EAAOpR,QAAQ,2BAA4B,UACvD,CAEHM,KAAK0P,QAAS,EACd1P,KAAK6P,MAAQ,QACb,IAAImB,GAAW,mBAEXhR,MAAKmB,QADL6P,EAASzR,KAAKuR,GACCA,EAAOnJ,MAAMqJ,GAAU,GAEvBF,EAAOpR,QAAQ,gCAAiC,UAGpE,IAAI,QAAQH,KAAKuR,GAEpB9Q,KAAKyP,OAAQ,EACbzP,KAAK6P,MAAQ,QACb7P,KAAKmB,QAAU2P,EAAOpR,QAAQ,0BAA2B,MACzDM,KAAK8P,UAAY,MACjB9P,KAAK+P,UAAY,QACd,IAAI,YAAYxQ,KAAKuR,GAExB9Q,KAAK2P,WAAY,EACjB3P,KAAK6P,MAAQ,YACb7P,KAAKmB,QAAU2P,EAAOpR,QAAQ,8BAA+B,MAC7DM,KAAK8P,UAAY,UACjB9P,KAAK+P,UAAY,YACd,IAAI,kBAAkBxQ,KAAKuR,GAE9B9Q,KAAKuP,IAAK,EACVvP,KAAK6P,MAAQ,KAET7P,KAAKmB,QADL,kBAAkB5B,KAAKuR,GACRA,EAAOnJ,MAAM,mBAAmB,GAEhCmJ,EAAOpR,QAAQ,2BAA4B,MAE9DM,KAAK8P,UAAY,OACjB9P,KAAK+P,UAAY,SACd,IAAI,QAAQxQ,KAAKuR,GAAS,CAK7B9Q,KAAK8P,UAAY,QACjB9P,KAAK+P,UAAY,MAEjB/P,KAAKwP,OAAQ,CAEb,IAAIyB,GAAK,4HACT,IAAGA,EAAG1R,KAAKuR,GACP9Q,KAAK6P,MAAQiB,EAAOnJ,MAAMsJ,GAAI,GAC9BjR,KAAKmB,QAAU2P,EAAOpR,QAAQ,GAAIwR,QAAO,OAAOlR,KAAK6P,MAAM,oBAAsB,UAC9E,CAEH7P,KAAK6P,MAAQ,SACb,IAAIsB,GAAY,oBACbA,GAAU5R,KAAKuR,KACd9Q,KAAKmB,QAAU2P,EAAOpR,QAAQyR,EAAW,UAczD3L,MAAO,WAEH,GAAIyH,GAAM,0DACVA,KAAQjN,KAAKuP,GAAIvP,KAAKwP,MAAOxP,KAAKyP,MAAOzP,KAAK0P,OAAQ1P,KAAK2P,WAAY,KACvE1C,GAAO,gBAAgBjN,KAAK8P,UAAU,KACtC7C,GAAO,gBAAgBjN,KAAK+P,UAAU,KACtC9C,GAAO,YAAYjN,KAAK6P,MAAM,KAC9B5C,GAAO,cAAcjN,KAAKmB,QAAQ,KAClC8L,GAAO,KACPA,GAAO,kBAAkBjN,KAAKmJ,UAE9BiI,MAAMnE,IAMd,OAFAqC,GAAQxK,OAEDwK,ICvSXzR,IAAIuD,aAAc,cAAe,KAAO,WAEpC,YAGC,IAAIiQ,GAAS,eAAiBtU,WAAc,oBAAsBA,UAASuU,YAAevU,SAASuU,YAAYC,iBAAmBzU,OAAOyU,iBAOtIC,GAaAC,mBAAoB,SAASC,EAAKC,EAAWC,GACzC,MAAIA,GACO5R,KAAK6R,aAAaH,EAAKC,OAElC3R,MAAK8R,gBAAgBJ,EAAKC,IAa9BE,aAAc,SAASH,EAAKC,GAExB,GADAD,EAAM7T,IAAIe,EAAE8S,IACPA,IAAQC,EAAa,MAAO,KACjCA,IAAa,GAAKA,GAAW1S,MAAM,QAInC,KAHA,GAAIL,GAAI,EACJ0F,EAAMqN,EAAUpT,OAET+F,EAAJ1F,EAASA,IAER+S,EAAU/S,GAAGc,QAAQ,aAAc,MACN,mBAAlBgS,GAAIK,UACXL,EAAIK,UAAUC,IAAIL,EAAU/S,IACpB4S,EAAIS,aAAaP,EAAKC,EAAU/S,MACxC8S,EAAIC,YAAcD,EAAIC,UAAY,IAAM,IAAMA,EAAU/S,MAgBxEkT,gBAAiB,SAASJ,EAAKC,GAE3B,GADAD,EAAM7T,IAAIe,EAAE8S,IACPA,IAAQC,EAAa,MAAO,KAEjCA,IAAa,GAAKA,GAAW1S,MAAM,QACnC,IAAIL,GAAI,EACJ0F,EAAMqN,EAAUpT,MAEpB,IAA6B,mBAAlBmT,GAAIK,UACX,KAAWzN,EAAJ1F,EAASA,IACZ8S,EAAIK,UAAUG,OAAOP,EAAU/S,QAEhC,CAGH,IAFA,GAAIuT,GAAeT,EAAIC,WAAa,GAChCV,EACO3M,EAAJ1F,EAASA,IACZqS,EAAK,GAAIC,QAAO,WAAaS,EAAU/S,GAAK,YAC5CuT,EAAeA,EAAazS,QAAQuR,EAAI,IAE5CS,GAAIC,UAAaQ,EACZzS,QAAQ,OAAQ,IAChBA,QAAQ,OAAQ,MAgB7B0S,aAAc,SAASV,EAAKC,EAAWK,GACnChS,KAAKyR,mBAAmBC,EAAKC,EAAWK,IAAO,IAenDC,aAAc,SAASP,EAAKC,EAAWU,GAEnC,GADAX,EAAM7T,IAAIe,EAAE8S,IACPA,IAAQC,EAAa,OAAO,CAEjCA,IAAa,GAAKA,GAAW1S,MAAM,QAMnC,KALA,GAAIL,GAAI,EACJ0F,EAAMqN,EAAUpT,OAChB+T,EACArB,EAEQ3M,EAAJ1F,EAASA,IAAK,CAClB,GAA6B,mBAAlB8S,GAAIK,UACXO,EAAMZ,EAAIK,UAAUQ,SAASZ,EAAU/S,QACpC,CACH,GAAIuT,GAAeT,EAAIC,SACnBQ,KAAiBR,EAAU/S,GAC3B0T,GAAM,GAENrB,EAAK,GAAIC,QAAO,UAAYS,EAAU/S,GAAK,WAC3C0T,EAAMrB,EAAG1R,KAAK4S,IAGtB,GAAIG,IAAQD,EAAO,OAAO,CAC1B,KAAKC,GAAOD,EAAO,OAAO,EAG9B,MAAIA,IAEO,GAGA,GAkBfG,WAAY,SAASC,EAASd,EAAW5L,EAAS2M,GAC9CD,EAAU5U,IAAIe,EAAE6T,GAChBjB,EAAIC,mBAAmBgB,EAASd,GAAYe,GAC5C7T,WAAW,WACP2S,EAAIC,mBAAmBgB,EAASd,EAAWe,IAC5CC,OAAO5M,IAAY,MAc1B6M,gBAAiB,SAASlB,EAAKC,EAAWkB,GACtC,MAAKnB,IAAQC,EAEW,mBAAbkB,GACArB,EAAIC,mBAAmBC,EAAKC,EAAWkB,QACd,mBAAlBnB,GAAIK,WAA8B,OAAOxS,KAAKoS,GAMxDH,EAAIS,aAAaP,EAAKC,GACtBH,EAAIM,gBAAgBJ,EAAKC,GAEzBH,EAAIK,aAAaH,EAAKC,IAR1BD,EAAM7T,IAAIe,EAAE8S,GACA,OAARA,GACAA,EAAIK,UAAUe,OAAOnB,MAPI,GA4BrCoB,WAAY,SAASrB,EAAKjF,GAEtB,GADAiF,EAAM7T,IAAIe,EAAE8S,GACA,OAARA,EAAa,CACb,GAAIsB,GAAM,CAELpJ,OAAM+I,OAAOlG,MACWuG,EAAP,GAATvG,EAAsB,EACb,GAATA,EAAsBA,EACb,KAATA,EAAsBA,EAAQ,IACR,GAGF,mBAAtBiF,GAAIuB,MAAMC,QACjBxB,EAAIuB,MAAMC,QAAUF,EAGpBtB,EAAIuB,MAAME,OAAS,kBAAsB,IAAJH,EAAQ,GAAG,MAY5DI,WAAY,SAASnG,GACjB,MAAOA,GAAMA,EAAIvN,QAAQ,SAAU,SAAU2T,EAAGC,GAC5C,MAAOA,GAAGC,gBACTtG,GAcRuG,SAAU,SAAS9B,EAAKuB,GAEpB,GADAvB,EAAM7T,IAAIe,EAAE8S,GACA,OAARA,GAAgBA,EAAIuB,MAAO,CAC3BA,EAAkB,UAAVA,EAAoB,WAAYjT,KAAKoT,WAAWH,EAExD,IAAIxG,GAAQiF,EAAIuB,MAAMA,EAEtB,KAAI5B,GAAW5E,GAAmB,SAAVA,GAIdA,GAASiF,EAAI+B,eAClBhH,EAAQiF,EAAI+B,aAAaR,GACX,SAAVxG,GAA+B,UAAVwG,GAA+B,WAAVA,IAC5CxG,EAAQiF,EAAI,SAAWuB,EAAMS,OAAO,GAAGH,cAAgBN,EAAM5T,MAAM,IAAM,WAPrC,CACvC,GAAIsU,GAAMtC,EAAMK,EAAK,KACrBjF,GAAQkH,EAAMA,EAAIV,GAAS,KAS/B,GAAc,YAAVA,EACA,MAAOxG,GAAQmH,WAAWnH,EAAO,IAAM,CAEtC,IAAc,mBAAVwG,GAA0C,sBAAVA,GACtB,qBAAVA,GAA0C,oBAAVA,EAAoC,CACxE,GAAmB,SAAVxG,EAAyB,MAAO,KACpC,IAAc,WAAVA,EAAyB,MAAO,KACpC,IAAc,UAAVA,EAAyB,MAAO,MAG9C,MAAiB,SAAVA,EAAmB,KAAOA,IAe1CoH,SAAU,SAASnC,EAAKuB,GAEpB,GADAvB,EAAM7T,IAAIe,EAAE8S,GACA,OAARA,EACJ,GAAqB,gBAAVuB,GACPvB,EAAIuB,MAAMa,SAAW,KAAKb,EAEO,KAA7BA,EAAMnT,QAAQ,YACdE,KAAK+S,WAAWrB,EAAKuB,EAAMtL,MAAM,0BAA0B,QAI/D,KAAK,GAAIoM,KAAQd,GACTA,EAAMrV,eAAemW,KACR,YAATA,EACA/T,KAAK+S,WAAWrB,EAAKuB,EAAMc,IAEb,UAATA,GAA6B,aAATA,EACW,mBAAzBrC,GAAIuB,MAAMe,WACjBtC,EAAIuB,MAAMgB,SAAWhB,EAAMc,GAG3BrC,EAAIuB,MAAMe,WAAaf,EAAMc,GAGjCrC,EAAIuB,MAAMc,GAAQd,EAAMc,KAmB5CG,KAAM,SAASxC,EAAKyC,GAChBzC,EAAM7T,IAAIe,EAAE8S,GACA,OAARA,IACAA,EAAIuB,MAAMmB,QAAUD,GAAwB,KAapDE,KAAM,SAAS3C,GACXA,EAAM7T,IAAIe,EAAE8S,GACA,OAARA,IACAA,EAAIuB,MAAMmB,QAAU,SAe5BE,SAAU,SAAS5C,EAAKwC,GACpBxC,EAAM7T,IAAIe,EAAE8S,GACRA,IACAA,EAAIuB,MAAMmB,QAAUF,EAAO,GAAK,SAcxCpB,OAAQ,SAASpB,EAAK6C,GAClB7C,EAAM7T,IAAIe,EAAE8S,GACA,OAARA,IACyB,mBAAd6C,GACHA,KAAc,EACdvU,KAAKkU,KAAKxC,GAEV1R,KAAKqU,KAAK3C,GAGqC,SAA/C1R,KAAKwT,SAAS9B,EAAI,WAAWX,cAC7B/Q,KAAKkU,KAAKxC,GAGV1R,KAAKqU,KAAK3C,KAM1B8C,WAAY,SAASjU,GACjB,GAAIA,EAAKkU,kBACL,MAAOlU,GAAKkU,iBAGhB,KAAK,GAAIC,GAAQnU,EAAKoU,WAAYD,EAAOA,EAAQA,EAAME,YACnD,GAAuB,IAAnBF,EAAMhI,SACN,MAAOgI,EAGf,OAAO,OAiBXG,eAAgB,SAAShR,EAAUoP,EAAOpO,GACtCA,EAAUhH,IAAIsG,WACV6K,KAAM,WACN8F,OAAO,GACRjQ,MAEH,IAAIkQ,GAAShY,SAASyD,qBAAqB,SACvCwU,GAAW,EAAOnB,GAAW,EAAMjV,EAAGqW,CAE1C,KAAKrW,EAAE,EAAGqW,EAAEF,EAAOxW,OAAU0W,EAAFrW,EAAKA,IAC5BoW,EAAWD,EAAOnW,GAAGsW,UACjBF,EAASlV,QAAQ+D,IAAa,IAC9BgQ,GAAW,EAInB,IAAIA,EAAU,CACV,GAAIsB,GAAWpY,SAASoD,cAAc,SAClCI,EAAOxD,SAASyD,qBAAqB,QAAQ,GAC7C4U,GAAS,EAAOC,EAAW,EAE/BF,GAASnG,KAAQnK,EAAQmK,KAEzBqG,GAAYxR,EAAU,KACtBwR,GAAYpC,EACZoC,GAAY,KAEuB,mBAAxBF,GAASG,WAChBH,EAASG,WAAWxB,QAAUuB,EAE9BF,EAAS1U,YAAY1D,SAASwY,eAAeF,IAG7CxQ,EAAQiQ,MACRvU,EAAKE,YAAY0U,IAEjBC,EAASpV,KAAKwU,WAAWjU,GACrB6U,GACA7U,EAAKiV,aAAaL,EAAUC,MAoB5CK,iBAAkB,SAASrW,EAAMyF,GAC7BA,EAAUhH,IAAIsG,WACVuR,MAAO,SACP1G,KAAM,WACN8F,OAAO,GACRjQ,MAEH,IAAIuQ,GACAnC,EAAQlW,SAASoD,cAAc,QAC/BI,EAAOxD,SAASyD,qBAAqB,QAAQ,EAEjDyS,GAAMyC,MAAQ7Q,EAAQ6Q,MACtBzC,EAAMjE,KAAOnK,EAAQmK,KACrBiE,EAAMvL,KAAOtI,EACb6T,EAAM0C,IAAM,aAER9Q,EAAQiQ,MACRvU,EAAKE,YAAYwS,IAGjBmC,EAASpV,KAAKwU,WAAWjU,GACrB6U,GACA7U,EAAKiV,aAAavC,EAAOmC,KAmBrCQ,oBACAC,mBACAC,mBAAoB,SAASlR,EAAK4I,GAC9B,IAAK5I,EACD,MAAO4I,GAAS5I,EAGpB,IAAI5E,KAAK6V,gBAAgBjR,GACrB,MAAO4I,GAAS5I,EAGpB,IAAImR,GAAM/V,KAAK4V,iBAAiBhR,EAChC,IAAImR,EACA,MAAOA,GAAIpX,KAAK6O,EAGpBxN,MAAK4V,iBAAiBhR,IAAQ4I,EAE9B,IAAIwI,GAASjZ,SAASoD,cAAc,OACpC6V,GAAOhH,KAAO,WACdgH,EAAOL,IAAO,aACdK,EAAOtO,KAAO9C,CAEd,IAAIqR,GAASlZ,SAASyD,qBAAqB,QAAQ,EACnDyV,GAAOxV,YAAYuV,EAEnB,IAAIE,GAAQnZ,SAASoD,cAAc,MAgBnC+V,GAAM7V,QAAUxC,IAAI2F,UAAU,SAASC,EAAO0S,GAE1C,GAAIvR,GAAMuR,CACVnW,MAAK6V,gBAAgBjR,IAAO,CAE5B,KAAK,GADDwR,GAAYpW,KAAK4V,iBAAiBhR,GAC7BhG,EAAI,EAAGqC,EAAImV,EAAU7X,OAAY0C,EAAJrC,IAASA,EAC3CwX,EAAUxX,GAAGgG,SAEV5E,MAAK4V,iBAAiBhR,IAC9B5E,KAAM4E,GACTsR,EAAMjH,IAAMrK,GAYhByR,SAAU,SAASC,GACf,GAAIC,GAAe,SAASvD,GAKxB,MAJmB,KAAfA,EAAIzU,SACJyU,EAAM,IAAMA,GAEhBA,EAAMA,EAAIO,cAId,IAAmB,gBAAR+C,GAAkB,CACzB,GAAIE,GAAOD,EAAaxI,SAASuI,EAAIhM,EAAG,IAAIX,SAAS,KACjD8M,EAAOF,EAAaxI,SAASuI,EAAII,EAAG,IAAI/M,SAAS,KACjDgN,EAAOJ,EAAaxI,SAASuI,EAAIM,EAAG,IAAIjN,SAAS,IACrD,OAAO6M,GAAKC,EAAKE,EAGjBL,GAAO,EACP,IAAIO,GAAMP,EAAI3O,MAAM,8BACpB,OAAY,QAARkP,EACQN,EAAaxI,SAAS8I,EAAI,GAAI,IAAIlN,SAAS,KAC3C4M,EAAaxI,SAAS8I,EAAI,GAAI,IAAIlN,SAAS,KAC3C4M,EAAaxI,SAAS8I,EAAI,GAAI,IAAIlN,SAAS,KAG5C4M,EAAaxI,SAASuI,EAAK,IAAI3M,SAAS,MAc3DmN,SAAU,SAASC,GAIf,MAHyB,KAArBA,EAAIjX,QAAQ,OACZiX,EAAMA,EAAIC,OAAO,IAEF,IAAfD,EAAIxY,QAEA+L,EAAGyD,SAASgJ,EAAIC,OAAO,EAAE,GAAI,IAC7BN,EAAG3I,SAASgJ,EAAIC,OAAO,EAAE,GAAI,IAC7BJ,EAAG7I,SAASgJ,EAAIC,OAAO,EAAE,GAAI,KAGb,IAAfD,EAAIxY,QAEL+L,EAAGyD,SAASgJ,EAAIrD,OAAO,GAAKqD,EAAIrD,OAAO,GAAI,IAC3CgD,EAAG3I,SAASgJ,EAAIrD,OAAO,GAAKqD,EAAIrD,OAAO,GAAI,IAC3CkD,EAAG7I,SAASgJ,EAAIrD,OAAO,GAAKqD,EAAIrD,OAAO,GAAI,KAG1CqD,EAAIxY,QAAU,EACZwP,SAASgJ,EAAK,IADpB,QAcTE,0BAA2B,SAASpT,EAAUU,GAC1C,GAAI2S,GAAOlX,KAAKmX,sBAAsBtT,EACtC,OAAIqT,GACOA,EAAKjE,MAAM1O,GAEf,MAGX6S,2BAA4B,SAASvT,EAAUU,GAW3C,IAAI,GAVA8S,GAAQrX,KAAKsX,uBAAuBzT,GASpC0T,EACI3Y,EAAE,EAAGkD,EAAEuV,EAAM9Y,OAAYuD,EAAJlD,EAAOA,IAEhC,GADA2Y,EAAIF,EAAMzY,GAAGqU,MAAM1O,GACT,OAANgT,GAAoBtV,SAANsV,EACd,MAAOA,EAGf,OAAO,OAGXJ,sBAAuB,SAAStT,GAC5B,GAAI2T,GAAOH,EAAOI,EAAIC,EAAIR,EACtBhT,EAAInH,SAAS4a,WACjB,KAAKzT,EACD,MAAO,KAGX,KAAK,GAAI0T,GAAK,EAAGC,EAAK9a,SAAS4a,YAAYpZ,OAAasZ,EAALD,IAAWA,EAAI,CAG9D,GAFAJ,EAAQza,SAAS4a,YAAYC,GAC7BP,EAAQG,EAAMH,MAAQG,EAAMH,MAAQG,EAAMM,UACrCT,EAAS,MAAO,KAErB,KAAKI,EAAK,EAAGC,EAAKL,EAAM9Y,OAAamZ,EAALD,IAAWA,EAEvC,GADAP,EAAOG,EAAMI,GACRP,EAAKa,cACNb,EAAKa,eAAiBlU,EACtB,MAAOqT,GAKnB,MAAO,OAGXI,uBAAwB,SAASzT,GAC7B,GAAImU,MACAR,EAAOH,EAAOI,EAAIC,EAAIR,EACtBhT,EAAInH,SAAS4a,WACjB,KAAKzT,EAAK,MAAO8T,EAEjB,KAAK,GAAIJ,GAAK,EAAGC,EAAK9a,SAAS4a,YAAYpZ,OAAasZ,EAALD,IAAWA,EAAI,CAG9D,GAFAJ,EAAQza,SAAS4a,YAAYC,GAC7BP,EAAQG,EAAMH,MAAQG,EAAMH,MAAQG,EAAMM,UACrCT,EACD,MAAO,KAGX,KAAKI,EAAK,EAAGC,EAAKL,EAAM9Y,OAAamZ,EAALD,IAAWA,EACvCP,EAAOG,EAAMI,GACRP,EAAKa,cACNb,EAAKa,eAAiBlU,GACtBmU,EAAIrZ,KAAKuY,GAKrB,MAAOc,IAGXC,sBAAuB,SAASpU,GAC5B,GAAIqT,GAAOlX,KAAKmX,sBAAsBtT,GAClCqU,KACAnE,EAAMnV,EAAGqC,CASTiW,GAAOA,EAAKjE,MAAMa,OAClB,IAAIpF,GAAQwI,EAAKjY,MAAM,KACnBkZ,EAAOnF,EAAKoF,EAAKC,CACrB,KAAKzZ,EAAI,EAAGqC,EAAIyN,EAAMnQ,OAAY0C,EAAJrC,IAASA,EACR,MAAvB8P,EAAM9P,GAAG8U,OAAO,KAChBhF,EAAM9P,GAAK8P,EAAM9P,GAAG0Z,UAAU,IAElCH,EAAQzJ,EAAM9P,GAAGK,MAAM,KACvB8U,EAAO/T,KAAKoT,WAAY+E,EAAM,GAAGpH,eACjCiC,EAAMmF,EAAM,GACRnF,IACAA,EAAMA,EAAIsF,UAAU,GAEP,YAATvE,GAA+B,WAATA,GAA8B,gBAATA,GAE9B,gBAATA,GAA4BqE,EAAM,SAAUC,EAAM,UACtBD,EAAMrE,EAAUsE,EAAM,IAE7B,KAArBrF,EAAIlT,QAAQ,MACZkT,EAAMA,EAAI/T,MAAM,KAChBiZ,EAAME,EAAM,MAAUC,GAAQrF,EAAI,GAClCkF,EAAME,EAAM,SAAUC,GAAQrF,EAAI,GAClCkF,EAAME,EAAM,OAAUC,GAAQrF,EAAI,GAClCkF,EAAME,EAAM,QAAUC,GAAQrF,EAAI,KAGlCkF,EAAME,EAAM,MAAUC,GAAQrF,EAC9BkF,EAAME,EAAM,SAAUC,GAAQrF,EAC9BkF,EAAME,EAAM,OAAUC,GAAQrF,EAC9BkF,EAAME,EAAM,QAAUC,GAAQrF,IAGpB,iBAATe,EACoB,KAArBf,EAAIlT,QAAQ,MACZkT,EAAMA,EAAI/T,MAAM,KAChBiZ,EAAMK,oBAA4BvF,EAAI,GACtCkF,EAAMM,wBAA4BxF,EAAI,GACtCkF,EAAMO,qBAA4BzF,EAAI,GACtCkF,EAAMQ,uBAA4B1F,EAAI,KAGtCkF,EAAMK,oBAA4BvF,EAClCkF,EAAMO,qBAA4BzF,EAClCkF,EAAMQ,uBAA4B1F,EAClCkF,EAAMM,wBAA4BxF,GAItCkF,EAAMnE,GAAQf,EAO9B,OAAOkF,IAiBXS,eAAgB,SAAS9U,EAAU+U,EAAOC,EAAIC,EAAQC,GAClD,GAAIC,GAAOhZ,IACXnC,KAAIkE,gBAAgB,sBAAuB,SAASiC,GAChD,GAAIwE,EAMJ,IAL6B,gBAAb3E,GAAyB2E,EAAI,4CAChB,gBAAboQ,GAAyBpQ,EAAI,iCAC7BvG,SAAP4W,GAA2B,MAAPA,GAAqB,MAAPA,EAAcrQ,EAAI,wCACzCvG,SAAX6W,IAA2C,gBAAXA,IAAiC,GAAVA,GAAgBtQ,EAAI,0CAChEvG,SAAX8W,IAA2C,gBAAXA,IAAgCA,EAATA,KAAoBvQ,EAAI,iEACpFA,EAAK,KAAM,IAAIyQ,WAAUzQ,EAE7B,IAAIwK,GAAKkG,EAAIC,EAAMnV,EAASC,OAAOJ,EACpB5B,UAAX6W,IAAwBA,EAAS,GACrCD,EAAa,MAAPA,EAAc,SAASpP,EAAEmN,GAAG,MAAOnN,GAAEmN,GAAM,SAASnN,EAAEmN,GAAG,MAAOnN,GAAEmN,EACxE,KAAK,GAAIhY,GAAI,EAAGqC,EAAIkY,EAAI5a,OAAY0C,EAAJrC,IAASA,EACrCsa,EAAKC,EAAIva,GACToU,EAAMY,WAAYoF,EAAKxF,SAAS0F,EAAI,aACpClG,EAAM6F,EAAG7F,EAAK4F,GACJE,EAAN9F,GACkB,gBAAX+F,IAAuB/F,EAAM+F,IACxCG,EAAGjG,MAAMmG,SAAWpG,EAAM,SAO1C,OAAOxB,KCv2BX3T,IAAIuD,aAAa,kBAAmB,KAAO,WAEvC,YAaA,SAASiY,GAAKC,GACV,GAAIC,KACJ,KACIA,EAAaD,EAAKE,wBACpB,MAAMhR,GACJ+Q,GAAeE,IAAKH,EAAKI,UAAWlb,KAAM8a,EAAKK,YAEnD,MAAOJ,GAlBX,GAAIK,GACgC,kBAAzB7c,UAAS8c,aAC2C,kBAApD/c,QAAOgd,MAAMtc,UAAUuc,yBAE9BC,EAAuB,0BAA4BhM,KAAKC,SACxDgM,EAAyB,WACzB,GAAIC,GAAMnd,SAASoD,cAAc,MAEjC,OADA+Z,GAAIhF,UAAY,UACoC,IAA7CgF,EAAI1Z,qBAAqB,SAASjC,UAiBzC4b,GAkBAC,aAAc,SAAS1c,GACnB,MAAa,QAANA,GAA2B,gBAANA,IAAkB,YAAcA,IAAoB,IAAfA,EAAEgP,UAYvE2N,IAAK,SAAS3I,GACV,MAAkB,mBAARA,GACY,gBAARA,GACC3U,SAAS4G,eAAe+N,GAE5BA,EAEJ,MAeX4I,OAAQ,SAASC,EAAKC,GAClB,GAAItB,GAAKnc,SAASoD,cAAcoa,EAEhC,IAAIC,EACA,IAAI,GAAIjW,KAAYiW,GACbA,EAAW5c,eAAe2G,KACrBA,IAAY4V,GACZA,EAAW5V,GAAU2U,EAAIsB,EAAWjW,IAEpB,cAAbA,GAAyC,UAAbA,EAC3B2U,EAAGvH,UAAY6I,EAAW7I,WAAa6I,EAAW,SAElDtB,EAAG9Y,aAAamE,EAAUiW,EAAWjW,IAMzD,OAAO2U,IAYXhH,OAAQ,SAASR,GACbA,EAAM7T,IAAIe,EAAE8S,EACZ,IAAI+I,EACA/I,KAAQ+I,EAAQ/I,EAAItC,aACpBqL,EAAMpL,YAAYqC,IAa1BgJ,SAAU,SAAShJ,GAEf,GADAA,EAAMyI,EAAWE,IAAI3I,GACb,CACJ,GAAIA,EAAIiJ,eACJ,MAAOjJ,GAAIiJ,gBAGf,IAAIC,MACAC,EAAS,EAAGC,EAAU,CAE1B,GACID,IAAUnJ,EAAIgI,WAAa,EAC3BoB,GAAWpJ,EAAIiI,YAAc,EAE7BjI,EAAMA,EAAIqJ,mBACNrJ,EAERkJ,IAAarD,EAAGuD,EAASE,EAAGH,GAE5B/d,OAAO4d,SAASE,EAAUrD,EAAGqD,EAAUI,KAe/CtB,UAAW,SAAShI,GAChB,MAAOyI,GAAWc,OAAOvJ,GAAK,IAclCiI,WAAY,SAASjI,GACjB,MAAOyI,GAAWc,OAAOvJ,GAAK,IAYlCwJ,iBAAkB,SAASzI,GACvB,GAAI0I,GAAW,EAAGC,EAAY,CAC9B3I,GAAU0H,EAAWE,IAAI5H,EACzB,GAII,IAHA0I,GAAa1I,EAAQiH,WAAc,EACnC0B,GAAa3I,EAAQkH,YAAc,EACnClH,EAAUA,EAAQsI,aACL,CACT,GAAsC,SAAlCtI,EAAQ4I,QAAQtK,cAA4B,KAEhD,IAAItE,GAAQgG,EAAQQ,MAAMqI,QAI1B,KAHK7O,GAASgG,EAAQgB,eAClBhH,EAAQgG,EAAQgB,aAAa6H,YAE3B7O,GAAmB,SAAVA,IAAiD,mBAArB8E,kBAAkC,CACzE,GAAIoC,GAAMpC,iBAAiBkB,EAAS,KACpChG,GAAQkH,EAAMA,EAAI2H,SAAW,KAEjC,GAAc,aAAV7O,GAAkC,aAAVA,EAAwB,YAEnDgG,EACT,QAAQ2I,EAAWD,IAiBvBF,OAAQ,SAASvJ,GAEbA,EAAM7T,IAAIe,EAAE8S,EACZ,IAAIsG,IAAO,EAAG,GACVuD,EAAM7J,EAAI8J,cACVC,EAAUF,EAAI1M,gBACd6M,EAAMrC,EAAK3H,GACX9C,EAAO2M,EAAI3M,KACX+M,EAAaF,EAAQE,WAAc/M,EAAK+M,WAAc,EACtDC,EAAaH,EAAQG,YAAchN,EAAKgN,YAAc,EACtDC,EAAaN,EAAIO,aAAeL,EAAQI,WAAcjN,EAAKiN,UAC3DE,EAAaR,EAAIS,aAAeP,EAAQM,YAAcnN,EAAKmN,WAC3DtC,EAAOiC,EAAIjC,IAAOoC,EAAaF,EAC/Bnd,EAAOkd,EAAIld,KAAOud,EAAaH,CAEnC,OADA5D,IAAOxZ,EAAMib,IAajBwC,OAAQ,SAASvK,GAEb,MADAA,GAAMA,EAAM7T,IAAIe,EAAE8S,GAAO3U,SAAS6R,MAEzB9R,OAAOkf,YAAiClf,OAAOkf,YAAxBtK,EAAIqK,WAC3Bjf,OAAOgf,YAAgChf,OAAOgf,YAAvBpK,EAAImK,YAIxCK,WAAY,SAASC,EAAIpI,GACrB,GAAIqI,GAAGC,EACHrJ,EAAMmJ,EAAGG,iBAAmBH,EAAGG,iBAAiBvI,GAAQoI,EAAGpI,EAY/D,OAXKf,IAEDqJ,EAAIrJ,EAAIlT,QAAQ,MACAsc,EAAN,KAANC,EAAgB,EAEZzI,WAAWZ,EAAK,KALhBoJ,EAAI,EAWTA,GAYXG,QAAS,SAASrD,GACd,MAAOiB,GAAWc,OAAO/B,IAY7BsD,aAAc,SAAS9K,EAAK+K,GAExB,MADA/K,GAAM7T,IAAIe,EAAE8S,GACLA,EAAI8K,aAAe9K,EAAI8K,aAAaC,KAAU/K,EAAIgL,aAAaD,IAY1EE,YAAa,SAASC,EAAQC,IAEtBA,EAAY1C,EAAWE,IAAIwC,MACG,OAA1BA,EAAUjI,YACViI,EAAUzN,WAAWoG,aAAaoH,EAAQC,EAAUjI,aAEpDiI,EAAUzN,WAAW3O,YAAYmc,KAe7CpH,aAAc,SAAUoH,EAAQC,IAEtBA,EAAY1C,EAAWE,IAAIwC,KAC7BA,EAAUzN,WAAWoG,aAAaoH,EAAQC,IAclDC,UAAW,SAASF,EAAOC,IAEnBA,EAAY1C,EAAWE,IAAIwC,MACvBA,EAAUlI,WACVkI,EAAUrH,aAAaoH,EAAQC,EAAUlI,YAEzCkI,EAAUpc,YAAYmc,KAelCG,aAAc,SAASH,EAAQC,GAE3BA,EAAYhf,IAAIe,EAAEie,GAClBA,EAAUpc,YAAYmc,IAY1BI,YAAa,SAASC,GAClBA,EAAOpf,IAAIe,EAAEqe,EACb,IAAIC,GAAMvf,EAAGwe,EAAIzZ,CAEjB,QAAOua,GAAQA,EAAKvQ,UACpB,IAAK,GAED,MAAOyN,GAAW6C,YAAYC,EAAKpO,iBAAmBoO,EAAKrO,MAAQqO,EAAKrO,KAAKQ,YAAc6N,EAAKrO,KAEpG,KAAK,GAED,GADAsO,EAAQ,eAAiBD,GAAQA,EAAKD,YAAcC,EAAKE,UACrC,mBAATD,GACP,MAAOA,EAGf,KAAK,IAED,GADAA,EAAOD,EAAKD,YACQ,mBAATE,GACP,MAAOA,EAGX,IAAID,EAAKtI,aAAesI,EAAKG,UAEzB,MAAOjD,GAAW6C,YAAYC,EAAKtI,WAKvC,KAFAuI,KACAf,EAAKc,EAAKI,WACL1f,EAAI,EAAG+E,EAAIyZ,EAAG5d,OAAYmE,EAAJ/E,IAASA,EAChCuf,EAAKve,KAAMwb,EAAW6C,YAAab,EAAGxe,IAE1C,OAAOuf,GAAK5d,KAAK,GAErB,KAAK,GACL,IAAK,GACD,MAAO2d,GAAKK,UAEhB,MAAO,IAcXC,eAAgB,SAASN,EAAMC,GAE3B,OADAD,EAAOpf,IAAIe,EAAEqe,GACNA,GAAQA,EAAKvQ,UAEpB,IAAK,GACD,GAAI,aAAeuQ,GAAM,CACrBA,EAAKE,UAAYD,CACjB,OAGR,IAAK,IACD,GAAI,eAAiBD,GAAM,CACvBA,EAAKD,YAAcE,CACnB,OAGR,IAAK,GACD,KAAMD,EAAKtI,YACPsI,EAAK5N,YAAY4N,EAAKtI,WAE1B,IAAa,KAATuI,EAAa,CACb,GAAI3B,GAAM0B,EAAKzB,eAAiByB,CAChCA,GAAKxc,YAAY8a,EAAIhG,eAAe2H,IAExC,KAEJ,KAAK,GACL,IAAK,GACDD,EAAKK,UAAYJ,IAczBM,OAAQ,SAAS/K,GACb,GAAImE,GAAInE,GAAgC,IAArBA,EAAQ/F,WAAmB,YAAcnN,KAAKkT,EAAQ4I,UACrE5I,EAAQgL,gBAAkBhL,EAAQgL,eAAe,+BAA+B,QACpF,SAAS7G,GAab8G,aAAc,SAASC,EAAUV,GAE7B,IAAKA,IAASU,EACV,OAAO,CAEX,IAAIV,EAAKW,wBACL,MAA2D,MAAV,GAAzCD,EAASC,wBAAwBX,GAE7C,MAAOA,EAAOA,EAAK7N,YACf,GAAI6N,IAASU,EACT,OAAO,CAGf,QAAO,GAaXE,aAAc,SAASZ,EAAMa,GACzB,MAAOb,KAASa,GAAc3D,EAAWuD,aAAaT,EAAMa,IAWhErJ,kBAAmB,SAAS/C,GACxB,IAAIA,EACA,MAAO,KAEX,IAAI,qBAAuBA,GACvB,MAAOA,GAAI+C,iBAGf,KADA,GAAIC,GAAQhD,EAAIiD,WACVD,GAA4B,IAAnBA,EAAMhI,UACjBgI,EAAQA,EAAME,WAElB,OAAOF,IAWXqJ,iBAAkB,SAASrM,GACvB,IAAIA,EACA,MAAO,KAEX,IAAI,oBAAsBA,GACtB,MAAOA,GAAIqM,gBAGf,KADA,GAAIrJ,GAAQhD,EAAI0L,UACV1I,GAA4B,IAAnBA,EAAMhI,UACjBgI,EAAQA,EAAMsJ,eAElB,OAAOtJ,IAYXuJ,mBAAoB,SAAShB,GACzB,GAAIiB,GAAU,IAEd,KAAIjB,EAAO,MAAOiB,EAElB,IAAG,sBAAwBjB,GACvB,MAAOA,GAAKgB,kBAKZ,KAHAC,EAAUjB,EAAKrI,YAGTsJ,GAAgC,IAArBA,EAAQxR,UACrBwR,EAAUA,EAAQtJ,WAGtB,OAAOsJ,IAafC,uBAAwB,SAASlB,GAC7B,GAAIiB,GAAU,IAEd,KAAIjB,EAAO,MAAOiB,EAElB,IAAG,0BAA4BjB,GAC3B,MAAOA,GAAKkB,sBAKZ,KAHAD,EAAUjB,EAAKe,gBAGTE,GAAgC,IAArBA,EAAQxR,UACrBwR,EAAUA,EAAQF,eAGtB;MAAOE,IAafE,aAAc,SAAS3L,GAInB,MAHsB,gBAAZA,KACNA,EAAU1V,SAAS4G,eAAe8O,IAE/BA,EAAQ4L,aAYnBC,cAAe,SAAS7L,GAIpB,MAHsB,gBAAZA,KACNA,EAAU1V,SAAS4G,eAAe8O,IAE/BA,EAAQ8L,cAUnBC,YAAa,SAAS/L,GAClB,MAAO0H,GAAWR,WAAWlH,IAUjCgM,WAAY,SAAShM,GACjB,MAAO0H,GAAWT,UAAUjH,IAWhCiM,kBAAmB,SAASjM,GAExB,MADAA,GAAU5U,IAAIe,EAAE6T,IACRA,EAAQ4L,YAAa5L,EAAQ8L,eAazCI,gBAAiB,SAAUlM,GACvB,GAAImM,GAAOvF,EAAK5G,GAEZjB,EAAM3T,IAAIqD,UAAU,iBACpBsS,EAAW3V,IAAIwF,WAAWmO,EAAK,WAAYiB,EAE/C,QACImM,EAAKC,MAAQD,EAAKpgB,KAAOoV,WAAWJ,EAAS,eAAiB,GAAKI,WAAWJ,EAAS,gBAAkB,GACzGoL,EAAKE,OAASF,EAAKnF,IAAM7F,WAAWJ,EAAS,cAAgB,GAAKI,WAAWJ,EAAS,iBAAmB,KAgBjHuL,WAAY,SAAUtM,EAAS5N,GAC3B,GAAIma,GAAO3F,EAAKxb,IAAIe,EAAE6T,GAKtB,OAJuB,iBAAZ5N,KACPA,GAAWoa,QAASpa,EAASqa,OAAQ,IAEzCra,EAAUhH,IAAIsG,WAAY8a,SAAS,EAAOC,OAAQ,GAAIra,OAClDA,EAAQoa,QACAD,EAAKF,OAASja,EAAQqa,OAAS,GAC/BF,EAAKxgB,KAASqG,EAAQqa,OAAS/E,EAAWgF,iBAC1CH,EAAKvF,IAAS5U,EAAQqa,OAAS/E,EAAWiF,kBAC1CJ,EAAKH,MAASha,EAAQqa,OAAS,EAE/BF,EAAKvF,IAAS5U,EAAQqa,OAAS,GAC/BF,EAAKH,MAASha,EAAQqa,OAAS/E,EAAWgF,iBAC1CH,EAAKF,OAASja,EAAQqa,OAAS/E,EAAWiF,kBAC1CJ,EAAKxgB,KAASqG,EAAQqa,OAAS,GAa/CG,SAAU,SAAU5M,GAChB,GAAI6M,GAAI7M,EAAQ4L,YACZkB,EAAI9M,EAAQ8L,aACZzJ,EAA2C,OAAlCrC,EAAQ4I,QAAQtK,cAEzBS,EAAM3T,IAAIqD,UAAU,gBAExB,OAAY,KAAJoe,GAAa,IAAJC,GAAUzK,EAClB,IAAJwK,GAAa,IAAJC,GAAUzK,EAC+B,SAAnDtD,EAAIgC,SAASf,EAAS,WAAW1B,eADJ,GADG,GAcxCyO,UAAW,SAAU/M,GACjB,OAAQzS,KAAKqf,SAAS5M,IAa1BgN,cAAe,SAASC,EAASC,GAC7B,GAAItH,GAAM8B,EAAWc,OAAO0E,EAI5B,OAHAD,GAAQzM,MAAMzU,KAAO6Z,EAAI,GAAG,KAC5BqH,EAAQzM,MAAMwG,IAAMpB,EAAI,GAAG,KAEpBqH,GAaXE,cAAe,SAASnN,IACfA,EAAU5U,IAAIe,EAAE6T,MACjBA,EAAQQ,MAAM4M,SAAW,SACzBpN,EAAQQ,MAAM6M,WAAa,SAC3BrN,EAAQQ,MAAM8M,aAAe,aAcrCC,kBAAmB,SAASvN,EAASwN,GACjC,KAAOxN,GAAgC,IAArBA,EAAQ/F,UAAgB,CACtC,GAAIuT,EAASxN,GACT,MAAOA,EAEXA,GAAUA,EAAQrD,WAEtB,OAAO,GAcX8Q,mBAAoB,SAASzN,EAASd,GAClC,GAAIV,GAAK,GAAIC,QAAO,UAAYS,EAAY,WACxCwO,EAAM,SAASjH,GACf,GAAIkH,GAAMlH,EAAGvH,SACb,OAAOyO,IAAOnP,EAAG1R,KAAK6gB,GAE1B,OAAOjG,GAAW6F,kBAAkBvN,EAAS0N,IAYjDE,iBAAkB,SAAS5N,EAAS8H,GAChCA,EAAMA,EAAIhH,aACV,IAAI4M,GAAM,SAASjH,GACf,MAAOA,GAAGoH,UAAYpH,EAAGoH,SAAS/M,gBAAkBgH,EAExD,OAAOJ,GAAW6F,kBAAkBvN,EAAS0N,IAYjDI,gBAAiB,SAAS9N,EAAS/O,GAC/B,GAAIyc,GAAM,SAASjH,GACf,MAAOA,GAAGxV,KAAOA,EAErB,OAAOyW,GAAW6F,kBAAkBvN,EAAS0N,IAYjDK,sBAAuB,SAAS/N,EAASgO,GACrC,GAAIzc,GAAWnG,IAAIqD,UAAU,mBAAoB,IACjD,KAAK8C,EACD,KAAM,IAAI/D,OAAM,wCAEpB,IAAIkgB,GAAM,SAASjH,GACf,MAAOlV,GAAS0c,gBAAgBxH,EAAIuH,GAExC,OAAOtG,GAAW6F,kBAAkBvN,EAAS0N,IAYjDQ,gBAAiB,SAASzH,EAAI0H,GAC1B,GAAI3D,GACA4D,EACAC,EACAC,EAAQ7H,EAAGmE,WACX2D,EAAOD,EAAMxiB,OACb2e,EAAO,EAEX,KAAKhE,EACD,MAAOgE,EAGX,KAAK2D,EAAI,EAAOG,EAAJH,IAAYA,EACpB5D,EAAO8D,EAAMF,GACR5D,GACiB,IAAlBA,EAAKvQ,WACLoU,EAAO3G,EAAW8G,YAAaC,OAAOjE,EAAKkE,OACvCL,EAAKviB,OAAS,GACd2e,GAAQ4D,EACJF,GAAY1H,EAAG7J,YAAY4N,IAE3B/D,EAAG7J,YAAY4N,GAI/B,OAAOC,IAWX+D,YAAa,SAAS/D,GAClB,MAAQgE,QAAO1jB,UAAc,KAAI0f,EAAKkE,OAASlE,EAAKxd,QAAQ,OAAQ,IAAIA,QAAQ,OAAQ,KAW5F2hB,gBAAiB,SAAUpd,GAGvB,IAAK,GAFDqd,GAAWzjB,IAAIe,EAAEqF,GACjBsd,KACK3iB,EAAI,EAAGA,EAAI0iB,EAASzc,QAAQtG,SAAUK,EAC3C2iB,EAAO5iB,KAAM2iB,EAASzc,QAAQjG,GAAG6N,MAErC,OAAO8U,IAKXC,eAAgB,SAASL,GAErB,IAAK,GADDM,GAAGC,KACE9iB,EAAI,EAAGqC,EAAIkgB,EAAK5iB,OAAY0C,EAAJrC,IAASA,EACtC6iB,EAAIN,EAAKviB,GAEH6iB,YAAajgB,OAGG,IAAbigB,EAAEljB,QACPkjB,EAAE9iB,KAAK8iB,EAAE,IAHTA,GAAKA,EAAGA,GAKZC,EAAM/iB,KAAK8iB,EAEf,OAAOC,IAiBXC,WAAY,SAASC,EAAWT,EAAMU,EAAWC,GAC7C,GAAIC,GAAclkB,IAAIe,EAAEgjB,EACxB,IAAKG,EAAL,CAEAA,EAAY7M,UAAY,EACxB,IAAIuM,GAAGO,CAEFH,KAEDG,EAAWjlB,SAASoD,cAAc,UAClC6hB,EAAS5hB,aAAa,QAAS,IAC/B2hB,EAAYthB,YAAYuhB,IAG5Bb,EAAOhH,EAAWqH,eAAeL,EAEjC,KAAK,GAAIviB,GAAI,EAAGqC,EAAIkgB,EAAK5iB,OAAY0C,EAAJrC,IAASA,EACtC6iB,EAAIN,EAAKviB,GAETojB,EAAWjlB,SAASoD,cAAc,UAClC6hB,EAAS5hB,aAAa,QAASqhB,EAAE,IAC7BA,EAAEljB,OAAS,GACXyjB,EAAS5hB,aAAa,QAASqhB,EAAE,IAErCO,EAASvhB,YAAa1D,SAASwY,eAAekM,EAAE,KAE5CA,EAAE,KAAOK,GACTE,EAAS5hB,aAAa,WAAY,YAGtC2hB,EAAYthB,YAAYuhB,KAiBhCC,WAAY,SAASC,EAAejY,EAAMkX,EAAMU,EAAWC,EAAcK,GACrED,EAAgBrkB,IAAIe,EAAEsjB,EACtB,IAAIH,GAAchlB,SAASoD,cAAc,OACzCga,GAAWwC,YAAYoF,EAAaG,GAEpCf,EAAOhH,EAAWqH,eAAeL,EAQjC,IAAIM,GAAGW,CAEFP,KAEDO,EAAUrlB,SAASoD,cAAc,SACjCiiB,EAAQhiB,aAAa,OAAQ,SAC7BgiB,EAAQhiB,aAAa,OAAQ6J,GAC7BmY,EAAQhiB,aAAa,QAAS,IAC9B2hB,EAAYthB,YAAY2hB,GACpBD,GAAYJ,EAAYthB,YAAa1D,SAASoD,cAAcgiB,IAGpE,KAAK,GAAIvjB,GAAI,EAAGA,EAAIuiB,EAAK5iB,SAAUK,EAC/B6iB,EAAIN,EAAKviB,GAETwjB,EAAUrlB,SAASoD,cAAc,SACjCiiB,EAAQhiB,aAAa,OAAQ,SAC7BgiB,EAAQhiB,aAAa,OAAQ6J,GAC7BmY,EAAQhiB,aAAa,QAASqhB,EAAE,IAChCM,EAAYthB,YAAY2hB,GACxBL,EAAYthB,YAAa1D,SAASwY,eAAekM,EAAE,KAC/CU,GAAYJ,EAAYthB,YAAa1D,SAASoD,cAAcgiB,IAE5DV,EAAE,KAAOK,IACTM,EAAQC,SAAU,EAI1B,OAAON,IAgBXO,WAAY,SAASJ,EAAejY,EAAMkX,EAAMW,EAAcK,GAC1DD,EAAgBrkB,IAAIe,EAAEsjB,EACtB,IAAIH,GAAchlB,SAASoD,cAAc,OACzCga,GAAWwC,YAAYoF,EAAaG,GAEpCf,EAAOhH,EAAWqH,eAAeL,GAEO,MAApClX,EAAKqO,UAAUrO,EAAK1L,OAAS,KAC7B0L,GAAQ,KAKZ,KAAK,GAFDwX,GAAGW,EAEExjB,EAAI,EAAGA,EAAIuiB,EAAK5iB,SAAUK,EAC/B6iB,EAAIN,EAAKviB,GAETwjB,EAAUrlB,SAASoD,cAAc,SACjCiiB,EAAQhiB,aAAa,OAAQ,YAC7BgiB,EAAQhiB,aAAa,OAAQ6J,GAC7BmY,EAAQhiB,aAAa,QAASqhB,EAAE,IAChCM,EAAYthB,YAAY2hB,GACxBL,EAAYthB,YAAa1D,SAASwY,eAAekM,EAAE,KAC/CU,GAAYJ,EAAYthB,YAAa1D,SAASoD,cAAcgiB,IAE5DV,EAAE,KAAOK,IACTM,EAAQC,SAAU,EAI1B,OAAON,IAcXQ,cAAe,SAASC,EAAUC,GAM9B,GALKA,IAEDA,EAAUD,EACVA,EAAWA,EAASpT,aAEnBoT,EAAY,OAAO,CACxB,KAAK,GAAI5jB,GAAI,EAAGqC,EAAIuhB,EAASE,SAASnkB,OAAY0C,EAAJrC,IAASA,EACnD,GAAI4jB,EAASE,SAAS9jB,KAAO6jB,EACzB,MAAO7jB,EAGf,QAAO,GAYX+jB,aAAc,SAASjR,GAEnB,GADAA,EAAM7T,IAAIe,EAAE8S,GACO,gBAAV,IAA8B,OAARA,GAAgBA,EAAIhF,UAA6B,IAAjBgF,EAAIhF,SAAgB,CAK/E,IAAI,GAJAkW,MACAC,EAAWnR,EAAItC,WAAWsT,SAC1BI,EAAW3I,EAAWoI,cAAc7Q,EAAItC,WAAYsC,GAEhD9S,IAAMkkB,EAAOxe,EAAMue,EAAStkB,OAAU+F,EAAF1F,EAAOA,IAC/CgkB,EAASjkB,KAAKkkB,EAASjkB,GAG3B,OAAOgkB,GAEX,UAYJG,iBAAkB,SAASrR,GAEvB,GADAA,EAAM7T,IAAIe,EAAE8S,GACO,gBAAV,IAA8B,OAARA,GAAgBA,EAAIhF,UAA6B,IAAjBgF,EAAIhF,SAAgB,CAK/E,IAAI,GAJAkW,MACAC,EAAcnR,EAAItC,WAAWsT,SAC7BI,EAAc3I,EAAWoI,cAAc7Q,EAAItC,WAAYsC,GAEnD9S,EAAI,EAAG0F,EAAMwe,EAASxe,EAAF1F,EAAOA,IAC/BgkB,EAASjkB,KAAKkkB,EAASjkB,GAG3B,OAAOgkB,GAEX,UAYJC,SAAU,SAASnR,GAEf,GADAA,EAAM7T,IAAIe,EAAE8S,GACO,gBAAV,IAA8B,OAARA,GAAgBA,EAAIhF,UAA6B,IAAjBgF,EAAIhF,SAAgB,CAI/E,IAAI,GAHAkW,MACAC,EAAanR,EAAItC,WAAWsT,SAExB9jB,EAAI,EAAG0F,EAAMue,EAAStkB,OAAU+F,EAAF1F,EAAOA,IACtC8S,IAAQmR,EAASjkB,IAChBgkB,EAASjkB,KAAKkkB,EAASjkB,GAI/B,OAAOgkB,GAEX,UAWJI,kBAAmB,SAAStR,GAExB,MADAA,GAAM7T,IAAIe,EAAE8S,GACR,qBAAuBA,GAChBA,EAAIsR,kBAEVtR,EACEyI,EAAW0I,SAASnR,GAAKnT,OAAS,EADtB,GAIvB0kB,eACIC,MAAO,SAAUhJ,EAAKiJ,GAOlB,MAJIjJ,GAAIhF,UADJ+E,EACgB,UAAYkJ,EAAO,kBAAoBnJ,EAAuB,6BAE9D,UAAYmJ,EAAO,WAEhCjJ,EAAIvF,YAEfyO,MAAO,SAAUlJ,EAAKiJ,GAElB,MADAjJ,GAAIhF,UAAY,iBAAmBiO,EAAO,mBACnCjJ,EAAIvF,WAAWnU,qBAAqB,SAAS,IAExD6iB,MAAO,SAAUnJ,EAAKiJ,GAElB,MADAjJ,GAAIhF,UAAY,iBAAmBiO,EAAO,kCACnCjJ,EAAIvF,WAAWnU,qBAAqB,SAAS,IAExD8iB,MAAO,SAAUpJ,EAAKiJ,GAElB,MADAjJ,GAAIhF,UAAY,iBAAmBiO,EAAO,kCACnCjJ,EAAIvF,WAAWnU,qBAAqB,SAAS,IAExD+iB,GAAI,SAAUrJ,EAAKiJ,GAEf,MADAjJ,GAAIhF,UAAY,qBAAuBiO,EAAO,wBACvCjJ,EAAIvF,WAAWA,WAAWA,aAczC6O,YAAa,SAAU9R,EAAKyR,GACxB,GAAI7C,GAAW5O,EAAI4O,UAAY5O,EAAI4O,SAAS/M,cACxCkQ,EAAU1mB,SAASoD,cAAc,OACjCujB,EAAWvJ,EAAW8I,cAAc3C,EAExC,KAAMoD,EAEF,MADAD,GAAQvO,UAAYiO,EACbM,CAKX,IAFAA,EAAUC,EAASD,EAASN,GAExBlJ,GAAsC,UAAbqG,EAGzB,IAAK,GADDqD,GAAMF,EAAQjjB,qBAAqB,MAC9B5B,EAAI,EAAG0F,EAAMqf,EAAIplB,OAAY+F,EAAJ1F,EAASA,IACvC,GAAI+kB,EAAI/kB,GAAGsW,YAAc8E,EAAsB,CAC3C,GAAI4J,GAAQD,EAAI/kB,GAAGwQ,WAAWA,UAC9BwU,GAAMxU,WAAWC,YAAYuU,GAIzC,MAAOH,IAcXI,WAAY,SAASnS,EAAKyR,GAEtB,GADAzR,EAAM7T,IAAIe,EAAE8S,GACD,OAARA,EAEC,IADA,GAAI+R,GAAUtJ,EAAWqJ,YAAY9R,EAAKyR,GACnCM,EAAQ9O,YACXjD,EAAIjR,YAAYgjB,EAAQ9O,aAgBpCmP,YAAa,SAASpS,EAAKyR,GAEvB,GADAzR,EAAM7T,IAAIe,EAAE8S,GACD,OAARA,EAEC,IADA,GAAI+R,GAAUtJ,EAAWqJ,YAAY9R,EAAKyR,GACnCM,EAAQrG,WACX1L,EAAI8D,aAAaiO,EAAQrG,UAAW1L,EAAIiD,aAepDoP,QAAS,SAAUrS,EAAKyR,GAEpB,GADAzR,EAAM7T,IAAIe,EAAE8S,GACD,OAARA,EACC,IACIA,EAAIwD,UAAYiO,EAClB,MAAO3a,GAEL,KAAOkJ,EAAIiD,YACPjD,EAAIrC,YAAYqC,EAAIiD,WAExBwF,GAAW0J,WAAWnS,EAAKyR,KA8BvCa,KAAM,SAAUC,EAAQrC,GACpBqC,EAASpmB,IAAIe,EAAEqlB,GACfrC,EAAY/jB,IAAIe,EAAEgjB,EAElB,IAAIsC,GAAWD,EAAOrP,YAClB5T,EAASijB,EAAO7U,UAUpB,OARAwS,GAAUnhB,YAAYwjB,GAEL,OAAbC,EACAljB,EAAOwU,aAAaoM,EAAWsC,GAE/BljB,EAAOP,YAAYmhB,GAGhBA,GA8BXuC,OAAQ,SAAU7K,EAAM8K,GACpB9K,EAAOzb,IAAIe,EAAE0a,EACb,IAAImK,EAEAA,GAD2B,gBAApBW,GACGjK,EAAWqG,sBAAsBlH,EAAM8K,GACf,gBAApBA,IAAgCA,EAAgB/I,QACpDlB,EAAW6F,kBAAkB1G,EAAM,SAAUqE,GACnD,MAAOA,KAAayG,IAGd9K,EAAKlK,WAEdqU,GAAYA,EAAQrU,YAEzB+K,EAAW3E,aAAa8D,EAAMmK,IAkBlC/jB,QAAS,SAAU+S,EAAS4R,GACxB5R,EAAU5U,IAAIe,EAAE6T,GACD,OAAZA,GACCA,EAAQrD,WAAWkV,aAAaD,EAAa5R,IAcrD8R,uBAAwB,SAASrL,GAE7B,GADAA,EAAKrb,IAAIe,EAAEsa,GACD,OAAPA,EAAa,CACZ,GAAIsL,GAAQC,EAAUzjB,EAASkY,CAE/B,KADAA,EAAKA,EAAGvE,WACDuE,GACHuL,EAA4B,IAAhBvL,EAAGxM,SACf8X,EAAStL,EACTA,EAAKA,EAAGtE,YACJ6P,GACAzjB,EAAOqO,YAAYmV,KAcnCE,eAAiB9K,EACb,SAASuJ,GACL,GAAIwB,EAEJ,OAAmB,gBAATxB,GAA2BpmB,SAAS6nB,0BAE9CD,EAAQ5nB,SAAS8c,cAGjB8K,EAAME,WAAW9nB,SAAS6R,MAEnB+V,EAAM5K,yBAAyBoJ,KACtC,SAAUA,GACV,GAAI2B,GAAW/nB,SAAS6nB,yBACpBG,EACAC,CAEJ,IAAmB,gBAAT7B,GAAoB,MAAO2B,EAMrC,KAJAC,EAAchoB,SAASoD,cAAc,OACrC4kB,EAAY7P,UAAYiO,EAGhB6B,EAAUD,EAAYpQ,YAC1BmQ,EAASrkB,YAAYukB,EAGzB,OAAOF,IAGf1R,WAAY,SAASnG,GAEjB,MAAOA,GAAMA,EAAIvN,QAAQ,SAAU,SAAU2T,EAAGC,GAC5C,MAAOA,GAAGC,gBACTtG,GAWTkU,KAAM,SAAStd,GACX,GAAIqV,EACJ,IAAwB,gBAAbrV,IAA6C,gBAAbA,GACvC,KAAM,oDAGV,IAAwB,gBAAbA,GACPqV,EAAKrV,MAEJ,CACD,GAAIohB,GAAiBpnB,IAAIqD,UAAU,mBAAoB,EACvD,KAAK+jB,EACD,KAAM,sEAGV,IADA/L,EAAK+L,EAAehhB,OAAOJ,GACvBqV,EAAG3a,QAAU,EACb,KAAM,8EAEV2a,GAAKA,EAAG,GAGZ,GAAIgM,MACAC,EAAQjM,EAAGkM,eAEXC,EAASC,EAAaC,CAC1B,IAAIJ,EACA,IAAK,GAAIvmB,GAAI,EAAG4mB,EAAQL,EAAM5mB,OAAYinB,EAAJ5mB,IAAaA,EAC/CymB,EAAUF,EAAMvmB,GAChB0mB,EAAcD,EAAQpb,KACtBsb,EAAeF,EAAQ5Y,MACnB6Y,GAAgD,IAAjCA,EAAYxlB,QAAQ,WACnColB,EAAQ/K,EAAW/G,WAAWkS,EAAY5lB,QAAQ,QAAS,MAAQ6lB,EAK/E,OAAOL,IAYXO,aAAc,SAASvM,EAAIpX,GAEvB,GADAoX,EAAKrb,IAAIe,EAAEsa,GACD,OAAPA,EACC,GAAIA,EAAGwM,kBACHxM,EAAGwM,kBAAkB5jB,EAAGA,OAGvB,CACD,GAAI6iB,GAAQzL,EAAGyM,iBACfhB,GAAMiB,UAAS,GACfjB,EAAMkB,QAAU,YAAa/jB,GAC7B6iB,EAAMmB,UAAU,YAAahkB,GAC7B6iB,EAAM1gB,WAWlB8hB,UAAW,WACP,GAAIC,EAGAA,GADAlpB,OAAOuT,YAAcvT,OAAOmpB,WAClBnpB,OAAOuT,WAAavT,OAAOmpB,WAC9BlpB,SAAS6R,KAAKsX,YAAcnpB,SAAS6R,KAAKyP,YACvCthB,SAAS6R,KAAKsX,YAEdnpB,SAAS6R,KAAKyP,WAG5B,IAAI5N,EAcJ,OAZI3T,QAAOqpB,KAAK9V,WAERI,EADD1T,SAAS8R,gBAAgB0B,YACVxT,SAAS8R,gBAAgB0B,YAEzBzT,OAAOqpB,KAAK9V,WAEvBtT,SAAS8R,iBAAmB9R,SAAS8R,gBAAgB0B,YAC5DE,EAAc1T,SAAS8R,gBAAgB0B,YAChCxT,SAAS6R,OAChB6B,EAAc1T,SAAS6R,KAAK2B,aAGnBE,EAAVuV,EACQA,EAEAvV,GAUf2V,WAAY,WACR,GAAIC,EAGAA,GADAvpB,OAAOwT,aAAexT,OAAOwpB,WACnBxpB,OAAOwT,YAAcxT,OAAOwpB,WAC/BvpB,SAAS6R,KAAK2X,aAAexpB,SAAS6R,KAAK2P,aACxCxhB,SAAS6R,KAAK2X,aAEdxpB,SAAS6R,KAAK2P,YAG5B,IAAI7N,EAUJ,OARI5T,QAAOqpB,KAAK7V,YACZI,EAAe5T,OAAOqpB,KAAK7V,YACpBvT,SAAS8R,iBAAmB9R,SAAS8R,gBAAgB2B,aAC5DE,EAAe3T,SAAS8R,gBAAgB2B,aACjCzT,SAAS6R,OAChB8B,EAAe3T,SAAS6R,KAAK4B,cAGpBE,EAAV2V,EACQ3V,EAEA2V,GAUflH,cAAe,WACX,MAAgC,mBAAtBriB,QAAOuT,WACNvT,OAAOuT,WAEdtT,SAAS8R,iBAAmE,mBAAzC9R,UAAS8R,gBAAgBwP,YACrDthB,SAAS8R,gBAAgBwP,YADpC,QAWJe,eAAgB,WACZ,MAAkC,mBAAvBtiB,QAAOwT,YACPxT,OAAOwT,YAEdvT,SAAS8R,iBAAoE,mBAA1C9R,UAAS8R,gBAAgB0P,aACrDxhB,SAAS8R,gBAAgB0P,aADpC,QAUJ2H,YAAa,WACT,MAAuC,mBAA5BppB,QAAOqpB,KAAKnK,YACZlf,OAAOqpB,KAAKnK,YAEiB,mBAA7Bjf,UAAS8R,iBAAkF,mBAAxC9R,UAAS8R,gBAAgBkN,WAC5Ehf,SAAS8R,gBAAgBkN,WAE7Bhf,SAAS6R,KAAKmN,YAQzBwK,aAAc,WACV,MAAuC,mBAA5BzpB,QAAOqpB,KAAKrK,YACZhf,OAAOqpB,KAAKrK,YAEiB,mBAA7B/e,UAAS8R,iBAAiF,mBAAvC9R,UAAS8R,gBAAgBgN,UAC5E9e,SAAS8R,gBAAgBgN,UAE7B9e,SAAS6R,KAAKiN,WAI7B,OAAO1B,KCtvDXtc,IAAIuD,aAAa,gBAAiB,KAAO,WAsBrC,GAAIolB,GAAO,SAAWvc,EAAMhH,EAASwjB,GACnC,MAAOA,MACN,OAAQzmB,KAAM,SAAUiK,EAAMhH,GAC/BgH,EAAUA,GAAW,OACrBhH,EAAUA,GAAWjD,IAErB,IAAI0mB,GAAiB5pB,OACjB6pB,EAAiB1jB,EAAQgH,GACzB2c,EAAiB,sBACjBC,EAAiB,OACjBC,EAAiB,mBACjBC,EAAiB,sBACjBxL,EAAiBxe,aACjBoC,EAAiBoc,EAAI1M,oBACrBmY,EAAiB7nB,EAAK2nB,GACtBG,EAAiBD,EAAYF,EAAW,cACxCI,KAEA7nB,EAAiBmC,MAAMhE,UAAU6B,MACjC8nB,EAAiB,SAAUjjB,EAAGud,GAAK,MAAOvd,GAAEjF,MAAMwiB,GAAK,MACvD2F,EAAiB,SAAU1pB,GAAK,MAAmB,gBAALA,IAC9C2pB,EAAiB,SAAU3pB,GAAK,MAAmB,kBAALA,IAI9C4pB,EACE,8TAWFC,EACE,qgBAgBFC,EAAgB,SAAUC,EAAMC,EAAQ9oB,GACtC,IAAKA,EAAI,EAAGA,EAAI8oB,EAAOnpB,OAAQK,IAAK8oB,EAAO9oB,KAAO6oB,EAAKC,EAAO9oB,IAAM,EACpE,OAAO6oB,OACHN,EAAQG,GAAwBN,EAAYO,EAAkB,MAIpEI,EAAgB,WACd,GAAIC,GAAa,2BAA6BzoB,GACtC,SAAUsT,EAASmP,GACjB,MAAOA,GAAUhE,yBAAiF,MAAR,GAA7CgE,EAAUhE,wBAAwBnL,KAEjF,YAActT,GACZ,SAAUsT,EAASmP,GAEjB,MADAA,GAAmC,IAAvBA,EAAUlV,UAAkBkV,IAAc9kB,OAASqC,EAAOyiB,EAC/DA,IAAcnP,GAAWmP,EAAUrP,SAASE,IAErD,SAAUA,EAASmP,GACjB,KAAOnP,EAAUA,EAAQrD,YAAY,GAAIqD,IAAYmP,EAAW,MAAO,EACvE,OAAO,IAEfiG,EAAQ,SAAUpkB,GAChB,GAAIqkB,GAAUrkB,EAAMskB,aACpB,OAAQD,GAEHA,IAAY9nB,MAA2B,QAAnB8nB,EAAQE,SAAqB,WAAWzoB,KAAKS,KAAK2J,cACjEie,EAAWE,EAAS9nB,MAFf,MAAX8nB,EAKV,QACIG,YAAcC,KAAM,YAAaC,UAAWN,GAC5CO,YAAcF,KAAM,WAAYC,UAAWN,GAC3CQ,YAAcH,KAAM,UAAU3oB,KAAKsJ,UAAUM,WAAa,iBAAmB,kBAMnFmf,EAAS,WAEP,GAAIC,GAAepB,EAAQ,6NAGvBqB,EAAeD,EAAYnlB,OAAO+jB,EAAQ,6IAE1CsB,EAAkBD,EAAWplB,OAAO+jB,EAAQ,wDAE5CuB,EAAeH,EAAYnlB,OAAO+jB,EAAQ,kFAE1CwB,EAAeJ,EAAYnlB,OAAO+jB,EAAQ,SAC1CyB,EAAeL,EAAYnlB,OAAO+jB,EAAQ,wDAC1C0B,EAAeN,EAAYnlB,OAAO+jB,EAAQ,uBAC1C2B,EAAeP,EAAYnlB,OAAO+jB,EAAQ,UAC1C4B,EAAe,WAEfC,IAEQC,IAAK,OACLC,IAAK,SAAUzlB,EAAO0lB,GAEpB,MADAA,GAASC,QAAU3lB,EAAM2lB,SAAW3lB,EAAM4lB,MACnCX,KAITO,IAAK,kDACLC,IAAK,SAAUzlB,EAAO0lB,EAAUna,GAc9B,MAbAma,GAASG,WAA6B,IAAhB7lB,EAAM4lB,OAAgC,IAAjB5lB,EAAM8lB,OACjDJ,EAAS9Q,KAAQd,EAAG,EAAGyD,EAAG,GACtBvX,EAAM+lB,OAAS/lB,EAAMgmB,OACvBN,EAASO,QAAUjmB,EAAM+lB,MACzBL,EAASQ,QAAUlmB,EAAMgmB,QAChBhmB,EAAMimB,SAAWjmB,EAAMkmB,WAChCR,EAASO,QAAUjmB,EAAMimB,QAAUnO,EAAI3M,KAAKmN,WAAa5c,EAAK4c,WAC9DoN,EAASQ,QAAUlmB,EAAMkmB,QAAUpO,EAAI3M,KAAKiN,UAAY1c,EAAK0c,WAE3DkN,EAAaxpB,KAAKyP,KACpBma,EAASpB,cAAgBtkB,EAAMskB,eAC1BtkB,GAAe,aAARuL,EAAsB,OAAS,MAAQ,YAE9CwZ,KAITS,IAAK,yBACLC,IAAK,WAAc,MAAOT,MAG1BQ,IAAK,SACLC,IAAK,WAAc,MAAOP,MAG1BM,IAAK,mBACLC,IAAK,WAAc,MAAON,MAG1BK,IAAK,aACLC,IAAK,WAAc,MAAOL,MAG1BI,IAAK,cACLC,IAAK,WAAc,MAAOJ,MAG1BG,IAAK,KACLC,IAAK,WAAc,MAAOX,MAGlCqB,KAEAtB,EAAQ,SAAU7kB,EAAOgP,EAASoX,GAChC,GAAKnoB,UAAUnD,SACfkF,EAAQA,KAAWgP,EAAQ+I,eAAiB/I,EAAQ1V,UAAY0V,GAASqX,cAAgBpD,GAAKjjB,MAC9FzD,KAAK+pB,cAAgBtmB,EACrBzD,KAAK6pB,SAAiBA,EACtB7pB,KAAKgqB,QAAiB,EAEjBvmB,GAAL,CAEA,GAAIuL,GAASvL,EAAMuL,KACfiV,EAASxgB,EAAMwgB,QAAUxgB,EAAMwmB,WAC/BrrB,EAAGqW,EAAGzL,EAAG0O,EAAOgS,CAIpB,IAFAlqB,KAAKikB,OAASA,GAA8B,IAApBA,EAAOvX,SAAiBuX,EAAO7U,WAAa6U,EAEhE4F,EAAU,CAEZ,GADAK,EAAQN,EAAa5a,IAChBkb,EACH,IAAKtrB,EAAI,EAAGqW,EAAI+T,EAAWzqB,OAAY0W,EAAJrW,EAAOA,IACxC,GAAIoqB,EAAWpqB,GAAGqqB,IAAI1pB,KAAKyP,GAAO,CAChC4a,EAAa5a,GAAQkb,EAAQlB,EAAWpqB,GAAGsqB,GAC3C,OAMN,IADAhR,EAAQgS,EAAMzmB,EAAOzD,KAAMgP,GACtBpQ,EAAIsZ,EAAM3Z,OAAQK,QACd4K,EAAI0O,EAAMtZ,KAAOoB,QAASwJ,IAAK/F,KAAOzD,KAAKwJ,GAAK/F,EAAM+F,MAsCvE,OA/BA8e,GAAM9qB,UAAU2sB,eAAiB,WAC3BnqB,KAAK+pB,cAAcI,eAAgBnqB,KAAK+pB,cAAcI,iBACrDnqB,KAAK+pB,cAAcK,aAAc,GAExC9B,EAAM9qB,UAAU6sB,gBAAkB,WAC5BrqB,KAAK+pB,cAAcM,gBAAiBrqB,KAAK+pB,cAAcM,kBACtDrqB,KAAK+pB,cAAcO,cAAe,GAEzChC,EAAM9qB,UAAU+sB,KAAO,WACrBvqB,KAAKmqB,iBACLnqB,KAAKqqB,kBACLrqB,KAAKwqB,SAAU,GAKjBlC,EAAM9qB,UAAUitB,yBAA2B,WACrCzqB,KAAK+pB,cAAcU,0BAA0BzqB,KAAK+pB,cAAcU,2BACpEzqB,KAAK0qB,8BAAgC,WAAc,OAAO,IAE5DpC,EAAM9qB,UAAUktB,8BAAgC,WAC9C,MAAO1qB,MAAK+pB,cAAcW,+BAAiC1qB,KAAK+pB,cAAcW,iCAEhFpC,EAAM9qB,UAAUmtB,MAAQ,SAAUC,GAGhC,GAAIC,GAAK,GAAIvC,GAAMtoB,KAAMA,KAAKyS,QAASzS,KAAK6pB,SAE5C,OADAgB,GAAGD,cAAgBA,EACZC,GAGFvC,KAITwC,EAAgB,SAAUrY,EAASoX,GACjC,MAAQ7C,IAAc6C,GAAapX,IAAY8I,GAAO9I,IAAYiU,EAAcjU,EAAPtT,GAQ3E4rB,EAAY,WAEV,GAAIC,GAAiB,SAAUvY,EAASzP,EAAImlB,EAAW1pB,GACnD,GAAIgD,GAAO,SAAUgC,EAAOwnB,GACtB,MAAOjoB,GAAG1F,MAAMmV,EAAShU,EAAOY,EAAMoC,KAAKwpB,EAAOxnB,EAAQ,EAAI,GAAGL,OAAO3E,GAAQwsB,IAElFC,EAAa,SAAUznB,EAAO0nB,GAC5B,MAAOnoB,GAAGooB,UAAYpoB,EAAGooB,UAAUC,GAAG5nB,EAAMwgB,OAAQxR,GAAW0Y,GAEjEG,EAAUnD,EACN,SAAU1kB,GACR,GAAIwgB,GAASiH,EAAWznB,EAAOzD,KAC/B,OAAImoB,GAAU7qB,MAAM2mB,EAAQviB,YACtB+B,IAAOA,EAAMmnB,cAAgB3G,GAC1BxiB,EAAKgC,EAAO/B,YAFrB,QAKF,SAAU+B,GAER,MADIT,GAAGooB,YAAW3nB,EAAQA,EAAMknB,MAAMO,EAAWznB,KAC1ChC,EAAKgC,EAAO/B,WAG7B,OADA4pB,GAAQF,UAAYpoB,EAAGooB,UAChBE,GAGTP,EAAW,SAAUtY,EAASzD,EAAMsc,EAASC,EAAUC,EAAY/sB,EAAMU,GACvE,GAAIssB,GAAiB9D,EAAa3Y,GAC9B6a,CAEQ,WAAR7a,IAEFsc,EAAUI,EAAKC,EAAgBlZ,EAASzD,EAAMsc,EAASC,IAGrDE,IACEA,EAAWtD,YACbmD,EAAUN,EAAevY,EAAS6Y,EAASG,EAAWtD,UAAW1pB,IAEnEuQ,EAAOyc,EAAWvD,MAAQlZ,GAG5BhP,KAAK6pB,SAAgBA,EAAWrC,EAAaxY,MAAWyD,EAAQwU,GAChEjnB,KAAKyrB,YAAiBzE,IAAc6C,GAAY7a,EAChDhP,KAAKyS,QAAgBA,EACrBzS,KAAKgP,KAAgBA,EACrBhP,KAAKurB,SAAgBA,EACrBvrB,KAAKwrB,WAAgBA,EACrBxrB,KAAK4rB,UAAgB5E,GAAa6C,EAAW7a,EAAO,iBACpDhP,KAAKikB,OAAgB6G,EAAcrY,EAASoX,GAC5C7pB,KAAKinB,KAAkBjnB,KAAKikB,OAAOgD,GACnCjnB,KAAKb,KAAgBA,EACrBa,KAAKsrB,QAAgBN,EAAevY,EAAS6Y,EAAS,KAAM7sB,GAuBhE,OAnBAssB,GAASvtB,UAAUquB,aAAe,SAAUC,GAC1C,GAAIltB,GAAGiiB,EAAGxE,EAAI,CACd,KAAKyP,EAAiB,OAAO,CAC7B,KAAK9rB,KAAKwrB,WAAY,OAAO,CAC7B,KAAK5sB,EAAIktB,EAAgBvtB,OAAQK,KAC/B,IAAKiiB,EAAI7gB,KAAKwrB,WAAWjtB,OAAQsiB,KAC3BiL,EAAgBltB,IAAMoB,KAAKwrB,WAAW3K,IAAIxE,GAGlD,OAAOyP,GAAgBvtB,SAAW8d,GAIpC0O,EAASvtB,UAAUuuB,QAAU,SAAUC,EAAcC,EAAeC,GAClE,QAAOlsB,KAAKyS,UAAYuZ,GACpBC,GAAiBjsB,KAAKurB,WAAaU,GACnCC,GAAgBlsB,KAAKsrB,UAAYY,IAGhCnB,KAGToB,EAAY,WAKV,GAAI1pB,MAIA2pB,EAAS,SAAU3Z,EAASzD,EAAMuc,EAAUD,EAASnsB,EAAM6D,GACzD,GAAIqpB,GAAMltB,EAAO,IAAM,GACvB,IAAK6P,GAAgB,KAARA,EAON,CACL,GAAIpQ,GAAI,EAAGqW,EAAGqX,EAAO7pB,EAAI4pB,EAAMrd,GAAOqD,EAAiB,KAAXI,CAC5C,KAAK6Z,EAAM,MACX,KAAKrX,EAAIqX,EAAK/tB,OAAY0W,EAAJrW,EAAOA,IAC3B,IAAKyT,GAAOia,EAAK1tB,GAAGmtB,QAAQtZ,EAAS8Y,EAAUD,MAActoB,EAAGspB,EAAK1tB,GAAI0tB,EAAM1tB,EAAGoQ,GAAO,WAT3F,KAAK,GAAIlN,KAAKW,GACRX,EAAE4R,OAAO,IAAM2Y,GACjBD,EAAO3Z,EAAS3Q,EAAEkV,OAAO,GAAIuU,EAAUD,EAASnsB,EAAM6D,IAY9DsP,EAAM,SAAUG,EAASzD,EAAMuc,EAAUpsB,GAGvC,GAAIP,GAAG0tB,EAAO7pB,GAAKtD,EAAO,IAAM,KAAO6P,EACvC,IAAIsd,EACF,IAAK1tB,EAAI0tB,EAAK/tB,OAAQK,KACpB,IAAK0tB,EAAK1tB,GAAGO,MAAQmtB,EAAK1tB,GAAGmtB,QAAQtZ,EAAS8Y,EAAU,MAAO,OAAO,CAG1E,QAAO,GAGTlR,EAAM,SAAU5H,EAASzD,EAAMuc,EAAUpsB,GACvC,GAAIotB,KAIJ,OAHAH,GAAO3Z,EAASzD,EAAMuc,EAAU,KAAMpsB,EAAM,SAAUqtB,GACpD,MAAOD,GAAQ5tB,KAAK6tB,KAEfD,GAGTE,EAAM,SAAUD,GACd,GAAIla,IAAOka,EAAMrtB,OAASa,KAAKsS,IAAIka,EAAM/Z,QAAS+Z,EAAMxd,KAAM,MAAM,GAChEjQ,GAAOytB,EAAMrtB,KAAO,IAAM,KAAOqtB,EAAMxd,IAE3C,QADEvM,EAAI1D,KAAS0D,EAAI1D,QAAYJ,KAAK6tB,GAC7Bla,GAGToa,EAAM,SAAUF,GACdJ,EAAOI,EAAM/Z,QAAS+Z,EAAMxd,KAAM,KAAMwd,EAAMlB,QAASkB,EAAMrtB,KAAM,SAAUqtB,EAAOF,EAAM1tB,GAIxF,MAHA0tB,GAAKK,OAAO/tB,EAAG,GACf4tB,EAAMI,SAAU,EACI,IAAhBN,EAAK/tB,cAAqBkE,IAAK+pB,EAAMrtB,KAAO,IAAM,KAAOqtB,EAAMxd,OAC5D,KAKXud,EAAU,WACR,GAAIzqB,GAAGyqB,IACP,KAAKzqB,IAAKW,GACW,KAAfX,EAAE4R,OAAO,KAAW6Y,EAAUA,EAAQnpB,OAAOX,EAAIX,IAEvD,OAAOyqB,GAGb,QAASja,IAAKA,EAAK+H,IAAKA,EAAKoS,IAAKA,EAAKC,IAAKA,EAAKH,QAASA,MAK5DM,EACAC,EAAoB,SAAUtkB,GAU1BqkB,EATGnrB,UAAUnD,OASIiK,EARA+S,EAAIwR,iBACjB,SAAU7oB,EAAGoG,GACX,MAAOA,GAAEyiB,iBAAiB7oB,IAE5B,WACE,KAAM,IAAIjE,OAAM,wCAS1B+sB,EAAe,SAAUvpB,EAAOuL,GAC9B,GAAKgY,IAAahY,IAAQvL,GAASA,EAAMwpB,cAAgB,MAAQje,EAAjE,CAEA,GAAIke,GAAYf,EAAS9R,IAAIra,KAAMgP,GAAQvL,EAAMuL,KAAM,MAAM,GACzDiG,EAAIiY,EAAU3uB,OACdK,EAAI,CAOR,KALA6E,EAAQ,GAAI6kB,GAAM7kB,EAAOzD,MAAM,GAC3BgP,IAAMvL,EAAMuL,KAAOA,GAIZiG,EAAJrW,IAAU6E,EAAMinB,gCAAiC9rB,IACjDsuB,EAAUtuB,GAAGguB,SAASM,EAAUtuB,GAAG0sB,QAAQ7pB,KAAKzB,KAAMyD,KAK/D0pB,EAAWnG,EACP,SAAUvU,EAASzD,EAAMgD,GAEvBS,EAAQT,EAAM8U,EAAWC,GAAa/X,EAAMge,GAAc,IAE5D,SAAUva,EAASzD,EAAMgD,EAAKob,GAG5B,GAAIZ,EACAxa,IACFma,EAASM,IAAID,EAAQ,GAAIzB,GACrBtY,EACA2a,GAAUpe,EACV,SAAUvL,GACRupB,EAAavrB,KAAKgR,EAAShP,EAAO2pB,IAEpCJ,EACA,KACA,MACA,IAEAI,GAAqC,MAA3B3a,EAAQ,MAAQ2a,KAAiB3a,EAAQ,MAAQ2a,GAAU,GACzEZ,EAAMvI,OAAOoJ,YAAY,KAAOb,EAAMZ,UAAWY,EAAMlB,WAEvDkB,EAAQL,EAAS9R,IAAI5H,EAAS2a,GAAUpe,EAAMge,GAAc,GAAM,GAC9DR,IACFA,EAAMvI,OAAOqJ,YAAY,KAAOd,EAAMZ,UAAWY,EAAMlB,SACvDa,EAASO,IAAIF,MAKvBd,EAAO,SAAU6B,EAAI9a,EAASzD,EAAMhM,EAAIwqB,GAEtC,MAAO,YACLxqB,EAAG1F,MAAM0C,KAAM0B,WACf6rB,EAAG9a,EAASzD,EAAMwe,KAItB7B,EAAiB,SAAUlZ,EAASgb,EAASnC,EAASE,GACpD,GAAIxc,GAAWye,GAAWA,EAAQ/tB,QAAQmnB,EAAW,IACjD6G,EAAWvB,EAAS9R,IAAI5H,EAASzD,EAAM,MAAM,GAC7C4d,KACAhuB,EAAGqW,CAEP,KAAKrW,EAAI,EAAGqW,EAAIyY,EAASnvB,OAAY0W,EAAJrW,EAAOA,IAChC0sB,GAAWoC,EAAS9uB,GAAG2sB,WAAaD,IAAYoC,EAAS9uB,GAAGitB,aAAaL,KAM7EW,EAASO,IAAIgB,EAAS9uB,KACjBguB,EAAQc,EAAS9uB,GAAGgtB,YAAc8B,EAAS9uB,GAAGqoB,KACjD2F,EAAQc,EAAS9uB,GAAGgtB,YAAe9pB,EAAG4rB,EAAS9uB,GAAGgtB,UAAWvP,EAAGqR,EAAS9uB,GAAGoQ,OAIlF,KAAKpQ,IAAKguB,GACJA,EAAQhvB,eAAegB,KACpButB,EAAS7Z,IAAIG,EAASma,EAAQhuB,GAAGkD,EAAG,MAAM,IAE7CqrB,EAAS1a,EAASma,EAAQhuB,GAAGkD,GAAG,EAAO8qB,EAAQhuB,GAAGyd,KAO1DsR,EAAW,SAAU9pB,EAAUb,GAG7B,GAAIkoB,GAAa,SAAUjH,EAAQ9kB,GAE7B,IADA,GAAIP,GAAGgvB,EAAQxG,EAASvjB,GAAYgpB,EAAehpB,EAAU1E,GAAQ0E,EAC9DogB,GAAUA,IAAW9kB,EAAM8kB,EAASA,EAAO7U,WAChD,IAAKxQ,EAAIgvB,EAAMrvB,OAAQK,KACrB,GAAIgvB,EAAMhvB,KAAOqlB,EAAQ,MAAOA,IAItCqH,EAAU,SAAU9iB,GAClB,GAAIb,GAAQujB,EAAW1iB,EAAEyb,OAAQjkB,KAC7B2H,IAAO3E,EAAG1F,MAAMqK,EAAOjG,WAQjC,OAJA4pB,GAAQF,WACJC,GAAWH,EACXrnB,SAAWA,GAERynB,GAGTuC,EAAe7G,EAAY,SAAU6C,EAAU7a,EAAMyD,GAEnD,GAAIqb,GAAMvS,EAAIwS,YAAYlE,EAAW,aAAe,WACpDiE,GAAIjE,EAAW,YAAc,eAAe7a,GAAM,GAAM,EAAM0X,EAAK,GACnEjU,EAAQub,cAAcF,IACpB,SAAUjE,EAAU7a,EAAMyD,GAE5BA,EAAUqY,EAAcrY,EAASoX,GACjCA,EAAWpX,EAAQwb,UAAU,KAAOjf,EAAMuM,EAAI2S,qBAAuBzb,EAAQ,MAAQzD,MAUvFmf,EAAM,SAAU1b,EAAS2b,EAAUprB,GACjC,GAAIqrB,GAAYjH,EAASgH,GACrBzwB,EAAGqR,EAAMwc,EAAY5sB,CAEzB,IAAIyvB,GAAaD,EAAStuB,QAAQ,KAAO,EAAG,CAG1C,IADAsuB,EAAWjH,EAAQiH,GACdxvB,EAAIwvB,EAAS7vB,OAAQK,KACxBuvB,EAAI1b,EAAS2b,EAASxvB,GAAIoE,EAC5B,OAAOyP,GAMT,GAHAzD,EAAOqf,GAAaD,EAAS1uB,QAAQmnB,EAAW,IAC5C7X,GAAQ2Y,EAAa3Y,KAAOA,EAAO2Y,EAAa3Y,GAAMkZ,OAErDkG,GAAYC,GAEX7C,EAAa6C,GAAaD,EAAS1uB,QAAQknB,EAAgB,OAAK4E,EAAarE,EAAQqE,EAAY,MACrGG,EAAelZ,EAASzD,EAAMhM,EAAIwoB,OAC7B,IAAInE,EAAW+G,GAEpBzC,EAAelZ,EAAS,KAAM2b,OAG9B,KAAKzwB,IAAKywB,GACJA,EAASxwB,eAAeD,IAAIwwB,EAAI1b,EAAS9U,EAAGywB,EAASzwB,GAI7D,OAAO8U,IAMT6b,EAAK,SAAS7b,EAASiV,EAAQ7jB,EAAUb,GACvC,GAAIwqB,GAAYxe,EAAMuf,EAAO3vB,EAAGH,EAAM+tB,EAAOgC,CAG7C,EAAA,GAAiBvsB,SAAb4B,GAA2C,gBAAV6jB,GAArC,CA2BA,IAjBKL,EAAWxjB,IAMdpF,EAAaY,EAAMoC,KAAKC,UAAW,GACnCsB,EAAawqB,EAAa3pB,IAL1B2pB,EAAaxqB,EACbvE,EAAaY,EAAMoC,KAAKC,UAAW,GACnCsB,EAAa2qB,EAAS9pB,EAAU2pB,EAAYX,IAM9C0B,EAAQpH,EAAQO,GAGZ1nB,OAASknB,IACXlkB,EAAK0oB,EAAKyC,EAAK1b,EAASiV,EAAQ1kB,EAAIwqB,IAGjC5uB,EAAI2vB,EAAMhwB,OAAQK,KAErB4vB,EAAQrC,EAASM,IAAID,EAAQ,GAAIzB,GAC7BtY,EACA8b,EAAM3vB,GAAGc,QAAQmnB,EAAW,IAC5B7jB,EACAwqB,EACArG,EAAQoH,EAAM3vB,GAAGc,QAAQknB,EAAgB,IAAK,KAC9CnoB,GACA,IAEA+tB,EAAMvF,IAAiBuH,GAEzBrB,EAAS1a,EAAS+Z,EAAMZ,WAAW,EAAMY,EAAMf,WAInD,OAAOhZ,GA1CL,IAAKzD,IAAQ0Y,GACPA,EAAO9pB,eAAeoR,IACxBsf,EAAG7sB,KAAKzB,KAAMyS,EAASzD,EAAM0Y,EAAO1Y,MAgD5CgD,EAAM,SAAUS,EAASiV,EAAQ1kB,EAAIyrB,GACnC,MAAOH,GAAGhxB,MACN,KACC8pB,EAASpkB,IAEJyP,EAASzP,EAAI0kB,EAAQ+G,GAAQrrB,OAAO1B,UAAUnD,OAAS,EAAIc,EAAMoC,KAAKC,UAAW,OADnFrC,EAAMoC,KAAKC,aAQrBgtB,EAAM,WACJ,MAAOJ,GAAGhxB,MAAM4pB,EAAKxlB,YASvBitB,EAAO,SAAUlc,EAASzD,EAAMvQ,GAC9B,GAAI8vB,GAAQpH,EAAQnY,GAChBpQ,EAAGiiB,EAAG5L,EAAG2Z,EAAOlB,CAEpB,KAAK9uB,EAAI2vB,EAAMhwB,OAAQK,KAGrB,GAFAoQ,EAAOuf,EAAM3vB,GAAGc,QAAQmnB,EAAW,KAC/B+H,EAAQL,EAAM3vB,GAAGc,QAAQknB,EAAgB,OAAKgI,EAAQzH,EAAQyH,EAAO,MACpEA,GAAUnwB,IAAQgU,EAAQwU,GAO7B,IAFAyG,EAAWvB,EAAS9R,IAAI5H,EAASzD,EAAM,MAAM,GAC7CvQ,IAAQ,GAAO2E,OAAO3E,GACjBoiB,EAAI,EAAG5L,EAAIyY,EAASnvB,OAAY0W,EAAJ4L,EAAOA,IAClC6M,EAAS7M,GAAGgL,aAAa+C,IAC3BlB,EAAS7M,GAAGyK,QAAQhuB,MAAMmV,EAAShU,OARvCovB,GAAarG,EAAaxY,GAAOA,EAAMyD,EAa3C,OAAOA,IAQTkY,EAAQ,SAAUlY,EAAS3O,EAAMkL,GAM/B,IALA,GAAI0e,GAAWvB,EAAS9R,IAAIvW,EAAMkL,EAAM,MAAM,GAC1CiG,EAAIyY,EAASnvB,OACbK,EAAI,EACJH,EAAMowB,EAEC5Z,EAAJrW,EAAOA,IACR8uB,EAAS9uB,GAAG2sB,WACd9sB,GAASgU,EAASib,EAAS9uB,GAAGoQ,OAC1B6f,EAAUnB,EAAS9uB,GAAG0sB,QAAQF,YAAW3sB,EAAKE,KAAKkwB,EAAQhrB,UAC/DpF,EAAKE,KAAK+uB,EAAS9uB,GAAG2sB,UACtB+C,EAAGhxB,MAAM,KAAMmB,GAGnB,OAAOgU,IAGT+T,GACI8H,GAAsBA,EACtBtc,IAAsBA,EACtB0c,IAAsBA,EACtBP,IAAsBA,EACtBjc,OAAsBic,EACtBxD,MAAsBA,EACtBgE,KAAsBA,EACtBrG,MAAsBA,EACtBwE,kBAAsBA,EACtBgC,WAAsB,WAEpB,MADA7rB,GAAQgH,GAAQ0c,EACT3mB,MAKjB,IAAI0mB,EAAI2G,YAAa,CACnB,GAAI0B,GAAU,WACZ,GAAInwB,GAAG2tB,EAAUJ,EAASI,SAC1B,KAAK3tB,IAAK2tB,GACJA,EAAQ3tB,GAAGoQ,MAA4B,WAApBud,EAAQ3tB,GAAGoQ,MAAmBmf,EAAI5B,EAAQ3tB,GAAG6T,QAAS8Z,EAAQ3tB,GAAGoQ,KAE1F0X,GAAI4G,YAAY,WAAYyB,GAC5BrI,EAAIsI,gBAAkBtI,EAAIsI,iBAE5BtI,GAAI2G,YAAY,WAAY0B,GAM9B,MAFAjC,GAAkBjvB,IAAI+F,IAEf4iB,IASLyI,GAEJC,cAAe,EACfC,QAAe,EACfC,WAAc,GACdC,QAAc,GACdC,UAAc,GACdC,SAAc,GACdC,OAAc,GACdC,UAAc,GACdC,SAAc,GACdC,WAAc,GACdC,SAAc,GACdC,QAAc,GACdC,WAAc,GACdC,aAAc,GACdC,WAAc,GAcdC,SAAU,SAAUC,EAAMC,GAItB,QAASC,KACL,GAAIC,IAAO,GAAI3lB,MACX4lB,EAAWD,EAAME,CACrB,IAAID,GAAYH,EAEZ,MADAI,GAAWF,EACJH,EAAK5yB,MAAM0C,QAASX,MAAMoC,KAAKC,WAEtC,IAAIsX,GAAOhZ,KACPvB,KAAUY,MAAMoC,KAAKC,UAErBqE,IAEAoF,aAAapF,GAGjBA,EAAUlH,WAAW,WAEjB,MADAkH,GAAU,KACHqqB,EAAU9yB,MAAM0b,EAAMva,IAC9B0xB,EAAOG,GArBlBH,EAAOA,GAAQ,CACf,IAAII,GAAW,EACXxqB,CAsBJ,OAAOqqB,IAYX3d,QAAS,SAAS+d,GACd,GAAIvT,GAAOuT,EAAGC,kBACVD,EAAGvM,QAEU,aAAZuM,EAAGxhB,MAAyBwhB,EAAGE,aACnB,eAAZF,EAAGxhB,MAAyBwhB,EAAGE,aACnB,cAAZF,EAAGxhB,MAAyBwhB,EAAGG,WACnB,eAAZH,EAAGxhB,MAAyBwhB,EAAGG,WAChCH,EAAGvG,YACH,IACJ,QAAOhN,GAA2B,IAAlBA,EAAKvQ,UAAoC,IAAlBuQ,EAAKvQ,SAAoCuQ,EAAlBA,EAAK7N,YAWvE2Y,cAAe,SAASyI,GACpB,GAAIvT,GAAOuT,EAAGzI,eAEG,aAAZyI,EAAGxhB,MAAyBwhB,EAAGG,WACnB,eAAZH,EAAGxhB,MAAyBwhB,EAAGG,WACnB,cAAZH,EAAGxhB,MAAyBwhB,EAAGE,aACnB,eAAZF,EAAGxhB,MAAyBwhB,EAAGE,aAChC,IACJ,QAAOzT,GAA2B,IAAlBA,EAAKvQ,UAAoC,IAAlBuQ,EAAKvQ,SAAoCuQ,EAAlBA,EAAK7N,YAgBvEwhB,YAAa,SAASJ,EAAIK,EAAY/b,GAGlC,IADA,GAAImI,GAAOjd,KAAKyS,QAAQ+d,KACZ,CACR,GAAGvT,EAAKqD,SAASvP,gBAAkB8f,EAAW9f,cAC1C,MAAOkM,EAGP,IADAA,EAAOA,EAAK7N,YACR6N,EACA,MAAGnI,IACQ,EAEJ/X,QAEX,KAAIkgB,EAAK7N,WACL,MAAG0F,IAAe,EACX/X,WAiBvB+zB,QAAS,SAASre,EAASse,EAAWC,EAAUC,GAE5C,MADAxe,GAAU5U,IAAIe,EAAE6T,GACbA,GACIA,EAAQye,iBACPze,EAAQye,iBAAiBH,EAAWC,IAAYC,GAEhDxe,EAAQ4a,YAAY,KAAO0D,EAAYC,EAAWnzB,IAAIkF,KAAKiuB,EAAUve,IAElEue,GANX,QAqBJG,YAAa,SAAU1e,EAASse,EAAWC,EAAUC,GACjD,GAAIG,GAAW,WAEX,MADAnC,GAASoC,cAAc5e,EAASse,EAAWzF,GACpC0F,EAAS1zB,MAAM0C,KAAM0B,YAE5B4pB,EAAU2D,EAAS6B,QAAQre,EAASse,EAAWK,EAAUH,EAC7D,OAAO3F,IAcXgG,aAAc,SAAU1O,EAAUmO,EAAWC,EAAUC,GAMnD,GALwB,gBAAbrO,GACPA,EAAW/kB,IAAI+F,GAAGgf,GACUA,GAAkC,IAAtBA,EAASlW,WACjDkW,GAAYA,KAEXA,EAAS,GAAM,OAAO,CAE3B,KAAK,GAAIhkB,GAAI,EAAG0F,EAAMse,EAASrkB,OAAY+F,EAAJ1F,EAASA,IAC5CoB,KAAK8wB,QAAQlO,EAAShkB,GAAImyB,EAAWC,EAAUC,EAEnD,OAAOD,IAiBXO,iBAAkB,SAAU9e,EAASse,EAAWltB,EAAU2J,GACtD,MAAOyhB,GAAS6B,QAAQre,EAASse,EAAW,SAAUttB,GAClD,GAAIitB,GAAczB,EAASxc,QAAQhP,EACnC,IAAKitB,GAAeA,IAAgBje,EAKpC,IAHA,GAAI+e,GAASd,EAGNc,IAAW/e,GAAW+e,IAAWz0B,UAAYy0B,GAAQ,CACxD,GAAI3zB,IAAIkG,IAAI0tB,WAAW/Q,gBAAgB8Q,EAAQ3tB,GAE3C,MADAJ,GAAMgtB,iBAAmBe,EAClBhkB,EAAS/J,EAEpB+tB,GAASA,EAAOpiB,eAiB5BiiB,cAAe,SAAS5e,EAASse,EAAWC,EAAUC,GAClDxe,EAAU5U,IAAIe,EAAE6T,GAEbA,IACIA,EAAQif,oBACPjf,EAAQif,oBAAoBX,EAAWC,IAAYC,GAEnDxe,EAAQ6a,YAAY,KAAOyD,EAAWC,KAclDzG,KAAM,SAAS9mB,GAEe,OAAvBA,EAAM6mB,eACL7mB,EAAM6mB,cAAe,GAEtB7mB,EAAM4mB,iBACL5mB,EAAM4mB,kBAEP5mB,EAAM0mB,gBACL1mB,EAAM0mB,iBAEPrtB,OAAOuwB,cACN5pB,EAAM2mB,aAAc,GAEJ,OAAjB3mB,EAAMkuB,SACLluB,EAAMkuB,QAAS,IAavBtH,gBAAiB,SAAS5mB,GACI,OAAvBA,EAAM6mB,eACL7mB,EAAM6mB,cAAe,GAEtB7mB,EAAM4mB,iBACL5mB,EAAM4mB,mBAaduH,YAAa,SAASnuB,GAEfA,EAAM0mB,gBACL1mB,EAAM0mB,iBAEPrtB,OAAOuwB,cACN5pB,EAAM2mB,aAAc,GAEJ,OAAjB3mB,EAAMkuB,SACLluB,EAAMkuB,QAAS,IAavBE,QAAS,SAASrB,GAEd,OACIjZ,EAAGvX,KAAK8xB,SAAStB,GACjBxV,EAAGhb,KAAK+xB,SAASvB,KAYzBsB,SAAU,SAAStB,GAEf,MAAQA,GAAGwB,SAAWxB,EAAGwB,QAAQ,IAAMxB,EAAGwB,QAAQ,GAAGtI,SAChD8G,EAAQ,OACRA,EAAG9G,SAAW3sB,SAAS8R,gBAAgBkN,YAAchf,SAAS6R,KAAKmN,aAW5EgW,SAAU,SAASvB,GAEf,MAAQA,GAAGwB,SAAWxB,EAAGwB,QAAQ,IAAMxB,EAAGwB,QAAQ,GAAGrI,SAChD6G,EAAQ,OACRA,EAAG7G,SAAW5sB,SAAS8R,gBAAgBgN,WAAa9e,SAAS6R,KAAKiN,YAY3EoW,YAAa,SAASzB,GAClB,GAAI1zB,OAAOo0B,iBAAkB,CACzB,GAAiB,IAAdV,EAAGjH,OACF,OAAO,CACJ,IAAe,aAAZiH,EAAGxhB,MAAqC,OAAdwhB,EAAGjH,OAEnC,OAAO,MAIX,IAAiB,IAAdiH,EAAGjH,OAAe,OAAO,CAEhC,QAAO,GAYX2I,aAAc,SAAS1B,GACnB,MAAsB,KAAdA,EAAGjH,QAYf4I,cAAe,SAAS3B,GACpB,MAAI1zB,QAAOo0B,iBACe,IAAdV,EAAGjH,OAGW,IAAdiH,EAAGjH,MAEf,QAAO,GAaX6I,yBAA0B,SAAS3uB,EAAO4uB,GACtC,GAAI10B,GAAI8F,EAAM2lB,QACV/M,EAAI6E,OAAOoR,aAAa30B,GAExB40B,EAAU9uB,EAAM+uB,QACpB,IAAI70B,GAAK,IAAW,IAALA,EAIX,MAH4B,iBAAjB00B,KACPE,EAAUF,GAEP,EAAYhW,EAAIA,EAAEtL,aAExB,IAAIpT,GAAK,IAAW,KAALA,EAChB,MAAOujB,QAAOoR,aAAc,IAAM30B,EAAE,IAExC,QAAQA,GACJ,IAAK,KAAO,IAAK,KAAO,MAAO,GAC/B,KAAK,KAAO,IAAK,KAAO,MAAO,IAEnC,MAAO0e,IAGX7W,MAAO,aAgFX,OAAO3H,KAAIsG,UAAU8qB,EAAUzI,KCzxC/B3oB,IAAIuD,aAAa,wBAAyB,GAAI,mBAAoB,oBAAqB,sBAAuB,SAAUqxB,EAAUtY,EAAYnW,GAC1I,YAGA,SAAS0uB,GAAWC,GAChB,MAAc,OAAPA,IACDxY,EAAWC,aAAauY,KACzBF,EAASG,QAAQD,IAAwB,gBAARA,IAA0C,gBAAfA,GAAIp0B,QAGzE,QAASs0B,GAAQF,GACb,MAAID,GAAWC,GAAeA,GACfA,GAOnB,GAAIG,IAeAC,UAAW,SAASC,EAAMnuB,GACtBA,EAAUA,KACV,IAAIouB,MACAC,KAEAC,EAAQnzB,KAAKozB,QAAQJ,GAAQpQ,UAAU,EAAMyQ,WAAYH,EAAiBI,gBAAiBzuB,EAAQyuB,iBACvG,OAAa,OAATH,EAAwBA,GAC5BV,EAASc,QAAQJ,EAAO,SAAUK,GAC9B,GAAIvpB,GAAOupB,EAAK,GAAG9zB,QAAQ,QAAS,IAChC+M,EAAQ+mB,EAAK,GACbta,EAAKsa,EAAK,EAEV/mB,KAAUymB,EACVD,EAAIhpB,MACK6oB,EAAcW,gBAAgBva,IAAO,QAAQ3Z,KAAKi0B,EAAK,KAGhEP,EAAIhpB,GAAQgpB,EAAIhpB,OAChBgpB,EAAIhpB,GAAMtL,KAAK8N,IAHfwmB,EAAIhpB,GAAQwC,IAObwmB,IAcXG,QAAS,SAAUJ,EAAMnuB,GAIrB,QAAS6uB,GAAKzpB,EAAM+I,EAAKkG,GAEjB+Z,EAAIt0B,KADJkG,EAAQ+d,UACE3Y,EAAM+I,EAAKkG,IAEXjP,EAAM+I,IAIxB,QAAS2gB,GAAYza,GACjB,GAAI0a,GAAa1a,EAAGoH,SAASvP,cACzB8iB,GAAU3a,EAAGlK,KAAO,IAAI+B,aAE5B,IAAmB,WAAf6iB,GAA2B1a,EAAG4a,SAAU,CACxC,GAAIC,IAAU,CACdtB,GAASc,QAAQvvB,EAASC,OAAO,iBAAkBiV,GAAK,SAAU8a,GAC9DN,EAAKxa,EAAGjP,KAAM+pB,EAAWvnB,MAAOyM,GAChC6a,GAAU,KAETA,GAAW,cAAgBlvB,IAC5B6uB,EAAKxa,EAAGjP,KAAMpF,EAAQwuB,WAAYna,OAEhB,UAAf0a,GAAsC,aAAXC,GAAoC,UAAXA,IAAuBhvB,EAAQyuB,gBAI1FI,EAAKxa,EAAGjP,KAAMiP,EAAGzM,MAAOyM,GAFxBwa,EAAKxa,EAAGjP,KAAM,KAAMiP,GA1B5B,GAAI+Z,KAgCJ,IA/BApuB,EAAUA,MA+BLmuB,EAAOn1B,IAAIe,EAAEo0B,GAAQ,CAItB,IAAK,GAHDiB,GAASxB,EAAStf,OAAO6f,EAAKpQ,SAAU,SAAUlR,GAClD,MAAOohB,GAAcoB,cAAcxiB,EAAK7M,KAEnCjG,EAAI,EAAG0F,EAAM2vB,EAAO11B,OAAY+F,EAAJ1F,EAASA,IAC1C+0B,EAAYM,EAAOr1B,GAEvB,OAAOq0B,GAGX,MAAO,OAcXkB,OAAQ,SAASnB,EAAMoB,GACnB,KAAMpB,EAAOn1B,IAAIe,EAAEo0B,IAAU,MAAO,KAEpC,IAAIG,EAEJ,IAAoB,gBAATiB,IAAsB1B,EAAW0B,GAErC,CAAA,IAAI1B,EAAW0B,GAGlB,MAAO,KAFPjB,GAAQiB,MAFRjB,GAAQL,EAAcuB,YAAYD,EAOtC,OAAOtB,GAAcwB,aAAatB,EAAMG,IAG5CkB,YAAa,SAAU1B,GACnB,GAAIQ,MACAngB,CACJ,KAAK,GAAI/I,KAAQ0oB,GAAK,GAAIA,EAAI/0B,eAAeqM,GAAO,CAChD+I,EAAM6f,EAAQF,EAAI1oB,GAClB,KAAK,GAAIrL,GAAI,EAAG0F,EAAM0O,EAAIzU,OAAY+F,EAAJ1F,EAASA,IACvCu0B,EAAMx0B,MAAMsL,EAAM+I,EAAIpU,IAEd,KAAR0F,GACA6uB,EAAMx0B,MAAMsL,OAGpB,MAAOkpB,IAGXmB,aAAc,SAAUtB,EAAMG,GAC1BA,EAAQV,EAAS8B,QAAQpB,GACrBp0B,IAAK,SAAUy0B,GAAQ,MAAOA,GAAK,GAAG9zB,QAAQ,QAAS,OAI3DyzB,EAAQV,EAAShwB,IAAI0wB,EAAO,SAAUK,GAElC,GAAIjS,GAASkR,EAAS+B,OAAOhB,EAAM,SAAUh1B,EAAMqgB,GAC/C,OAAQ,KAAMrgB,EAAK,GAAG4E,QAAQyb,EAAM,QACpC,UAAW,EACf,QAAQ2U,EAAK,GAAG,GAAIjS,IAMxB,KAAK,GAHDtX,GACAgqB,EACA1S,EACK3iB,EAAI,EAAG0F,EAAM6uB,EAAM50B,OAAY+F,EAAJ1F,EAASA,IAAK,CAG9C,GAFAqL,EAAOkpB,EAAMv0B,GAAG,GAEZqL,IAAQ+oB,GACRiB,EAASjB,EAAK/oB,OACX,CAAA,KAAKA,EAAO,MAAS+oB,IAIxB,QAHAiB,GAASjB,EAAK/oB,EAAO,MACrBA,GAAc,KAKlBgqB,EAASpB,EAAQoB,GACjB1S,EAAS4R,EAAMv0B,GAAG,GAElBk0B,EAAc2B,WAAWxqB,EAAMgqB,EAAQ1S,KAI/CkT,WAAY,SAAUxqB,EAAMgqB,EAAQ1S,GAChC,GAAImT,GAAWT,EAAO,GAClBU,EAAgBD,EAASpU,SAASvP,cAClC6jB,EAAYF,EAAShY,aAAa,OACtCkY,GAAYA,GAAaA,EAAU7jB,aACnC,IAAI8jB,GAAkC,WAAlBF,GAA8Bxa,EAAWqC,aAAakY,EAAU,WAEpF,IAAkB,aAAdE,GAA0C,UAAdA,EAC5B9B,EAAcgC,eAAeb,EAAQ1S,EAAQ,eAC1C,IAAIsT,EACP/B,EAAcgC,eAAeb,EAAO,GAAGpvB,QAAS0c,EAAQ,gBACrD,CACC0S,EAAO11B,SAAWgjB,EAAOhjB,QACzBV,IAAIsE,KAAK,YAAc8xB,EAAO11B,OAAS,kBAAoB0L,EAAO,mBAAqBsX,EAAOhjB,OAAS,WAG3G,KAAK,GAAIK,GAAI,EAAG0F,EAAM0J,KAAK+mB,IAAId,EAAO11B,OAAQgjB,EAAOhjB,QAAa+F,EAAJ1F,EAASA,GAAK,EACxEq1B,EAAOr1B,GAAG6N,MAAQ8U,EAAO3iB,KAKrCk2B,eAAgB,SAAUb,EAAQ1S,EAAQyT,GACtCvC,EAASc,QAAQU,EAAQ,SAAUgB,GAC/B,GAAIC,GAAYzC,EAAS0C,QAAQF,EAAMxoB,MAAO8U,EAC9C0T,GAAMD,GAAaE,KAU3BzB,gBAAiB,SAAUhhB,GACvB,GAAIzD,GAAOyD,EAAQiK,aAAa,QAC5B4D,EAAW7N,EAAQ6N,SAASvP,aAEhC,OAAgB,aAAT/B,GACW,WAAbsR,GAAyBnG,EAAWqC,aAAa/J,EAAS,aAGnEyhB,cAAe,SAAUzhB,EAAS5N,GAE9B,GADAA,EAAUA,OACLsV,EAAWC,aAAa3H,GAAY,OAAO,CAChD,KAAK0H,EAAWqC,aAAa/J,EAAS,QAAW,OAAO,CAExD,IAAI6N,GAAW7N,EAAQ6N,SAASvP,aAEhC,OAAKuP,IAAyB,aAAbA,EAEI,aAAjB7N,EAAQzD,MAAwC,UAAjByD,EAAQzD,KACnCnK,EAAQyuB,iBAA0B,IAC7B7gB,EAAQ4P,SAGd,GAP4C,GAW3D,OAAOyQ,KC/PXj1B,IAAIuD,aAAa,iBAAkB,KAAO,WAEtC,YAKA,IAAIg0B,IAWAC,aAYAC,IAAK,SAAS5O,EAAK1jB,GACVA,IACDA,EAAM0jB,EACNA,EAAM5pB,OAKV,KAAK,GAFDmG,GAEKrE,EAAI,EAAG0F,EAAMtE,KAAKq1B,UAAU92B,OAAY+F,EAAJ1F,EAASA,IAClD,GAAIoB,KAAKq1B,UAAUz2B,GAAG,KAAO8nB,EAAK,CAC9BzjB,EAAUjD,KAAKq1B,UAAUz2B,GAAG,EAC5B,OAGHqE,IACDA,GACIsyB,WACA7O,IAAKA,EACLnL,IAAKmL,EAAI3pB,SACToC,KAAMunB,EAAI3pB,SAAS8R,gBACnB2mB,MAAM,EACN/b,KAAK,GAETxW,EAAQyqB,UACJ+H,WAAY53B,IAAI2F,UAAUxD,KAAK01B,YAAa11B,KAAMiD,GAClD0yB,KAAM93B,IAAIkF,KAAK/C,KAAK41B,MAAO51B,KAAMiD,IAErCjD,KAAKq1B,UAAU12B,MACV+nB,EAAKzjB,IAKd,IAAM4yB,GAAM5yB,EAAQsY,IAAI2V,gBACxBjuB,GAAQ+O,IAAM6jB,EAAM,mBAAqB,cACzC5yB,EAAQ6yB,IAAMD,EAAM,sBAAwB,cAC5C5yB,EAAQmV,IAAMyd,EAAM,GAAK,KACzB5yB,EAAQ8yB,IAAMF,EAAM,mBAAqB,qBACzC5yB,EAAQ+yB,IAAM/yB,EAAQmV,IAAM,MAE5B,IAAI6d,GAAMhzB,EAAQyqB,SAAS+H,WACvBS,EACA,kBAAkB32B,KAAK0D,EAAQsY,IAAI1Q,aACC,gBAApC5H,EAAQyjB,IAAIvf,SAASwC,UAEzB,IAAIusB,EACAr3B,WAAWhB,IAAIkF,KAAK,WAChBC,EAAGvB,KAAKwB,EAAQyjB,IAAK,SACtB1mB,MAAO,OACP,CACHiD,EAAQsyB,QAAQ52B,KAAKqE,GAErBC,EAAQsY,IAAItY,EAAQ+O,KAAM/O,EAAQ8yB,IAAME,GACxChzB,EAAQyjB,IAAIzjB,EAAQ+O,KAAM/O,EAAQ+yB,IAAMC,EAExC,IAAIE,GAAe,CACnB,KACIA,EAAelzB,EAAQyjB,IAAIyP,aAC7B,MAAM3tB,IACR,IAAMqtB,GAAO5yB,EAAQ9D,MAAQ8D,EAAQ9D,KAAKi3B,SAAW,CACjD,IACInzB,EAAQwW,KAAO0c,EACjB,MAAM3tB,IACJvF,EAAQwW,KACRzZ,KAAK41B,MAAM3yB,MAa3ByyB,YAAa,SAASjyB,EAAOR,GACzB,GAAMQ,IAAyB,qBAAfA,EAAMuL,MAAgC,kBAAkBzP,KAAK0D,EAAQsY,IAAI1Q,aAAzF,CAGA,GAAIwrB,GAAwB,SAAf5yB,EAAMuL,KAAmB/L,EAAQyjB,IAAMzjB,EAAQsY,GAC5D8a,GAAMpzB,EAAQ6yB,KAAK7yB,EAAQmV,IAAI3U,EAAMuL,KAAM/L,EAAQyqB,SAAS+H,YAAY,GACxEz1B,KAAKs2B,OAAOrzB,KAgBhB2yB,MAAO,SAAS3yB,GACZ,IACIA,EAAQ9D,KAAKi3B,SAAS,QACxB,MAAM5tB,GACJ,MAAO3J,YAAWoE,EAAQyqB,SAASiI,KAAM,IAE7C31B,KAAKs2B,OAAOrzB,IAShBqzB,OAAQ,SAASrzB,GACb,IAAKA,EAAQuyB,KAAM,CACfvyB,EAAQuyB,MAAO,CACf,KAAK,GAAI52B,GAAI,EAAGA,EAAIqE,EAAQsyB,QAAQh3B,SAAUK,EAC1CqE,EAAQsyB,QAAQ32B,GAAG6C,KAAKwB,EAAQyjB,IAEpCzjB,GAAQsyB,aAKpB,OAAOH,KC3JXv3B,IAAIuD,aAAa,mBAAoB,KAAO,WAE3C,YA6KD,SAASyoB,GAAU7mB,GAClB,MAAOuzB,IAAQh3B,KAAMyD,EAAK,IAS3B,QAASwzB,KACR,GAAIC,GACHC,IAED,OAAQD,GAAQ,SAAU13B,EAAK0N,GAM9B,MAJKiqB,GAAK/3B,KAAMI,GAAO,KAAQ43B,EAAKC,mBAE5BH,GAAOC,EAAKG,SAEZJ,EAAO13B,GAAQ0N,GAQzB,QAASqqB,GAAc9zB,GAEtB,MADAA,GAAI+zB,IAAY,EACT/zB,EAOR,QAASg0B,GAAQh0B,GAChB,GAAIkX,GAAMnd,EAASoD,cAAc,MAEjC,KACC,QAAS6C,EAAIkX,GACZ,MAAO1R,GACR,OAAO,EACN,QAED0R,EAAM,MAIR,QAAS+c,GAAQpzB,EAAUZ,EAASi0B,EAASC,GAC5C,GAAIxvB,GAAO2R,EAAM5W,EAAGgK,EAEnB9N,EAAGw4B,EAAQzQ,EAAK0Q,EAAKC,EAAYC,CASlC,KAPOt0B,EAAUA,EAAQuY,eAAiBvY,EAAUu0B,KAAmBz6B,GACtE06B,EAAax0B,GAGdA,EAAUA,GAAWlG,EACrBm6B,EAAUA,OAEJrzB,GAAgC,gBAAbA,GACxB,MAAOqzB,EAGR,IAAuC,KAAjCxqB,EAAWzJ,EAAQyJ,WAAgC,IAAbA,EAC3C,QAGD,IAAKgrB,IAAmBP,EAAO,CAG9B,GAAMxvB,EAAQgwB,GAAWC,KAAM/zB,GAE9B,GAAMnB,EAAIiF,EAAM,IACf,GAAkB,IAAb+E,EAAiB,CAIrB,GAHA4M,EAAOrW,EAAQU,eAAgBjB,IAG1B4W,IAAQA,EAAKlK,WAQjB,MAAO8nB,EALP,IAAK5d,EAAK5V,KAAOhB,EAEhB,MADAw0B,GAAQv4B,KAAM2a,GACP4d,MAOT,IAAKj0B,EAAQuY,gBAAkBlC,EAAOrW,EAAQuY,cAAc7X,eAAgBjB,KAC3E6P,EAAUtP,EAASqW,IAAUA,EAAK5V,KAAOhB,EAEzC,MADAw0B,GAAQv4B,KAAM2a,GACP4d,MAKH,CAAA,GAAKvvB,EAAM,GAEjB,MADAhJ,GAAKrB,MAAO45B,EAASj0B,EAAQzC,qBAAsBqD,IAC5CqzB,CAGD,KAAMx0B,EAAIiF,EAAM,KAAOkwB,EAAQC,wBAA0B70B,EAAQ60B,uBAEvE,MADAn5B,GAAKrB,MAAO45B,EAASj0B,EAAQ60B,uBAAwBp1B,IAC9Cw0B,EAKT,GAAKW,EAAQE,MAAQC,EAAUz4B,KAAKsE,GAAY,CAU/C,GATA8iB,GAAM,EACN0Q,EAAMN,EACNO,EAAar0B,EACbs0B,EAA2B,IAAb7qB,GAAkB7I,EAMd,IAAb6I,GAAqD,WAAnCzJ,EAAQqd,SAASvP,cAA6B,CAWpE,IAVAqmB,EAASa,EAAUp0B,IAEb8iB,EAAM1jB,EAAQyZ,aAAa,OAChC2a,EAAM1Q,EAAIjnB,QAASw4B,GAAS,QAE5Bj1B,EAAQ7C,aAAc,KAAMi3B,GAE7BA,EAAM,QAAUA,EAAM,MAEtBz4B,EAAIw4B,EAAO74B,OACHK,KACPw4B,EAAOx4B,GAAKy4B,EAAMc,EAAYf,EAAOx4B,GAEtC04B,GAAac,GAAS74B,KAAMsE,IAAcZ,EAAQmM,YAAcnM,EAChEs0B,EAAcH,EAAO93B,KAAK,KAG3B,GAAKi4B,EACJ,IAIC,MAHA54B,GAAKrB,MAAO45B,EACXI,EAAWvK,iBAAkBwK,IAEvBL,EACN,MAAMmB,IACN,QACK1R,GACL1jB,EAAQq1B,gBAAgB,QAQ7B,MAAOr0B,GAAQJ,EAASnE,QAAS64B,GAAO,MAAQt1B,EAASi0B,EAASC,GA6dnE,QAASqB,GAAc/uB,EAAGmN,GACzB,GAAI6hB,GAAM7hB,GAAKnN,EACdivB,EAAOD,KAAU7hB,EAAE+hB,aAAeC,KAAoBnvB,EAAEkvB,aAAeC,EAGxE,IAAKF,EACJ,MAAOA,EAIR,IAAKD,EACJ,KAASA,EAAMA,EAAI7jB,aAClB,GAAK6jB,IAAQ7hB,EACZ,MAAO,EAKV,OAAOnN,GAAI,EAAI,GAIhB,QAASovB,GAAmB7pB,GAC3B,MAAO,UAAUsK,GAChB,GAAIrP,GAAOqP,EAAKgH,SAASvP,aACzB,OAAgB,UAAT9G,GAAoBqP,EAAKtK,OAASA,GAK3C,QAAS8pB,GAAoB9pB,GAC5B,MAAO,UAAUsK,GAChB,GAAIrP,GAAOqP,EAAKgH,SAASvP,aACzB,QAAiB,UAAT9G,GAA6B,WAATA,IAAsBqP,EAAKtK,OAASA,GAKlE,QAAS+pB,GAAwB/1B,GAChC,MAAO8zB,GAAa,SAAUkC,GAE7B,MADAA,IAAYA,EACLlC,EAAa,SAAUK,EAAMpL,GAMnC,IALA,GAAIlL,GACHoY,EAAej2B,KAAQm0B,EAAK54B,OAAQy6B,GACpCp6B,EAAIq6B,EAAa16B,OAGVK,KACFu4B,EAAOtW,EAAIoY,EAAar6B,MAC5Bu4B,EAAKtW,KAAOkL,EAAQlL,GAAKsW,EAAKtW,SAogBnC,QAASoX,GAAUp0B,EAAUq1B,GAC5B,GAAIC,GAASxxB,EAAOyxB,EAAQpqB,EAC3BqqB,EAAOjC,EAAQkC,EACfC,EAASC,EAAY31B,EAAW,IAEjC,IAAK01B,EACJ,MAAOL,GAAY,EAAIK,EAAOl6B,MAAO,EAOtC,KAJAg6B,EAAQx1B,EACRuzB,KACAkC,EAAa3C,EAAK8C,UAEVJ,GAAQ,GAGTF,IAAYxxB,EAAQ+xB,GAAO9B,KAAMyB,OACjC1xB,IAEJ0xB,EAAQA,EAAMh6B,MAAOsI,EAAM,GAAGpJ,SAAY86B,GAE3CjC,EAAOz4B,KAAMy6B,OAGdD,GAAU,GAGJxxB,EAAQgyB,GAAa/B,KAAMyB,MAChCF,EAAUxxB,EAAMkvB,QAChBuC,EAAOz6B,MACN8N,MAAO0sB,EAEPnqB,KAAMrH,EAAM,GAAGjI,QAAS64B,GAAO,OAEhCc,EAAQA,EAAMh6B,MAAO85B,EAAQ56B,QAI9B,KAAMyQ,IAAQ2nB,GAAKxjB,SACZxL,EAAQiyB,GAAW5qB,GAAO4oB,KAAMyB,KAAcC,EAAYtqB,MAC9DrH,EAAQ2xB,EAAYtqB,GAAQrH,MAC7BwxB,EAAUxxB,EAAMkvB,QAChBuC,EAAOz6B,MACN8N,MAAO0sB,EACPnqB,KAAMA,EACN+c,QAASpkB,IAEV0xB,EAAQA,EAAMh6B,MAAO85B,EAAQ56B,QAI/B,KAAM46B,EACL,MAOF,MAAOD,GACNG,EAAM96B,OACN86B,EACCpC,EAAO32B,MAAOuD,GAEd21B,EAAY31B,EAAUuzB,GAAS/3B,MAAO,GAGzC,QAAS84B,GAAYiB,GAIpB,IAHA,GAAIx6B,GAAI,EACP0F,EAAM80B,EAAO76B,OACbsF,EAAW,GACAS,EAAJ1F,EAASA,IAChBiF,GAAYu1B,EAAOx6B,GAAG6N,KAEvB,OAAO5I,GAGR,QAASg2B,GAAeC,EAASC,EAAY7R,GAC5C,GAAI8R,GAAMD,EAAWC,IACpBC,EAAmB/R,GAAgB,eAAR8R,EAC3BE,EAAW1E,GAEZ,OAAOuE,GAAWvL,MAEjB,SAAUlV,EAAMrW,EAASoJ,GACxB,KAASiN,EAAOA,EAAM0gB,IACrB,GAAuB,IAAlB1gB,EAAK5M,UAAkButB,EAC3B,MAAOH,GAASxgB,EAAMrW,EAASoJ,IAMlC,SAAUiN,EAAMrW,EAASoJ,GACxB,GAAI8U,GAAMsV,EAAO0D,EAChBC,EAASC,EAAU,IAAMH,CAG1B,IAAK7tB,GACJ,KAASiN,EAAOA,EAAM0gB,IACrB,IAAuB,IAAlB1gB,EAAK5M,UAAkButB,IACtBH,EAASxgB,EAAMrW,EAASoJ,GAC5B,OAAO,MAKV,MAASiN,EAAOA,EAAM0gB,IACrB,GAAuB,IAAlB1gB,EAAK5M,UAAkButB,EAE3B,GADAE,EAAa7gB,EAAMyd,KAAczd,EAAMyd,QACjCN,EAAQ0D,EAAYH,KAAUvD,EAAM,KAAO2D,GAChD,IAAMjZ,EAAOsV,EAAM,OAAQ,GAAQtV,IAASmZ,EAC3C,MAAOnZ,MAAS,MAKjB,IAFAsV,EAAQ0D,EAAYH,IAAUI,GAC9B3D,EAAM,GAAKqD,EAASxgB,EAAMrW,EAASoJ,IAASiuB,EACvC7D,EAAM,MAAO,EACjB,OAAO,GASf,QAAS8D,GAAgBC,GACxB,MAAOA,GAASj8B,OAAS,EACxB,SAAU+a,EAAMrW,EAASoJ,GAExB,IADA,GAAIzN,GAAI47B,EAASj8B,OACTK,KACP,IAAM47B,EAAS57B,GAAI0a,EAAMrW,EAASoJ,GACjC,OAAO,CAGT,QAAO,GAERmuB,EAAS,GAGX,QAASC,GAAUC,EAAWj4B,EAAK0Q,EAAQlQ,EAASoJ,GAOnD,IANA,GAAIiN,GACHqhB,KACA/7B,EAAI,EACJ0F,EAAMo2B,EAAUn8B,OAChBq8B,EAAgB,MAAPn4B,EAEE6B,EAAJ1F,EAASA,KACV0a,EAAOohB,EAAU97B,OAChBuU,GAAUA,EAAQmG,EAAMrW,EAASoJ,MACtCsuB,EAAah8B,KAAM2a,GACdshB,GACJn4B,EAAI9D,KAAMC,GAMd,OAAO+7B,GAGR,QAASE,GAAYpB,EAAW51B,EAAUi2B,EAASgB,EAAYC,EAAYC,GAO1E,MANKF,KAAeA,EAAY/D,KAC/B+D,EAAaD,EAAYC,IAErBC,IAAeA,EAAYhE,KAC/BgE,EAAaF,EAAYE,EAAYC,IAE/BlE,EAAa,SAAUK,EAAMD,EAASj0B,EAASoJ,GACrD,GAAI4uB,GAAMr8B,EAAG0a,EACZ4hB,KACAC,KACAC,EAAclE,EAAQ34B,OAGtB88B,EAAQlE,GAAQmE,EAAkBz3B,GAAY,IAAKZ,EAAQyJ,UAAazJ,GAAYA,MAGpFs4B,GAAY9B,IAAetC,GAAStzB,EAEnCw3B,EADAZ,EAAUY,EAAOH,EAAQzB,EAAWx2B,EAASoJ,GAG9CmvB,EAAa1B,EAEZiB,IAAgB5D,EAAOsC,EAAY2B,GAAeN,MAMjD5D,EACDqE,CAQF,IALKzB,GACJA,EAASyB,EAAWC,EAAYv4B,EAASoJ,GAIrCyuB,EAMJ,IALAG,EAAOR,EAAUe,EAAYL,GAC7BL,EAAYG,KAAUh4B,EAASoJ,GAG/BzN,EAAIq8B,EAAK18B,OACDK,MACD0a,EAAO2hB,EAAKr8B,MACjB48B,EAAYL,EAAQv8B,MAAS28B,EAAWJ,EAAQv8B,IAAO0a,GAK1D,IAAK6d,GACJ,GAAK4D,GAActB,EAAY,CAC9B,GAAKsB,EAAa,CAIjB,IAFAE,KACAr8B,EAAI48B,EAAWj9B,OACPK,MACD0a,EAAOkiB,EAAW58B,KAEvBq8B,EAAKt8B,KAAO48B,EAAU38B,GAAK0a,EAG7ByhB,GAAY,KAAOS,KAAkBP,EAAM5uB,GAK5C,IADAzN,EAAI48B,EAAWj9B,OACPK,MACD0a,EAAOkiB,EAAW58B,MACtBq8B,EAAOF,EAAaj7B,GAAQ2B,KAAM01B,EAAM7d,GAAS4hB,EAAOt8B,IAAM,KAE/Du4B,EAAK8D,KAAU/D,EAAQ+D,GAAQ3hB,SAOlCkiB,GAAaf,EACZe,IAAetE,EACdsE,EAAW7O,OAAQyO,EAAaI,EAAWj9B,QAC3Ci9B,GAEGT,EACJA,EAAY,KAAM7D,EAASsE,EAAYnvB,GAEvC1N,EAAKrB,MAAO45B,EAASsE,KAMzB,QAASC,GAAmBrC,GAqB3B,IApBA,GAAIsC,GAAc5B,EAASjZ,EAC1Bvc,EAAM80B,EAAO76B,OACbo9B,EAAkBhF,EAAKiF,SAAUxC,EAAO,GAAGpqB,MAC3C6sB,EAAmBF,GAAmBhF,EAAKiF,SAAS,KACpDh9B,EAAI+8B,EAAkB,EAAI,EAG1BG,EAAejC,EAAe,SAAUvgB,GACvC,MAAOA,KAASoiB,GACdG,GAAkB,GACrBE,EAAkBlC,EAAe,SAAUvgB,GAC1C,MAAOxZ,IAAQ2B,KAAMi6B,EAAcpiB,GAAS,IAC1CuiB,GAAkB,GACrBrB,GAAa,SAAUlhB,EAAMrW,EAASoJ,GACrC,OAAUsvB,IAAqBtvB,GAAOpJ,IAAY+4B,MAChDN,EAAez4B,GAASyJ,SACxBovB,EAAcxiB,EAAMrW,EAASoJ,GAC7B0vB,EAAiBziB,EAAMrW,EAASoJ,MAGxB/H,EAAJ1F,EAASA,IAChB,GAAMk7B,EAAUnD,EAAKiF,SAAUxC,EAAOx6B,GAAGoQ,MACxCwrB,GAAaX,EAAcU,EAAgBC,GAAYV,QACjD,CAIN,GAHAA,EAAUnD,EAAKxjB,OAAQimB,EAAOx6B,GAAGoQ,MAAO1R,MAAO,KAAM87B,EAAOx6B,GAAGmtB,SAG1D+N,EAAS/C,GAAY,CAGzB,IADAlW,IAAMjiB,EACM0F,EAAJuc,IACF8V,EAAKiF,SAAUxC,EAAOvY,GAAG7R,MADd6R,KAKjB,MAAOga,GACNj8B,EAAI,GAAK27B,EAAgBC,GACzB57B,EAAI,GAAKu5B,EAAYiB,EAAO/5B,MAAO,EAAGT,EAAI,IAAMc,QAAS64B,GAAO,MAChEuB,EACIjZ,EAAJjiB,GAAS68B,EAAmBrC,EAAO/5B,MAAOT,EAAGiiB,IACzCvc,EAAJuc,GAAW4a,EAAoBrC,EAASA,EAAO/5B,MAAOwhB,IAClDvc,EAAJuc,GAAWsX,EAAYiB;CAGzBoB,EAAS77B,KAAMm7B,GAIjB,MAAOS,GAAgBC,GAGxB,QAASyB,GAA0BC,EAAiBC,GAEnD,GAAIC,GAAoB,EACvBC,EAAQF,EAAY59B,OAAS,EAC7B+9B,EAAYJ,EAAgB39B,OAAS,EACrCg+B,EAAe,SAAUpF,EAAMl0B,EAASoJ,EAAK6qB,EAASsF,GACrD,GAAIljB,GAAMuH,EAAGiZ,EACZ2C,KACAC,EAAe,EACf99B,EAAI,IACJ87B,EAAYvD,MACZwF,EAA6B,MAAjBH,EACZI,EAAgBZ,EAEhBX,EAAQlE,GAAQmF,GAAa3F,EAAKkG,KAAU,IAAG,IAAKL,GAAiBv5B,EAAQmM,YAAcnM,GAE3F65B,EAAiBzC,GAA4B,MAAjBuC,EAAwB,EAAI5uB,KAAKC,UAAY,EAS1E,KAPK0uB,IACJX,EAAmB/4B,IAAYlG,GAAYkG,EAC3Cq3B,EAAa8B,GAKe,OAApB9iB,EAAO+hB,EAAMz8B,IAAaA,IAAM,CACxC,GAAK09B,GAAahjB,EAAO,CAExB,IADAuH,EAAI,EACKiZ,EAAUoC,EAAgBrb,MAClC,GAAKiZ,EAASxgB,EAAMrW,EAASoJ,GAAQ,CACpC6qB,EAAQv4B,KAAM2a,EACd,OAGGqjB,IACJtC,EAAUyC,EACVxC,IAAe8B,GAKZC,KAEE/iB,GAAQwgB,GAAWxgB,IACxBojB,IAIIvF,GACJuD,EAAU/7B,KAAM2a,IAOnB,GADAojB,GAAgB99B,EACXy9B,GAASz9B,IAAM89B,EAAe,CAElC,IADA7b,EAAI,EACKiZ,EAAUqC,EAAYtb,MAC9BiZ,EAASY,EAAW+B,EAAYx5B,EAASoJ,EAG1C,IAAK8qB,EAAO,CAEX,GAAKuF,EAAe,EACnB,KAAQ99B,KACA87B,EAAU97B,IAAM69B,EAAW79B,KACjC69B,EAAW79B,GAAKkL,EAAIrI,KAAMy1B,GAM7BuF,GAAahC,EAAUgC,GAIxB99B,EAAKrB,MAAO45B,EAASuF,GAGhBE,IAAcxF,GAAQsF,EAAWl+B,OAAS,GAC5Cm+B,EAAeP,EAAY59B,OAAW,GAExC04B,EAAO8F,WAAY7F,GAUrB,MALKyF,KACJtC,EAAUyC,EACVd,EAAmBY,GAGblC,EAGT,OAAO2B,GACNvF,EAAcyF,GACdA,EA8BF,QAASjB,GAAkBz3B,EAAUm5B,EAAU9F,GAG9C,IAFA,GAAIt4B,GAAI,EACP0F,EAAM04B,EAASz+B,OACJ+F,EAAJ1F,EAASA,IAChBq4B,EAAQpzB,EAAUm5B,EAASp+B,GAAIs4B,EAEhC,OAAOA,GAGR,QAASjzB,GAAQJ,EAAUZ,EAASi0B,EAASC,GAC5C,GAAIv4B,GAAGw6B,EAAQ6D,EAAOjuB,EAAM6tB,EAC3Bl1B,EAAQswB,EAAUp0B,EAEnB,KAAMszB,GAEiB,IAAjBxvB,EAAMpJ,OAAe,CAIzB,GADA66B,EAASzxB,EAAM,GAAKA,EAAM,GAAGtI,MAAO,GAC/B+5B,EAAO76B,OAAS,GAAkC,QAA5B0+B,EAAQ7D,EAAO,IAAIpqB,MACvB,IAArB/L,EAAQyJ,UAAkBgrB,GAC1Bf,EAAKiF,SAAUxC,EAAO,GAAGpqB,MAAS,CAGnC,GADA/L,GAAY0zB,EAAKkG,KAAS,GAAGI,EAAMlR,QAAQ,GAAGrsB,QAAQw9B,GAAWC,IAAYl6B,QAAkB,IACzFA,EACL,MAAOi0B,EAGRrzB,GAAWA,EAASxE,MAAO+5B,EAAOvC,QAAQpqB,MAAMlO,QAKjD,IADAK,EAAIg7B,GAAwB,aAAEr6B,KAAMsE,GAAa,EAAIu1B,EAAO76B,OACpDK,MACPq+B,EAAQ7D,EAAOx6B,IAGV+3B,EAAKiF,SAAW5sB,EAAOiuB,EAAMjuB,QAGlC,IAAM6tB,EAAOlG,EAAKkG,KAAM7tB,MAEjBmoB,EAAO0F,EACZI,EAAMlR,QAAQ,GAAGrsB,QAASw9B,GAAWC,IACrC/E,GAAS74B,KAAM65B,EAAO,GAAGpqB,OAAU/L,EAAQmM,YAAcnM,IACrD,CAKJ,GAFAm2B,EAAOzM,OAAQ/tB,EAAG,GAClBiF,EAAWszB,EAAK54B,QAAU45B,EAAYiB,IAChCv1B,EAEL,MADAlF,GAAKrB,MAAO45B,EAASC,GACdD,CAGR,QAgBL,MAPAkG,GAASv5B,EAAU8D,GAClBwvB,EACAl0B,GACCy0B,EACDR,EACAkB,GAAS74B,KAAMsE,IAETqzB,EAOR,QAASmG,MAp1DT,GAAIz+B,GACH07B,EACA3D,EACA2G,EACAC,EACAH,EACApB,EACAwB,EACAC,EAGAhG,EACA16B,EACA0e,EACAic,EACAM,EACA0F,EACA3R,EACAxZ,EAGAwkB,EAAU,UAAY,GAAKrsB,MAC3B8sB,EAAe16B,OAAOC,SACtB86B,KACAwC,EAAU,EACV7E,EAAO,EACPmI,EAAanH,IACbgD,EAAahD,IACboH,EAAgBpH,IAChBqH,GAAe,EACfC,EAAY,WAAa,MAAO,IAGhCC,EAAe,YACfnF,EAAe,GAAK,GAGpBoF,KACAl0B,EAAMk0B,EAAIl0B,IACVm0B,EAAcD,EAAIr/B,KAClBA,EAAOq/B,EAAIr/B,KACXU,EAAQ2+B,EAAI3+B,MAEZS,GAAUk+B,EAAIl+B,SAAW,SAAUwZ,GAGlC,IAFA,GAAI1a,GAAI,EACP0F,EAAMtE,KAAKzB,OACA+F,EAAJ1F,EAASA,IAChB,GAAKoB,KAAKpB,KAAO0a,EAChB,MAAO1a,EAGT,OAAO,IAORs/B,GAAa,sBAEbC,GAAoB,mCAKpBC,GAAaD,GAAkBz+B,QAAS,IAAK,MAG7C2+B,GAAY,eACZjZ,GAAa,MAAQ8Y,GAAa,KAAOC,GAAoB,IAAMD,GAClE,OAASG,GAAYH,GAAa,wCAA0CE,GAAa,QAAUF,GAAa,OAQjHI,GAAU,KAAOH,GAAoB,mEAAqE/Y,GAAW1lB,QAAS,EAAG,GAAM,eAGvI64B,GAAQ,GAAIrnB,QAAQ,IAAMgtB,GAAa,8BAAgCA,GAAa,KAAM,KAE1FxE,GAAS,GAAIxoB,QAAQ,IAAMgtB,GAAa,KAAOA,GAAa,KAC5DvE,GAAe,GAAIzoB,QAAQ,IAAMgtB,GAAa,4BAA8BA,GAAa,KACzFK,GAAU,GAAIrtB,QAAQotB,IACtBE,GAAc,GAAIttB,QAAQ,IAAMktB,GAAa,KAE7CxE,IACC6E,GAAM,GAAIvtB,QAAQ,MAAQitB,GAAoB,KAC9CO,MAAS,GAAIxtB,QAAQ,QAAUitB,GAAoB,KACnDQ,KAAQ,GAAIztB,QAAQ,mBAAqBitB,GAAoB,cAC7DS,IAAO,GAAI1tB,QAAQ,KAAOitB,GAAkBz+B,QAAS,IAAK,MAAS,KACnEm/B,KAAQ,GAAI3tB,QAAQ,IAAMkU,IAC1B0Z,OAAU,GAAI5tB,QAAQ,IAAMotB,IAC5BS,MAAS,GAAI7tB,QAAQ,yDAA2DgtB,GAC/E,+BAAiCA,GAAa,cAAgBA,GAC9D,aAAeA,GAAa,SAAU,KAGvCc,aAAgB,GAAI9tB,QAAQ,IAAMgtB,GAAa,mDAC9CA,GAAa,mBAAqBA,GAAa,mBAAoB,MAGrE9F,GAAW,sBAEX7B,GAAU,2BAGVoB,GAAa,mCAEbsH,GAAU,sCACVC,GAAU,SAEVhH,GAAU,QACViH,GAAmB,gDAGnBjC,GAAY,wCACZC,GAAY,SAAU9pB,EAAG+rB,GACxB,GAAIC,GAAO,KAAOD,EAAU,KAE5B,OAAOC,KAASA,EACfD,EAEO,EAAPC,EACCne,OAAOoR,aAAc+M,EAAO,OAE5Bne,OAAOoR,aAAc+M,GAAQ,GAAK,MAAe,KAAPA,EAAe,OAI7D,KACC1gC,EAAKrB,MACH0gC,EAAM3+B,EAAMoC,KAAM+1B,EAAana,YAChCma,EAAana,YAId2gB,EAAKxG,EAAana,WAAW9e,QAASmO,SACrC,MAAQlE,IACT7J,GAASrB,MAAO0gC,EAAIz/B,OAGnB,SAAU0lB,EAAQ9K,GACjB8kB,EAAY3gC,MAAO2mB,EAAQ5kB,EAAMoC,KAAK0X,KAKvC,SAAU8K,EAAQ9K,GAIjB,IAHA,GAAI0H,GAAIoD,EAAO1lB,OACdK,EAAI,EAEIqlB,EAAOpD,KAAO1H,EAAIva,OAC3BqlB,EAAO1lB,OAASsiB,EAAI,IA6KvB0c,EAAQtG,EAAOsG,MAAQ,SAAUjkB,GAGhC,GAAIzK,GAAkByK,IAASA,EAAKkC,eAAiBlC,GAAMzK,eAC3D,OAAOA,GAA+C,SAA7BA,EAAgByR,UAAsB,GAQhEmX,EAAcR,EAAOQ,YAAc,SAAUxa,GAC5C,GAAI1B,GAAM0B,EAAOA,EAAKzB,eAAiByB,EAAOua,CAG9C,OAAKjc,KAAQxe,GAA6B,IAAjBwe,EAAI7O,UAAmB6O,EAAI1M,iBAKpD9R,EAAWwe,EACXE,EAAUF,EAAI1M,gBAGd6oB,GAAkB6F,EAAOhiB,GAGzBsc,EAAQr3B,qBAAuBw2B,EAAO,SAAU9c,GAE/C,MADAA,GAAIzZ,YAAa8a,EAAI+jB,cAAc,MAC3BplB,EAAI1Z,qBAAqB,KAAKjC,SAIvCs5B,EAAQzS,WAAa4R,EAAO,SAAU9c,GACrCA,EAAIhF,UAAY,mBAChB,IAAIlG,SAAckL,GAAIkD,UAAUV,aAAa,WAE7C,OAAgB,YAAT1N,GAA+B,WAATA,IAI9B6oB,EAAQC,uBAAyBd,EAAO,SAAU9c,GAGjD,MADAA,GAAIhF,UAAY,yDACVgF,EAAI4d,wBAA2B5d,EAAI4d,uBAAuB,KAAKv5B,QAKrE2b,EAAIkD,UAAUzL,UAAY,IACwB,IAA3CuI,EAAI4d,uBAAuB,KAAKv5B,SAL/B,IAUTs5B,EAAQ0H,UAAYvI,EAAO,SAAU9c,GAEpCA,EAAIxW,GAAKqzB,EAAU,EAInB7c,EAAIzZ,YAAa1D,EAASoD,cAAc,MAAOC,aAAc,OAAQ22B,GACrE7c,EAAIzZ,YAAa1D,EAASoD,cAAc,MAAOC,aAAc,OAAQ22B,GACrEtb,EAAQhb,YAAayZ,EAGrB,IAAIslB,GAAOjkB,EAAIkkB,mBAEdlkB,EAAIkkB,kBAAmB1I,GAAUx4B,SAAW,EAE5Cgd,EAAIkkB,kBAAmB1I,EAAU,GAAIx4B,MAKtC,OAFAkd,GAAQpM,YAAa6K,GAEdslB,IAKR3H,EAAQ6H,aAAe1I,EAAO,SAAU2I,GACvC,MAAOA,GAAK/hB,yBAEsD,EAAhE+hB,EAAK/hB,wBAAyB7gB,EAASoD,cAAc,UAIxDw2B,EAAKiJ,WAAa5I,EAAO,SAAU9c,GAElC,MADAA,GAAIhF,UAAY,mBACTgF,EAAIvF,kBAAqBuF,GAAIvF,WAAW+H,eAAiBqhB,GACvB,MAAxC7jB,EAAIvF,WAAW+H,aAAa,cAI5BhV,KAAQ,SAAU4R,GACjB,MAAOA,GAAKoD,aAAc,OAAQ,IAEnC1N,KAAQ,SAAUsK,GACjB,MAAOA,GAAKoD,aAAa,UAKvBmb,EAAQ0H,WACZ5I,EAAKkG,KAAS,GAAI,SAAUn5B,EAAIT,GAC/B,SAAYA,GAAQU,iBAAmBo6B,GAAgBrG,EAAiB,CACvE,GAAIh1B,GAAIO,EAAQU,eAAgBD,EAGhC,OAAOhB,IAAKA,EAAE0M,YAAc1M,QAG9Bi0B,EAAKxjB,OAAW,GAAI,SAAUzP,GAC7B,GAAIm8B,GAASn8B,EAAGhE,QAASw9B,GAAWC,GACpC,OAAO,UAAU7jB,GAChB,MAAOA,GAAKoD,aAAa,QAAUmjB,MAIrClJ,EAAKkG,KAAS,GAAI,SAAUn5B,EAAIT,GAC/B,SAAYA,GAAQU,iBAAmBo6B,GAAgBrG,EAAiB,CACvE,GAAIh1B,GAAIO,EAAQU,eAAgBD,EAEhC,OAAOhB,GACNA,EAAEgB,KAAOA,SAAahB,GAAEo9B,mBAAqB/B,GAAgBr7B,EAAEo9B,iBAAiB,MAAMrzB,QAAU/I,GAC9FhB,GACDT,YAIJ00B,EAAKxjB,OAAW,GAAK,SAAUzP,GAC9B,GAAIm8B,GAASn8B,EAAGhE,QAASw9B,GAAWC,GACpC,OAAO,UAAU7jB,GAChB,GAAI2D,SAAc3D,GAAKwmB,mBAAqB/B,GAAgBzkB,EAAKwmB,iBAAiB,KAClF,OAAO7iB,IAAQA,EAAKxQ,QAAUozB,KAMjClJ,EAAKkG,KAAU,IAAIhF,EAAQr3B,qBAC1B,SAAU+Z,EAAKtX,GACd,aAAYA,GAAQzC,uBAAyBu9B,EACrC96B,EAAQzC,qBAAsB+Z,GADtC,QAID,SAAUA,EAAKtX,GACd,GAAIqW,GACHymB,KACAnhC,EAAI,EACJs4B,EAAUj0B,EAAQzC,qBAAsB+Z,EAGzC,IAAa,MAARA,EAAc,CAClB,KAASjB,EAAO4d,EAAQt4B,MACA,IAAlB0a,EAAK5M,UACTqzB,EAAIphC,KAAM2a,EAIZ,OAAOymB,GAER,MAAO7I,IAITP,EAAKkG,KAAW,KAAIhF,EAAQ0H,WAAa,SAAUhlB,EAAKtX,GACvD,aAAYA,GAAQw8B,oBAAsB1B,EAClC96B,EAAQw8B,kBAAmBx1B,MADnC,QAMD0sB,EAAKkG,KAAY,MAAIhF,EAAQC,wBAA0B,SAAUnmB,EAAW1O,GAC3E,aAAYA,GAAQ60B,yBAA2BiG,GAAgBrG,EACvDz0B,EAAQ60B,uBAAwBnmB,GADxC,QAQD+rB,KAKA1F,GAAc,WAERH,EAAQE,IAAMlO,EAAStO,EAAIwR,qBAGhCiK,EAAO,SAAU9c,GAMhBA,EAAIhF,UAAY,iDAGVgF,EAAI6S,iBAAiB,cAAcxuB,QACxCy5B,EAAUr5B,KAAM,MAAQu/B,GAAa,gEAMhChkB,EAAI6S,iBAAiB,YAAYxuB,QACtCy5B,EAAUr5B,KAAK,cAIjBq4B,EAAO,SAAU9c,GAIhBA,EAAIhF,UAAY,8BACXgF,EAAI6S,iBAAiB,WAAWxuB,QACpCy5B,EAAUr5B,KAAM,SAAWu/B,GAAa,gBAKnChkB,EAAI6S,iBAAiB,YAAYxuB,QACtCy5B,EAAUr5B,KAAM,WAAY,aAI7Bub,EAAI6S,iBAAiB,QACrBiL,EAAUr5B,KAAK,YAIXk5B,EAAQnX,gBAAkBmJ,EAAWkC,EAAUtQ,EAAQiF,iBAC5DjF,EAAQukB,oBACRvkB,EAAQwkB,uBACRxkB,EAAQykB,kBACRzkB,EAAQ0kB,qBAERnJ,EAAO,SAAU9c,GAGhB2d,EAAQuI,kBAAoBrU,EAAQtqB,KAAMyY,EAAK,OAI/C6R,EAAQtqB,KAAMyY,EAAK,aACnBwjB,EAAc/+B,KAAM,KAAM2/B,MAI5BtG,EAAY,GAAI9mB,QAAQ8mB,EAAU14B,KAAK,MACvCo+B,EAAgBA,EAAcn/B,QAAU,GAAI2S,QAAQwsB,EAAcp+B,KAAK,MAKvEiT,EAAWsX,EAASpO,EAAQlJ,WAAakJ,EAAQmC,wBAChD,SAAUnU,EAAGmN,GACZ,GAAIypB,GAAuB,IAAf52B,EAAEiD,SAAiBjD,EAAEoF,gBAAkBpF,EAClD62B,EAAM1pB,GAAKA,EAAExH,UACd,OAAO3F,KAAM62B,MAAWA,GAAwB,IAAjBA,EAAI5zB,YAClC2zB,EAAM9tB,SACL8tB,EAAM9tB,SAAU+tB,GAChB72B,EAAEmU,yBAA8D,GAAnCnU,EAAEmU,wBAAyB0iB,MAG3D,SAAU72B,EAAGmN,GACZ,GAAKA,EACJ,KAASA,EAAIA,EAAExH,YACd,GAAKwH,IAAMnN,EACV,OAAO,CAIV,QAAO,GAITq0B,EAAYriB,EAAQmC,wBACpB,SAAUnU,EAAGmN,GAGZ,GAAKnN,IAAMmN,EAEV,MADAinB,IAAe,EACR,CAGR,IAAI0C,GAAU3pB,EAAEgH,yBAA2BnU,EAAEmU,yBAA2BnU,EAAEmU,wBAAyBhH,EAEnG,OAAK2pB,GAEW,EAAVA,GACH/C,GAAa5mB,EAAEgH,wBAAyBnU,KAAQ82B,EAG5C92B,IAAM8R,GAAOhJ,EAASilB,EAAc/tB,GACjC,GAEHmN,IAAM2E,GAAOhJ,EAASilB,EAAc5gB,GACjC,EAID6mB,EACJ39B,GAAQ2B,KAAMg8B,EAAWh0B,GAAM3J,GAAQ2B,KAAMg8B,EAAW7mB,GAC1D,EAGe,EAAV2pB,EAAc,GAAK,EAIpB92B,EAAEmU,wBAA0B,GAAK,GAEzC,SAAUnU,EAAGmN,GACZ,GAAI6hB,GACH75B,EAAI,EACJ4hC,EAAM/2B,EAAE2F,WACRkxB,EAAM1pB,EAAExH,WACRqxB,GAAOh3B,GACPi3B,GAAO9pB,EAGR,IAAKnN,IAAMmN,EAEV,MADAinB,IAAe,EACR,CAGD,KAAM2C,IAAQF,EACpB,MAAO72B,KAAM8R,EAAM,GAClB3E,IAAM2E,EAAM,EACZilB,EAAM,GACNF,EAAM,EACN,CAGK,IAAKE,IAAQF,EACnB,MAAO9H,GAAc/uB,EAAGmN,EAKzB,KADA6hB,EAAMhvB,EACGgvB,EAAMA,EAAIrpB,YAClBqxB,EAAGj+B,QAASi2B,EAGb,KADAA,EAAM7hB,EACG6hB,EAAMA,EAAIrpB,YAClBsxB,EAAGl+B,QAASi2B,EAIb,MAAQgI,EAAG7hC,KAAO8hC,EAAG9hC,IACpBA,GAGD,OAAOA,GAEN45B,EAAciI,EAAG7hC,GAAI8hC,EAAG9hC,IAGxB6hC,EAAG7hC,KAAO44B,EAAe,GACzBkJ,EAAG9hC,KAAO44B,EAAe,EACzB,GAGKz6B,GA/VCA,GAkWTk6B,EAAOlL,QAAU,SAAU4U,EAAM/d,GAChC,MAAOqU,GAAQ0J,EAAM,KAAM,KAAM/d,IAGlCqU,EAAOvW,gBAAkB,SAAUpH,EAAMqnB,GAUxC,IAROrnB,EAAKkC,eAAiBlC,KAAWvc,GACvC06B,EAAane,GAIdqnB,EAAOA,EAAKjhC,QAASy/B,GAAkB,UAGlCtH,EAAQnX,iBAAmBgX,KAAoBgG,IAAkBA,EAAcn+B,KAAKohC,MAAW3I,EAAUz4B,KAAKohC,GAClH,IACC,GAAIC,GAAM7U,EAAQtqB,KAAM6X,EAAMqnB,EAG9B,IAAKC,GAAO/I,EAAQuI,mBAGlB9mB,EAAKvc,UAAuC,KAA3Buc,EAAKvc,SAAS2P,SAChC,MAAOk0B,GAEP,MAAMp4B,IAGT,MAAOyuB,GAAQ0J,EAAM5jC,EAAU,MAAOuc,IAAQ/a,OAAS,GAGxD04B,EAAO1kB,SAAW,SAAUtP,EAASqW,GAKpC,OAHOrW,EAAQuY,eAAiBvY,KAAclG,GAC7C06B,EAAax0B,GAEPsP,EAAUtP,EAASqW,IAG3B2d,EAAOxa,KAAO,SAAUnD,EAAMrP,GAC7B,GAAI+I,EAUJ,QAPOsG,EAAKkC,eAAiBlC,KAAWvc,GACvC06B,EAAane,GAGToe,IACJztB,EAAOA,EAAK8G,gBAEPiC,EAAM2jB,EAAKiJ,WAAY31B,IACrB+I,EAAKsG,IAEPoe,GAAkBG,EAAQzS,WACxB9L,EAAKoD,aAAczS,KAEjB+I,EAAMsG,EAAKwmB,iBAAkB71B,KAAWqP,EAAKoD,aAAczS,KAAYqP,EAAMrP,MAAW,EACjGA,EACA+I,GAAOA,EAAI6tB,UAAY7tB,EAAIvG,MAAQ,MAGrCwqB,EAAO32B,MAAQ,SAAUwgC,GACxB,KAAM,IAAI7gC,OAAO,0CAA4C6gC,IAI9D7J,EAAO8F,WAAa,SAAU7F,GAC7B,GAAI5d,GACHynB,KACAlgB,EAAI,EACJjiB,EAAI,CASL,IANAi/B,GAAgBhG,EAAQmJ,iBAExBxD,GAAa3F,EAAQ6H,aACrBjC,GAAa5F,EAAQoJ,YAAc/J,EAAQ73B,MAAO,GAClD63B,EAAQgK,KAAMpD,GAETD,EAAe,CACnB,KAASvkB,EAAO4d,EAAQt4B,MAClB0a,IAAS4d,EAASt4B,KACtBiiB,EAAIkgB,EAAWpiC,KAAMC,GAGvB,MAAQiiB,KACPqW,EAAQvK,OAAQoU,EAAYlgB,GAAK,GAInC,MAAOqW,IAqERoG,EAAUrG,EAAOqG,QAAU,SAAUhkB,GACpC,GAAI2D,GACH2jB,EAAM,GACNhiC,EAAI,EACJ8N,EAAW4M,EAAK5M,QAEjB,IAAMA,GAMC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAGjE,GAAiC,gBAArB4M,GAAK0D,YAChB,MAAO1D,GAAK0D,WAGZ,KAAM1D,EAAOA,EAAK3E,WAAY2E,EAAMA,EAAOA,EAAK1E,YAC/CgsB,GAAOtD,EAAShkB,OAGZ,IAAkB,IAAb5M,GAA+B,IAAbA,EAC7B,MAAO4M,GAAKgE,cAhBZ,MAASL,EAAO3D,EAAK1a,GAAKA,IAEzBgiC,GAAOtD,EAASrgB,EAkBlB,OAAO2jB,IAGRjK,EAAOM,EAAOkK,WAGbvK,YAAa,GAEbwK,aAActK,EAEdnvB,MAAOiyB,GAEPiD,QAEAjB,UACCyF,KAAOrH,IAAK,aAAcxL,OAAO,GACjC8S,KAAOtH,IAAK,cACZuH,KAAOvH,IAAK,kBAAmBxL,OAAO,GACtCgT,KAAOxH,IAAK,oBAGbP,WACCoF,KAAQ,SAAUl3B,GAUjB,MATAA,GAAM,GAAKA,EAAM,GAAGjI,QAASw9B,GAAWC,IAGxCx1B,EAAM,IAAOA,EAAM,IAAMA,EAAM,IAAM,IAAKjI,QAASw9B,GAAWC,IAE5C,OAAbx1B,EAAM,KACVA,EAAM,GAAK,IAAMA,EAAM,GAAK,KAGtBA,EAAMtI,MAAO,EAAG,IAGxB0/B,MAAS,SAAUp3B,GA6BlB,MAlBAA,GAAM,GAAKA,EAAM,GAAGoJ,cAEY,QAA3BpJ,EAAM,GAAGtI,MAAO,EAAG,IAEjBsI,EAAM,IACXsvB,EAAO32B,MAAOqH,EAAM,IAKrBA,EAAM,KAAQA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAAK,GAAmB,SAAbA,EAAM,IAA8B,QAAbA,EAAM,KACzFA,EAAM,KAAUA,EAAM,GAAKA,EAAM,IAAqB,QAAbA,EAAM,KAGpCA,EAAM,IACjBsvB,EAAO32B,MAAOqH,EAAM,IAGdA,GAGRm3B,OAAU,SAAUn3B,GACnB,GAAI85B,GACHC,GAAY/5B,EAAM,IAAMA,EAAM,EAE/B,OAAKiyB,IAAiB,MAAEr6B,KAAMoI,EAAM,IAC5B,MAIHA,EAAM,GACVA,EAAM,GAAKA,EAAM,GAGN+5B,GAAYnD,GAAQh/B,KAAMmiC,KAEpCD,EAASxJ,EAAUyJ,GAAU,MAE7BD,EAASC,EAAS5hC,QAAS,IAAK4hC,EAASnjC,OAASkjC,GAAWC,EAASnjC,UAGvEoJ,EAAM,GAAKA,EAAM,GAAGtI,MAAO,EAAGoiC,GAC9B95B,EAAM,GAAK+5B,EAASriC,MAAO,EAAGoiC,IAIxB95B,EAAMtI,MAAO,EAAG,MAIzB8T,QAECyrB,IAAO,SAAUte,GAChB,MAAkB,MAAbA,EACG,WAAa,OAAO,IAG5BA,EAAWA,EAAS5gB,QAASw9B,GAAWC,IAAYpsB,cAC7C,SAAUuI,GAChB,MAAOA,GAAKgH,UAAYhH,EAAKgH,SAASvP,gBAAkBuP,KAI1Doe,MAAS,SAAU/sB,GAClB,GAAIgwB,GAAUhE,EAAYhsB,EAAY,IAEtC,OAAOgwB,KACLA,EAAU,GAAIzwB,QAAQ,MAAQgtB,GAAa,IAAMvsB,EAAY,IAAMusB,GAAa,SACjFP,EAAYhsB,EAAW,SAAU2H,GAChC,MAAOqoB,GAAQpiC,KAAM+Z,EAAK3H,iBAAqB2H,GAAKoD,eAAiBqhB,GAAgBzkB,EAAKoD,aAAa,UAAa,OAIvHmiB,KAAQ,SAAU50B,EAAM23B,EAAU/Z,GACjC,MAAO,UAAUvO,GAChB,GAAIuoB,GAAS5K,EAAOxa,KAAMnD,EAAMrP,EAEhC,OAAe,OAAV43B,EACgB,OAAbD,EAEFA,GAINC,GAAU,GAEU,MAAbD,EAAmBC,IAAWha,EACvB,OAAb+Z,EAAoBC,IAAWha,EAClB,OAAb+Z,EAAoB/Z,GAAqC,IAA5Bga,EAAO/hC,QAAS+nB,GAChC,OAAb+Z,EAAoB/Z,GAASga,EAAO/hC,QAAS+nB,GAAU,GAC1C,OAAb+Z,EAAoB/Z,GAASga,EAAOxiC,OAAQwoB,EAAMtpB,UAAaspB,EAClD,OAAb+Z,GAAsB,IAAMC,EAAS,KAAM/hC,QAAS+nB,GAAU,GACjD,OAAb+Z,EAAoBC,IAAWha,GAASga,EAAOxiC,MAAO,EAAGwoB,EAAMtpB,OAAS,KAAQspB,EAAQ,KACxF,IAZO,IAgBVkX,MAAS,SAAU/vB,EAAM8yB,EAAM9I,EAAUxK,EAAOuT,GAC/C,GAAIC,GAAgC,QAAvBhzB,EAAK3P,MAAO,EAAG,GAC3B4iC,EAA+B,SAArBjzB,EAAK3P,MAAO,IACtB6iC,EAAkB,YAATJ,CAEV,OAAiB,KAAVtT,GAAwB,IAATuT,EAGrB,SAAUzoB,GACT,QAASA,EAAKlK,YAGf,SAAUkK,EAAMrW,EAASoJ,GACxB,GAAIoqB,GAAO0D,EAAYld,EAAMyb,EAAMyJ,EAAWC,EAC7CpI,EAAMgI,IAAWC,EAAU,cAAgB,kBAC3CjhC,EAASsY,EAAKlK,WACdnF,EAAOi4B,GAAU5oB,EAAKgH,SAASvP,cAC/BsxB,GAAYh2B,IAAQ61B,CAErB,IAAKlhC,EAAS,CAGb,GAAKghC,EAAS,CACb,KAAQhI,GAAM,CAEb,IADA/c,EAAO3D,EACE2D,EAAOA,EAAM+c,IACrB,GAAKkI,EAASjlB,EAAKqD,SAASvP,gBAAkB9G,EAAyB,IAAlBgT,EAAKvQ,SACzD,OAAO,CAIT01B,GAAQpI,EAAe,SAAThrB,IAAoBozB,GAAS,cAE5C,OAAO,EAMR,GAHAA,GAAUH,EAAUjhC,EAAO2T,WAAa3T,EAAOoc,WAG1C6kB,GAAWI,GAQf,IANAlI,EAAan5B,EAAQ+1B,KAAc/1B,EAAQ+1B,OAC3CN,EAAQ0D,EAAYnrB,OACpBmzB,EAAY1L,EAAM,KAAO4D,GAAW5D,EAAM,GAC1CiC,EAAOjC,EAAM,KAAO4D,GAAW5D,EAAM,GACrCxZ,EAAOklB,GAAanhC,EAAOqc,WAAY8kB,GAE9BllB,IAASklB,GAAallB,GAAQA,EAAM+c,KAG3CtB,EAAOyJ,EAAY,IAAMC,EAAMt4B,OAGhC,GAAuB,IAAlBmT,EAAKvQ,YAAoBgsB,GAAQzb,IAAS3D,EAAO,CACrD6gB,EAAYnrB,IAAWqrB,EAAS8H,EAAWzJ,EAC3C,YAKI,IAAK2J,IAAa5L,GAASnd,EAAMyd,KAAczd,EAAMyd,QAAkB/nB,KAAWynB,EAAM,KAAO4D,EACrG3B,EAAOjC,EAAM,OAKb,OAASxZ,IAASklB,GAAallB,GAAQA,EAAM+c,KAC3CtB,EAAOyJ,EAAY,IAAMC,EAAMt4B,UAEzBo4B,EAASjlB,EAAKqD,SAASvP,gBAAkB9G,EAAyB,IAAlBgT,EAAKvQ,cAAsBgsB,IAE5E2J,KACHplB,EAAM8Z,KAAc9Z,EAAM8Z,QAAkB/nB,IAAWqrB,EAAS3B,IAG7Dzb,IAAS3D,MASjB,MADAof,IAAQqJ,EACDrJ,IAASlK,GAAWkK,EAAOlK,IAAU,GAAKkK,EAAOlK,GAAS,KAKrEsQ,OAAU,SAAUwD,EAAQtJ,GAK3B,GAAIv6B,GACHuE,EAAK2zB,EAAK2H,QAASgE,IAAY3L,EAAK0G,WAAYiF,EAAOvxB,gBACtDkmB,EAAO32B,MAAO,uBAAyBgiC,EAKzC,OAAKt/B,GAAI+zB,GACD/zB,EAAIg2B,GAIPh2B,EAAGzE,OAAS,GAChBE,GAAS6jC,EAAQA,EAAQ,GAAItJ,GACtBrC,EAAK0G,WAAWz/B,eAAgB0kC,EAAOvxB,eAC7C+lB,EAAa,SAAUK,EAAMpL,GAI5B,IAHA,GAAIwW,GACHpJ,EAAUn2B,EAAIm0B,EAAM6B,GACpBp6B,EAAIu6B,EAAQ56B,OACLK,KACP2jC,EAAMziC,GAAQ2B,KAAM01B,EAAMgC,EAAQv6B,IAClCu4B,EAAMoL,KAAWxW,EAASwW,GAAQpJ,EAAQv6B,MAG5C,SAAU0a,GACT,MAAOtW,GAAIsW,EAAM,EAAG7a,KAIhBuE,IAITs7B,SAECkE,IAAO1L,EAAa,SAAUjzB,GAI7B,GAAIoxB,MACHiC,KACA4C,EAAUsD,EAASv5B,EAASnE,QAAS64B,GAAO,MAE7C,OAAOuB,GAAS/C,GACfD,EAAa,SAAUK,EAAMpL,EAAS9oB,EAASoJ,GAM9C,IALA,GAAIiN,GACHohB,EAAYZ,EAAS3C,EAAM,KAAM9qB,MACjCzN,EAAIu4B,EAAK54B,OAGFK,MACD0a,EAAOohB,EAAU97B,MACtBu4B,EAAKv4B,KAAOmtB,EAAQntB,GAAK0a,MAI5B,SAAUA,EAAMrW,EAASoJ,GAGxB,MAFA4oB,GAAM,GAAK3b,EACXwgB,EAAS7E,EAAO,KAAM5oB,EAAK6qB,IACnBA,EAAQptB,SAInBwI,IAAOwkB,EAAa,SAAUjzB,GAC7B,MAAO,UAAUyV,GAChB,MAAO2d,GAAQpzB,EAAUyV,GAAO/a,OAAS,KAI3CgU,SAAYukB,EAAa,SAAU5Z,GAClC,MAAO,UAAU5D,GAChB,OAASA,EAAK0D,aAAe1D,EAAK6D,WAAamgB,EAAShkB,IAASxZ,QAASod,GAAS,MAWrFulB,KAAQ3L,EAAc,SAAU2L,GAM/B,MAJMjE,IAAYj/B,KAAKkjC,GAAQ,KAC9BxL,EAAO32B,MAAO,qBAAuBmiC,GAEtCA,EAAOA,EAAK/iC,QAASw9B,GAAWC,IAAYpsB,cACrC,SAAUuI,GAChB,GAAIopB,EACJ,GACC,IAAMA,EAAWhL,EAChBpe,EAAKmpB,KACLnpB,EAAKoD,aAAa,aAAepD,EAAKoD,aAAa,QAGnD,MADAgmB,GAAWA,EAAS3xB,cACb2xB,IAAaD,GAA2C,IAAnCC,EAAS5iC,QAAS2iC,EAAO,YAE5CnpB,EAAOA,EAAKlK,aAAiC,IAAlBkK,EAAK5M,SAC3C,QAAO,KAKTuX,OAAU,SAAU3K,GACnB,GAAImO,GAAO3qB,OAAOqK,UAAYrK,OAAOqK,SAASsgB,IAC9C,OAAOA,IAAQA,EAAKpoB,MAAO,KAAQia,EAAK5V,IAGzCvE,KAAQ,SAAUma,GACjB,MAAOA,KAASmC,GAGjBknB,MAAS,SAAUrpB,GAClB,MAAOA,KAASvc,EAAS6lC,iBAAmB7lC,EAAS8lC,UAAY9lC,EAAS8lC,gBAAkBvpB,EAAKtK,MAAQsK,EAAK5R,OAAS4R,EAAKwpB,WAI7HC,QAAW,SAAUzpB,GACpB,MAAOA,GAAK0pB,YAAa,GAG1BA,SAAY,SAAU1pB,GACrB,MAAOA,GAAK0pB,YAAa,GAG1B3gB,QAAW,SAAU/I,GAGpB,GAAIgH,GAAWhH,EAAKgH,SAASvP,aAC7B,OAAqB,UAAbuP,KAA0BhH,EAAK+I,SAA0B,WAAb/B,KAA2BhH,EAAK2pB,UAGrFA,SAAY,SAAU3pB,GAOrB,MAJKA,GAAKlK,YACTkK,EAAKlK,WAAW8zB,cAGV5pB,EAAK2pB,YAAa,GAI1BE,MAAS,SAAU7pB,GAMlB,IAAMA,EAAOA,EAAK3E,WAAY2E,EAAMA,EAAOA,EAAK1E,YAC/C,GAAK0E,EAAKgH,SAAW,KAAyB,IAAlBhH,EAAK5M,UAAoC,IAAlB4M,EAAK5M,SACvD,OAAO,CAGT,QAAO,GAGR1L,OAAU,SAAUsY,GACnB,OAAQqd,EAAK2H,QAAe,MAAGhlB,IAIhC8pB,OAAU,SAAU9pB,GACnB,MAAO4lB,IAAQ3/B,KAAM+Z,EAAKgH,WAG3B2U,MAAS,SAAU3b,GAClB,MAAO2lB,IAAQ1/B,KAAM+Z,EAAKgH,WAG3BiJ,OAAU,SAAUjQ,GACnB,GAAIrP,GAAOqP,EAAKgH,SAASvP,aACzB,OAAgB,UAAT9G,GAAkC,WAAdqP,EAAKtK,MAA8B,WAAT/E,GAGtDiT,KAAQ,SAAU5D,GACjB,GAAImD,EAGJ,OAAuC,UAAhCnD,EAAKgH,SAASvP,eACN,SAAduI,EAAKtK,OACmC,OAArCyN,EAAOnD,EAAKoD,aAAa,UAAoBD,EAAK1L,gBAAkBuI,EAAKtK,OAI9Ewf,MAASuK,EAAuB,WAC/B,OAAS,KAGVgJ,KAAQhJ,EAAuB,SAAUE,EAAc16B,GACtD,OAASA,EAAS,KAGnB8kC,GAAMtK,EAAuB,SAAUE,EAAc16B,EAAQy6B,GAC5D,OAAoB,EAAXA,EAAeA,EAAWz6B,EAASy6B,KAG7CsK,KAAQvK,EAAuB,SAAUE,EAAc16B,GAEtD,IADA,GAAIK,GAAI,EACIL,EAAJK,EAAYA,GAAK,EACxBq6B,EAAat6B,KAAMC,EAEpB,OAAOq6B,KAGRsK,IAAOxK,EAAuB,SAAUE,EAAc16B,GAErD,IADA,GAAIK,GAAI,EACIL,EAAJK,EAAYA,GAAK,EACxBq6B,EAAat6B,KAAMC,EAEpB,OAAOq6B,KAGRuK,GAAMzK,EAAuB,SAAUE,EAAc16B,EAAQy6B,GAE5D,IADA,GAAIp6B,GAAe,EAAXo6B,EAAeA,EAAWz6B,EAASy6B,IACjCp6B,GAAK,GACdq6B,EAAat6B,KAAMC,EAEpB,OAAOq6B,KAGRwK,GAAM1K,EAAuB,SAAUE,EAAc16B,EAAQy6B,GAE5D,IADA,GAAIp6B,GAAe,EAAXo6B,EAAeA,EAAWz6B,EAASy6B,IACjCp6B,EAAIL,GACb06B,EAAat6B,KAAMC,EAEpB,OAAOq6B,MAMV,KAAMr6B,KAAO8kC,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5EnN,EAAK2H,QAAS1/B,GAAMi6B,EAAmBj6B,EAExC,KAAMA,KAAOmlC,QAAQ,EAAMC,OAAO,GACjCrN,EAAK2H,QAAS1/B,GAAMk6B,EAAoBl6B,EA+jBzC,OApKAw+B,GAAUnG,EAAOmG,QAAU,SAAUv5B,EAAUogC,GAC9C,GAAIrlC,GACHu9B,KACAD,KACA3C,EAASqE,EAAe/5B,EAAW,IAEpC,KAAM01B,EAAS,CAMd,IAJM0K,IACLA,EAAQhM,EAAUp0B,IAEnBjF,EAAIqlC,EAAM1lC,OACFK,KACP26B,EAASkC,EAAmBwI,EAAMrlC,IAC7B26B,EAAQxC,GACZoF,EAAYx9B,KAAM46B,GAElB2C,EAAgBv9B,KAAM46B,EAKxBA,GAASqE,EAAe/5B,EAAUo4B,EAA0BC,EAAiBC,IAE9E,MAAO5C,IA8ER5C,EAAK2H,QAAa,IAAI3H,EAAK2H,QAAY,GAIvCjB,EAAW7/B,UAAYm5B,EAAKuN,QAAUvN,EAAK2H,QAC3C3H,EAAK0G,WAAa,GAAIA,GAGtBxF,EAAQoJ,WAAalK,EAAQ93B,MAAM,IAAIiiC,KAAMpD,GAAYx+B,KAAK,MAAQy3B,EAGtEU,KAIC,EAAG,GAAGyJ,KAAMpD,GACbjG,EAAQmJ,iBAAmBnD,GA+CvB55B,OAAiBgzB,EACjBlL,QAAiBkL,EAAOlL,QACxBrL,gBAAiBuW,EAAOvW,mBC75D5B7iB,IAAIuD,aAAa,iBAAkB,OAAS,WAExC,YAEA,IAAI+iC,GAAa3iC,MAAMhE,UAMnBi1B,GASAG,QAASpxB,MAAMoxB,SAAW,SAAUwR,GAChC,MAA0C,sBAAhCz6B,SAASlI,KAAK2iC,IAkB5B7P,QAAS,SAAUyJ,EAAKn5B,GAIpB,QAASw+B,GAAG55B,EAAGmN,GACX,MAAOytB,GAAO56B,KAAO46B,EAAOztB,GAEhC,QAASytB,GAAOC,GACZ,MAA2B,kBAAhBz/B,GAAQ9F,IACR8F,EAAQ9F,IAAIulC,GAEZA,EAVfz/B,EAAUA,KAcV,KAAK,GAbD+7B,MACA2D,EAYK3lC,EAAI,EAAG0F,EAAM05B,EAAIz/B,OAAY+F,EAAJ1F,EAASA,IAAK,CAI5C,IAHA2lC,GAAevG,EAAIp/B,IAGH0F,EAAR1F,EAAI,GAAYykC,EAAGrF,EAAIp/B,GAAIo/B,EAAIp/B,EAAI,KACvC2lC,EAAY5lC,KAAKq/B,EAAIp/B,EAAI,IACzBA,GAIAgiC,GAAIjiC,KADJkG,EAAQsuB,OACEkR,EAAOrG,EAAIp/B,IAAK2lC,GAEjBA,GAGjB,MAAO3D,IAqBXpM,OAAQ,SAAU5G,EAAOpgB,EAAUg3B,GAC/B,GAAIL,EAAW3P,OACX,MAAO2P,GAAW3P,OAAOl3B,MAAMswB,EAAOuW,EAAW9kC,MAAMoC,KAAKC,UAAW,GAI3E,IAAII,GAAI0C,OAAQopB,GAAStpB,EAAMxC,EAAEvD,SAAW,EAAGZ,EAAI,EAAG8O,CACtD,IAAK/K,UAAUnD,QAAU,EACrBkO,EAAQ+3B,MACL,CACH,KAAYlgC,EAAJ3G,KAAaA,IAAKmE,KAAKnE,GAC/B,IAAKA,GAAK2G,EACN,KAAM,IAAI2U,WAAU,8CACxBxM,GAAQ3K,EAAGnE,KAEf,KAAY2G,EAAJ3G,EAAUA,IACTA,IAAKmE,KACN2K,EAAQe,EAAUf,EAAO3K,EAAEnE,GAAIA,EAAGmE,GAG1C,OAAO2K,IAcX0oB,QAAS,SAAS1oB,EAAOuxB,GACrB,GAAmB,gBAARA,GACP,IAAK,GAAIp/B,GAAI,EAAGqC,EAAI+8B,EAAIz/B,OAAY0C,EAAJrC,IAASA,EACrC,GAAIo/B,EAAIp/B,KAAO6N,EACX,OAAO,CAInB,QAAO,GAcXg4B,UAAW,SAASzG,EAAKj/B,GACrB,GAAmB,mBAARi/B,IAAuBA,EAAI0G,cAAgBljC,MAAS,OAAO,CACtE,IAAmB,gBAARzC,GAAoB,MAAOi/B,GAAIkD,MAC1C,IAAIlD,EAAIz/B,OAAS,EAAG,CAChB,GAA4B,mBAAjBy/B,GAAI,GAAGj/B,GAAyB,OAAO,CAClDi/B,GAAIkD,KAAK,SAASz3B,EAAGmN,GACjB,GAAIW,GAAI9N,EAAE1K,GACNic,EAAIpE,EAAE7X,EACV,OAAaic,GAAJzD,EAAS,GAAOA,EAAIyD,EAAK,EAAI,IAG9C,MAAOgjB,IAeX2G,SAAU,SAASl4B,EAAOuxB,EAAKxP,GAC3B,GAAqB,mBAAV/hB,IAAwC,gBAARuxB,IAAoBh+B,KAAKm1B,QAAQ1oB,EAAOuxB,GAAM,CAErF,IAAK,GADD4G,MACKhmC,EAAI,EAAGqC,EAAI+8B,EAAIz/B,OAAY0C,EAAJrC,IAASA,EACrC,GAAIo/B,EAAIp/B,KAAO6N,EAAO,CAClB,GAAqB,mBAAV+hB,IAAyBA,KAAU,EAC1C,MAAO5vB,EAEPgmC,GAAMjmC,KAAKC,GAIvB,MAAOgmC,GAEX,OAAO,GAaXC,QAAS,SAAS7G,GACd,GAAoB,mBAAV,IAAyBA,EAAI0G,cAAgBljC,MAAS,OAAO,CAKvE,KAJA,GAAIgkB,GAAUwY,EAAIz/B,OACdumC,GAAU,EACVC,GAAU,EAEPvf,KACHuf,EAAa/2B,KAAKg3B,MAAMh3B,KAAKC,UAAYuX,EAAQ,IACjDsf,EAAa9G,EAAIxY,GACjBwY,EAAIxY,GAASwY,EAAI+G,GACjB/G,EAAI+G,GAASD,CAEjB,OAAO9G,IAiBXzK,QAAS,SAAS3F,EAAOpgB,EAAUvK,GAC/B,GAAIkhC,EAAW5Q,QACX,MAAO4Q,GAAW5Q,QAAQ9xB,KAAKmsB,EAAOpgB,EAAUvK,EAEpD,KAAK,GAAIrE,GAAI,EAAG0F,EAAMspB,EAAMrvB,SAAW,EAAO+F,EAAJ1F,EAASA,IAC/C4O,EAAS/L,KAAKwB,EAAS2qB,EAAMhvB,GAAIA,EAAGgvB,IAW5CqX,KAAM,WACFxS,EAASc,QAAQj2B,MAAMm1B,EAAU0R,EAAW9kC,MAAMoC,KAAKC,aAe3De,IAAK,SAAUmrB,EAAOsX,EAAOjiC,GACzB,GAAIkhC,EAAW1hC,IACX,MAAO0hC,GAAW1hC,IAAIhB,KAAKmsB,EAAOsX,EAAOjiC,EAG7C,KAAK,GADD23B,GAAS,GAAIp5B,OAAM8C,GACd1F,EAAI,EAAG0F,EAAMspB,EAAMrvB,SAAW,EAAO+F,EAAJ1F,EAASA,IAC/Cg8B,EAAOh8B,GAAKsmC,EAAMzjC,KAAKwB,EAAS2qB,EAAMhvB,GAAIA,EAAGgvB,EAEjD,OAAOgN,IAcXznB,OAAQ,SAAUya,EAAOruB,EAAM0D,GAC3B,GAAIkhC,EAAWhxB,OACX,MAAOgxB,GAAWhxB,OAAO1R,KAAKmsB,EAAOruB,EAAM0D,EAI/C,KAAK,GAFDkiC,MACAnyB,EAAM,KACDpU,EAAI,EAAG0F,EAAMspB,EAAMrvB,OAAY+F,EAAJ1F,EAASA,IACzCoU,EAAM4a,EAAMhvB,GACRW,EAAKkC,KAAKwB,EAAS+P,EAAKpU,EAAGgvB,IAC3BuX,EAASxmC,KAAKqU,EAGtB,OAAOmyB,IAeXC,KAAM,SAASpH,EAAK5/B,EAAI6E,GAEpB,GAAY,OAAR+6B,EACA,KAAM,IAAI/kB,WAAU,6BAGxB,IAAInX,GAAI0C,OAAOw5B,GACX15B,EAAMxC,EAAEvD,SAAW,CACvB,IAAkB,kBAAPH,GAAoB,KAAM,IAAI6a,WAAU,sCAEnD,KAAK,GAAIra,GAAI,EAAO0F,EAAJ1F,EAASA,IACrB,GAAIA,IAAKkD,IAAK1D,EAAGqD,KAAKwB,EAASnB,EAAElD,GAAIA,EAAGkD,GAAK,OAAO,CAGxD,QAAO,GAcXujC,UAAW,SAASC,EAAMC,GACtB,IAAKD,IAASC,GAAQD,YAAgB9jC,SAAU,GAAS+jC,YAAgB/jC,SAAU,EAC/E,QAIJ,KAAK,GADDgkC,MACK5mC,EAAI,EAAGZ,EAAIsnC,EAAK/mC,OAAUP,EAAFY,IAAOA,EACpC,IAAK,GAAIiiB,GAAI,EAAG4kB,EAAIF,EAAKhnC,OAAYknC,EAAJ5kB,IAASA,EAClCykB,EAAK1mC,KAAO2mC,EAAK1kB,IACjB2kB,EAAO7mC,KAAK2mC,EAAK1mC,GAK7B,OAAO4mC,IAaXE,QAAS,SAAS1H,GACd,MAAOmG,GAAW9kC,MAAMoC,KAAKu8B,MAAW,IAY5C2H,OAAQ,SAAS3H,GACb,IAAIx8B,MAAMhE,UAAUooC,YAAY,CAC5B,GAAIC,KAOJ,OALApT,GAASc,QAAQd,EAASiT,QAAQ1H,GAAM,SAASp/B,GACzC6zB,EAAS0C,QAAQv2B,EAAEinC,IACnBA,EAAOlnC,KAAKC,KAGbinC,EAEX,MAAOpT,GAAStf,OAAOsf,EAASiT,QAAQ1H,GAAM,SAAUx1B,EAAG5J,EAAGo/B,GAC9C,MAAOA,GAAI4H,YAAYp9B,KAAO5J,KAmBlD+lB,MAAO,QAASA,GAAMyd,EAAO7X,EAAMub,GAE1BA,IACDA,EAAO,EAGX,IAAIx7B,MACAiN,CAEJ,IAAIuuB,EAAO,EACP,IAAKvuB,EAAI6qB,EAAW7X,EAAJhT,EAAUA,GAAKuuB,EAC3Bx7B,EAAE3L,KAAK4Y,OAGX,KAAKA,EAAI6qB,EAAO7qB,EAAIgT,EAAMhT,GAAKuuB,EAC3Bx7B,EAAE3L,KAAK4Y,EAIf,OAAOjN,IAeXy7B,OAAQ,SAAS/H,EAAKuE,EAAK91B,GACvBuxB,EAAIrR,OAAO4V,EAAK,EAAG91B,IAevByF,OAAQ,SAAS8rB,EAAKl6B,EAAMkiC,GAGxB,IAAI,GAFAC,MAEIrnC,EAAI,EAAGsnC,EAAOlI,EAAIz/B,OAAY2nC,EAAJtnC,EAAUA,IACrCA,GAAKkF,GAAYA,EAAOkiC,EAAXpnC,GAIhBqnC,EAAOtnC,KAAKq/B,EAAIp/B,GAGpB,OAAOqnC,IAIf,OAAOxT,KCxdX50B,IAAIuD,aAAa,mBAAoB,OAAS,WAE1C,YA8BA,IAAI+kC,GAAS,SAAS7mB,EAAGC,GACrBvf,KAAK8E,KAAKwa,EAAGC,GAGjB4mB,GAAO3oC,WAEHsH,KAAM,SAASwa,EAAGC,GACdvf,KAAKb,MAASoY,EAAG,EAAGyD,EAAG,EAAGsE,EAAGA,EAAGC,EAAGA,IAGvC6mB,IAAK,SAASC,GACV,GAAIjqB,GAAGa,EAAMqpB,CACb,KAAKlqB,EAAI,EAAGA,EAAIiqB,EAAO9nC,SAAU6d,EAC7BkqB,EAAQD,EAAOjqB,IACXa,EAAOjd,KAAKumC,SAASvmC,KAAKb,KAAMmnC,EAAMhnB,EAAGgnB,EAAM/mB,MAC/C+mB,EAAMF,IAAMpmC,KAAKwmC,UAAUvpB,EAAMqpB,EAAMhnB,EAAGgnB,EAAM/mB,KAK5DgnB,SAAU,SAASpnC,EAAMmgB,EAAGC,GACxB,MAAIpgB,GAAKsnC,KACEzmC,KAAKumC,SAASpnC,EAAK0f,MAAOS,EAAGC,IAAMvf,KAAKumC,SAASpnC,EAAKunC,KAAMpnB,EAAGC,GAEhED,GAAKngB,EAAKmgB,GAAOC,GAAKpgB,EAAKogB,EAC1BpgB,EAGA,MAIfqnC,UAAW,SAASvpB,EAAMqC,EAAGC,GAIzB,MAHAtC,GAAKwpB,MAAO,EACZxpB,EAAKypB,MAAUnvB,EAAG0F,EAAK1F,EAAOyD,EAAGiC,EAAKjC,EAAIuE,EAAGD,EAAGrC,EAAKqC,EAAOC,EAAGtC,EAAKsC,EAAIA,GACxEtC,EAAK4B,OAAUtH,EAAG0F,EAAK1F,EAAI+H,EAAGtE,EAAGiC,EAAKjC,EAAOsE,EAAGrC,EAAKqC,EAAIA,EAAGC,EAAGA,GACxDtC,GAOf,IAAI0pB,GAAgB,YAEpBA,GAAcnpC,WAEV4oC,IAAK,SAASC,GACV,GAAIjqB,GAAGa,EAAMqpB,EAAOhiC,EAAM+hC,EAAO9nC,OAC7B+gB,EAAIhb,EAAM,EAAI+hC,EAAO,GAAG/mB,EAAI,EAC5BC,EAAIjb,EAAM,EAAI+hC,EAAO,GAAG9mB,EAAI,CAEhC,KADAvf,KAAKb,MAASoY,EAAG,EAAGyD,EAAG,EAAGsE,EAAGA,EAAGC,EAAGA,GAC9BnD,EAAI,EAAO9X,EAAJ8X,EAAUA,IAClBkqB,EAAQD,EAAOjqB,GAEXkqB,EAAMF,KADNnpB,EAAOjd,KAAKumC,SAASvmC,KAAKb,KAAMmnC,EAAMhnB,EAAGgnB,EAAM/mB,IACnCvf,KAAKwmC,UAAUvpB,EAAMqpB,EAAMhnB,EAAGgnB,EAAM/mB,GAGpCvf,KAAK4mC,SAASN,EAAMhnB,EAAGgnB,EAAM/mB,IAKrDgnB,SAAU,SAASpnC,EAAMmgB,EAAGC,GACxB,MAAIpgB,GAAKsnC,KACEzmC,KAAKumC,SAASpnC,EAAK0f,MAAOS,EAAGC,IAAMvf,KAAKumC,SAASpnC,EAAKunC,KAAMpnB,EAAGC,GAEhED,GAAKngB,EAAKmgB,GAAOC,GAAKpgB,EAAKogB,EAC1BpgB,EAGA,MAIfqnC,UAAW,SAASvpB,EAAMqC,EAAGC,GAIzB,MAHAtC,GAAKwpB,MAAO,EACZxpB,EAAKypB,MAAUnvB,EAAG0F,EAAK1F,EAAOyD,EAAGiC,EAAKjC,EAAIuE,EAAGD,EAAGrC,EAAKqC,EAAOC,EAAGtC,EAAKsC,EAAIA,GACxEtC,EAAK4B,OAAUtH,EAAG0F,EAAK1F,EAAI+H,EAAGtE,EAAGiC,EAAKjC,EAAOsE,EAAGrC,EAAKqC,EAAIA,EAAGC,EAAGA,GACxDtC,GAGX2pB,SAAU,SAAStnB,EAAGC,GAClB,GAAIsnB,GAAgBvnB,GAAKtf,KAAKb,KAAKmgB,EAC/BwnB,EAAgBvnB,GAAKvf,KAAKb,KAAKogB,EAE/BwnB,EAAkBD,GAAiB9mC,KAAKb,KAAKogB,GAAMvf,KAAKb,KAAKmgB,EAAIA,EACjE0nB,EAAkBH,GAAiB7mC,KAAKb,KAAKmgB,GAAMtf,KAAKb,KAAKogB,EAAIA,CAErE,OAAIwnB,GACO/mC,KAAKinC,UAAU3nB,EAAGC,GAEpBynB,EACEhnC,KAAKknC,SAAS5nB,EAAGC,GAEnBunB,EACE9mC,KAAKinC,UAAU3nB,EAAGC,GAEpBsnB,EACE7mC,KAAKknC,SAAS5nB,EAAGC,GAGjB,MAIf0nB,UAAW,SAAS3nB,EAAGC,GACnBvf,KAAKb,MACDsnC,MAAM,EACNlvB,EAAG,EACHyD,EAAG,EACHsE,EAAGtf,KAAKb,KAAKmgB,EAAIA,EACjBC,EAAGvf,KAAKb,KAAKogB,EACbmnB,KAAM1mC,KAAKb,KACX0f,OAAStH,EAAGvX,KAAKb,KAAKmgB,EAAGtE,EAAG,EAAGsE,EAAGA,EAAGC,EAAGvf,KAAKb,KAAKogB,GAEtD,IAAItC,EACJ,QAAIA,EAAOjd,KAAKumC,SAASvmC,KAAKb,KAAMmgB,EAAGC,IAC5Bvf,KAAKwmC,UAAUvpB,EAAMqC,EAAGC,GAGxB,MAIf2nB,SAAU,SAAS5nB,EAAGC,GAClBvf,KAAKb,MACDsnC,MAAM,EACNlvB,EAAG,EACHyD,EAAG,EACHsE,EAAGtf,KAAKb,KAAKmgB,EACbC,EAAGvf,KAAKb,KAAKogB,EAAIA,EACjBmnB,MAASnvB,EAAG,EAAGyD,EAAGhb,KAAKb,KAAKogB,EAAGD,EAAGtf,KAAKb,KAAKmgB,EAAGC,EAAGA,GAClDV,MAAO7e,KAAKb,KAEhB,IAAI8d,EACJ,QAAIA,EAAOjd,KAAKumC,SAASvmC,KAAKb,KAAMmgB,EAAGC,IAC5Bvf,KAAKwmC,UAAUvpB,EAAMqC,EAAGC,GAGxB,MAQnB,IAAI4nB,IACAl5B,OAAS,WAAa,MAAOD,MAAKC,SAAW,IAC7CqR,EAAS,SAAS7V,EAAGmN,GAAK,MAAOA,GAAE0I,EAAI7V,EAAE6V,GACzCC,EAAS,SAAS9V,EAAGmN,GAAK,MAAOA,GAAE2I,EAAI9V,EAAE8V,GACzC9V,EAAS,SAASA,EAAGmN,GAAK,MAAOA,GAAEwwB,KAAO39B,EAAE29B,MAC5CC,IAAS,SAAS59B,EAAGmN,GAAK,MAAO5I,MAAKq5B,IAAIzwB,EAAE0I,EAAG1I,EAAE2I,GAAKvR,KAAKq5B,IAAI59B,EAAE6V,EAAG7V,EAAE8V,IACtEwV,IAAS,SAAStrB,EAAGmN,GAAK,MAAO5I,MAAK+mB,IAAIne,EAAE0I,EAAG1I,EAAE2I,GAAKvR,KAAK+mB,IAAItrB,EAAE6V,EAAG7V,EAAE8V,IACtE+nB,OAAS,SAAS79B,EAAGmN,GAAK,MAAOuwB,GAAMI,MAAM99B,EAAGmN,GAAI,IAAK,OACzD4wB,MAAS,SAAS/9B,EAAGmN,GAAK,MAAOuwB,GAAMI,MAAM99B,EAAGmN,GAAI,IAAK,OACzDwwB,KAAS,SAAS39B,EAAGmN,GAAK,MAAOuwB,GAAMI,MAAM99B,EAAGmN,GAAI,IAAK,IAAK,OAC9D6wB,QAAS,SAASh+B,EAAGmN,GAAK,MAAOuwB,GAAMI,MAAM99B,EAAGmN,GAAI,MAAO,MAAO,IAAK,OACvE2wB,MAAS,SAAS99B,EAAGmN,EAAG8wB,GACpB,GAAIhP,GAAMtc,CACV,KAAKA,EAAI,EAAGA,EAAIsrB,EAASnpC,SAAU6d,EAE/B,GADAsc,EAAOyO,EAAOO,EAAStrB,IAAK3S,EAAGmN,GAClB,IAAT8hB,EACA,MAAOA,EAGf,OAAO,KAWX/uB,EAAW,WACb,OAAQ3J,KAAKsf,EAAG,MAAOtf,KAAKuf,GAAGjgB,KAAK,KAgBlCqoC,GAWAC,QAAS,SAASlqC,GACd,GAAIkB,GAAGqC,EAAG4mC,CAKV,KAAKjpC,EAAI,EAAGqC,EAAIvD,EAAE2oC,OAAO9nC,OAAY0C,EAAJrC,IAASA,EACtCipC,EAAKnqC,EAAE2oC,OAAOznC,GACP,QAAUipC,KACbA,EAAGT,KAAOS,EAAGvoB,EAAIuoB,EAAGtoB,EAO5B,IAAIuoB,GAASpqC,EAAE6b,WAAa,GAAI4sB,GAAOzoC,EAAE6b,WAAW,GAAI7b,EAAE6b,WAAW,IAAM,GAAIotB,EAE1EjpC,GAAEqqC,SAAUrqC,EAAEqqC,OAAS,WAE5BrqC,EAAE2oC,OAAOnF,KAAMiG,EAAOzpC,EAAEqqC,SAExBD,EAAO1B,IAAI1oC,EAAE2oC,OAEb,IAAI2B,IAASF,EAAO3oC,KAAKmgB,EAAGwoB,EAAO3oC,KAAKogB,GAKpC0oB,KACAC,IAEJ,KAAKtpC,EAAI,EAAGqC,EAAIvD,EAAE2oC,OAAO9nC,OAAY0C,EAAJrC,IAASA,EACtCipC,EAAKnqC,EAAE2oC,OAAOznC,GACVipC,EAAGzB,IACH6B,EAAOtpC,KAAKkpC,IAGZA,EAAGl+B,SAAWA,EACdu+B,EAASvpC,KAAKkpC,GAItB,IAAIT,GAAOY,EAAM,GAAKA,EAAM,GACxB5B,EAAM,CACV,KAAKxnC,EAAI,EAAGqC,EAAIgnC,EAAO1pC,OAAY0C,EAAJrC,IAASA,EACpCipC,EAAKI,EAAOrpC,GACZwnC,GAAOyB,EAAGT,IAGd,QACI7tB,WAAYyuB,EACZG,OAAY/B,EAAMgB,EAClBf,OAAY3oC,EAAE2oC,OACd4B,OAAYA,EACZC,SAAYA,IAOxB,OAAOP,KC5SX9pC,IAAIuD,aAAa,kBAAmB,OAAS,WACzC,YAKA,IAAIgnC,IAYA/tB,IAAK,SAASpQ,GAEV,GAAIo+B,GAAStrC,SAASsrC,SAAU,EAE5BC,IAEJ,IAAGD,EAAQ,CACPA,EAASA,EAAO3oC,QAAQ,GAAIwR,QAAO,KAAM,KAAM,IAE/C,IAAIq3B,GAAUF,EAAOppC,MAAM,KACvBupC,IACJ,IAAGD,EAAQhqC,OAAS,EAChB,IAAI,GAAIK,GAAE,EAAGA,EAAI2pC,EAAQhqC,OAAQK,IAC7B4pC,EAAQD,EAAQ3pC,GAAGK,MAAM,KACL,IAAjBupC,EAAMjqC,SACL+pC,EAAQE,EAAM,IAAMC,mBAAmBD,EAAM,IAIzD,IAAGv+B,EACC,MAA6B,mBAAnBq+B,GAAQr+B,GACPq+B,EAAQr+B,GAER,KAInB,MAAOq+B,IAkBXI,IAAK,SAASz+B,EAAMwC,EAAOk8B,EAASvpC,EAAMwpC,EAAQC,GAE9C,GAAIC,EACJ,KAAI7+B,GAAQwC,KAAQ,GAA0B,mBAAX,IAA4C,mBAAZ,GAC/D,OAAO,CAEPq8B,GAAQ7+B,EAAK,IAAIJ,mBAAmB4C,EAExC,IAAIs8B,IAAW,EACXC,GAAQ,EACRC,GAAU,EACVC,GAAU,CAEd,IAAGP,GAA+B,mBAAd,KAA8B/+B,MAAM++B,GAAU,CAC9D,GAAIQ,GAAQ,GAAIz+B,MACZ0+B,EAASr7B,SAAS4E,OAAOw2B,EAAME,WAAY,IAAuC,IAAhC12B,OAAO5E,SAAS46B,EAAS,KAE3EW,EAAQ,GAAI5+B,MAAK0+B,GACjBG,EAAgBD,EAAME,cAEtBv4B,EAAK,GAAIC,QAAO,4CACpBq4B,GAAgBA,EAAc7pC,QAAQuR,EAAI,cAE1C83B,EAAW,WAAWQ,MAKlBR,GAHmB,mBAAd,IAA8Bn/B,MAAM++B,IAA4C,IAAhCh2B,OAAO5E,SAAS46B,EAAS,KAGnE,wCAFA,EAOfK,GADD5pC,GAAyB,mBAAX,GACL,QAAQA,EAER,SAGTwpC,EACCK,EAAU,UAAUL,EACb,KAAKrpC,KAAKzC,OAAOqK,SAASsiC,YAIjCR,EAAU,UAAUnsC,OAAOqK,SAASsiC,UAIpCP,EADDL,GAA6B,mBAAb,GACLA,GAEA,EAGd9rC,SAASsrC,OAASS,EACd,KAAOC,EACP,KAAOC,GACNC,EAAU,KAAOA,EAAU,IAC5B,KAAOC,GAefh3B,OAAQ,SAASw3B,EAAYtqC,EAAMwpC,GAC/B,GAAIe,GAAc,EAElB3pC,MAAK0oC,IAAIgB,EAAY,UAAWC,EAAavqC,EAAMwpC,IAI3D,OAAOR,KC9IXvqC,IAAIuD,aAAa,gBAAiB,OAAS,WAEvC,YAKA,IAAIwoC,IAaAC,QAAS,SAAS/mB,GACd,GAAIgnB,IAAM,UAAW,YAAa,QAAS,QAAS,OAAQ,QAAS,QAAS,SAAU,WAAY,UAAW,WAAY,WAC3H,OAAOA,GAAGhnB,IAcdinB,QAAU,SAAUC,GAEhB,MAAKr3B,QAAQq3B,IAAoBA,EAAQ,GAErCC,QAAc,EACdC,IAAc,EACdC,UAAc,EACdC,IAAc,EACdC,QAAc,EACdC,IAAc,EACdC,MAAc,EACdC,IAAc,EACdC,KAAc,EACdC,IAAc,EACdC,MAAc,EACdC,IAAc,EACdC,MAAc,EACdC,IAAc,EACdC,OAAc,EACdC,IAAc,EACdC,SAAc,EACdvC,IAAc,EACdwC,QAAc,EACdjY,IAAc,EACdkY,SAAc,GACdC,IAAc,GACdC,SAAc,GACdC,IAAc,IACftB,EAAMj5B,gBAcbw6B,OAAQ,SAASzoB,GACb,GAAI0oB,IAAM,UAAW,UAAW,QAAS,SAAU,SAAU,QAAS,SACtE,OAAOA,GAAG1oB,IAcd2oB,OAAQ,SAAUC,GAEd,MAAK/4B,QAAQ+4B,IAAmBA,GAAQ,GAEpCC,QAAY,EACZC,IAAY,EACZC,QAAY,EACZC,IAAY,EACZC,OAAY,EACZC,IAAY,EACZC,OAAY,EACZC,IAAY,EACZC,MAAY,EACZC,IAAY,EACZC,SAAY,EACZC,MAAY,EACZC,QAAY,EACZC,IAAY,GACbd,EAAK36B,gBAeZ07B,aAAc,SAAS3C,EAAG4C,GACtB,GAAIC,EAqBJ,OAjBIA,GAFI,IAAL7C,GAAe,IAALA,GAAe,IAALA,GAAe,IAALA,GAAe,IAALA,GAAe,KAALA,GAAgB,KAALA,EAErD,GAEI,IAALA,GAAe,IAALA,GAAe,IAALA,GAAe,KAALA,EAE5B,GAIJ4C,EAAG,MAAM,GAAOA,EAAG,IAAI,GAAKA,EAAG,MAAM,EAE7B,GAIA,IAkBpBryB,IAAK,SAASuyB,EAAQC,IAEI,mBAAb,IAAuC,KAAXD,KACjCA,EAAS,QAIb,IAAIE,GAAUF,EAAO3tC,MAAM,IACvB4iC,EAAS,GAAIrgC,OAAMsrC,EAAQvuC,QAC3BwuC,EAAa,KACbC,CAGJA,GADkB,mBAAZ,GACG,GAAItiC,MAEJ,GAAIA,MADU,gBAAV,GACW,IAANmiC,EAEAA,EAKtB,KAAK,GAFDI,GAAYC,EAAWC,EAElBvuC,EAAI,EAAGA,EAAIkuC,EAAQvuC,OAAQK,IACjC,OAAOkuC,EAAQluC,IACV,IAAKmuC,GACDlL,EAAOjjC,GAAKkuC,EAAQluC,EAAE,GACtBA,GACA,MAIJ,KAAK,IACD,GAAIwuC,GAAQJ,EAAOK,SACnBxL,GAAOjjC,GAAMsiB,OAAOksB,GAAO7uC,OAAS,EAAK6uC,EAAQ,IAAMA,CACvD,MAEJ,KAAK,IACDvL,EAAOjjC,GAAKoB,KAAKurC,OAAOyB,EAAOM,UAAUh1B,UAAU,EAAG,EACtD,MAEJ,KAAK,IACDupB,EAAOjjC,GAAKouC,EAAOK,SACnB,MAEJ,KAAK,IACDxL,EAAOjjC,GAAKoB,KAAKurC,OAAOyB,EAAOM,SAC/B,MAEJ,KAAK,IACDzL,EAAOjjC,GAAKouC,EAAOM,UAAY,CAC/B,MAEJ,KAAK,IACD,GAAIrS,GAAW+R,EAAOK,UAClBE,GAAY,KAAM,KAAM,MACxBC,EAAW,EAGX3L,GAAOjjC,GADPq8B,GAAQ,IAAc,IAARA,EACF,MAEEuS,EAASD,EAASrsB,OAAO+Z,GAAMjkB,OAAO,IAAM,IAAM,EAAW,IAE/E,MAEJ,KAAK,IACD6qB,EAAOjjC,GAAKouC,EAAOM,QACnB,MAEJ,KAAK,IACDL,EAAaviC,KAAK+iC,IAAIT,EAAOU,cAAe,EAAG,GAC/CR,EAAYxiC,KAAK+iC,IAAIT,EAAOU,cAAeV,EAAOW,WAAYX,EAAOK,WACrExL,EAAOjjC,GAAKoP,KAAKg3B,OAAOkI,EAAYD,GAAc,MAClD,MAGJ,KAAK,IACD,GAAIW,GAAc,GAAIljC,MAAMsiC,EAAOU,cAAiB,EAAI,EACxDT,GAAaW,EAAYN,UAAY,CAErC,IAAIO,GAAO7/B,KAAKg3B,OAASgI,EAASY,GAAgB,MAA0B,EAE5E/L,GAAQjjC,GAAMoP,KAAK8/B,MAAQD,GAAS,EAAIZ,IAAiB,GAAM,CAC/D,MAIJ,KAAK,IACDpL,EAAOjjC,GAAKoB,KAAK6pC,QAAQmD,EAAOW,WAChC,MAEJ,KAAK,IACD,GAAII,GAAU7sB,OAAO8rB,EAAOW,WAAa,EACzC9L,GAAOjjC,GAAMmvC,EAAQxvC,OAAS,EAAKwvC,EAAU,IAAMA,CACnD,MAEJ,KAAK,IACDlM,EAAOjjC,GAAKoB,KAAK6pC,QAAQmD,EAAOW,YAAYr1B,UAAU,EAAE,EACxD,MAEJ,KAAK,IACDupB,EAAOjjC,GAAKouC,EAAOW,WAAa,CAChC,MAEJ,KAAK,IACD9L,EAAOjjC,GAAKoB,KAAKysC,aAAaO,EAAOW,WAAW,EAAEX,EAAOgB,UACzD,MAGJ,KAAK,IACD,GAAIC,GAASjB,EAAOU,aACpB7L,GAAOjjC,GAAMqvC,EAAS,GAAK,EAAWA,EAAS,KAAQ,EAAUA,EAAS,KAAO,GAAQ,CACzF,MAEJ,KAAK,IACD,KAAM,sBAEV,KAAK,IACDpM,EAAOjjC,GAAKouC,EAAOU,aACnB,MAEJ,KAAK,IACD7L,EAAOjjC,GAAKsiB,OAAO8rB,EAAOU,eAAep1B,UAAU,EACnD,MAGJ,KAAK,IACDupB,EAAOjjC,GAAMouC,EAAOkB,WAAa,GAAM,KAAO,IAC9C,MAEJ,KAAK,IACDrM,EAAOjjC,GAAMouC,EAAOkB,SAAW,GAAM,KAAO,IAC5C,MAEJ,KAAK,IACD,KAAM,sBAEV,KAAK,IACDf,EAASH,EAAOkB,WAChBrM,EAAOjjC,GAAgB,IAAVuuC,EAAgBA,EAAUA,EAAS,EAChD,MAEJ,KAAK,IACDtL,EAAOjjC,GAAKsiB,OAAO8rB,EAAOkB,WAC1B,MAEJ,KAAK,IACDf,EAASjsB,OAAO8rB,EAAOkB,YACvBf,EAAoB,IAAVA,EAAgBA,EAAUA,EAAS,GAC7CtL,EAAOjjC,GAAMuuC,EAAO5uC,OAAS,EAAK4uC,EAAS,IAAMA,CACjD,MAEJ,KAAK,IACDA,EAASjsB,OAAO8rB,EAAOkB,YACvBrM,EAAOjjC,GAAMuuC,EAAO5uC,OAAS,EAAK4uC,EAAS,IAAMA,CACjD,MAEJ,KAAK,IACD,GAAIgB,GAAYjtB,OAAO8rB,EAAOoB,aAC9BvM,GAAOjjC,GAAMuvC,EAAS5vC,OAAS,EAAK4vC,EAAW,IAAMA,CACrD,MAEJ,KAAK,IACD,GAAIE,GAAYntB,OAAO8rB,EAAOsB,aAC9BzM,GAAOjjC,GAAOyvC,EAAS9vC,OAAS,EAAK8vC,EAAW,IAAMA,CACtD,MAEJ,KAAK,IACD,KAAM,sBAKV,KAAK,IACD,KAAM,sBAEV,KAAK,IACDpB,EAAa,GAAIviC,MAAKsiC,EAAOU,cAAe,EAAG,GAC/C7L,EAAOjjC,GAAMouC,EAAOuB,sBAAwBtB,EAAWsB,oBAAuB,EAAM,CACpF,MAEJ,KAAK,IACD,GAAIC,GAAYxB,EAAOuB,oBACnBE,EAAYD,EAAY,EAC5BrB,GAASjsB,QAASstB,EAAYC,GAAa,GAAM,IAExB,MAArBtB,EAAOz5B,OAAO,KACdy5B,EAAS,IAAMA,GAGnBA,EAA4B,IAAlBA,EAAO5uC,OAAgB,EAAY4uC,EAAOztC,QAAQ,cAAe,SAC3EmiC,EAAOjjC,GAAMuuC,EAASsB,EAAY,GAClC,MAEJ,KAAK,IACD,KAAM,sBAEV,KAAK,IACD,KAAM,sBAEV,KAAK,IACD5M,EAAOjjC,GAAkC,GAA7BouC,EAAOuB,mBACnB,MAKJ,KAAK,IACD,KAAM,sBAEV,KAAK,IACD,GAAIG,GAAY1uC,KAAKurC,OAAOyB,EAAOM,UAAUt2B,OAAO,EAAG,GACnD23B,EAAc3uC,KAAK6pC,QAAQmD,EAAOW,YAAY32B,OAAO,EAAG,EAC5D6qB,GAAOjjC,GAAK8vC,EAAY,KAAO1B,EAAOK,UAAY,IAAMsB,EAAc3uC,KAAKqa,IAAI,aAAa2yB,EAC5F,MAEJ,KAAK,IACDnL,EAAOjjC,GAAKoP,KAAKg3B,MAAMgI,EAAOthC,UAAY,IAC1C,MAEJ,SACIm2B,EAAOjjC,GAAKkuC,EAAQluC,GAIhC,MAAOijC,GAAOviC,KAAK,KAgBnBopC,IAAM,SAAUkE,EAASgC,GACrB,GAAyB,mBAAbA,GAAZ,EACuB,mBAAXhC,IAAqC,KAAXA,KAAkBA,EAAS,QA4BjE,KAAM,GA1BFE,GAAUF,EAAO3tC,MAAM,IACvB4iC,EAAS,GAAIrgC,OAAOsrC,EAAQvuC,QAC5BwuC,EAAa,KACb8B,EAEAC,GACAC,KAAQ9sC,OACR+nC,MAAQ/nC,OACR+sC,IAAQ/sC,OACRgtC,KAAQhtC,OACRitC,KAAQjtC,OACRypC,KAAQzpC,OACRktC,KAAQltC,OACRmtC,MAAQntC,OACR8yB,IAAQ9yB,OACRotC,IAAQptC,OACRqtC,KAAQrtC,OACRstC,KAAQttC,OACRutC,MAAQvtC,OACRwtC,MAAQxtC,OACRytC,KAAQztC,QAGR8pB,EAAU,EAGJntB,EAAI,EAAGA,EAAIkuC,EAAQvuC,OAAQK,IACjC,OAAQkuC,EAASluC,IACb,IAAKmuC,GACDlL,EAAOjjC,GAAUkuC,EAASluC,EAAI,GAC9BA,GACA,MAGJ,KAAK,IACDijC,EAAQjjC,GAAS,WACjBkwC,EAASE,KAAUzjB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD8V,EAAQjjC,GAAS,aACjBkwC,EAASE,KAAUzjB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD8V,EAAQjjC,GAAS,cACjBkwC,EAASI,MAAU3jB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD8V,EAAOjjC,GAAU,gBACjBkwC,EAASI,MAAU3jB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD8V,EAAQjjC,GAAS,QACjBkwC,EAASI,MAAU3jB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD8V,EAAQjjC,GAAS,QACjBkwC,EAASI,MAAU3jB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD8V,EAAQjjC,GAAS,QACjB,MAEJ,KAAK,IACDijC,EAAQjjC,GAAS,aACjBkwC,EAASG,MAAU1jB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAGJ,KAAK,IACD8V,EAAQjjC,GAAS,aACjBkwC,EAASpD,MAAUngB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAGJ,KAAK,IACD8V,EAAQjjC,GAAS,gBACjBkwC,EAAS9E,OAAUze,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD8V,EAAQjjC,GAAS,WACjBkwC,EAAS9E,OAAUze,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD8V,EAAQjjC,GAAS,WACjBkwC,EAAS9E,OAAUze,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD8V,EAAQjjC,GAAS,aACjBkwC,EAAS9E,OAAUze,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD8V,EAAQjjC,GAAS,QACjB,MAGJ,KAAK,IACDijC,EAAQjjC,GAAS,UACjB,MAEJ,KAAK,IACD,KAAM,sBAEV,KAAK,IACDijC,EAAQjjC,GAAS,WACjBkwC,EAASC,MAAUxjB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD8V,EAAQjjC,GAAS,YACa,mBAAlBkwC,GAASC,MAA8D,MAAtCjC,EAASgC,EAASC,KAAKxjB,aAChEujB,EAASC,MAASxjB,SAAW3sB,EAAI+I,MAAQokB,KAE7C,MAGJ,KAAK,IACD8V,EAAQjjC,GAAS,UACjBkwC,EAASS,MAAUhkB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD8V,EAAQjjC,GAAS,UACjBkwC,EAASS,MAAUhkB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD,KAAM,sBAEV,KAAK,IACD8V,EAAQjjC,GAAS,aACjBkwC,EAASM,OAAU7jB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD8V,EAAQjjC,GAAS,aACjBkwC,EAASK,MAAU5jB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD8V,EAAQjjC,GAAS,WACjBkwC,EAASM,OAAU7jB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD8V,EAAQjjC,GAAS,WACjBkwC,EAASK,MAAU5jB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD8V,EAAQjjC,GAAS,WACjBkwC,EAAS/Z,KAAUxJ,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD8V,EAAQjjC,GAAS,WACjBkwC,EAASO,KAAU9jB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD,KAAM,sBAGV,KAAK,IACD,KAAM,sBAEV,KAAK,IACD8V,EAAOjjC,GAAU,KACjB,MAEJ,KAAK,IACDijC,EAAQjjC,GAAS,eACjBkwC,EAASW,OAAUlkB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD,KAAM,sBAEV,KAAK,IACD,KAAM,sBAEV,KAAK,IACD8V,EAAQjjC,GAAS,iBACjBkwC,EAASU,OAAUjkB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAGJ,KAAK,IACD,KAAM,sBAEV,KAAK,IACD8V,EAAQjjC,GAAS,wEACjBkwC,EAASY,MAAUnkB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,KAAK,IACD8V,EAAQjjC,GAAS,cACjBkwC,EAASY,MAAUnkB,SAAW3sB,EAAI+I,MAAQokB,IAC1C,MAEJ,SACI8V,EAAQjjC,GAASkuC,EAASluC,GAItC,GAAI+wC,GAAQ,GAAIz+B,QAAQ2wB,EAAOviC,KAAK,IAEpC,KAEI,GADAuvC,EAAQD,EAASjnC,MAAOgoC,IAClBd,EAAU,OAEpB,MAAQrmC,GAAM,OAEd,GAAIonC,GAA0C,mBAAnBd,GAASY,KAEhCG,EAA0C,mBAAnBf,GAASC,KAEhCe,EAA0C,mBAAnBhB,GAASG,KAEhCc,EAA0C,mBAAnBjB,GAASE,IAChCgB,EAA0C,mBAAnBlB,GAAS9E,MAChCiG,EAAiBD,GAAcD,EAC/BG,GAAiBF,GAAcD,EAE/BI,EAA0C,mBAAnBrB,GAASI,KAChCkB,EAA0C,mBAAnBtB,GAASpD,KAChC2E,EAAiBD,GAAaD,EAC9BG,GAAiBF,GAAaD,EAE9BI,EAAgBT,GAAaG,IAAkBJ,GAAaK,GAAgBG,IAAkBR,GAAaS,EAC3GE,IAAiBX,GAAcC,GAAcC,GAAaC,GAAeG,GAAcC,GAEvFK,EAA0C,mBAAnB3B,GAASM,OAAkD,mBAAlBN,GAASS,KACzEmB,EAA0C,mBAAnB5B,GAASK,KAChCwB,EAAgBF,GAAeC,EAE/BE,EAA0C,mBAAnB9B,GAAS/Z,IAChC8b,EAA0C,mBAAnB/B,GAASO,IAChCyB,EAA0C,mBAAnBhC,GAASQ,KAEhCyB,GAAiBP,GAAWG,EAC5BK,EAAgBD,GAAcH,EAE9BK,EAA0C,mBAAnBnC,GAASU,MAChC0B,EAA0C,mBAAnBpC,GAASW,MAEhCN,EACApa,CAEJ,IAAK6a,EAAgB,CACjB,GAA2C,MAAtC9C,EAASgC,EAASY,KAAKnkB,UACxB,MAAO,IAAI7gB,MAA0C,KAAnCmkC,EAAOC,EAASY,KAAK/nC,MAAQ,GAGnD,IAAIwpC,GAAQtC,EAAOC,EAASY,KAAK/nC,MAAQ,GAAIA,MAAO,wEAIpD,OAHAwnC,IAASgC,EAAO,KAASA,EAAO,GAAI9xC,MAAO,EAAI,GAC/C01B,GAASoc,EAAO,IAAQA,EAAO,GAAI9xC,MAAO,EAAI,GAAM8xC,EAAO,GAAI9xC,MAAO,IAAQ,IAAM,GAE7E,GAAIqL,MAAMymC,EAAO,GAAMnxC,KAAK+pC,QAASoH,EAAO,IAAQA,EAAO,GAAMhC,EAAQpa,EAAMoc,EAAO,IAGjG,GAAI3F,GAAK,GAAI9gC,MACTqkC,EACA/E,EACAgF,EACAK,EACAC,EACA8B,CAEJ,IAAMb,GAAeC,EAArB,CAEA,GAAKD,EAAa,CACd,GAAKV,EAAY,CACb,GAAInD,GAAKlB,EAAGkC,cAAiB,GAAK,EAClCqB,GAASF,EAAOC,EAASC,KAAKpnC,MAAQ,GACK,MAAtCmlC,EAASgC,EAASC,KAAKxjB,YACxBwjB,GAAQrC,EAAGrtC,MAAO,EAAI,IAAQ0vC,GAAQ,EAAO1vC,MAAO,GAAM,EAAI,GAAM0vC,OAGxEA,GAAOvD,EAAGkC,aAGd,IAAKoC,EACD9F,EAAQ,EACRgF,EAAQH,EAAOC,EAASG,KAAKtnC,MAAQ,OAClC,IAAKooC,EAEJ/F,EADCgG,EACOhwC,KAAK+pC,QAAS8E,EAAOC,EAAS9E,MAAMriC,MAAQ,IAE5C6jC,EAAGmC,WAGfqB,EAAMH,EAAOC,EAASE,IAAIrnC,MAAQ,OAC/B,CACHqiC,EAAQ,CAER,IAAI0B,EAEAA,GADC0E,EACMvB,EAAOC,EAASpD,KAAK/jC,MAAQ,GAE7B3H,KAAKqa,IAAK,IAAMmxB,GAG3BwD,EAAqB,GAAbtD,EAAO,IAAY,GAAM,GAAMhhC,MAAMqkC,EAAO,EAAI,GAAMzB,UAAa,IAAQttC,KAAKyrC,OAAQoD,EAAOC,EAASpD,KAAK/jC,MAAQ,IAGjI,GAAe,IAAVqiC,GAAegF,EAAM,GAAK,CAC3B,GAAIqC,GAAM,GAAI3mC,MAAMqkC,EAAO/E,EAAQgF,EACnChF,GAAUqH,EAAI1D,WACdqB,EAAUqC,EAAIhE,eAIlB0B,GAAQvD,EAAGkC,cACX1D,EAAQwB,EAAGmC,WACXqB,EAAQxD,EAAG6B,SAuBf,OApB0B8B,GAAhBsB,GAAwB5B,EAAOC,EAASM,MAAMznC,MAAQ,IAA6C,OAArCknC,EAAOC,EAASS,KAAK5nC,MAAQ,GAAe,GAAK,GAC/G+oC,EAAuB7B,EAAOC,EAASK,KAAKxnC,MAAQ,GACpD6oC,EAAuBhF,EAAG0C,WACH,KAEPnZ,EAAf6b,EAAsB/B,EAAOC,EAAS/Z,IAAIptB,MAAQ,GAClDopC,EACsB,KADAvF,EAAG4C,aAGViB,EAAfwB,EAAsBhC,EAAOC,EAASO,IAAI1nC,MAAQ,GAClDqpC,EACsB,KADAxF,EAAG8C,aAGVgB,EAAhBwB,EAAuBjC,EAAOC,EAASQ,KAAK3nC,MAAQ,GAC7B,MAEPypC,EAAhBF,EAAuBrC,EAAOC,EAASW,MAAM9nC,MAAQ,GACrDspC,EAAuB/vB,OAAQ,GAAK2tB,EAAOC,EAASU,MAAM7nC,MAAQ,GAAM,GAAK,KAAMjI,QAAS,QAAU,OAAQA,QAAS,mBAAqB,SACrH,QAE1B,GAAIgL,MAAMqkC,EAAM/E,EAAOgF,EAAKG,EAAMpa,EAAKsa,MAKtD,OAAOzF,KCxvBX/rC,IAAIuD,aAAa,kBAAmB,OAAS,WAEzC,YAMA,IAAIkwC,IAYAC,KAAM,OAWNC,aAAc,SAASC,GAEnB,GAAIC,GAAW,EAEf,cAAa,IACT,IAAK,SACDA,EAAW,YAAYD,CACvB,MACJ,KAAK,SACDC,EAAW,YAAYD,CACvB,MACJ,KAAK,UACDC,EAAW,aAAaD,CACxB,MACJ,KAAK,SAGOC,EAFK,OAAVD,EACIA,EAAM/M,cAAgBljC,MACV,cAAgBxB,KAAK2xC,cAAcF,EAAO,GAAK,MAE/C,eAAiBzxC,KAAK2xC,cAAcF,EAAO,GAAK,MAGpD,MAEf,MACJ,SACIC,GAAW,EAGnB,MAAOA,IAYXE,SAAU,SAASC,GAGf,IAAI,GADAC,GAAO,GACHC,EAAK,EAAQF,EAALE,EAAmBA,IAC/BD,GAAQ9xC,KAAKuxC,IAEjB,OAAOO,IAaXH,cAAe,SAASF,EAAOO,GAE3B,GAAIN,GAAW,GAEXO,GAAU,CACd,KAAI,GAAIlzC,KAAO0yC,GACX,GAAkB,OAAfA,EAAM1yC,GACL,GAA0B,gBAAhB0yC,GAAM1yC,IAAuB0yC,EAAM1yC,GAAK2lC,cAAgBljC,OAASiwC,EAAM1yC,GAAK2lC,cAAgBlgC,OAS/F,CAAA,GAAGitC,EAAM1yC,GAAK2lC,cAAgBnnC,SACjC,QAEAm0C,GAAWA,EAAW1xC,KAAKuxC,KAAOvxC,KAAK4xC,SAASI,GAAU,IAAMjzC,EAAM,QAAU0yC,EAAM1yC,GAAO,SAX1F0yC,GAAM1yC,GAAK2lC,cAAgBljC,MAC1BywC,EAAU,QACJR,EAAM1yC,GAAK2lC,cAAgBlgC,SACjCytC,EAAU,UAEdP,GAAY1xC,KAAKuxC,KAAOvxC,KAAK4xC,SAASI,GAAU,IAAMjzC,EAAM,WAAWkzC,EAAQ,SAC/EP,GAAY1xC,KAAKuxC,KAAOvxC,KAAK4xC,SAASI,GAAU,MAChDN,GAAY1xC,KAAK2xC,cAAcF,EAAM1yC,GAAMizC,EAAS,GAAKhyC,KAAKuxC,KAAOvxC,KAAK4xC,SAASI,GAAU,UAOjGN,GAAWA,EAAW1xC,KAAKuxC,KAAOvxC,KAAK4xC,SAASI,GAAU,IAAMjzC,EAAM,cAG9E,OAAO2yC,IAcXQ,UAAW,SAAST,EAAOxtB,GAGvB,GAAIA,GAA6B,mBAAb,GAGhB,GAAsB,gBAAb,GACLlnB,SAAS4G,eAAesgB,GAAQ/O,UAAY,QAAUlV,KAAKwxC,aAAaC,GAAS,aAC9E,CAAA,GAAsB,gBAAb,GAGZ,KAAM,4CAFNxtB,GAAO/O,UAAY,QAAQlV,KAAKwxC,aAAaC,GAAO,aALxD10C,UAASo1C,MAAM,QAAQnyC,KAAKwxC,aAAaC,GAAO,WAsBxDW,WAAY,SAASX,GAEjB,MAAOzxC,MAAKwxC,aAAaC,IAa7BY,UAAW,SAASZ,GAEhB30C,OAAOsU,MAAMpR,KAAKwxC,aAAaC,GAAO/xC,QAAQ,8BAA+B,QAajF4yC,WAAY,SAASb,GAEjB,GAAIc,GAAe,gBAAiC,IAAhBvkC,KAAKC,SACrCyY,EAAM5pB,OAAO8P,KAAK,GAClB2lC,EACA,0EAEJ7rB,GAAI3pB,SAAS6P,OACb8Z,EAAI3pB,SAASo1C,MAAM,QAAQnyC,KAAKwxC,aAAaC,GAAO,UACpD/qB,EAAI3pB,SAASy1C,QACb9rB,EAAIic,SAKZ,OAAO2O,KCzMXzzC,IAAIuD,aAAa,gBAAiB,OAAS,WACvC,YAEA,IAAIqxC,GAAY,kDAEZC,EAAY,SAAU9R,EAAMniC,GAC5B,MAAoB,kBAARmiC,GACDA,EAAItjC,MAAM0C,KAAMvB,GACDwD,eAAR2+B,GACPA,EAEA,IAgBX+R,EAAO,SAAUC,EAAOnQ,EAAOoQ,GAC/B,MAAQ7yC,gBAAgB2yC,OAExB3yC,MAAKgkC,QACAvB,KAAMA,GACNoQ,SAAUA,GACVC,OAAQF,MAAcnQ,GALe,GAAIkQ,GAAMC,EAAOnQ,EAAOoQ,GAuUtE,OA/TAF,GAAKn1C,WACDwmC,MAAO,WAMH,MALAhkC,MAAK+yC,UACL/yC,KAAKgzC,SACLhzC,KAAKizC,WAAY,EACjBjzC,KAAKkzC,MAAYlzC,KAAKmzC,OAEfnzC,MAWX8yC,OAAQ,SAAUF,GAKd,MAJA5yC,MAAK+yC,OAAOp0C,KAAMi0C,GAElB5yC,KAAKgzC,MAAQn1C,IAAIsG,UAAUnE,KAAKgzC,MAAQJ,EAAM5yC,KAAKkzC,QAE5ClzC,MAUXyiC,KAAM,SAAUA,GACZ,IAAM/gC,UAAUnD,OAAW,MAAOyB,MAAKkzC,KAEvC,IAAKzQ,GAAQziC,KAAKkzC,QAAUzQ,EAAO,CAC/BziC,KAAKkzC,MAAQzQ,EAEbziC,KAAKgzC,QAEL,KAAM,GAAIp0C,GAAI,EAAGqW,EAAIjV,KAAK+yC,OAAOx0C,OAAY0W,EAAJrW,EAAOA,IAC5CoB,KAAKgzC,MAAQn1C,IAAIsG,UAAWnE,KAAKgzC,MAAQhzC,KAAK+yC,OAAQn0C,GAAK6jC,QAInE,MAAOziC,OAWX6yC,SAAU,SAAUO,GAChB,MAAM1xC,WAAUnD,QAEK0D,SAAhBmxC,IAA+BpzC,KAAKizC,YAAcG,GAEhDpzC,QAJ6BA,KAAKizC,WAgB7CI,OAAQ,SAAUt0C,GACd,GAAI6hC,GACA0S,EAAQtzC,KAAKmzC,OACb1Q,EAAQziC,KAAKkzC,KAYjB,OAVKn0C,KAAOiB,MAAKgzC,MACbpS,EAAM5gC,KAAKgzC,MAAOj0C,IAElB4zC,EAAKY,WAAY9Q,GAEjB7B,EAAM5gC,KAAKwzC,OAAQz0C,GAEnB4zC,EAAKY,WAAYD,IAGd1S,GAmBX1jB,KAAM,SAAUjQ,GACZ,GAAoB,gBAARA,GAAZ,CAEA,GAAIwmC,GAAOjyC,MAAMhE,UAAU6B,MAAMoC,KAAMC,UAAY,GAC/C6gC,EAAM,EACNmR,EAA6B,gBAAdD,GAAM,GAErBloB,EAAWvrB,KAAKqzC,OAAQpmC,EAI5B,OAHkBhL,UAAbspB,IAA2BA,EAAWvrB,KAAKizC,UAAY,IAAMhmC,EAAM,IAAMA,GACrD,gBAAbse,KAA0BA,GAAY,IAE1B,gBAAbA,GACPA,EAAWA,EAAS7rB,QAAS+yC,EAAY,SAAU/vC,EAAI4Q,EAAKqgC,EAAKC,GAC7D,GAAIhT,GACAttB,EAAKA,EACLqgC,EAAKF,EAAME,GAAOD,EAAQ,EAAI,IAC9BE,EAAKH,EAAM,GAAKG,IAAQ,GACnBH,EAAOlR,MAAWmR,EAAQ,EAAI,GACvC,OAAOhB,GAAW9R,GAAO2B,GAAKn/B,OAAOqwC,MAMrB,kBAAbloB,GAA0BA,EAASjuB,MAAO0C,KAAOyzC,GACxDloB,YAAoB/pB,OAAakxC,EAAWnnB,EAAUkoB,EAAM,IAAQA,GAChD,gBAAbloB,GAA0BmnB,EAAWnnB,EAAUkoB,EAAM,IAAQA,GACnC,KAkBzCI,MAAO,SAAUC,EAASC,EAAUC,GAChC,GAAIP,GAAOjyC,MAAMhE,UAAU6B,MAAM/B,MAAOoE,WACpC6pB,CAEJ,IAAqB,IAAhBkoB,EAAKl1C,QAAmC,gBAAZw1C,GAAuB,CAEpD,GADAxoB,EAAWvrB,KAAKqzC,OAAQS,KAChBvoB,YAAoB/pB,QAAY,MAAO,EAE/CiyC,GAAK9mB,OAAQ,EAAI,GACjBpB,EAAWA,EAAsB,IAAZwoB,EAAgB,EAAI,OAEzCN,GAAK9mB,OAAQ,EAAI,GACjBpB,EAAqB,IAAVyoB,EAAcF,EAASC,CAGtC,OAAO/zC,MAAKkd,KAAK5f,MAAO0C,MAASurB,GAAWnoB,OAAQqwC,KAmBxDQ,QAAS,SAAUC,GACf,GAAajyC,SAARiyC,EAAsB,MAAO,EAElC,IAAIC,IAAWD,EAAIvqC,WAAYtK,MAAO,IAElC+0C,EAAWp0C,KAAKqzC,OAAQ,YAC5B;GAAiBpxC,SAAZmyC,EAA0B,MAAO,EAEtC,IAAwB,gBAAZA,GAAyB,MAAOA,EAE5C,IAAIxT,EAEJ,OAAwB,kBAAZwT,KACRxT,EAAMwT,EAASF,EAAMC,GAED,gBAARvT,IAA4BA,EAGvC,cAAgBwT,KACjBxT,EAAoC,kBAAvBwT,GAAQC,WAA4BD,EAAQC,WAAYH,EAAMC,GACrED,IAAOE,GAAQC,WAA4B3B,EAAW0B,EAAQC,WAAYH,IAASA,EAAMC,IAC9ClyC,OAE7B,gBAAR2+B,IAA4BA,EAGvC,eAAiBwT,KAClBxT,EAAqC,kBAAxBwT,GAAQE,YAA6BF,EAAQE,YAAaH,EAAUD,GAC3EC,IAAWC,GAAQE,YAAyB5B,EAAW0B,EAAQE,YAAaH,IAAaA,EAAUD,IACvDjyC,OAE9B,gBAAR2+B,IAA4BA,EAGvC,WAAawT,KACdxT,EAAM8R,EAAW0B,EAAQ,YAAeF,EAAMC,IAE1B,gBAARvT,IAA4BA,EAGrC,IAaX2T,MAAO,WACH,GAAI3T,GAAW/iC,IAAIkF,KAAM4vC,EAAKn1C,UAAU0f,KAAWld,KAMnD,OALA4gC,GAAIiT,MAAWh2C,IAAIkF,KAAM4vC,EAAKn1C,UAAUq2C,MAAW7zC,MACnD4gC,EAAIkS,OAAWj1C,IAAIkF,KAAM4vC,EAAKn1C,UAAUs1C,OAAW9yC,MACnD4gC,EAAIqT,QAAWp2C,IAAIkF,KAAM4vC,EAAKn1C,UAAUy2C,QAAWj0C,MACnD4gC,EAAIiS,SAAWh1C,IAAIkF,KAAM4vC,EAAKn1C,UAAUq1C,SAAW7yC,MAE5C4gC,IAYf+R,EAAK3O,MAAQ,WACT2O,EAAKn1C,UAAUg3C,WACf7B,EAAKn1C,UAAUg2C,UACfb,EAAKn1C,UAAU21C,OAAU,SAE7BR,EAAK3O,QAaL2O,EAAK8B,aAAe,SAAU7B,EAAOnQ,GACjC,GAAKA,EAAO,CACR,KAAQA,IAAQmQ,IAAS,CACrB,GAAIjgB,KAEJA,GAAK8P,GAASmQ,EAEdA,EAAOjgB,EAGN8P,IAASkQ,EAAKn1C,UAAU21C,QAAWR,EAAKY,WAAY9Q,GAG7DkQ,EAAKn1C,UAAUg3C,QAAQ71C,KAAMi0C,GAE7B/0C,IAAIsG,UAAWwuC,EAAKn1C,UAAUg2C,OAASZ,EAAMD,EAAKn1C,UAAU21C,UAahER,EAAKY,WAAa,SAAU9Q,GACxB,IAAM/gC,UAAUnD,OAAW,MAAOo0C,GAAKn1C,UAAU21C,MAEjD,IAAK1Q,GAAQkQ,EAAKn1C,UAAU21C,SAAW1Q,EAAO,CAC1CkQ,EAAKn1C,UAAU21C,OAAS1Q,EAExBkQ,EAAKn1C,UAAUg2C,SAEf,KAAM,GAAI50C,GAAI,EAAGqW,EAAI09B,EAAKn1C,UAAUg3C,QAAQj2C,OAAY0W,EAAJrW,EAAOA,IACvDf,IAAIsG,UAAWwuC,EAAKn1C,UAAUg2C,OAASb,EAAKn1C,UAAUg3C,QAAS51C,GAAK6jC,UAKzEkQ,ICnWX90C,IAAIuD,aAAa,gBAAiB,OAAS,WACvC,YAKA,SAASszC,WAAUt4B,GACf,GAAI9R,GAAI,GAAK8R,CACb,OAAiB,KAAb9R,EAAE/L,OACK,IAAM+L,EAENA,EARf,GAAIqqC,eAAgBp3C,SAASC,UAAUiE,KACnCmzC,GAAK,2GAWLC,gBAAkBnqC,KAAKlN,UAAUs3C,YACjCj3C,IAAIkF,KAAK4xC,cAAejqC,KAAKlN,UAAUs3C,aACvC,SAASpF,GAEL,MAAOA,GAAKqF,iBACR,IAAML,UAAWhF,EAAKsF,cAAgB,GACtC,IAAMN,UAAWhF,EAAKuF,cACtB,IAAMP,UAAWhF,EAAKwF,eACtB,IAAMR,UAAWhF,EAAKyF,iBACtB,IAAMT,UAAWhF,EAAK0F,iBACtB,IAAMl0B,QAASwuB,EAAK2F,qBAAqB,KAAMC,QAAQ,IAAKj2C,MAAO,EAAG,GACtE,KA+BRk2C,SACAC,YAAa14C,OAAOsQ,MAAQ,KAE5BqoC,mBAAmB,EAGnBC,QAAS,SAAUC,GACf,GAAI7L,IAAO8L,KAAM,MAAOC,IAAM,MAAOC,KAAM,MAAOC,KAAM,MAAOC,KAAM,MAAOC,IAAK,MAAQC,KAAM,OAa/F,OAXI,iBAAiB32C,KAAKo2C,KACtBA,EAAYA,EAAUj2C,QAAQ,oBAAqB,SAAS+J,EAAGmN,GAC3D,GAAIyF,GAAIytB,EAAGlzB,EACX,OAAIyF,GACOA,GAEXA,EAAIzF,EAAEu/B,aACC,QAAUnoC,KAAKg3B,MAAM3oB,EAAI,IAAI1S,SAAS,KAAO0S,EAAI,IAAI1S,SAAS,QAItEgsC,GAIXS,WAAY,SAAUT,GAElB,GAAI31C,KAAKy1C,kBAEF,CAMH,IALA,GAAIY,GAAgB,GAChBC,GAAQ,EACRC,GAAa,EACb33C,EAAI,EACJ4mB,EAAQmwB,EAAUp3C,OACZinB,EAAJ5mB,GAAW,CAEb,GADA03C,EAAQX,EAAUQ,WAAWv3C,GACxB03C,GAAS,IAAe,KAATA,GAIF,IAAVA,GACU,IAAVA,GACU,KAAVA,GACU,KAAVA,GACU,KAAVA,GACU,KAAVA,GACU,KAAVA,GACU,KAAVA,GACU,KAAVA,GACU,KAAVA,EAGAC,EADS,KAAVD,GAA0B,KAAVA,GAA0B,KAAVA,EAClB,KAAKX,EAAUjiC,OAAO9U,GACnB,IAAV03C,EACO,MACG,IAAVA,EACO,MACG,KAAVA,EACO,MACG,KAAVA,EACO,MACG,KAAVA,EACO,MAEAX,EAAUjiC,OAAO9U,OAGlC,IAAGoB,KAAKy1C,kBAAmB,CAEvB,IADAc,EAAaZ,EAAUQ,WAAWv3C,GAAG+K,SAAS,IAAI,GAAG4J,cAC9CgjC,EAAWh4C,OAAS,GACvBg4C,EAAa,IAAMA,CAEvBA,GAAa,MAAQA,MAErBA,GAAaZ,EAAUjiC,OAAO9U,EAGtCy3C,IAAiBE,EAEjB33C,IAGJ,MAAOy3C,GAvDP,MAAOr2C,MAAK01C,QAAQC,IA4D5Ba,gBAAiB,SAAS/E,GACtB,GAAqB,gBAAVA,GACP,MAAO,IAAMzxC,KAAKo2C,WAAW3E,GAAS,GACnC,IAAqB,gBAAVA,KAAuB7nC,MAAM6nC,IAAWgF,SAAShF,GAE5D,CAAA,GAAqB,mBAAVA,IAAmC,OAAVA,EACvC,MAAO,MACJ,IAA4B,kBAAjBA,GAAMiF,OAAuB,CAC3C,GAAI50C,GAAI2vC,EAAMiF,QACd,OAAiB,gBAAN50C,GACA,IAAM9B,KAAK01C,QAAQ5zC,GAAK,IAExB9B,KAAK01C,QAAQ5zC,EAAE6H,YAEvB,GAAqB,gBAAV8nC,IAAuC,iBAAVA,GAC3C,MAAO,GAAKA,CACT,IAAqB,kBAAVA,GACd,MAAO,MACJ,IAAIA,EAAM/M,cAAgBh6B,KAC7B,MAAO,IAAM1K,KAAK01C,QAAQb,gBAAgBpD,IAAU,GACjD,IAAIA,EAAM/M,cAAgBljC,MAAO,CAEpC,IAAK,GADDm1C,GAAc,GACT/3C,EAAI,EAAG0F,EAAMmtC,EAAMlzC,OAAY+F,EAAJ1F,EAASA,IACrCA,EAAI,IACJ+3C,GAAe,KAEnBA,GAAe32C,KAAKw2C,gBAAgB/E,EAAM7yC,GAE9C,OAAO,IAAM+3C,EAAc,IAE3B,GAAIC,GAAe,EACnB,KAAK,GAAIj5C,KAAK8zC,QACH7zC,eAAe6D,KAAKgwC,EAAO9zC,KACT,KAAjBi5C,IACAA,GAAgB,KAEpBA,GAAgB,IAAM52C,KAAK01C,QAAQ/3C,GAAK,MAAQqC,KAAKw2C,gBAAgB/E,EAAM9zC,IAGnF,OAAO,IAAMi5C,EAAe,IAnC5B,MAAO,QAiDfC,UAAW,SAAS5hB,EAAO6hB,GAEvB,MADA92C,MAAKy1C,oBAAsBqB,GACvB92C,KAAKy1C,mBAAqBz1C,KAAKw1C,YACxBx1C,KAAKw1C,YAAYqB,UAAU5hB,GAE/Bj1B,KAAKw2C,gBAAgBvhB,IAehC5nB,MAAO,SAAU6P,KAAM65B,SAQnB,QAASC,MAAKC,EAAQl4C,GAKlB,GAAIpB,GAAGu5C,EAAGzqC,EAAQwqC,EAAOl4C,EACzB,IAAI0N,GAA0B,gBAAVA,GAChB,IAAK9O,IAAK8O,GACFjI,OAAOhH,UAAUI,eAAe6D,KAAKgL,EAAO9O,KAC5Cu5C,EAAIF,KAAKvqC,EAAO9O,GACNsE,SAANi1C,EACAzqC,EAAM9O,GAAKu5C,QAEJzqC,GAAM9O,GAK7B,OAAOo5C,SAAQt1C,KAAKw1C,EAAQl4C,EAAK0N,GApBrC,GAAIoU,EAkDJ,IAtBA3D,KAAOgE,OAAOhE,MACd03B,GAAGuC,UAAY,EACXvC,GAAGr1C,KAAK2d,QACRA,KAAOA,KAAKxd,QAAQk1C,GAAI,SAAUnrC,GAC9B,MAAO,OACF,OAASA,EAAE0sC,WAAW,GAAGxsC,SAAS,KAAKtK,MAAM,OAiBtD,gBACKE,KAAK2d,KAAKxd,QAAQ,sCAAuC,KACrDA,QAAQ,mEAAoE,KAC5EA,QAAQ,uBAAwB,KAYzC,MALAmhB,GAAIvT,KAAK,IAAM4P,KAAO,KAKI,kBAAZ65B,SACVC,MAAM,GAAIn2B,GAAI,IACdA,CAKR,MAAM,IAAIu2B,aAAY,eAI9B,OAAO7B,WC3SX13C,IAAIuD,aAAa,kBAAmB,OAAS,WAEzC,YAKA,IAAIi2C,gBAWAC,QAAS,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IACzC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IACxC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IACxC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IACxC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IACxC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAK,IAAI,IACzC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IACxC,IAAI,IAAO,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAC3C,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAWpCC,WAAY,MAAM,SAAS,SAAS,QAAQ,SAAS,OAAO,QAChD,QAAQ,SAAS,SAAS,SAAS,QAAQ,OAAO,SAClD,SAAS,QAAQ,OAAO,MAAM,SAAS,SAAS,SAChD,QAAQ,SAAS,OAAO,SAAS,SAAS,SAAS,QACnD,OAAO,SAAS,QAAQ,OAAO,SAAS,SAAS,QACjD,SAAS,OAAO,QAAQ,QAAQ,SAAS,SAAS,SAClD,QAAQ,OAAO,SAAS,SAAS,QAAQ,OAAO,MAAM,SACtD,SAAS,SAAS,QAAQ,SAAS,OAAO,SAAS,SACnD,SAAS,QAAQ,OAAO,SAAS,QAAQ,OAAO,OAAO,QACvD,KAAK,KAAK,OAAO,QAAQ,SAAS,MAAM,SAAS,OAAO,MACxD,OAAO,OAAO,QAAQ,MAAM,MAAM,MAAM,OAAO,MAAM,SACrD,OAAO,OAAO,QAAQ,QAAQ,OAAO,SAAS,QAAQ,OACtD,OAAO,QAAQ,SAAS,SAAS,UAW7CC,gBAAgB,IAAI,IAAI,IAAI,IAAI,IAAI,IACpB,IAAI,IAAI,IAAI,IACZ,IAAI,IAAI,IAAI,IACZ,IAAI,IAAI,IAAI,IAAI,IAChB,IAAI,IAAI,IAAI,IACZ,IAAI,IACJ,IAAI,IAAI,IAAI,IAAI,IAAI,IACpB,IAAI,IAAI,IAAI,IACZ,IAAI,IAAI,IAAI,IACZ,IAAI,IAAI,IAAI,IAAI,IAChB,IAAI,IAAI,IAAI,IACZ,IAAI,KAWpBC,uBAAuB,IAAI,IAAI,IAAI,IAAI,IAAI,IACpB,IAAI,IAAI,IAAI,IACZ,IAAI,IAAI,IAAI,IACZ,IAAI,IAAI,IAAI,IAAI,IAChB,IAAI,IAAI,IAAI,IACZ,IAAI,IACJ,IAAI,IAAI,IAAI,IAAI,IAAI,IACpB,IAAI,IAAI,IAAI,IACZ,IAAI,IAAI,IAAI,IACZ,IAAI,IAAI,IAAI,IAAI,IAChB,IAAI,IAAI,IAAI,IACZ,IAAI,KAU3BC,kBAAkBC,IAAI,OAAOtW,IAAI,OAAOuW,IAAI,QAAQ3B,IAAI,SAAS4B,IAAI,UAcrEC,QAAS,SAASC,EAAQC,GACtB,GAAIC,GAAWD,EAAgB,qBAAuB,qBACtD,OAAOD,GAAS72B,OAAO62B,GAAQr4C,QAAQu4C,EAAU,SAAS5kC,EAAGC,EAAIqgC,EAAIC,GACjE,MAAOtgC,GAAKqgC,EAAGpgC,cAAgBqgC,EAAG7iC,gBACjCgnC,GAaT32B,KAAM,SAAS22B,GAEX,MAAsB,gBAAXA,GACAA,EAAOr4C,QAAQ,kBAAmB,IAEtCq4C,GAcXG,UAAW,SAASH,EAAQI,GAExB,GAAIA,GAA8B,gBAAZA,GAAsB,CAIxC,IAAI,GAHAC,GAAWf,cAAcj2B,KAAK+2B,GAASl5C,MAAM,KAC7Co5C,KACAC,GAAa,EACT15C,EAAE,EAAGA,EAAIw5C,EAAS75C,OAAQK,IACS,KAApCy4C,cAAcj2B,KAAKg3B,EAASx5C,MAC3B05C,EAAajB,cAAcj2B,KAAKg3B,EAASx5C,GAAGc,QAAQ,UAAW,IAAIA,QAAQ,KAAM,KACjF24C,EAAY15C,KAAK,KAAK25C,EAAW,kCAAkCA,EAAW,MAQtF,KAAI,GALAC,GAAaF,EAAY/4C,KAAK,KAC9Bk5C,EAAY,GAAItnC,QAAOqnC,EAAY,KAEnCE,EAAaV,EAAOpwC,MAAM,GAAIuJ,QAAO,UAAW,MAE5C2P,EAAE,EAAGA,EAAI43B,EAAWl6C,OAAQsiB,IAC5B43B,EAAW53B,GAAGlZ,MAAM6wC,KACpBT,EAASA,EAAOr4C,QAAQ,GAAKwR,QAAOunC,EAAW53B,GAAI,MAAQ,IAGnE,OAAOk3B,GAEP,MAAOA,GAAOr4C,QAAQ,aAAc,KAc5Cg5C,mBAAoB,SAASX,GAEzB,GAAIA,GAAUA,EAAOr4C,QAEjB,IAAK,GADDuR,IAAK,EACArS,EAAI,EAAGA,EAAIy4C,cAAcC,OAAO/4C,OAAQK,IAC7CqS,EAAK,GAAIC,QAAOmmC,cAAcC,OAAO14C,GAAI,MACzCm5C,EAASA,EAAOr4C,QAAQuR,EAAI,IAAMomC,cAAcE,UAAU34C,GAAK,IAGvE,OAAOm5C,IAaXY,mBAAoB,SAASZ,GAEzB,GAAIA,GAAUA,EAAOr4C,QAAS,CAE1B,IAAK,GADDuR,IAAK,EACArS,EAAI,EAAGA,EAAIy4C,cAAcE,UAAUh5C,OAAQK,IAChDqS,EAAK,GAAIC,QAAO,IAAImmC,cAAcE,UAAU34C,GAAG,IAAK,MACpDm5C,EAASA,EAAOr4C,QAAQuR,EAAIomC,cAAcC,OAAO14C,GAErDm5C,GAASA,EAAOr4C,QAAQ,aAAc,SAASk5C,GAC3C,MACW13B,QAAOoR,aADG,MAAjBsmB,EAAGllC,OAAO,GACiB3F,SAAS6qC,EAAGtgC,UAAU,GAAI,IAG1BvK,SAAS6qC,EAAGtgC,UAAU,GAAI,OAIjE,MAAOy/B,IAYXc,WAAY,SAASd,GAEjBA,EAASA,EAAOr4C,QAAQ,QAAQ,KAGhC,KAAK,GAFDo5C,GAAY,GAEP18B,EAAI,EAAGA,EAAI27B,EAAOx5C,OAAQ6d,IAAK,CAEpC,GAAIC,GAAI07B,EAAO5B,WAAW/5B,EAElB,KAAJC,EACAy8B,GAAa53B,OAAOoR,aAAajW,GAE5BA,EAAI,KAAa,KAAJA,GAClBy8B,GAAa53B,OAAOoR,aAAcjW,GAAK,EAAK,KAC5Cy8B,GAAa53B,OAAOoR,aAAkB,GAAJjW,EAAU,OAG5Cy8B,GAAa53B,OAAOoR,aAAcjW,GAAK,GAAM,KAC7Cy8B,GAAa53B,OAAOoR,aAAejW,GAAK,EAAK,GAAM,KACnDy8B,GAAa53B,OAAOoR,aAAkB,GAAJjW,EAAU,MAIpD,MAAOy8B,IAcXC,YAAa,SAAS9rC,EAAImP,GAGxB,IAAI,GAFA48B,GAAQ/rC,EAAIhO,MAAM,KAClBg6C,EAAY,GACRr6C,EAAI,EAAGA,EAAIo6C,EAAMz6C,OAAQK,IAAK,CACpC,IAAIq6C,EAAYD,EAAMp6C,GAAK,KAAKL,QAAQ6d,EAAE,CACxC68B,GAAa,UACb,OAEFA,GAAaD,EAAMp6C,GAAK,IAE1B,MAAOq6C,IAcTC,eAAgB,SAASjsC,EAAK1O,GAC1B,MAAG0O,GAAI1O,OAAS,EAAIA,EACT0O,EAAI+J,OAAO,EAAGzY,EAAS,GAAK,IAE5B0O,GAafksC,WAAY,SAASpB,GAKjB,IAHA,GAAInX,GAAM,GACNhiC,EAAI,EAAGyd,EAAI,EAAG+8B,EAAK,EAAGC,EAAK,EAEvBz6C,EAAIm5C,EAAOx5C,QAEf8d,EAAI07B,EAAO5B,WAAWv3C,GAEd,IAAJyd,GACAukB,GAAO1f,OAAOoR,aAAajW,GAC3Bzd,KAEKyd,EAAI,KAAa,IAAJA,GAClB+8B,EAAKrB,EAAO5B,WAAWv3C,EAAE,GACzBgiC,GAAO1f,OAAOoR,cAAmB,GAAJjW,IAAW,EAAW,GAAL+8B,GAC9Cx6C,GAAK,IAGLw6C,EAAKrB,EAAO5B,WAAWv3C,EAAE,GACzBy6C,EAAKtB,EAAO5B,WAAWv3C,EAAE,GACzBgiC,GAAO1f,OAAOoR,cAAmB,GAAJjW,IAAW,IAAa,GAAL+8B,IAAY,EAAW,GAALC,GAClEz6C,GAAK,EAIb,OAAOgiC,IAaX0Y,oBAAqB,SAASvB,GAI1B,IAAK,GAFDwB,GAAYxB,EACZ9mC,GAAK,EACArS,EAAI,EAAGA,EAAIy4C,cAAcG,eAAej5C,OAAQK,IACrDqS,EAAK,GAAIC,QAAOmmC,cAAcG,eAAe54C,GAAI,MACjD26C,EAAYA,EAAU75C,QAAQuR,EAAI,GAAKomC,cAAcI,sBAAsB74C,GAE/E,OAAO26C,IAcXC,YAAa,SAASC,EAASC,GAE3B,MAAOD,GAAWA,EAASx6C,MAAMy6C,GAAQn7C,OAAS,EAAI,GAa1DyN,SAAU,SAASkB,QAASC,UAExB,GAAyB,mBAAbA,WAAyC,OAAbA,UAAsBkqC,cAAcrqC,OAAOE,SAC/E,IACI,MAAoB,mBAAX,OAAiD,mBAAhBE,MAAU,MACzCA,KAAKC,MAAMH,SAEfI,KAAK,IAAIJ,QAAQ,KAC1B,MAAM1E,GACJ,KAAM,IAAIvI,OAAM,+BAc5B+M,OAAQ,SAASC,GAGb,MADAA,GAAMA,EAAIvN,QAAQ,OAAQ,KAAKA,QAAQ,iBAAkB,IAClD,uCAAyCH,KAAK0N,IAazD0sC,iBAAkB,SAAS1sC,GACvB,GAAI2sC,GAAQvC,cAAcK,gBAC1B,OAAe,QAARzqC,EAAeiU,OAAOjU,GAAKvN,QAAQ,WAAW,SAAS2c,GAAG,MAAOu9B,GAAMv9B,KAAQpP,GAc1F4sC,oBAAqB,SAAS5sC,GAC1B,MAAe,QAARA,EAAeoqC,cAAcj2B,KAAKF,OAAOjU,GAAKvN,QAAQ,OAAO,MAAQuN,GAahF6sC,UAAW,SAAS7sC,GAChB,GAAmB,gBAARA,GAAkB,CAOzB,IANA,GAAIopC,GAAgB,GAChBC,GAAQ,EACRC,GAAa,EACb/wB,EAAQvY,EAAI1O,OACZK,EAAE,EAEI4mB,EAAJ5mB,GACN,CAEI,GADA03C,EAAQrpC,EAAIkpC,WAAWv3C,GAClB03C,GAAS,IAAe,KAATA,GACF,IAAVA,GACU,IAAVA,GACU,KAAVA,GACU,KAAVA,GACU,KAAVA,GACU,KAAVA,GACU,KAAVA,GACU,KAAVA,GACU,KAAVA,GACU,KAAVA,EASAC,EADS,IAAVD,EACc,MACG,IAAVA,EACO,MACG,KAAVA,EACO,MACG,KAAVA,EACO,MACG,KAAVA,EACO,MAEArpC,EAAIyG,OAAO9U,OAEzB,CAEH,IADA23C,EAAatpC,EAAIkpC,WAAWv3C,GAAG+K,SAAS,IAAI,GAAG4J,cACxCgjC,EAAWh4C,OAAS,GACvBg4C,EAAa,IAAMA,CAEvBA,GAAa,MAAQA,EAEzBF,GAAiBE,EAEjB33C,IAEJ,MAAOy3C,KAcfzlC,OAAQ,SAASyL,GACb,GAAItF,GAAM,EAAIo/B,WAAW,GAAGxsC,SAAS,IAAI1K,MAAM,GAC/C,IAAI8X,EAAIxY,OAAS,EAAG,CAChB,KAAOwY,EAAIxY,OAAS,GAAKwY,EAAIvU,QAAQ,IACrCuU,GAAIvU,QAAQ,SAEX,CACD,KAAOuU,EAAIxY,OAAS,GAAKwY,EAAIvU,QAAQ,IACrCuU,GAAIvU,QAAQ,KAIhB,MADAuU,GAAIvU,QAAQ,MACLuU,EAAIzX,KAAK,KAapBy6C,SAAU,SAASC,GACf,GAAIzX,GAAMyX,EAAGpU,YAAY,IACzBrD,GAAc,KAARA,EAAa,EAAIv0B,KAAK+mB,IAAIwN,EAAK,EAErC,IAAI0X,GAASD,EAAG1hC,UAAUiqB,GAEtB2R,EAAMnmC,SAASksC,EAAQ,GAC3B,OAAO/4B,QAAOoR,aAAa4hB,IAc/BgG,WAAY,SAASC,EAAKC,GACJn4C,SAAdm4C,IACAA,GAAa,IAAK,IAAK,IAAM,KAIjC,KAAK,GAFDC,MACAh+B,EAAGi+B,EACE17C,EAAI,EAAGqC,EAAIk5C,EAAI57C,OAAY0C,EAAJrC,IAASA,EACrCyd,EAAI89B,EAAIv7C,GACR07C,EAAIj+B,EAAE85B,WAAW,IACT,GAAJmE,GAAUA,EAAI,KAAgC,KAAzBF,EAAUt6C,QAAQuc,MACvCA,EAAIg7B,cAAczmC,OAAOyL,IAE7Bg+B,EAAK17C,KAAK0d,EAEd,OAAOg+B,GAAK/6C,KAAK,KAYrBi7C,iBAAkB,2CAYlBC,aAAc,SAASL,GAGnB,IADA,GAAIz3C,GACGA,EAAI20C,cAAckD,iBAAiB3iB,KAAKuiB,IAC3Cz3C,EAAIA,EAAE,GACNy3C,EAAMA,EAAIz6C,QAAQgD,EAAG20C,cAAc0C,SAASr3C,IAC5C20C,cAAckD,iBAAiBpD,UAAY,CAE/C,OAAOgD,IAcXM,OAAQ,SAASC,EAAMC,GACnB,MAASD,KAASC,EAAQ,EAAMD,EAAOC,EAAQ,EAAI,IAcvDC,UAAW,SAAS3tC,EAAK4tC,GAKrB,IAJA,GAAIv2C,GAAM2I,EAAI1O,OACVmQ,EAAQ,GAAIlN,OAAOwM,KAAK8/B,KAAKxpC,EAAMu2C,IACnCjB,EAAQ3sC,EAAIhO,MAAM,IAClB67C,EAAIl8C,EAAI,EACL0F,GACHw2C,EAAK9sC,KAAK+mB,IAAI8lB,EAAQv2C,GACtBoK,EAAM9P,KAAOg7C,EAAMjtB,OAAO,EAAGmuB,GAAIx7C,KAAK,IACtCgF,GAAOw2C,CAEX,OAAOpsC,IAIf,OAAO2oC,iBC3pBXx5C,IAAIuD,aAAa,eAAgB,OAAS,WAEtC,YAKA,IAAI25C,IAUAC,QAAU,oEAYVC,OAAQ,WAEJ,MAAOn+C,QAAOqK,SAASO,MAc3BwzC,eAAgB,SAASt7C,EAAK8J,GAC1B,GAAI4E,GAAuC,KAArB1O,EAAIE,QAAQ,KAC9ByO,EAAKC,EAAMC,EAAQC,GAAS9O,EAEhC,KAAK4O,IAAQ9E,GACLA,EAAO9L,eAAe4Q,KACjBF,EAIDC,EAAM,KAHNA,EAAM,IACND,GAAkB,GAItBG,EAAS/E,EAAO8E,GACM,gBAAXC,IAAwBA,IAC/BA,EAAS,IAEbC,EAAQA,EAAMtL,QAAQmL,EAAK1E,mBAAmB2E,GAAO,IAAK3E,mBAAmB4E,KAIrF,OAAOC,GAAMpP,KAAK,KAatB67C,eAAgB,SAASluC,GAErB,GAAIrI,EAEAA,GADDqI,GAAuB,mBAAV,GACNA,EAEAjN,KAAKi7C,QAEf,IAAIG,KACJ,IAAGx2C,EAAI+C,MAAM,WAAY,CACrB,GAAI0zC,GAAWz2C,EAAIlF,QAAQ,4BAA6B,KACxD,IAAG27C,EAAS98C,OAAS,EAEjB,IAAI,GADA+8C,GAAYD,EAASp8C,MAAM,QACvBL,EAAE,EAAGA,EAAI08C,EAAU/8C,OAAQK,IAAK,CACpC,GAAI28C,GAAUD,EAAU18C,GAAGK,MAAM,IACjCm8C,GAAQ3S,mBAAmB8S,EAAQ,KAA+B,mBAAhBA,GAAQ,IAAuBA,EAAQ,GAAM9S,mBAAmB8S,EAAQ,KAAM,GAI5I,MAAOH,IAaXI,UAAW,SAASvuC,GAEhB,GAAIrI,EAEAA,GADDqI,GAAuB,mBAAV,GACNA,EAEAjN,KAAKi7C,QAEf,IAAIQ,IAAS,CAIb,OAHG72C,GAAI+C,MAAM,WACT8zC,EAAS72C,EAAIlF,QAAQ,eAAgB,OAElC+7C,GAaXC,gBAAiB,SAAS3D,GAEtB,GAAInzC,EAEAA,GADDmzC,GAA6B,mBAAb,GACTA,EAEA/3C,KAAKi7C,QAEf,IAAIG,KACJ,IAAGx2C,EAAI+C,MAAM,UAAW,CACpB,GAAIg0C,GAAY/2C,EAAIlF,QAAQ,kBAAmB,KAC/C,IAAGi8C,EAAUp9C,OAAS,EAElB,IAAI,GADAq9C,GAAaD,EAAU18C,MAAM,QACzBL,EAAE,EAAGA,EAAIg9C,EAAWr9C,OAAQK,IAAK,CACrC,GAAI28C,GAAUK,EAAWh9C,GAAGK,MAAM,IAClCm8C,GAAQ3S,mBAAmB8S,EAAQ,KAA+B,mBAAhBA,GAAQ,IAAuBA,EAAQ,GAAM9S,mBAAmB8S,EAAQ,KAAM,GAI5I,MAAOH,IAcXS,SAAU,SAASj3C,GACf,GAAIk3C,KACJ,IAAGl3C,GAAsB,gBAARA,GAAkB,CAC/B,GAAGA,EAAI+C,MAAM,kBAAmB,CAC5B,GAAIsJ,GAAK,oDACNrM,GAAI+C,MAAMsJ,KACT6qC,EAAKC,OAAWn3C,EAAIlF,QAAQuR,EAAI,MAChC6qC,EAAKE,KAAWp3C,EAAIlF,QAAQuR,EAAI,MAChC6qC,EAAK18C,KAAW,IAAIwF,EAAIlF,QAAQuR,EAAI,MACpC6qC,EAAKG,MAAWr3C,EAAIlF,QAAQuR,EAAI,QAAS,EACzC6qC,EAAKh3B,SAAWlgB,EAAIlF,QAAQuR,EAAI,QAAS,OAE1C,CACH,GAAIirC,GAAM,GAAIhrC,QAAO,4BAA6B,KAC9CirC,EAAM,GAAIjrC,QAAO,yBAA0B,KAC3CkrC,EAAM,GAAIlrC,QAAO,iBAAkB,IACpCtM,GAAI+C,MAAMu0C,IACTJ,EAAKC,QAAW,EAChBD,EAAKE,MAAW,EAChBF,EAAK18C,KAAWwF,EAAIlF,QAAQw8C,EAAK,MACjCJ,EAAKG,MAAWr3C,EAAIlF,QAAQw8C,EAAK,MACjCJ,EAAKh3B,SAAWlgB,EAAIlF,QAAQw8C,EAAK,OAC3Bt3C,EAAI+C,MAAMw0C,IAChBL,EAAKC,QAAS,EACdD,EAAKE,MAAS,EACdF,EAAK18C,KAASwF,EAAIlF,QAAQy8C,EAAK,MAC/BL,EAAKG,MAASr3C,EAAIlF,QAAQy8C,EAAK,MAC/BL,EAAKh3B,UAAW,GACVlgB,EAAI+C,MAAMy0C,KAChBN,EAAKC,QAAW,EAChBD,EAAKE,MAAW,EAChBF,EAAK18C,KAAWwF,EAAIlF,QAAQ08C,EAAK,MACjCN,EAAKG,OAAW,EAChBH,EAAKh3B,UAAW,GAGxB,GAAGg3B,EAAKE,KAAM,CACV,GAAIK,GAAU,mBAEd,IAAGP,EAAKE,KAAKr0C,MAAM00C,GAAU,CACzB,GAAIC,GAAWR,EAAKE,IACpBF,GAAKE,KAAOM,EAAS58C,QAAQ28C,EAAS,MACtCP,EAAKS,KAAOD,EAAS58C,QAAQ28C,EAAS,UAEtCP,GAAKS,MAAO,CAGhB,IAAGT,EAAKE,KAAKr0C,MAAM,MAAO,CACtB,GAAI60C,GAAWV,EAAKE,IACpBF,GAAKE,KAAOQ,EAASv9C,MAAM,KAAK,EAChC,IAAIw9C,GAAcD,EAASv9C,MAAM,KAAK,EACnCw9C,GAAY90C,MAAM,OACjBm0C,EAAKY,KAAOD,EAAYx9C,MAAM,KAAK,GACnC68C,EAAKtc,KAAOid,EAAYx9C,MAAM,KAAK,KAEnC68C,EAAKY,KAAOD,EACZX,EAAKtc,MAAO,KAK5B,MAAOsc,IAUXlP,OAAQ,SAAU+P,GACd,GAAI/0C,GAAW,GACXo0C,EAAO,GACP58C,EAAO,GACPw9C,EAAO,GACPX,EAAQ,EAsBZ,OApB+B,gBAApBU,GAAO/0C,SACdA,EAAW+0C,EAAO/0C,SAAW,KACG,gBAAlB+0C,GAAOZ,SACrBn0C,EAAW+0C,EAAOZ,OAAS,OAG/BC,EAAOW,EAAOX,MAAQW,EAAOlT,UAAY,GACzCrqC,EAAOu9C,EAAOv9C,MAAQ,GAEM,gBAAjBu9C,GAAOV,MACdA,EAAQU,EAAOV,MACiB,gBAAlBU,GAAOt1C,SACrB40C,EAAQU,EAAOt1C,OAAO3H,QAAQ,MAAO,KAEV,gBAApBi9C,GAAO73B,SACd83B,EAAQD,EAAO73B,SACe,gBAAhB63B,GAAOl1B,OACrBm1B,EAAOD,EAAOl1B,KAAK/nB,QAAQ,KAAM,MAIjCkI,EACAo0C,EACA58C,EACA68C,GAAS,IAAMA,EACfW,GAAQ,IAAMA,GAChBt9C,KAAK,KAaXu9C,qBAAsB,SAASl1C,GAE3B,GAAIm1C,GAAW//C,SAASyD,qBAAqB,SAC7C,IAAqB,mBAAZ,GACL,MAAGs8C,GAASv+C,OAAS,EACVu+C,EAAUA,EAASv+C,OAAS,IAE5B,CAKX,KAAI,GAFAw+C,IAAY,EACZ9rC,EAAK,GAAIC,QAAO,GAAGvJ,EAAU,KACzB/I,EAAE,EAAG4mB,EAAQs3B,EAASv+C,OAAYinB,EAAJ5mB,EAAWA,IAE7C,GADAm+C,EAAYD,EAASl+C,GAClBqS,EAAG1R,KAAKw9C,EAAU9tC,KACjB,MAAO8tC,EAGf,QAAO,GAKnB,OAAOhC,KCpTXl9C,IAAIuD,aAAa,qBAAsB,OAAS,WAE5C,YAKA,IAAI47C,IAWAC,eACgB,KACA,KACA,KACA,MAahBC,iBAAkB,IAYlBC,gBACgBC,GAAI,SACJC,GAAI,QACJC,IAAK,WACLC,IAAK,QACLC,IAAK,kBACLC,IAAK,SACLC,IAAK,UACLC,IAAK,SACLC,IAAK,OACLC,IAAK,UACLC,IAAK,WACLC,IAAK,eACLC,IAAK,WACLC,IAAK,SACLC,IAAK,aACLC,IAAK,eACLC,IAAK,UACLC,IAAK,yBACLC,IAAK,QACLC,IAAK,gBACLC,IAAK,WACLC,IAAK,sBACLC,IAAK,mBACLC,IAAK,YACLC,IAAK,gBACLC,IAAK,mBACLC,IAAK,sBACLC,IAAK,UACLC,IAAK,QACLC,IAAK,WACLC,IAAK,oBACLC,IAAK,SACLC,IAAK,iBACLC,IAAK,WACLC,IAAK,iBACLC,IAAK,UACLC,IAAK,SACLC,IAAK,gBACLC,IAAK,YACLC,IAAK,WACLC,IAAK,SACLC,IAAK,WACLC,IAAK,UACLC,IAAK,OACLC,IAAK,QACLC,IAAK,eACLC,IAAK,OACLC,IAAK,uBACLC,IAAK,oCACLC,IAAK,mDACLC,IAAK,yCAELC,GAAK,kCACLC,GAAK,0BACLC,GAAK,sBACLC,GAAK,wBAMLC,IAAK,eACLC,IAAK,eACLC,IAAK,gBACLC,IAAK,gBACLC,GAAK,QAWrBC,iBAAkB,IAWlBC,gBACgBC,EAAG,OACHX,GAAI,WACJY,GAAI,WACJC,GAAI,WACJC,GAAI,WACJC,GAAI,YAWpBC,iBAAkB,IAWlBC,gBACgBN,EAAG,OACHX,GAAI,WACJG,GAAI,YAWpBe,iBAAkB,IAWlBC,gBACgBR,EAAG,OACHS,GAAI,WACJC,GAAI,YAYpBC,iBAAkB,IAWlBC,gBACgBC,EAAG,OACHC,EAAG,WAgBnBC,kBACIC,SAAU,OACVC,YAAa,UACbC,aAAc,SAAU,OACxBC,cAAe,SAAU,MAAiB,MAAiB,OAE3DC,OAAQ,KACRC,MAAO,KACPC,YAAa,KACbC,qBAAsB,OAEtBC,sBAAuB,MACvBC,SAAU,MACVzkB,YAAa,cAEb0kB,kBAAmB,MAAiB,MAAiB,MAAiB,OACtEC,mBAAoB,MAAiB,MAAiB,MAAiB,MAAiB,MAAiB,IAAU,KACnHC,oBAAqB,MAAiB,MAAiB,MAAiB,MAAiB,MAAiB,IAAU,IAAU,MAAiB,MAAiB,QA4BpKC,aAAc,SAAU3rB,GACpB,GAAInmB,GAAK,IACT,KAAK,GAAIlS,KAAOq4B,GAAQ,GAAIA,EAAOx5B,eAAemB,GAAM,CACpD,KAAMA,IAAOi+C,GAAUiF,kBACnB,KAAM,IAAIhiD,OAAM,SAAWlB,EAAM,kCAC1Bq4B,GAAOr4B,KACdkS,GAAM+rC,EAAUiF,iBAAiBljD,GAAKO,KAAK,KAGnD,MAEW,IAAI4R,QAFJ,OAAPD,EAEkB,KAEJA,EAAK,SAY3B+xC,qBAAsB,SAAU9+C,EAAGkzB,GAC/B,MAAO4lB,GAAU+F,aAAa3rB,GAAQ73B,KAAK2E,IAW/C++C,QAAS,SAAU/+C,EAAGW,GAClB,MAAOm4C,GAAUgG,qBAAqB9+C,EAAGrG,IAAIsG,WACzCk+C,cAAc,GAAOx9C,KAc7Bq+C,OAAQ,SAAUh/C,EAAGW,GACjB,MAAOm4C,GAAUgG,qBAAqB9+C,EAAGrG,IAAIsG,WACzCi+C,aAAa,GAAOv9C,KAc5Bs+C,MAAO,SAAUj/C,EAAGW,GAChB,MAAOm4C,GAAUgG,qBAAqB9+C,EAAGrG,IAAIsG,WACzCg+C,YAAY,GAAOt9C,KAmB3Bu+C,OAAQ,SAAUC,EAAMx+C,GAapB,GAZAw+C,GAAc,GACdx+C,EAAUhH,IAAIsG,WACVm/C,WAAY,IACZC,YAAa,GACbC,UAAU,EACVC,cAAe,KACfC,UAAW,KACXrc,IAAK,KACLtS,IAAK,KACL4uB,cAAc,GACf9+C,OAECA,EAAQ0+C,YAGR,MAFAF,GAAOA,EAAK3jD,QAAQ,GAAIwR,QAAO,KAAOrM,EAAQ0+C,YAAa,KAAM,IACjE1+C,EAAQ0+C,YAAc,GACfvG,EAAUoG,OAAOC,EAAMx+C,EAElC,IAAIA,EAAQ2+C,YAAa,EAGrB,MAFA3+C,GAAQkwB,IAAM,EACdlwB,EAAQ2+C,UAAW,EACZxG,EAAUoG,OAAOC,EAAMx+C,EAMlC,IAJ2B,MAAvBA,EAAQy+C,aACRD,EAAOA,EAAK3jD,QAAQ,GAAIwR,QAAO,KAAOrM,EAAQy+C,WAAY,KAAM,OAG/D,uBAAuB/jD,KAAK8jD,IAAkB,KAATA,EACtC,OAAO,CAGX,IAAIpkD,EACJ,IAAI4F,EAAQy+C,YAAmD,KAArCD,EAAKvjD,QAAQ+E,EAAQy+C,aAE3C,GADArkD,EAAQokD,EAAKpkD,MAAM4F,EAAQy+C,YACG,OAA1Bz+C,EAAQ4+C,eACJxkD,EAAM,GAAGV,OAASsG,EAAQ4+C,cAC9B,OAAO,MAGXxkD,IAAS,GAAKokD,EAAM,GAGxB,IAAyB,OAArBx+C,EAAQ6+C,WACJzkD,EAAM,GAAGS,QAAQ,KAAM,IAAInB,OAASsG,EAAQ6+C,UAC5C,MAAOzkD,EAKf,IAAI2hC,GAAMhtB,WAAWyvC,EAErB,OAAwB,QAApBx+C,EAAQ++C,SAAoBhjB,GAAO/7B,EAAQ++C,SACnB,OAApB/+C,EAAQg/C,SAAoBjjB,GAAO/7B,EAAQg/C,SACxC,EAES,OAAhBh/C,EAAQwiC,KAAgBzG,EAAM/7B,EAAQwiC,KAClB,OAAhBxiC,EAAQkwB,KAAgB6L,EAAM/7B,EAAQkwB,KACnC,EAGPlwB,EAAQ8+C,aACD/iB,GAEA,GAkBfkjB,YAAa,SAAS/U,GAClB,GAAIgV,GAAa,SAEjB,OAAGA,GAAWxkD,KAAKwvC,GACNA,EAAK,GAAK,EAASA,EAAK,KAAO,EAASA,EAAK,KAAM,GAAQ,GAGjE,GAYXiV,cACIC,cAAejV,IAAI,EAAGhF,MAAM,EAAG+E,KAAK,EAAGxgC,IAAK,IAAK21C,OAAQ,uCACzDC,cAAenV,IAAI,EAAGhF,MAAM,EAAG+E,KAAK,EAAGxgC,IAAK,IAAK21C,OAAQ,uCACzDE,YAAapV,IAAI,EAAGhF,MAAM,EAAG+E,KAAK,EAAGxgC,IAAK,IAAK21C,OAAQ,uCACvDG,YAAarV,IAAI,EAAGhF,MAAM,EAAG+E,KAAK,EAAGxgC,IAAK,IAAK21C,OAAQ,uCACvDI,cAAetV,IAAI,EAAGhF,MAAM,EAAG+E,KAAK,EAAGxgC,IAAK,IAAK21C,OAAQ,uCACzDK,cAAevV,IAAI,EAAGhF,MAAM,EAAG+E,KAAK,EAAGxgC,IAAK,IAAK21C,OAAQ,uCACzDM,YAAaxV,IAAI,EAAGhF,MAAM,EAAG+E,KAAK,EAAGxgC,IAAK,IAAK21C,OAAQ,uCACvDO,YAAazV,IAAI,EAAGhF,MAAM,EAAG+E,KAAK,EAAGxgC,IAAK,IAAK21C,OAAQ,wCAkB3DzX,aAAc,SAAS3C,EAAG4C,GACtB,GAAIC,GAAM,CAiBV,OAfA7C,GAAK/7B,SAAS+7B,EAAI,IAClB4C,EAAK3+B,SAAS2+B,EAAI,IAEV,IAAL5C,GAAe,IAALA,GAAe,IAALA,GAAe,IAALA,GAAe,IAALA,GAAe,KAALA,GAAgB,KAALA,EAC5D6C,EAAO,GACM,IAAL7C,GAAe,IAALA,GAAe,IAALA,GAAe,KAALA,EACtC6C,EAAQ,GACI,IAAL7C,IAEH6C,EADAD,EAAG,MAAM,GAAOA,EAAG,IAAI,GAAKA,EAAG,MAAM,EAC7B,GAEA,IAITC,GAqBX+X,aAAc,SAAS3V,EAAM/E,EAAOgF,GAChC,GAAI+U,GAAa,UACbY,EAAgB,WACpB,OAAGZ,GAAWxkD,KAAKwvC,IAAS4V,EAAcplD,KAAKyqC,IAAU2a,EAAcplD,KAAKyvC,IACrEhF,GAAO,GAAY,IAAPA,GAAagF,GAAK,GAAKhvC,KAAKysC,aAAazC,EAAM+E,IAAOC,GAC1D,GAIR,GAaX4V,MAAO,SAASA,GAEZ,GAAIC,GAAc,GAAI3zC,QAAO,sEAAuE,IACpG,SAAS2zC,EAAYtlD,KAAKqlD,IAa9BE,KAAM,SAAUA,GAAQ,MAAO9H,GAAU4H,MAAME,IAa/ClgD,IAAK,SAASA,EAAKmgD,GAEf,GAAmB,mBAATA,IAAwBA,KAAS,EAAO,CAC9C,GAAIC,GAAS,GAAI9zC,QAAO,wCAAyC,IAC9D8zC,GAAOzlD,KAAKqF,MAAS,IACpBA,EAAM,UAAUA,GAIxB,GAAIqgD,GAAQ,GAAI/zC,QAAO,+DAAgE,IACvF,OAAG+zC,GAAM1lD,KAAKqF,MAAS,GACZ,GAEA,GAcfsgD,UAAW,SAASC,GAGhBA,EAAQA,EAAMx7C,UACd,IAAIy7C,KACJ,KAAI,GAAIxmD,KAAKoB,MAAKm9C,eACwB,gBAA5Bn9C,MAAKm9C,eAAev+C,IAC1BwmD,EAAKzmD,KAAKC,EAGlB,IAAIymD,GAASD,EAAK9lD,KAAK,KAEnBgmD,EAAQ,gBACTA,GAAM/lD,KAAK4lD,KACVA,EAAQA,EAAMzlD,QAAQ4lD,EAAO,IAGjC,IAAIC,GAAiB,cACrBJ,GAAQA,EAAMzlD,QAAQ6lD,EAAgB,GAEtC,IAAIC,GAAQ,UACZ,IAAoB,IAAjBL,EAAM5mD,QAAgBinD,EAAMjmD,KAAK4lD,GAAQ,CACxC,GAAIM,GAAU,GAAIv0C,QAAO,KAAKm0C,EAAO,IACrC,IAAGI,EAAQlmD,KAAK4lD,GACZ,OAAO,EAIf,OAAO,GAYXO,kBAAmB,SAASP,GAExB,MAAOnlD,MAAKklD,UAAUC,IAa1BQ,UAAW,SAASR,GAEhBA,EAAQA,EAAMx7C,UACd,IAAIy7C,KACJ,KAAI,GAAIxmD,KAAKoB,MAAKihD,eACwB,gBAA5BjhD,MAAKihD,eAAeriD,IAC1BwmD,EAAKzmD,KAAKC,EAGlB,IAAIymD,GAASD,EAAK9lD,KAAK,KAEnBsmD,EAAQ,gBACTA,GAAMrmD,KAAK4lD,KACVA,EAAQA,EAAMzlD,QAAQkmD,EAAO,IAGjC,IAAIL,GAAiB,cACrBJ,GAAQA,EAAMzlD,QAAQ6lD,EAAgB,GAEtC,IAAIC,GAAQ,UACZ,IAAoB,IAAjBL,EAAM5mD,QAAgBinD,EAAMjmD,KAAK4lD,GAAQ,CACxC,GAAIM,GAAU,GAAIv0C,QAAO,KAAKm0C,EAAO,IACrC,IAAGI,EAAQlmD,KAAK4lD,GACZ,OAAO,EAIf,OAAO,GAaXU,UAAW,SAASV,GAGhBA,EAAQA,EAAMx7C,UACd,IAAIy7C,KACJ,KAAI,GAAIxmD,KAAKoB,MAAKwhD,eACwB,gBAA5BxhD,MAAKwhD,eAAe5iD,IAC1BwmD,EAAKzmD,KAAKC,EAGlB,IAAIymD,GAASD,EAAK9lD,KAAK,KAEnBwmD,EAAQ,gBACTA,GAAMvmD,KAAK4lD,KACVA,EAAQA,EAAMzlD,QAAQomD,EAAO,IAGjC,IAAIP,GAAiB,cACrBJ,GAAQA,EAAMzlD,QAAQ6lD,EAAgB,GAEtC,IAAIC,GAAQ,UACZ,IAAoB,IAAjBL,EAAM5mD,QAAgBinD,EAAMjmD,KAAK4lD,GAAQ,CACxC,GAAIM,GAAU,GAAIv0C,QAAO,KAAKm0C,EAAO,IACrC,IAAGI,EAAQlmD,KAAK4lD,GACZ,OAAO,EAIf,OAAO,GAaXY,UAAW,SAASZ,GAGhBA,EAAQA,EAAMx7C,UACd,IAAIy7C,KACJ,KAAI,GAAIxmD,KAAKoB,MAAK0hD,eACwB,gBAA5B1hD,MAAK0hD,eAAe9iD,IAC1BwmD,EAAKzmD,KAAKC,EAGlB,IAAIymD,GAASD,EAAK9lD,KAAK,KACnB0mD,EAAQ,gBACTA,GAAMzmD,KAAK4lD,KACVA,EAAQA,EAAMzlD,QAAQsmD,EAAO,IAGjC,IAAIT,GAAiB,cACrBJ,GAAQA,EAAMzlD,QAAQ6lD,EAAgB,GAEtC,IAAIC,GAAQ,YACZ,KAAqB,IAAjBL,EAAM5mD,QAAiC,IAAjB4mD,EAAM5mD,SAAiBinD,EAAMjmD,KAAK4lD,GAAQ,CAChE,GAAIM,GAAU,GAAIv0C,QAAO,KAAKm0C,EAAO,IACrC,IAAGI,EAAQlmD,KAAK4lD,GAAQ,CACrB,GAA0B,IAAvBA,EAAMrlD,QAAQ,MAA+B,IAAjBqlD,EAAM5mD,OACjC,OAAO,CACJ,IAA0B,IAAvB4mD,EAAMrlD,QAAQ,MAA+B,IAAjBqlD,EAAM5mD,OACxC,OAAO,GAKlB,OAAO,GAaX0nD,UAAW,SAASd,GAGhBA,EAAQA,EAAMx7C,UACd,IAAIy7C,KACJ,KAAI,GAAIxmD,KAAKoB,MAAK8hD,eACwB,gBAA5B9hD,MAAK8hD,eAAeljD,IAC1BwmD,EAAKzmD,KAAKC,EAGlB,IAAIymD,GAASD,EAAK9lD,KAAK,KACnB4mD,EAAQ,gBACTA,GAAM3mD,KAAK4lD,KACVA,EAAQA,EAAMzlD,QAAQwmD,EAAO,IAIjC,IAAIX,GAAiB,cACrBJ,GAAQA,EAAMzlD,QAAQ6lD,EAAgB,GAEtC,IAAIC,GAAQ,UACZ,IAAoB,IAAjBL,EAAM5mD,QAAgBinD,EAAMjmD,KAAK4lD,GAAQ,CACxC,GAAIM,GAAU,GAAIv0C,QAAO,KAAKm0C,EAAO,IACrC,IAAGI,EAAQlmD,KAAK4lD,GACZ,OAAO,EAIf,OAAO,GAeXgB,QAAS,WACL,GAAIrjC,EAEJ,IAAsB,IAAnBphB,UAAUnD,OACT,OAAO,CAGX,IAAI4mD,GAAQzjD,UAAU,EAEtB,IAAGA,UAAUnD,OAAO,EAAE,CAClB,GAAGmD,UAAU,GAAGgjC,cAAgBljC,MAWzB,CAAA,GAA+D,kBAArDxB,MAAK,KAAO0B,UAAU,GAAG6R,cAAgB,SACtD,MAAOvT,MAAK,KAAO0B,UAAU,GAAG6R,cAAgB,SAAS4xC,EAEzD,MAAM,wBAbN,GAAIj1B,EACJ,KAAIpN,EAAM,EAAGA,EAAMphB,UAAU,GAAGnD,OAAQukB,IAAS,CAC7C,GAA2E,mBAAjEoN,EAAKlwB,KAAK,KAAO0B,UAAU,GAAGohB,GAAOvP,cAAgB,UAK3D,KAAM,uBAJN,IAAG2c,EAAKi1B,GACJ,OAAO,OAYvB,KAAIriC,EAAM,EAAGA,EAAM9iB,KAAKi9C,cAAc1+C,OAAQukB,IAC1C,GAAG9iB,KAAK,KAAOA,KAAKi9C,cAAcn6B,GAAS,SAASqiC,GAChD,OAAO,CAInB,QAAO,GAeXiB,UAAW,SAASC,EAAKC,EAAKC,GAC1B,GAAIC,GAAa,mBACbplC,EAAO,aACPqlC,EAAW,eACXC,EAAW,UACXC,EAAgB,oBAIpB,IAFAN,EAAMA,EAAI3mD,QAAQ0hB,EAAK,IAEN,mBAAR,IAEL,GADAklC,EAAMA,EAAI5mD,QAAQ0hB,EAAK,IACpBqlC,EAASlnD,KAAK8mD,IAAQK,EAASnnD,KAAK+mD,GACnC,MAAIC,KACQ,GAAM,IAEP,MAGZ,CACH,GAAGE,EAASlnD,KAAK8mD,GACb,MAAIE,KACQ,GAAK,IAEN,CAIf,IAAIK,GAAUP,EAAI1+C,MAAMg/C,EAExB,IAAa,OAAVC,GAAkBH,EAASlnD,KAAKqnD,EAAQ,KAAOJ,EAAWjnD,KAAKqnD,EAAQ,KAAOF,EAASnnD,KAAKqnD,EAAQ,IACnG,MAAIL,KACQ,GAAK,IAEN,EAKnB,MAAIA,KACQ,GAAM,IAEP,GAefM,OAAQ,SAASja,EAAQka,GAIrB,GAAuC,mBAA7B9mD,MAAKgkD,aAAapX,GACxB,OAAO,CAEX,IAAIma,GAAY/mD,KAAKgkD,aAAapX,GAAQmC,KACtCiY,EAAahnD,KAAKgkD,aAAapX,GAAQ5C,MACvCid,EAAWjnD,KAAKgkD,aAAapX,GAAQoC,IACrCkY,EAAalnD,KAAKgkD,aAAapX,GAAQsX,OACvCiD,EAAYnnD,KAAKgkD,aAAapX,GAAQr+B,IAMtC4S,EAAO2lC,EAAQn/C,MAAMu/C,EACzB,IAAU,OAAP/lC,GAMIA,EAAK,KAAKA,EAAK,IAAMA,EAAK,KAAKgmC,EAAU,CAExC,GAAIza,GAAgC,IAAzBvrB,EAAK4lC,GAAWxoD,OAAc,KAAO4iB,EAAK4lC,GAAWp9C,WAAawX,EAAK4lC,EAElF,IAAG/mD,KAAK0kD,aAAahY,EAAGvrB,EAAK6lC,GAAYr9C,WAAWwX,EAAK8lC,GAAUt9C,YAC/D,OAAO,EAMnB,OAAO,GAaXy9C,QAAS,SAASn6C,GACd,GAAItF,GAAO0/C,GAAQ,EACfC,EAAU,cACVC,EAAO,qCACP1wC,EAAM,gFACN2wC,EAAO,6GACPC,EAAM,4EACNC,EAAO,wGAQX,IACIJ,EAAQ/nD,KAAK0N,IACbs6C,EAAKhoD,KAAK0N,GAEV,OAAO,CAGX,IAAIrO,EAGJ,IAA+B,QAA3B+I,EAAQkP,EAAI+gB,KAAK3qB,KAA+C,QAA5BtF,EAAQ6/C,EAAK5vB,KAAK3qB,IAGtD,IAFArO,EAAI+I,EAAMpJ,OAEJK,KAAI,CAEN,IAAQ,IAAJA,GAAa,IAAJA,GAAa,IAAJA,IAA8B,mBAAb+I,GAAM/I,IAAmC,KAAb+I,EAAM/I,GAAU,CAC/E,KAAyB,mBAAf+I,GAAM/I,EAAE,IAAsB+I,EAAM/I,EAAE,IAAM,GAAK+I,EAAM/I,EAAE,IAAM,KAGrE,OAAO,CAFPyoD,IAAQ,EAMhB,GAAO,IAAJzoD,GAAa,IAAJA,GAAa,IAAJA,IAAgC,mBAAf+I,GAAM/I,EAAE,IAAqC,KAAf+I,EAAM/I,EAAE,IAAW,CACnF,KAAuB,mBAAb+I,GAAM/I,IAAsB+I,EAAM/I,IAAM,GAAK+I,EAAM/I,IAAM,KAG/D,OAAO,CAFPyoD,IAAQ,GASxB,GAA+B,QAA3B1/C,EAAQ8/C,EAAI7vB,KAAK3qB,KAA+C,QAA5BtF,EAAQ+/C,EAAK9vB,KAAK3qB,IAEtD,IADArO,EAAI+I,EAAMpJ,OACJK,KAAI,CAEN,GAAO,IAAJA,GAAa,IAAJA,EAAM,CACd,KAAyB,mBAAf+I,GAAM/I,EAAE,IAA0C,mBAAb+I,GAAM/I,IAAmC,KAAb+I,EAAM/I,IACjF+I,EAAM/I,EAAE,IAAM,GAAK+I,EAAM/I,EAAE,IAAM,KAG7B,OAAO,CAFPyoD,IAAQ,EAMhB,GAAO,IAAJzoD,EAAM,CACL,KAAuB,mBAAb+I,GAAM/I,IAAsB+I,EAAM/I,IAAM,GAAK+I,EAAM/I,IAAM,KAG/D,OAAO,CAFPyoD,IAAQ,GAQxB,MAAOA,IAYXM,KAAM,SAAUl7C,EAAOm7C,GACnB,GAAqB,gBAAVn7C,GACP,OAAO,CAKX,QAFAm7C,GAAUA,GAAU,QAAQ72C,eAGxB,IAAK,OACD,MAAO,8FAAgGxR,KAAKkN,EAChH,KAAK,OACD,MAAO,0jCAA4jClN,KAAKkN,EAC5kC,SACI,OAAO,IAWnBo7C,kBACIC,WACIvpD,OAAU,uBACVypB,OAAU,MACV+/B,MAAQ,GAGZC,oBACIzpD,OAAU,KACVypB,OAAU,SACV+/B,MAAU,GAGdE,eACI1pD,OAAU,QACVypB,OAAU,iBACV+/B,MAAU,GAGdG,UACI3pD,OAAU,KACVypB,OAAU,cACV+/B,MAAU,GAGdI,KACI5pD,OAAU,QACVypB,OAAU,eACV+/B,MAAU,GAGdK,SACI7pD,OAAU,QACVypB,OAAU,4BACV+/B,MAAU,GAGdM,YACI9pD,OAAU,KACVypB,OAAU,UACV+/B,MAAU,GAGdO,MACI/pD,OAAU,QACVypB,OAAU,KACV+/B,MAAU,IAWlBQ,MAAO,SAAUrU,GAIb,GAFAA,EAAMnmC,SAASmmC,EAAI,IAEE,gBAARA,IAAsBA,EAAM,IAAM,EAE3C,OAAO,CAGXA,IAAU,EAEV,IAAI31C,GAAS21C,EAAI31C,OAGbK,EACA4pD,EAAW,CAEf,KAAK5pD,EAAIL,EAAS,EAAGK,GAAK,EAAGA,GAAK,EAG9B4pD,GAAYz6C,SAASmmC,EAAIl9B,OAAOpY,EAAG,GAAG,GAG1C,KAAKA,EAAIL,EAAS,EAAGK,GAAK,EAAGA,GAAK,EAClC,CAEI,GAAI6pD,GAAM16C,SAA4B,EAAnBmmC,EAAIl9B,OAAOpY,EAAG,GAAO,GAGxC4pD,IAAaC,GAAO,GAAOA,EAAM,EAAKA,EAI1C,MAAQD,GAAW,KAAO,GAW9BE,aAAc,SAASxU,EAAKyU,GAExB,GAAK,MAAMppD,KAAK20C,MAAS,EACrB,OAAO,CAGX,IAA+B,mBAAnByU,GACRA,EAAiB,cAEhB,IAAKA,YAA0BnnD,OAAO,CACvC,GAAI5C,GAAGgqD,EAAWD,EAAepqD,MACjC,KAAMK,EAAE,EAAOgqD,EAAJhqD,EAAcA,IAErB,GAAIoB,KAAK0oD,aAAaxU,EAAKyU,EAAe/pD,IACtC,OAAO,CAIf,QAAO,EAMX,GAFA+pD,EAAiBA,EAAe53C,cAEsB,mBAA1C/Q,MAAK6nD,iBAAiBc,GAC9B,OAAO,CAIX,IAAIpqD,GAAS21C,EAAI31C,OAAO,EAGxB,OAAoF,KAA/EyB,KAAK6nD,iBAAiBc,GAAwB,OAAE1pD,MAAM,KAAKa,QAAQvB,IAC7D,EAILyB,KAAK6nD,iBAAiBc,GAAwB,OAAEppD,KAAK20C,GAKvDl0C,KAAK6nD,iBAAiBc,GAAsB,QAAM,GAC3C,EAGJ3oD,KAAKuoD,MAAMrU,IARP,GAYnB,OAAO8I","sourcesContent":["/**\n * Ink Core.\n * @module Ink_1\n * This module provides the necessary methods to create and load the modules using Ink.\n */\n\n;(function(window, document) {\n\n 'use strict';\n\n // skip redefinition of Ink core\n if ('Ink' in window) { return; }\n\n\n // internal data\n\n /*\n * NOTE:\n * invoke Ink.setPath('Ink', '/Ink/'); before requiring local modules\n */\n var paths = {};\n var modules = {};\n var modulesLoadOrder = [];\n var modulesRequested = {};\n var pendingRMs = [];\n var modulesWaitingForDeps = {};\n\n var apply = Function.prototype.apply;\n\n // auxiliary fns\n var isEmptyObject = function(o) {\n /*jshint unused:false */\n if (typeof o !== 'object') { return false; }\n for (var k in o) {\n if (o.hasOwnProperty(k)) {\n return false;\n }\n }\n return true;\n };\n\n /**\n * @namespace Ink_1\n */\n\n window.Ink = {\n /**\n * @property {String} VERSION\n **/\n VERSION: '3.1.4',\n _checkPendingRequireModules: function() {\n var I, F, o, dep, mod, cb, pRMs = [];\n var toApply = [];\n for (I = 0, F = pendingRMs.length; I < F; ++I) {\n o = pendingRMs[I];\n\n if (!o) { continue; }\n\n for (dep in o.left) {\n if (o.left.hasOwnProperty(dep)) {\n mod = modules[dep];\n if (mod) {\n o.args[o.left[dep] ] = mod;\n delete o.left[dep];\n --o.remaining;\n }\n }\n }\n\n if (o.remaining > 0) {\n pRMs.push(o);\n } else {\n cb = o.cb;\n if (!cb) { continue; }\n delete o.cb; // to make sure I won't call this more than once!\n toApply.push([cb, o.args]);\n }\n }\n\n pendingRMs = pRMs;\n\n for (var i = 0; i < toApply.length; i++) {\n toApply[i][0].apply(false, toApply[i][1]);\n }\n\n if (pendingRMs.length > 0) {\n setTimeout( function() { Ink._checkPendingRequireModules(); }, 0 );\n }\n },\n\n /**\n * Get the full path of a module.\n * This method looks up the paths given in setPath (and ultimately the default Ink's path).\n *\n * @method getPath\n * @param {String} key Name of the module you want to get the path\n * @param {Boolean} [noLib] Flag to skip appending 'lib.js' to the returned path.\n *\n * @return {String} The URI to the module, according to what you added in setPath for the given `key`.\n */\n getPath: function(key, noLib) {\n var split = key.split(/[._]/g);\n var curKey;\n var i;\n var root;\n var path;\n\n // Look for Ink.Dom.Element.1, Ink.Dom.Element, Ink.Dom, Ink in this order.\n for (i = split.length; i >= 0; i -= 1) {\n curKey = split.slice(0, i + 1).join('.'); // See comment in setPath\n if (paths[curKey]) {\n root = curKey;\n break;\n }\n }\n\n if (root in paths) {\n path = paths[root];\n } else {\n return null;\n }\n\n if (!/\\/$/.test(path)) {\n path += '/';\n }\n if (i < split.length) {\n // Add the rest of the path. For example, if we found\n // paths['Ink.Dom'] to be 'http://example.com/Ink/Dom/',\n // we now add '/Element/' to get the full path.\n path += split.slice(i + 1).join('/') + '/';\n }\n if (!noLib) {\n path += 'lib.js';\n }\n return path;\n },\n\n /**\n * Sets the URL path for a namespace.\n * Use this to customize where requireModules and createModule will load dependencies from.\n * This can be useful to set your own CDN for dynamic module loading or simply to change your module folder structure\n *\n * @method setPath\n *\n * @param {String} key Module or namespace\n * @param {String} rootURI Base URL path and schema to be appended to the module or namespace\n * @return {void}\n *\n * @example\n * Ink.setPath('Ink', 'http://my-cdn/Ink/');\n * Ink.setPath('Lol', 'http://my-cdn/Lol/');\n *\n * // Loads from http://my-cdn/Ink/Dom/Whatever/lib.js\n * Ink.requireModules(['Ink.Dom.Whatever'], function () { ... });\n * // Loads from http://my-cdn/Lol/Whatever/lib.js\n * Ink.requireModules(['Lol.Whatever'], function () { ... });\n */\n setPath: function(key, rootURI) {\n // Replacing version separator with dot because the difference\n // between a submodule and a version doesn't matter here.\n // It would also overcomplicate the implementation of getPath\n paths[key.replace(/_/, '.')] = rootURI;\n },\n\n /**\n * Loads a script URL.\n * This creates a `script` tag in the `head` of the document.\n * Reports errors by listening to 'error' and 'readystatechange' events.\n *\n * @method loadScript\n * @param {String} uri Can be an external URL or a module name\n * @param {String} [contentType]='text/javascript' The `type` attribute of the new script tag.\n * @return {Element} The newly created script element.\n */\n loadScript: function(uri, contentType) {\n /*jshint evil:true */\n\n if (uri.indexOf('/') === -1) {\n var givenUri = uri; // For the error message\n uri = this.getPath(uri);\n if (uri === null) {\n throw new Error('Could not load script \"' + givenUri + '\". ' +\n 'Path not found in the registry. Did you misspell ' +\n 'the name, or forgot to call setPath()?');\n }\n }\n\n var scriptEl = document.createElement('script');\n scriptEl.setAttribute('type', contentType || 'text/javascript');\n scriptEl.setAttribute('src', uri);\n\n if ('onerror' in scriptEl) {\n scriptEl.onerror = function () {\n Ink.error(['Failed to load script from ', uri, '.'].join(''));\n };\n }\n\n var head = document.head ||\n document.getElementsByTagName('head')[0];\n\n if (head) {\n return head.appendChild(scriptEl);\n }\n },\n\n _loadLater: function (dep) {\n setTimeout(function () {\n if (modules[dep] || modulesRequested[dep] ||\n modulesWaitingForDeps[dep]) {\n return;\n }\n modulesRequested[dep] = true;\n Ink.loadScript(dep);\n }, 0);\n },\n\n /**\n * Defines a module namespace.\n *\n * @method namespace\n * @param {String} ns Namespace to define.\n * @param {Boolean} [returnParentAndKey] Flag to change the return value to an array containing the namespace parent and the namespace key\n * @return {Object|Array} Returns the created namespace object\n */\n namespace: function(ns, returnParentAndKey) {\n if (!ns || !ns.length) { return null; }\n\n var levels = ns.split('.');\n var nsobj = window;\n var parent;\n\n for (var i = 0, f = levels.length; i < f; ++i) {\n nsobj[ levels[i] ] = nsobj[ levels[i] ] || {};\n parent = nsobj;\n nsobj = nsobj[ levels[i] ];\n }\n\n if (returnParentAndKey) {\n return [\n parent,\n levels[i-1]\n ];\n }\n\n return nsobj;\n },\n\n /**\n * Loads a module.\n * A synchronous method to get the module from the internal registry.\n * It assumes the module is defined and loaded already!\n *\n * @method getModule\n * @param {String} mod Module name\n * @param {Number} [version] Version number of the module\n * @return {Object|Function} Module object or function, depending how the module is defined\n */\n getModule: function(mod, version) {\n var key = version ? [mod, '_', version].join('') : mod;\n return modules[key];\n },\n\n /**\n * Creates a new module.\n * Use this to wrap your code and benefit from the module loading used throughout the Ink library\n *\n * @method createModule\n * @param {String} mod Module name, separated by dots. Like Ink.Dom.Selector, Ink.UI.Modal\n * @param {Number} version Version number\n * @param {Array} deps Array of module names which are dependencies of the module being created. The order in which they are passed here will define the order they will be passed to the callback function.\n * @param {Function} modFn The callback function to be executed when all the dependencies are resolved. The dependencies are passed as arguments, in the same order they were declared. The function itself should return the module.\n * @return {void}\n * @sample Ink_1_createModule.html\n *\n */\n createModule: function(mod, version, deps, modFn) { // define\n if (typeof mod !== 'string') {\n throw new Error('module name must be a string!');\n }\n\n // validate version correctness\n if (!(typeof version === 'number' || (typeof version === 'string' && version.length > 0))) {\n throw new Error('version number missing!');\n }\n\n var modAll = [mod, '_', version].join('');\n\n modulesWaitingForDeps[modAll] = true;\n\n var cb = function() {\n //console.log(['createModule(', mod, ', ', version, ', [', deps.join(', '), '], ', !!modFn, ')'].join(''));\n\n // make sure module in not loaded twice\n if (modules[modAll]) {\n //console.warn(['Ink.createModule ', modAll, ': module has been defined already.'].join(''));\n return;\n }\n\n\n // delete related pending tasks\n delete modulesRequested[modAll];\n delete modulesRequested[mod];\n\n\n // run module's supplied factory\n var args = Array.prototype.slice.call(arguments);\n var moduleContent = modFn.apply(window, args);\n modulesLoadOrder.push(modAll);\n // console.log('** loaded module ' + modAll + '**');\n\n\n // set version\n if (typeof moduleContent === 'object') { // Dom.Css Dom.Event\n moduleContent._version = version;\n }\n else if (typeof moduleContent === 'function') {\n moduleContent.prototype._version = version; // if constructor\n moduleContent._version = version; // if regular function\n }\n\n\n // add to global namespace...\n var isInkModule = mod.indexOf('Ink.') === 0;\n var t;\n if (isInkModule) {\n t = Ink.namespace(mod, true); // for mod 'Ink.Dom.Css', t[0] gets 'Ink.Dom' object and t[1] 'Css'\n }\n\n\n // versioned\n modules[ modAll ] = moduleContent; // in modules\n delete modulesWaitingForDeps[ modAll ];\n\n if (isInkModule) {\n t[0][ t[1] + '_' + version ] = moduleContent; // in namespace\n }\n\n\n // unversioned\n modules[ mod ] = moduleContent; // in modules\n\n if (isInkModule) {\n if (isEmptyObject( t[0][ t[1] ] )) {\n t[0][ t[1] ] = moduleContent; // in namespace\n }\n // else {\n // console.warn(['Ink.createModule ', modAll, ': module has been defined already with a different version!'].join(''));\n // }\n }\n\n\n if (this) { // there may be pending requires expecting this module, check...\n Ink._checkPendingRequireModules();\n }\n };\n\n this.requireModules(deps, cb);\n },\n\n /**\n * Requires modules asynchronously\n * Use this to get modules, even if they're not loaded yet\n *\n * @method requireModules\n * @param {Array} deps Array of module names. The order in which they are passed here will define the order they will be passed to the callback function.\n * @param {Function} cbFn The callback function to be executed when all the dependencies are resolved. The dependencies are passed as arguments, in the same order they were declared.\n * @return {void}\n * @sample Ink_1_requireModules.html\n */\n requireModules: function(deps, cbFn) { // require\n //console.log(['requireModules([', deps.join(', '), '], ', !!cbFn, ')'].join(''));\n var i, f, o, dep, mod;\n f = deps && deps.length;\n o = {\n args: new Array(f),\n left: {},\n remaining: f,\n cb: cbFn\n };\n\n if (!(typeof deps === 'object' && deps.length !== undefined)) {\n throw new Error('Dependency list should be an array!');\n }\n if (typeof cbFn !== 'function') {\n throw new Error('Callback should be a function!');\n }\n\n for (i = 0; i < f; ++i) {\n if (Ink._moduleRenames[deps[i]]) {\n Ink.warn(deps[i] + ' was renamed to ' + Ink._moduleRenames[deps[i]]);\n dep = Ink._moduleRenames[deps[i]];\n } else {\n dep = deps[i];\n }\n\n // Because trailing commas in oldIE bring us undefined values here\n if (!dep) {\n --o.remaining;\n continue;\n }\n\n mod = modules[dep];\n if (mod) {\n o.args[i] = mod;\n --o.remaining;\n continue;\n }\n else if (!modulesRequested[dep]) {\n Ink._loadLater(dep);\n }\n o.left[dep] = i;\n }\n\n if (o.remaining > 0) {\n pendingRMs.push(o);\n }\n else {\n cbFn.apply(true, o.args);\n }\n },\n\n _moduleRenames: {\n 'Ink.UI.Aux_1': 'Ink.UI.Common_1'\n },\n\n /**\n * Lists loaded module names.\n * The list is ordered by loaded time (oldest module comes first)\n *\n * @method getModulesLoadOrder\n * @return {Array} returns the order in which modules were resolved and correctly loaded\n */\n getModulesLoadOrder: function() {\n return modulesLoadOrder.slice();\n },\n\n /**\n * Builds the markup needed to load the modules.\n * This method builds the script tags needed to load the currently used modules\n *\n * @method getModuleScripts\n * @uses getModulesLoadOrder\n * @return {String} The script markup\n */\n getModuleScripts: function() {\n var mlo = this.getModulesLoadOrder();\n mlo.unshift('Ink_1');\n mlo = mlo.map(function(m) {\n return [''].join('');\n });\n\n return mlo.join('\\n');\n },\n\n /**\n * Creates an Ink.Ext module\n *\n * Does exactly the same as createModule but creates the module in the Ink.Ext namespace\n *\n * @method createExt\n * @uses createModule\n * @param {String} moduleName Extension name\n * @param {String} version Extension version\n * @param {Array} dependencies Extension dependencies\n * @param {Function} modFn Function returning the extension\n * @return {void}\n * @sample Ink_1_createExt.html\n */\n createExt: function (moduleName, version, dependencies, modFn) {\n return Ink.createModule('Ink.Ext.' + moduleName, version, dependencies, modFn);\n },\n\n /**\n * Function.prototype.bind alternative/fallback.\n * Creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called.\n *\n * @method bind\n * @param {Function} fn The function\n * @param {Object} context The value to be passed as the this parameter to the target function when the bound function is called. If used as false, it preserves the original context and just binds the arguments.\n * @param {Mixed} [more...] Additional arguments will be sent to the original function as prefix arguments.\n * @return {Function} A copy of `fn` bound to the given `context`. Calling this function causes a call to `fn` with the new `context` and any `more` arguments.\n * @sample Ink_1_bind.html\n */\n bind: function(fn, context) {\n var args = Array.prototype.slice.call(arguments, 2);\n return function() {\n var innerArgs = Array.prototype.slice.call(arguments);\n var finalArgs = args.concat(innerArgs);\n return fn.apply(context === false ? this : context, finalArgs);\n };\n },\n\n /**\n * Function.prototype.bind alternative for class methods\n * See Ink.bind. The difference between `bindMethod` and `bind` is that `bindMethod` fetches a method from an object. It can be useful, for instance, to bind a function which is a property of an object returned by another function.\n *\n * @method bindMethod\n * @uses bind\n * @param {Object} object The object that contains the method to bind\n * @param {String} methodName The name of the method that will be bound\n * @param {Mixed} [more...] Additional arguments will be sent to the new method as prefix arguments.\n * @return {Function} See Ink.bind.\n * @sample Ink_1_bindMethod.html\n */\n bindMethod: function (object, methodName) {\n return Ink.bind.apply(Ink,\n [object[methodName], object].concat([].slice.call(arguments, 2)));\n },\n\n /**\n * Function.prototype.bind alternative for event handlers.\n * Same as bind but keeps first argument of the call the original event.\n * Set `context` to `false` to preserve the original context of the function and just bind the arguments.\n *\n * @method bindEvent\n * @param {Function} fn The function\n * @param {Object} context The value to be passed as the this parameter to the target\n * @param {Mixed} [more...] Additional arguments will be sent to the original function as prefix arguments\n * @return {Function} A function which will always call `fn` with the given event (or window.event, in IE) as the first argument.\n * @sample Ink_1_bindEvent.html\n */\n bindEvent: function(fn, context) {\n var args = Array.prototype.slice.call(arguments, 2);\n return function(event) {\n var finalArgs = args.slice();\n finalArgs.unshift(event || window.event);\n return fn.apply(context === false ? this : context, finalArgs);\n };\n },\n\n /**\n * Shorter alias to document.getElementById.\n * Just calls `document.getElementById(id)`, unless `id` happens to be an element.\n * If `id` is an element, `Ink.i` just returns it.\n *\n * You can use this in situations where you want to accept an element id, but a raw element is also okay.\n *\n * @method i\n * @param {String} id Element ID\n * @return {DOMElement|null} The element returned by `document.getElementById(id)` if `id` was a string, and `id` otherwise.\n * @sample Ink_1_i.html\n */\n i: function(id) {\n if(typeof(id) === 'string') {\n return document.getElementById(id) || null;\n }\n return id;\n },\n\n /**\n * Alias for Ink.Dom.Selector\n *\n * Using sizzle-specific selectors is NOT encouraged!\n *\n * @method ss\n * @uses Ink.Dom.Selector.select\n * @param {String} selector CSS3 selector string\n * @param {DOMElement} [from=document] Context element. If set to a DOM element, the `selector` will only look for descendants of this DOM Element.\n * @return {Array} array of DOMElements\n * @sample Ink_1_ss.html\n */\n ss: function(selector, from)\n {\n if(typeof(Ink.Dom) === 'undefined' || typeof(Ink.Dom.Selector) === 'undefined') {\n throw new Error('This method requires Ink.Dom.Selector');\n }\n return Ink.Dom.Selector.select(selector, (from || document));\n },\n\n /**\n * Selects elements like `Ink.ss`, but only returns the first element found.\n *\n * Using sizzle-specific selectors is NOT encouraged!\n *\n * @method s\n * @uses Ink.Dom.Selector.select\n * @param {String} selector CSS3 selector string\n * @param {DOMElement} [from=document] Context element. If set to a DOM element, the `selector` will only look for descendants of this DOM Element.\n * @return {DOMElement} The first element found which matches the `selector`, or `null` if nothing is found.\n * @sample Ink_1_s.html\n */\n s: function(selector, from)\n {\n if(typeof(Ink.Dom) === 'undefined' || typeof(Ink.Dom.Selector) === 'undefined') {\n throw new Error('This method requires Ink.Dom.Selector');\n }\n return Ink.Dom.Selector.select(selector, (from || document))[0] || null;\n },\n\n /**\n * Extends an object with another\n * Copy all of the properties in one or more source objects over to the destination object, and return the destination object. It's in-order, so the last source will override properties of the same name in previous arguments.\n *\n * @method extendObj\n * @param {Object} destination The object that will receive the new/updated properties\n * @param {Object} source The object whose properties will be copied over to the destination object\n * @param {Object} [more...] Additional source objects. The last source will override properties of the same name in the previous defined sources\n * @return {Object} destination object, enriched with defaults from the sources\n * @sample Ink_1_extendObj.html\n */\n extendObj: function(destination/*, source... */) {\n var sources = [].slice.call(arguments, 1);\n\n for (var i = 0, len = sources.length; i < len; i++) {\n if (!sources[i]) { continue; }\n for (var property in sources[i]) {\n if(Object.prototype.hasOwnProperty.call(sources[i], property)) {\n destination[property] = sources[i][property];\n }\n }\n }\n\n return destination;\n },\n\n /**\n * Calls native console.log if available.\n *\n * @method log\n * @param {Mixed} [more...] Arguments to be evaluated\n * @return {void}\n * @sample Ink_1_log.html\n **/\n log: function () {\n // IE does not have console.log.apply in IE10 emulated mode\n var console = window.console;\n if (console && console.log) {\n apply.call(console.log, console, arguments);\n }\n },\n\n /**\n * Calls native console.warn if available.\n *\n * @method warn\n * @param {Mixed} [more...] Arguments to be evaluated\n * @return {void}\n * @sample Ink_1_warn.html\n **/\n warn: function () {\n // IE does not have console.log.apply in IE10 emulated mode\n var console = window.console;\n if (console && console.warn) {\n apply.call(console.warn, console, arguments);\n }\n },\n\n /**\n * Calls native console.error if available.\n *\n * @method error\n * @param {Mixed} [more...] Arguments to be evaluated\n * @return {void}\n * @sample Ink_1_error.html\n **/\n error: function () {\n // IE does not have console.log.apply in IE10 emulated mode\n var console = window.console;\n if (console && console.error) {\n apply.call(console.error, console, arguments);\n }\n }\n };\n\n\n // TODO for debug - to detect pending stuff\n /*\n var failCount = {}; // fail count per module name\n var maxFails = 3; // times\n var checkDelta = 0.5; //seconds\n\n var tmpTmr = setInterval(function() {\n var mk = Object.keys(modulesRequested);\n var l = mk.length;\n\n if (l > 0) {\n // console.log('** waiting for modules: ' + mk.join(', ') + ' **');\n\n for (var i = 0, f = mk.length, k, v; i < f; ++i) {\n k = mk[i];\n v = failCount[k];\n failCount[k] = (v === undefined) ? 1 : ++v;\n\n if (v >= maxFails) {\n console.error('** Loading of module ' + k + ' failed! **');\n delete modulesRequested[k];\n }\n }\n }\n else {\n // console.log('** Module loads complete. **');\n clearInterval(tmpTmr);\n }\n }, checkDelta*1000);\n */\n}(window, document));\n","/**\n * Cross Browser Ajax requests\n * @module Ink.Net.Ajax_1\n * @version 1\n */\n\nInk.createModule('Ink.Net.Ajax', '1', [], function() {\n 'use strict';\n\n /**\n * Creates a new XMLHttpRequest object\n *\n * @class Ink.Net.Ajax\n * @constructor\n *\n * @param {String} url Request URL\n * @param {Object} [options] Request options, containing:\n * @param {Boolean} [options.asynchronous=true] If false, the request synchronous.\n * @param {String} [options.contentType] Content-type header to be sent. Defaults to 'application/x-www-form-urlencoded'\n * @param {Boolean} [options.cors] Flag to activate CORS. Set this to true if you're doing a cross-origin request\n * @param {Boolean} [options.validateCors] If this is set to `true`, perform a CORS request automatically based on the URL being cross-domain or not.\n * @param {Number} [options.delay] Artificial delay. If the request is completed faster than this delay, wait the remaining time before executing the callbacks\n * @param {Boolean|String} [options.evalJS=true] If the request Content-type header is application/json, evaluates the response and populates responseJSON. Use 'force' if you want to force the response evaluation, no matter what Content-type it's using.\n * @param {String} [options.method='POST'] HTTP request method. POST by default.\n * @param {Object|String} [options.parameters] Request parameters to be sent with the request\n * @param {String} [options.postBody] POST request body. If not specified, it's filled with the contents from parameters\n * @param {Object} [options.requestHeaders] Key-value pairs for additional request headers\n * @param {Boolean} [options.sanitizeJSON] Flag to sanitize the content of responseText before evaluation\n * @xparam {Boolean} [options.signRequest=false] Send a \"X-Requested-With: XMLHttpRequest\" header in the request.\n * @param {Number} [options.timeout] Request timeout in seconds\n * @param {String} [options.xhrProxy] URI for proxy service hosted on the same server as the web app, that can fetch documents from other domains. The service must pipe all input and output untouched (some input sanitization is allowed, like clearing cookies). e.g., requesting http://example.org/doc can become /proxy/http%3A%2F%2Fexample.org%2Fdoc The proxy service will be used for cross-domain requests, if set, else a network error is returned as exception.\n * @param {Function} [options.onComplete] Callback executed after the request is completed, regardless of what happened during the request.\n * @param {Function} [options.onCreate] Callback executed after object initialization but before the request is made\n * @param {Function} [options.onException] Callback executed if an exception occurs. Receives the exception as a parameter.\n * @param {Function} [options.onFailure] Callback executed if the request fails (requests with status codes different from 2xx)\n * @param {Function} [options.onHeaders] Callback executed when headers of the response arrive.\n * @param {Function} [options.onInit] Callback executed before any initialization\n * @param {Function} [options.onSuccess] Callback executed if the request is successful (requests with 2xx status codes)\n * @param {Function} [options.onTimeout] Callback executed if the request times out\n *\n * @sample Ink_Net_Ajax_1.html \n */\n var Ajax = function(url, options){\n this.init(url, options);\n };\n\n /**\n * Options for all requests. These can then be overriden for individual ones.\n */\n Ajax.globalOptions = {\n parameters: {},\n requestHeaders: {}\n };\n\n\n // IE10 does not need XDomainRequest\n var xMLHttpRequestWithCredentials = 'XMLHttpRequest' in window && 'withCredentials' in (new XMLHttpRequest());\n\n\n\n Ajax.prototype = {\n\n init: function(url, userOptions) {\n if (!url) {\n throw new Error(\"new Ink.Net.Ajax: Pass a url as the first argument!\");\n }\n var options = Ink.extendObj({\n asynchronous: true,\n contentType: 'application/x-www-form-urlencoded',\n cors: false,\n validateCors: false,\n debug: false,\n delay: 0,\n evalJS: true,\n method: 'POST',\n parameters: null,\n postBody: '',\n requestHeaders: null,\n sanitizeJSON: false,\n signRequest: false,\n timeout: 0,\n useCredentials: false,\n xhrProxy: '',\n onComplete: null,\n onCreate: null,\n onException: null,\n onFailure: null,\n onHeaders: null,\n onInit: null,\n onSuccess: null,\n onTimeout: null\n }, Ajax.globalOptions);\n\n if (userOptions && typeof userOptions === 'object') {\n options = Ink.extendObj(options, userOptions);\n\n\n if (typeof userOptions.parameters === 'object') {\n options.parameters = Ink.extendObj(Ink.extendObj({}, Ajax.globalOptions.parameters), userOptions.parameters);\n } else if (userOptions.parameters !== null) {\n var globalParameters = this.paramsObjToStr(Ajax.globalOptions.parameters);\n if (globalParameters) {\n options.parameters = userOptions.parameters + '&' + globalParameters;\n }\n }\n\n options.requestHeaders = Ink.extendObj({}, Ajax.globalOptions.requestHeaders);\n options.requestHeaders = Ink.extendObj(options.requestHeaders, userOptions.requestHeaders);\n }\n\n this.options = options;\n\n this.safeCall('onInit');\n\n this.url = url;\n\n var urlLocation = this._locationFromURL(url);\n this.isHTTP = this._locationIsHTTP(urlLocation);\n this.isCrossDomain = this._locationIsCrossDomain(urlLocation, location);\n\n this.requestHasBody = options.method.search(/^get|head$/i) < 0;\n\n if (this.options.validateCors === true) {\n this.options.cors = this.isCrossDomain;\n }\n\n if(this.options.cors) {\n this.isCrossDomain = false;\n }\n\n this.transport = this.getTransport();\n\n this.request();\n },\n\n /**\n * Returns a location object from an URL\n *\n * @method _locationFromUrl\n * @param {String} url Input url\n * @return {Location} An `` element with `href` set to the given URL.\n * @private\n **/\n _locationFromURL: function (url) {\n var urlLocation = document.createElementNS ?\n document.createElementNS('http://www.w3.org/1999/xhtml', 'a') :\n document.createElement('a');\n urlLocation.setAttribute('href', url);\n return urlLocation;\n },\n\n /**\n * Checks whether a location is HTTP or HTTPS\n *\n * @method locationIsHttp\n * @param {Location} urlLocation Location object or `` element representing the current location.\n * @return {Boolean} `true` if the location is HTTP or HTTPS, `false` otherwise.\n * @private\n */\n _locationIsHTTP: function (urlLocation) {\n return urlLocation.href.match(/^https?:/i) ? true : false;\n },\n\n /**\n * Checks whether a location is cross-domain from ours.\n *\n * @method _locationIsCrossDomain\n * @param {Location} urlLocation A Location object or an `` elemnt.\n * @param {Location} [location=window.location] A location representing this one. This argument only exists for testing. Don't use it.\n * @return {Boolean} `true` if the locations are in different domains (in which case we need to perform a cross-domain request)\n * @private\n */\n _locationIsCrossDomain: function (urlLocation, location) {\n // TODO because of oldIE compatibility, we can only use .href (the full URL), and none of the other useful properties one can find in Location elements. So we should just pass pure strings around. Not only here.\n location = location || window.location;\n if (!Ajax.prototype._locationIsHTTP(urlLocation) || location.protocol === 'widget:' || typeof window.widget === 'object') {\n return false;\n } else {\n var split1 = urlLocation.href.split('//');\n var split2 = location.href.split('//');\n\n if (split1.length === 1 || split2.length === 1) {\n // This occurs when there's no protocol string in either URL\n // Only happens in IE7 because setting the \"href\" of a link doesn't make that link show you the full URL when the URI is relative to this host.\n // So we have our answer.\n // If there's no protocol string\n // We know for sure that our `urlLocation` is relative\n // In which case, they are in the same domain.\n return false;\n }\n\n var protocol1 = split1[0];\n var protocol2 = split2[0];\n\n var colonOrSlash = /:|\\//; // Finds colons or slashes, which are the end of hostnames (without ports)\n\n var host1 = split1[1].split(colonOrSlash)[0];\n var host2 = split2[1].split(colonOrSlash)[0];\n\n return protocol1 !== protocol2 ||\n host1 !== host2;\n }\n },\n\n /**\n * Creates the appropriate XMLHttpRequest object, depending on our browser and whether we're trying to perform a cross-domain request.\n *\n * @method getTransport\n * @return {Object} XMLHttpRequest object\n * @private\n */\n getTransport: function()\n {\n /*global XDomainRequest:false, ActiveXObject:false */\n if (!xMLHttpRequestWithCredentials && this.options.cors && 'XDomainRequest' in window) {\n this.usingXDomainReq = true;\n return new XDomainRequest();\n }\n else if (typeof XMLHttpRequest !== 'undefined') {\n return new XMLHttpRequest();\n }\n else if (typeof ActiveXObject !== 'undefined') {\n try {\n return new ActiveXObject('Msxml2.XMLHTTP');\n } catch (e) {\n return new ActiveXObject('Microsoft.XMLHTTP');\n }\n } else {\n return null;\n }\n },\n\n /**\n * Set the necessary headers for an ajax request.\n *\n * @method setHeaders\n * @return {void}\n */\n setHeaders: function()\n {\n if (this.transport) {\n try {\n var headers = {\n \"Accept\": \"text/javascript,text/xml,application/xml,application/xhtml+xml,text/html,application/json;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1\",\n \"Accept-Language\": navigator.language,\n \"X-Requested-With\": \"XMLHttpRequest\",\n \"X-Ink-Version\": \"3\"\n };\n if (this.options.cors) {\n if (!this.options.signRequest) {\n delete headers['X-Requested-With'];\n }\n delete headers['X-Ink-Version'];\n }\n\n if (this.options.requestHeaders && typeof this.options.requestHeaders === 'object') {\n for(var headerReqName in this.options.requestHeaders) {\n if (this.options.requestHeaders.hasOwnProperty(headerReqName)) {\n headers[headerReqName] = this.options.requestHeaders[headerReqName];\n }\n }\n }\n\n if (this.transport.overrideMimeType && (navigator.userAgent.match(/Gecko\\/(\\d{4})/) || [0,2005])[1] < 2005) {\n headers.Connection = 'close';\n }\n\n for (var headerName in headers) {\n if(headers.hasOwnProperty(headerName)) {\n this.transport.setRequestHeader(headerName, headers[headerName]);\n }\n }\n } catch(e) {}\n }\n },\n\n /**\n * Converts an object with parameters to a querystring\n *\n * @method paramsObjToStr\n * @param {Object} optParams Parameters object, example: `{ a: 2, b: 3 }`\n * @return {String} A query string. Example: `'a=2&b=3'`\n * @private\n */\n paramsObjToStr: function(optParams) {\n var k, m, p, a, params = [];\n if (typeof optParams === 'object') {\n for (p in optParams){\n if (optParams.hasOwnProperty(p)) {\n a = optParams[p];\n if (Object.prototype.toString.call(a) === '[object Array]' && !isNaN(a.length)) {\n for (k = 0, m = a.length; k < m; k++) {\n params = params.concat([\n encodeURIComponent(p), '[]', '=',\n encodeURIComponent(a[k]), '&'\n ]);\n }\n }\n else {\n params = params.concat([\n encodeURIComponent(p), '=',\n encodeURIComponent(a), '&'\n ]);\n }\n }\n }\n if (params.length > 0) {\n params.pop();\n }\n }\n else\n {\n return optParams;\n }\n return params.join('');\n },\n\n /**\n * Set the url parameters for a GET request\n *\n * @method setParams\n * @return {void}\n * @private\n */\n setParams: function()\n {\n var params = null, optParams = this.options.parameters;\n\n if(typeof optParams === \"object\"){\n params = this.paramsObjToStr(optParams);\n } else {\n params = '' + optParams;\n }\n\n if(params){\n if(this.url.indexOf('?') > -1) {\n this.url = this.url.split('#')[0] + '&' + params;\n } else {\n this.url = this.url.split('#')[0] + '?' + params;\n }\n }\n },\n\n /**\n * Gets an HTTP header from the response\n *\n * @method getHeader\n * @param {String} name Header name\n * @return {String} Header content\n * @public\n */\n getHeader: function(name)\n {\n if (this.usingXDomainReq && name === 'Content-Type') {\n return this.transport.contentType;\n }\n try{\n return this.transport.getResponseHeader(name);\n } catch(e) {\n return null;\n }\n },\n\n /**\n * Gets all the HTTP headers from the response\n *\n * @method getAllHeaders\n * @return {String} The headers, each separated by a newline\n * @public\n */\n getAllHeaders: function()\n {\n try {\n return this.transport.getAllResponseHeaders();\n } catch(e) {\n return null;\n }\n },\n\n /**\n * Gets the ajax response object\n *\n * @method getResponse\n * @return {Object} The response object\n * @public\n */\n getResponse: function(){\n // setup our own stuff\n var t = this.transport,\n r = {\n headerJSON: null,\n responseJSON: null,\n getHeader: this.getHeader,\n getAllHeaders: this.getAllHeaders,\n request: this,\n transport: t,\n timeTaken: new Date() - this.startTime,\n requestedUrl: this.url\n };\n\n // setup things expected from the native object\n r.readyState = t.readyState;\n try { r.responseText = t.responseText; } catch(e) {}\n try { r.responseXML = t.responseXML; } catch(e) {}\n try { r.status = t.status; } catch(e) { r.status = 0; }\n try { r.statusText = t.statusText; } catch(e) { r.statusText = ''; }\n\n return r;\n },\n\n /**\n * Aborts the request if still running. No callbacks are called\n *\n * @method abort\n * @return {void}\n * @public\n */\n abort: function(){\n if (this.transport) {\n clearTimeout(this.delayTimeout);\n clearTimeout(this.stoTimeout);\n try { this.transport.abort(); } catch(ex) {}\n this.finish();\n }\n },\n\n /**\n * Executes the state changing phase of an ajax request\n *\n * @method runStateChange\n * @return {void}\n * @public\n */\n runStateChange: function()\n {\n var rs = this.transport.readyState;\n if (rs === 3) {\n if (this.isHTTP) {\n this.safeCall('onHeaders');\n }\n } else if (rs === 4 || this.usingXDomainReq) {\n\n if (this.options.asynchronous && this.options.delay && (this.startTime + this.options.delay > new Date().getTime())) {\n this.delayTimeout = setTimeout(Ink.bind(this.runStateChange, this), this.options.delay + this.startTime - new Date().getTime());\n return;\n }\n\n var responseJSON,\n responseContent = this.transport.responseText,\n response = this.getResponse(),\n curStatus = this.transport.status;\n\n if (this.isHTTP && !this.options.asynchronous) {\n this.safeCall('onHeaders');\n }\n\n clearTimeout(this.stoTimeout);\n\n if (curStatus === 0) {\n // Status 0 indicates network error for http requests.\n // For http less requests, 0 is always returned.\n if (this.isHTTP) {\n this.safeCall('onException', new Error('Ink.Net.Ajax: network error! (HTTP status 0)'));\n } else {\n curStatus = responseContent ? 200 : 404;\n }\n }\n else if (curStatus === 304) {\n curStatus = 200;\n }\n var isSuccess = this.usingXDomainReq || 200 <= curStatus && curStatus < 300;\n\n var headerContentType = this.getHeader('Content-Type') || '';\n if (this.options.evalJS &&\n (headerContentType.indexOf(\"application/json\") >= 0 || this.options.evalJS === 'force')){\n try {\n responseJSON = this.evalJSON(responseContent, this.sanitizeJSON);\n\n if(responseJSON){\n responseContent = response.responseJSON = responseJSON;\n }\n } catch(e){\n if (isSuccess) {\n // If the request failed, then this is perhaps an error page\n // so don't notify error.\n this.safeCall('onException', e);\n }\n }\n }\n\n if (this.usingXDomainReq && headerContentType.indexOf('xml') !== -1 && 'DOMParser' in window) {\n // http://msdn.microsoft.com/en-us/library/ie/ff975278(v=vs.85).aspx\n var mimeType;\n switch (headerContentType) {\n case 'application/xml':\n case 'application/xhtml+xml':\n case 'image/svg+xml':\n mimeType = headerContentType;\n break;\n default:\n mimeType = 'text/xml';\n }\n var xmlDoc = (new DOMParser()).parseFromString( this.transport.responseText, mimeType);\n this.transport.responseXML = xmlDoc;\n response.responseXML = xmlDoc;\n }\n\n if (this.transport.responseXML != null && response.responseJSON == null && this.transport.responseXML.xml !== \"\"){\n responseContent = this.transport.responseXML;\n }\n\n if (curStatus || this.usingXDomainReq) {\n if (isSuccess) {\n this.safeCall('onSuccess', response, responseContent);\n } else {\n this.safeCall('onFailure', response, responseContent);\n }\n this.safeCall('on'+curStatus, response, responseContent);\n }\n this.finish(response, responseContent);\n }\n },\n\n /**\n * Last step after XHR is complete. Call onComplete and cleanup object\n *\n * @method finish\n * @param {Mixed} response Response object as returned from getResponse().\n * @param {Mixed} responseContent Content of the response.\n * @return {void}\n * @private\n */\n finish: function(response, responseContent){\n if (response) {\n this.safeCall('onComplete', response, responseContent);\n }\n clearTimeout(this.stoTimeout);\n\n if (this.transport) {\n // IE6 sometimes barfs on this one\n try{ this.transport.onreadystatechange = null; } catch(e){}\n\n if (typeof this.transport.destroy === 'function') {\n // Stuff for Samsung.\n this.transport.destroy();\n }\n\n // Let XHR be collected.\n this.transport = null;\n }\n },\n\n /**\n * Safely calls a callback function.\n * Verifies that the callback is well defined and traps errors\n *\n * If you pass in an error as the second argument, it gets thrown if there is no default listener.\n *\n * @method safeCall\n * @param {Function} handlerName Name of the handler we wish to call\n * @param {Error} error This error gets reported to the console using Ink.error if there's no listener to `handlerName`.\n * @param {Mixed} [args...] Arguments to get passed to the `handlerName` handler.\n * @return {void}\n * @private\n */\n safeCall: function(handlerName /*[error or rest...]*/) {\n var error = arguments[1] instanceof Error ? arguments[1] : null;\n if (typeof this.options[handlerName] === 'function') {\n try {\n this.options[handlerName].apply(this, [].slice.call(arguments, 1));\n } catch(ex) {\n Ink.error('Ink.Net.Ajax: an error was raised while executing ' + handlerName + '.', ex);\n }\n } else if (error) {\n Ink.error('Ink.Net.Ajax: ' + error);\n }\n },\n\n /**\n * Sets a new request header for the next http request\n *\n * @method setRequestHeader\n * @param {String} name Header name.\n * @param {String} value New header value.\n * @return {void}\n * @public\n */\n setRequestHeader: function(name, value){\n if (!this.options.requestHeaders) {\n this.options.requestHeaders = {};\n }\n this.options.requestHeaders[name] = value;\n },\n\n /**\n * Executes the request\n *\n * @method request\n * @return {void}\n * @private\n */\n request: function()\n {\n if(this.transport) {\n var params = null;\n if(this.requestHasBody) {\n if(this.options.postBody !== null && this.options.postBody !== '') {\n params = this.options.postBody;\n this.setParams();\n } else if (this.options.parameters !== null && this.options.parameters !== ''){\n params = this.options.parameters;\n }\n\n if (typeof params === \"object\" && !params.nodeType) {\n params = this.paramsObjToStr(params);\n } else if (typeof params !== \"object\" && params !== null){\n params = '' + params;\n }\n\n if(this.options.contentType) {\n this.setRequestHeader('Content-Type', this.options.contentType);\n }\n } else {\n this.setParams();\n }\n\n var url = this.url;\n var method = this.options.method;\n var crossDomain = this.isCrossDomain;\n\n if (crossDomain && this.options.xhrProxy) {\n this.setRequestHeader('X-Url', url);\n url = this.options.xhrProxy + encodeURIComponent(url);\n crossDomain = false;\n }\n\n try {\n this.transport.open(method, url, this.options.asynchronous);\n } catch(e) {\n this.safeCall('onException', e);\n return this.finish(this.getResponse(), null);\n }\n\n this.setHeaders();\n\n this.safeCall('onCreate');\n\n if(this.options.timeout && !isNaN(this.options.timeout)) {\n this.stoTimeout = setTimeout(Ink.bind(function() {\n if(this.options.onTimeout) {\n this.safeCall('onTimeout');\n this.abort();\n }\n }, this), (this.options.timeout * 1000));\n }\n\n if(this.options.useCredentials && !this.usingXDomainReq) {\n this.transport.withCredentials = true;\n }\n\n if(this.options.asynchronous && !this.usingXDomainReq) {\n this.transport.onreadystatechange = Ink.bind(this.runStateChange, this);\n }\n else if (this.usingXDomainReq) {\n this.transport.onload = Ink.bind(this.runStateChange, this);\n }\n\n try {\n if (crossDomain) {\n // Need explicit handling because Mozila aborts\n // the script and Chrome fails silently.per the spec\n Ink.error('Ink.Net.Ajax: You are attempting to request a URL which is cross-domain from this one. To do this, you *must* enable the `cors` option!');\n return;\n } else {\n this.startTime = new Date().getTime();\n this.transport.send(params);\n }\n } catch(e) {\n this.safeCall('onException', e);\n return this.finish(this.getResponse(), null);\n }\n\n if(!this.options.asynchronous) {\n this.runStateChange();\n }\n }\n },\n\n /**\n * Checks if a given string is valid JSON\n *\n * @method isJSON\n * @param {String} str String to be evaluated\n * @return {Boolean} True if the string is valid JSON\n * @public\n */\n isJSON: function(str)\n {\n if (typeof str !== \"string\" || !str){ return false; }\n str = str.replace(/\\\\./g, '@').replace(/\"[^\"\\\\\\n\\r]*\"/g, '');\n return (/^[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]*$/).test(str);\n },\n\n /**\n * Evaluates a given string as JSON\n *\n * @method evalJSON\n * @param {String} strJSON String to be evaluated\n * @param {Boolean} sanitize Flag to sanitize the content\n * @return {Object} JSON content as an object\n * @public\n */\n evalJSON: function(strJSON, sanitize)\n {\n if (strJSON && (!sanitize || this.isJSON(strJSON))) {\n try {\n if (typeof JSON !== \"undefined\" && typeof JSON.parse !== 'undefined'){\n return JSON.parse(strJSON);\n }\n /*jshint evil:true */\n return eval('(' + strJSON + ')');\n } catch(e) {\n throw new Error('Ink.Net.Ajax: Bad JSON string. ' + e);\n }\n }\n return null;\n }\n };\n\n /**\n * Loads content from a given url through an XMLHttpRequest.\n *\n * Shortcut function for simple AJAX use cases. Works with JSON, XML and plain text.\n *\n * @method load\n * @param {String} url Request URL\n * @param {Function} callback Callback to be executed if the request is successful\n * @return {Object} XMLHttpRequest object\n * @public\n *\n * @sample Ink_Net_Ajax_load.html \n */\n Ajax.load = function(url, callback){\n var isCrossDomain = Ajax.prototype._locationIsCrossDomain(window.location, Ajax.prototype._locationFromURL(url));\n return new Ajax(url, {\n method: 'GET',\n cors: isCrossDomain,\n onSuccess: function(response){\n callback(response.responseJSON || response.responseText, response);\n }\n });\n };\n\n /**\n * Loads content from a given url through an XMLHttpRequest.\n * Shortcut function for simple AJAX use cases.\n *\n * @method ping\n * @param {String} url Request url\n * @param {Function} callback Callback to be executed if the request is successful\n * @public\n * @return {Object} XMLHttpRequest object\n */\n Ajax.ping = function(url, callback){\n var isCrossDomain = Ajax.prototype._locationIsCrossDomain(window.location, Ajax.prototype._locationFromURL(url));\n return new Ajax(url, {\n method: 'HEAD',\n cors: isCrossDomain,\n onSuccess: function(response){\n if (typeof callback === 'function'){\n callback(response);\n }\n }\n });\n };\n\n\n return Ajax;\n});\n","/**\n * Cross Browser JsonP requests\n * @module Ink.Net.JsonP_1\n * @version 1\n */\n\nInk.createModule('Ink.Net.JsonP', '1', [], function() {\n\n 'use strict';\n\n /**\n * Executes a JSONP request\n *\n * @class Ink.Net.JsonP\n * @constructor\n *\n * @param {String} uri Request URL\n * @param {Object} options Request options\n * @param {Function} options.onSuccess Success callback. Called with the JSONP response.\n * @param {Function} [options.onFailure] Failure callback. Called when there is a timeout.\n * @param {Object} [options.failureObj] Object to be passed as argument to failure callback\n * @param {Number} [options.timeout] Timeout for the request, in seconds. defaults to 10.\n * @param {Object} [options.params] Object with URL parameters.\n * @param {String} [options.callbackParam] URL parameter which gets the name of the JSONP function to call. defaults to 'jsoncallback'.\n * @param {String} [options.randVar] (Advanced, not recommended unless you know what you're doing) A string to append to the callback name. By default, generate a random number. Use an empty string if you already passed the correct name in the internalCallback option.\n * @param {String} [options.internalCallback] (Advanced) Name of the callback function stored in the Ink.Net.JsonP object (before it's prefixed).\n *\n * @sample Ink_Net_JsonP_1.html \n */\n var JsonP = function(uri, options) {\n this.init(uri, options);\n };\n\n JsonP.prototype = {\n\n init: function(uri, options) {\n this.options = Ink.extendObj( {\n onSuccess: undefined,\n onFailure: undefined,\n failureObj: {},\n timeout: 10,\n params: {},\n callbackParam: 'jsoncallback',\n internalCallback: '_cb',\n randVar: false\n }, options || {});\n\n if(this.options.randVar !== false) {\n this.randVar = this.options.randVar;\n } else {\n this.randVar = parseInt(Math.random() * 100000, 10);\n }\n\n this.options.internalCallback += this.randVar;\n\n this.uri = uri;\n\n // prevent SAPO legacy onComplete - make it onSuccess\n if(typeof(this.options.onComplete) === 'function') {\n this.options.onSuccess = this.options.onComplete;\n }\n\n if (typeof this.uri !== 'string') {\n throw new Error('Ink.Net.JsonP: Please define an URI');\n }\n\n if (typeof this.options.onSuccess !== 'function') {\n throw new Error('Ink.Net.JsonP: please define a callback function on option onSuccess!');\n }\n\n Ink.Net.JsonP[this.options.internalCallback] = Ink.bind(function() {\n this.options.onSuccess(arguments[0]);\n this._cleanUp();\n }, this);\n\n this.timeout = setTimeout(Ink.bind(function () {\n this.abort();\n if(typeof this.options.onFailure === 'function'){\n this.options.onFailure(this.options.failureObj);\n }\n }, this),\n this.options.timeout * 1000);\n\n this._addScriptTag();\n },\n\n /**\n * Abort the request, avoiding onSuccess or onFailure being called.\n * @method abort\n * @return {void}\n **/\n abort: function () {\n Ink.Net.JsonP[this.options.internalCallback] = Ink.bindMethod(this, '_cleanUp');\n },\n\n _addParamsToGet: function(uri, params) {\n var hasQuestionMark = uri.indexOf('?') !== -1;\n var sep, pKey, pValue, parts = [uri];\n\n for (pKey in params) {\n if (params.hasOwnProperty(pKey)) {\n if (!hasQuestionMark) { sep = '?'; hasQuestionMark = true; }\n else { sep = '&'; }\n pValue = params[pKey];\n if (typeof pValue !== 'number' && !pValue) { pValue = ''; }\n parts = parts.concat([sep, pKey, '=', encodeURIComponent(pValue)]);\n }\n }\n\n return parts.join('');\n },\n\n _getScriptContainer: function() {\n return document.body ||\n document.getElementsByTagName('body')[0] ||\n document.getElementsByTagName('head')[0] ||\n document.documentElement;\n },\n\n _addScriptTag: function() {\n // enrich options will callback and random seed\n this.options.params[this.options.callbackParam] = 'Ink.Net.JsonP.' + this.options.internalCallback;\n this.options.params.rnd_seed = this.randVar;\n this.uri = this._addParamsToGet(this.uri, this.options.params);\n // create script tag\n this._scriptEl = document.createElement('script');\n this._scriptEl.type = 'text/javascript';\n this._scriptEl.src = this.uri;\n var scriptCtn = this._getScriptContainer();\n scriptCtn.appendChild(this._scriptEl);\n },\n\n _cleanUp: function () {\n if (this.timeout) {\n window.clearTimeout(this.timeout);\n }\n delete this.options.onSuccess;\n delete this.options.onFailure;\n delete Ink.Net.JsonP[this.options.internalCallback];\n this._removeScriptTag();\n },\n\n _removeScriptTag: function() {\n if (!this._scriptEl) { return; /* already removed */ }\n this._scriptEl.parentNode.removeChild(this._scriptEl);\n delete this._scriptEl;\n }\n };\n\n return JsonP;\n\n});\n","/**\n * Browser Detection and User Agent sniffing\n * @module Ink.Dom.Browser_1\n * @version 1\n */\nInk.createModule('Ink.Dom.Browser', '1', [], function() {\n 'use strict'; \n\n /**\n * @namespace Ink.Dom.Browser\n * @version 1\n * @static\n * @example\n * \n */\n var Browser = {\n /**\n * True if the browser is Internet Explorer\n *\n * @property IE\n * @type {Boolean}\n * @public\n * @static\n */\n IE: false,\n\n /**\n * True if the browser is Gecko based\n *\n * @property GECKO\n * @type {Boolean}\n * @public\n * @static\n */\n GECKO: false,\n\n /**\n * True if the browser is Opera\n *\n * @property OPERA\n * @type {Boolean}\n * @public\n * @static\n */\n OPERA: false,\n\n /**\n * True if the browser is Safari\n *\n * @property SAFARI\n * @type {Boolean}\n * @public\n * @static\n */\n SAFARI: false,\n\n /**\n * True if the browser is Konqueror\n *\n * @property KONQUEROR\n * @type {Boolean}\n * @public\n * @static\n */\n KONQUEROR: false,\n\n /**\n * True if browser is Chrome\n *\n * @property CHROME\n * @type {Boolean}\n * @public\n * @static\n */\n CHROME: false,\n\n /**\n * The specific browser model.\n * False if it is unavailable.\n *\n * @property model\n * @type {Boolean|String}\n * @public\n * @static\n */\n model: false,\n\n /**\n * The browser version.\n * False if it is unavailable.\n *\n * @property version\n * @type {Boolean|String}\n * @public\n * @static\n */\n version: false,\n\n /**\n * The user agent string.\n * False if it is unavailable.\n *\n * @property userAgent\n * @type {Boolean|String}\n * @public\n * @static\n */\n userAgent: false,\n\n /**\n * The CSS prefix (-moz-, -webkit-, -ms-, ...)\n * False if it is unavailable \n *\n * @property cssPrefix \n * @type {Boolean|String}\n * @public \n * @static \n */\n cssPrefix: false, \n\n /**\n * The DOM prefix (Moz, Webkit, ms, ...)\n * False if it is unavailable \n * @property domPrefix \n * @type {Boolean|String}\n * @public \n * @static \n */\n domPrefix: false,\n\n /**\n * Initialization function for the Browser object.\n *\n * Is called automatically when this module is loaded, and calls setDimensions, setBrowser and setReferrer.\n *\n * @method init\n * @return {void}\n * @public\n */\n init: function() {\n this.detectBrowser();\n this.setDimensions();\n this.setReferrer();\n },\n\n /**\n * Retrieves and stores window dimensions in this object. Called automatically when this module is loaded.\n *\n * @method setDimensions\n * @return {void}\n * @public\n */\n setDimensions: function() {\n //this.windowWidth=window.innerWidth !== null? window.innerWidth : document.documentElement && document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body !== null ? document.body.clientWidth : null;\n //this.windowHeight=window.innerHeight != null? window.innerHeight : document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body != null? document.body.clientHeight : null;\n var myWidth = 0, myHeight = 0;\n if ( typeof window.innerWidth=== 'number' ) {\n myWidth = window.innerWidth;\n myHeight = window.innerHeight;\n } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {\n myWidth = document.documentElement.clientWidth;\n myHeight = document.documentElement.clientHeight;\n } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {\n myWidth = document.body.clientWidth;\n myHeight = document.body.clientHeight;\n }\n this.windowWidth = myWidth;\n this.windowHeight = myHeight;\n },\n\n /**\n * Stores the referrer. Called automatically when this module is loaded.\n *\n * @method setReferrer\n * @return {void}\n * @public\n */\n setReferrer: function() {\n if (document.referrer && document.referrer.length) {\n this.referrer = window.escape(document.referrer);\n } else {\n this.referrer = false;\n }\n },\n\n /**\n * Detects the browser and stores the found properties. Called automatically when this module is loaded.\n *\n * @method detectBrowser\n * @return {void}\n * @public\n */\n detectBrowser: function() {\n this._sniffUserAgent(navigator.userAgent);\n },\n\n _sniffUserAgent: function (sAgent) {\n this.userAgent = sAgent;\n\n sAgent = sAgent.toLowerCase();\n\n if (/applewebkit\\//.test(sAgent)) {\n this.cssPrefix = '-webkit-';\n this.domPrefix = 'Webkit';\n if(/(chrome|crios)\\//.test(sAgent)) {\n // Chrome\n this.CHROME = true;\n this.model = 'chrome';\n this.version = sAgent.replace(/(.*)chrome\\/([^\\s]+)(.*)/, \"$2\");\n } else {\n // Safari\n this.SAFARI = true;\n this.model = 'safari';\n var rVersion = /version\\/([^) ]+)/;\n if (rVersion.test(sAgent)) {\n this.version = sAgent.match(rVersion)[1];\n } else {\n this.version = sAgent.replace(/(.*)applewebkit\\/([^\\s]+)(.*)/, \"$2\");\n }\n }\n } else if (/opera/.test(sAgent)) {\n // Opera\n this.OPERA = true;\n this.model = 'opera';\n this.version = sAgent.replace(/(.*)opera.([^\\s$]+)(.*)/, \"$2\");\n this.cssPrefix = '-o-';\n this.domPrefix = 'O';\n } else if (/konqueror/.test(sAgent)) {\n // Konqueroh\n this.KONQUEROR = true;\n this.model = 'konqueror';\n this.version = sAgent.replace(/(.*)konqueror\\/([^;]+);(.*)/, \"$2\");\n this.cssPrefix = '-khtml-';\n this.domPrefix = 'Khtml';\n } else if (/(msie|trident)/i.test(sAgent)) {\n // MSIE\n this.IE = true;\n this.model = 'ie';\n if (/rv:((?:\\d|\\.)+)/.test(sAgent)) { // IE 11\n this.version = sAgent.match(/rv:((?:\\d|\\.)+)/)[1];\n } else {\n this.version = sAgent.replace(/(.*)\\smsie\\s([^;]+);(.*)/, \"$2\");\n }\n this.cssPrefix = '-ms-';\n this.domPrefix = 'ms';\n } else if (/gecko/.test(sAgent)) {\n // GECKO\n // Supports only:\n // Camino, Chimera, Epiphany, Minefield (firefox 3), Firefox, Firebird, Phoenix, Galeon,\n // Iceweasel, K-Meleon, SeaMonkey, Netscape, Songbird, Sylera,\n this.cssPrefix = '-moz-';\n this.domPrefix = 'Moz';\n\n this.GECKO = true;\n\n var re = /(camino|chimera|epiphany|minefield|firefox|firebird|phoenix|galeon|iceweasel|k\\-meleon|seamonkey|netscape|songbird|sylera)/;\n if(re.test(sAgent)) {\n this.model = sAgent.match(re)[1];\n this.version = sAgent.replace(new RegExp(\"(.*)\"+this.model+\"\\/([^;\\\\s$]+)(.*)\"), \"$2\");\n } else {\n // probably is mozilla\n this.model = 'mozilla';\n var reVersion = /(.*)rv:([^)]+)(.*)/;\n if(reVersion.test(sAgent)) {\n this.version = sAgent.replace(reVersion, \"$2\");\n }\n }\n }\n },\n\n /**\n * Debug function which displays browser (and Ink.Dom.Browser) information as an alert message.\n *\n * @method debug\n * @return {void}\n * @public\n * @sample Ink_Dom_Browser_1_debug.html\n */\n debug: function() {\n /*global alert:false */\n var str = \"known browsers: (ie, gecko, opera, safari, konqueror) \\n\";\n str += [this.IE, this.GECKO, this.OPERA, this.SAFARI, this.KONQUEROR] +\"\\n\";\n str += \"cssPrefix -> \"+this.cssPrefix+\"\\n\";\n str += \"domPrefix -> \"+this.domPrefix+\"\\n\";\n str += \"model -> \"+this.model+\"\\n\";\n str += \"version -> \"+this.version+\"\\n\";\n str += \"\\n\";\n str += \"original UA -> \"+this.userAgent;\n\n alert(str);\n }\n };\n\n Browser.init();\n\n return Browser;\n});\n","/**\n * CSS Utilities and toolbox\n * @module Ink.Dom.Css_1\n * @version 1\n */\n\nInk.createModule( 'Ink.Dom.Css', 1, [], function() {\n\n 'use strict';\n\n // getComputedStyle feature detection.\n var getCs = (\"defaultView\" in document) && (\"getComputedStyle\" in document.defaultView) ? document.defaultView.getComputedStyle : window.getComputedStyle;\n\n /**\n * @namespace Ink.Dom.Css\n * @static\n */\n\n var Css = {\n /**\n * Adds of removes a class.\n * Depending on addRemState, this method either adds a class if it's true or removes if if false.\n *\n * @method addRemoveClassName\n * @param {DOMElement|string} elm DOM element or element id\n * @param {string} className class name to add or remove.\n * @param {boolean} addRemState Whether to add or remove. `true` to add, `false` to remove.\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_addRemoveClassName.html \n */\n addRemoveClassName: function(elm, className, addRemState) {\n if (addRemState) {\n return this.addClassName(elm, className);\n }\n this.removeClassName(elm, className);\n },\n\n /**\n * Adds a class to a given element\n *\n * @method addClassName\n * @param {Element|String} elm Element or element id\n * @param {String|Array} className Class or classes to add. Examples: 'my-class', ['my-class', 'other-class'], 'my-class other-class'\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_addClassName.html\n */\n addClassName: function(elm, className) {\n elm = Ink.i(elm);\n if (!elm || !className) { return null; }\n className = ('' + className).split(/[, ]+/);\n var i = 0;\n var len = className.length;\n\n for (; i < len; i++) {\n // remove whitespace and ignore on empty string\n if (className[i].replace(/^\\s+|\\s+$/g, '')) {\n if (typeof elm.classList !== \"undefined\") {\n elm.classList.add(className[i]);\n } else if (!Css.hasClassName(elm, className[i])) {\n elm.className += (elm.className ? ' ' : '') + className[i];\n }\n }\n }\n },\n\n /**\n * Removes a class from a given element\n *\n * @method removeClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String|Array} className Class names to remove. You can either use a space separated string of classnames, comma-separated list or an array\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_removeClassName.html \n */\n removeClassName: function(elm, className) {\n elm = Ink.i(elm);\n if (!elm || !className) { return null; }\n \n className = ('' + className).split(/[, ]+/);\n var i = 0;\n var len = className.length;\n\n if (typeof elm.classList !== \"undefined\"){\n for (; i < len; i++) {\n elm.classList.remove(className[i]);\n }\n } else {\n var elmClassName = elm.className || '';\n var re;\n for (; i < len; i++) {\n re = new RegExp(\"(^|\\\\s+)\" + className[i] + \"(\\\\s+|$)\");\n elmClassName = elmClassName.replace(re, ' ');\n }\n elm.className = (elmClassName\n .replace(/^\\s+/, '')\n .replace(/\\s+$/, ''));\n }\n },\n\n /**\n * Alias to addRemoveClassName. \n * Utility function, saves many if/elses.\n *\n * @method setClassName\n * @uses addRemoveClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String|Array} className Class names to add\\remove. Comma separated, space separated or simply an Array\n * @param {Boolean} [add]=false Flag to switch behavior from removal to addition. true to add, false to remove\n * @return {void}\n * @public\n */\n setClassName: function(elm, className, add) {\n this.addRemoveClassName(elm, className, add || false);\n },\n\n /**\n * Checks if an element has a class.\n * This method verifies if an element has ONE of a list of classes. If the last argument is flagged as true, instead checks if the element has ALL the classes\n * \n * @method hasClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String|Array} className Class name(s) to test\n * @param {Boolean} [all=false] Irrelevant if only one `className` is passed. If `true`, check if the element contains ALL the CSS classes. If `false`, check whether the element contains ANY of the given classes.\n * @return {Boolean} `true` if a given class is applied to a given element, `false` if it isn't.\n * @public\n * @sample Ink_Dom_Css_hasClassName.html \n */\n hasClassName: function(elm, className, all) {\n elm = Ink.i(elm);\n if (!elm || !className) { return false; }\n\n className = ('' + className).split(/[, ]+/);\n var i = 0;\n var len = className.length;\n var has;\n var re;\n\n for ( ; i < len; i++) {\n if (typeof elm.classList !== \"undefined\"){\n has = elm.classList.contains(className[i]);\n } else {\n var elmClassName = elm.className;\n if (elmClassName === className[i]) {\n has = true;\n } else {\n re = new RegExp(\"(^|\\\\s)\" + className[i] + \"(\\\\s|$)\");\n has = re.test(elmClassName);\n }\n }\n if (has && !all) { return true; } // return if looking for any class\n if (!has && all) { return false; } // return if looking for all classes\n }\n\n if (all) {\n // if we got here, all classes were found so far\n return true;\n } else {\n // if we got here with all == false, no class was found\n return false;\n }\n },\n\n /**\n * Blinks a class from an element\n * Add and removes the class from the element with a timeout, so it blinks\n *\n * @method blinkClass\n * @uses addRemoveClassName\n * @param {Element|String} element DOM element or element id\n * @param {String|Array} className Class name(s) to blink\n * @param {Number} timeout timeout in ms between adding and removing, default 100 ms\n * @param {Boolean} negate is true, class is removed then added\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_blinkClass.html \n */\n blinkClass: function(element, className, timeout, negate){\n element = Ink.i(element);\n Css.addRemoveClassName(element, className, !negate);\n setTimeout(function() {\n Css.addRemoveClassName(element, className, negate);\n }, Number(timeout) || 100);\n },\n\n /**\n * Toggles a class name from a given element\n *\n * @method toggleClassName\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} className Class name\n * @param {Boolean} [forceAdd] Flag to force adding the the classe names if they don't exist yet.\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_toggleClassName.html \n */\n toggleClassName: function(elm, className, forceAdd) {\n if (!elm || !className) { return false; }\n\n if (typeof forceAdd !== 'undefined') {\n return Css.addRemoveClassName(elm, className, forceAdd);\n } else if (typeof elm.classList !== \"undefined\" && !/[, ]/.test(className)) {\n elm = Ink.i(elm);\n if (elm !== null){\n elm.classList.toggle(className);\n }\n } else {\n if (Css.hasClassName(elm, className)) {\n Css.removeClassName(elm, className);\n } else {\n Css.addClassName(elm, className);\n }\n }\n },\n\n /**\n * Sets the opacity of given element \n *\n * @method setOpacity\n * @param {DOMElement|String} elm DOM element or element id\n * @param {Number} value allows 0 to 1(default mode decimal) or percentage (warning using 0 or 1 will reset to default mode)\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_setOpacity.html \n */\n setOpacity: function(elm, value) {\n elm = Ink.i(elm);\n if (elm !== null){\n var val = 1;\n\n if (!isNaN(Number(value))){\n if (value <= 0) { val = 0; }\n else if (value <= 1) { val = value; }\n else if (value <= 100) { val = value / 100; }\n else { val = 1; }\n }\n\n if (typeof elm.style.opacity !== 'undefined') {\n elm.style.opacity = val;\n }\n else {\n elm.style.filter = \"alpha(opacity:\"+(val*100|0)+\")\";\n }\n }\n },\n\n /**\n * Converts a css property name to a string in camelcase to be used with CSSStyleDeclaration.\n * @method _camelCase\n * @private\n * @param {String} str String to convert\n * @return {String} Converted string\n */\n _camelCase: function(str) {\n return str ? str.replace(/-(\\w)/g, function (_, $1) {\n return $1.toUpperCase();\n }) : str;\n },\n\n\n /**\n * Gets the value for an element's style attribute\n *\n * @method getStyle\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} style Which css attribute to fetch\n * @return {Mixed} Style value\n * @public\n * @sample Ink_Dom_Css_getStyle.html \n */\n getStyle: function(elm, style) {\n elm = Ink.i(elm);\n if (elm !== null && elm.style) {\n style = style === 'float' ? 'cssFloat': this._camelCase(style);\n\n var value = elm.style[style];\n\n if (getCs && (!value || value === 'auto')) {\n var css = getCs(elm, null);\n value = css ? css[style] : null;\n }\n else if (!value && elm.currentStyle) {\n value = elm.currentStyle[style];\n if (value === 'auto' && (style === 'width' || style === 'height')) {\n value = elm[\"offset\" + style.charAt(0).toUpperCase() + style.slice(1)] + \"px\";\n }\n }\n\n if (style === 'opacity') {\n return value ? parseFloat(value, 10) : 1.0;\n }\n else if (style === 'borderTopWidth' || style === 'borderBottomWidth' ||\n style === 'borderRightWidth' || style === 'borderLeftWidth' ) {\n if (value === 'thin') { return '1px'; }\n else if (value === 'medium') { return '3px'; }\n else if (value === 'thick') { return '5px'; }\n }\n\n return value === 'auto' ? null : value;\n }\n },\n\n\n /**\n * Adds CSS rules to an element's style attribute.\n *\n * @method setStyle\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} style Which css attribute to set\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_setStyle.html \n */\n setStyle: function(elm, style) {\n elm = Ink.i(elm);\n if (elm === null) { return; }\n if (typeof style === 'string') {\n elm.style.cssText += '; '+style;\n\n if (style.indexOf('opacity') !== -1) {\n this.setOpacity(elm, style.match(/opacity:\\s*(\\d?\\.?\\d*)/)[1]);\n }\n }\n else {\n for (var prop in style) {\n if (style.hasOwnProperty(prop)){\n if (prop === 'opacity') {\n this.setOpacity(elm, style[prop]);\n }\n else if (prop === 'float' || prop === 'cssFloat') {\n if (typeof elm.style.styleFloat === 'undefined') {\n elm.style.cssFloat = style[prop];\n }\n else {\n elm.style.styleFloat = style[prop];\n }\n } else {\n elm.style[prop] = style[prop];\n }\n }\n }\n }\n },\n\n\n /**\n * Shows an element.\n * Internally it unsets the display property of an element. You can force a specific display property using forceDisplayProperty\n *\n * @method show\n * @param {DOMElement|String} elm DOM element or element id\n * @param {String} [forceDisplayProperty] Css display property to apply on show\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_show.html \n */\n show: function(elm, forceDisplayProperty) {\n elm = Ink.i(elm);\n if (elm !== null) {\n elm.style.display = forceDisplayProperty || '';\n }\n },\n\n /**\n * Hides an element.\n *\n * @method hide\n * @param {DOMElement|String} elm DOM element or element id\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_hide.html \n */\n hide: function(elm) {\n elm = Ink.i(elm);\n if (elm !== null) {\n elm.style.display = 'none';\n }\n },\n\n /**\n * Shows or hides an element.\n * If the show parameter is true, it shows the element. Otherwise, hides it.\n *\n * @method showHide\n * @param {DOMElement|String} elm DOM element or element id\n * @param {boolean} [show]=false Whether to show or hide `elm`.\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_showHide.html \n */\n showHide: function(elm, show) {\n elm = Ink.i(elm);\n if (elm) {\n elm.style.display = show ? '' : 'none';\n }\n },\n\n /**\n * Toggles an element visibility.\n * \n * @method toggle\n * @param {DOMElement|String} elm DOM element or element id\n * @param {Boolean} forceShow Forces showing if element is hidden\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_toggle.html \n */\n toggle: function(elm, forceShow) {\n elm = Ink.i(elm);\n if (elm !== null) {\n if (typeof forceShow !== 'undefined') {\n if (forceShow === true) {\n this.show(elm);\n } else {\n this.hide(elm);\n }\n } else {\n if (this.getStyle(elm,'display').toLowerCase() === 'none') {\n this.show(elm);\n }\n else {\n this.hide(elm);\n }\n }\n }\n },\n\n _getRefTag: function(head){\n if (head.firstElementChild) {\n return head.firstElementChild;\n }\n\n for (var child = head.firstChild; child; child = child.nextSibling){\n if (child.nodeType === 1){\n return child;\n }\n }\n return null;\n },\n\n /**\n * Injects style tags with rules to the page.\n *\n * @method appendStyleTag\n * @param {String} selector The css selector for the rule\n * @param {String} style The content of the style rule\n * @param {Object} options Options for the tag\n * @param {String} [options.type]='text/css' File type\n * @param {Boolean} [options.force]=false If true, the style tag will be appended to end of head\n * @return {void}\n * @public\n * \n * @sample Ink_Dom_Css_appendStyleTag.html \n */\n appendStyleTag: function(selector, style, options){\n options = Ink.extendObj({\n type: 'text/css',\n force: false\n }, options || {});\n\n var styles = document.getElementsByTagName(\"style\"),\n oldStyle = false, setStyle = true, i, l;\n\n for (i=0, l=styles.length; i= 0) {\n setStyle = false;\n }\n }\n\n if (setStyle) {\n var defStyle = document.createElement(\"style\"),\n head = document.getElementsByTagName(\"head\")[0],\n refTag = false, styleStr = '';\n\n defStyle.type = options.type;\n\n styleStr += selector +\" {\";\n styleStr += style;\n styleStr += \"} \";\n\n if (typeof defStyle.styleSheet !== \"undefined\") {\n defStyle.styleSheet.cssText = styleStr;\n } else {\n defStyle.appendChild(document.createTextNode(styleStr));\n }\n\n if (options.force){\n head.appendChild(defStyle);\n } else {\n refTag = this._getRefTag(head);\n if (refTag){\n head.insertBefore(defStyle, refTag);\n }\n }\n }\n },\n\n /**\n * Injects an external link tag.\n * This method add a stylesheet to the head of a page\n *\n * @method appendStylesheet\n * @param {String} path File path\n * @param {Object} options Options for the tag\n * @param {String} [options.media='screen'] Media type\n * @param {String} [options.type='text/css'] File type\n * @param {Boolean} [options.force=false] If true, tag will be appended to end of head\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_appendStylesheet.html \n */\n appendStylesheet: function(path, options){\n options = Ink.extendObj({\n media: 'screen',\n type: 'text/css',\n force: false\n }, options || {});\n\n var refTag,\n style = document.createElement(\"link\"),\n head = document.getElementsByTagName(\"head\")[0];\n\n style.media = options.media;\n style.type = options.type;\n style.href = path;\n style.rel = \"Stylesheet\";\n\n if (options.force){\n head.appendChild(style);\n }\n else {\n refTag = this._getRefTag(head);\n if (refTag){\n head.insertBefore(style, refTag);\n }\n }\n },\n\n /**\n * Injects an external link tag.\n * Loads CSS via LINK element inclusion in HEAD (skips append if already there)\n *\n * Works similarly to appendStylesheet but:\n * supports optional callback which gets invoked once the CSS has been applied\n *\n * @method appendStylesheetCb\n * @param {String} cssURI URI of the CSS to load, if empty ignores and just calls back directly\n * @param {Function(cssURI)} [callback] optional callback which will be called once the CSS is loaded\n * @return {void}\n * @public\n * @sample Ink_Dom_Css_appendStylesheetCb.html \n */\n _loadingCSSFiles: {},\n _loadedCSSFiles: {},\n appendStylesheetCb: function(url, callback) {\n if (!url) {\n return callback(url);\n }\n\n if (this._loadedCSSFiles[url]) {\n return callback(url);\n }\n\n var cbs = this._loadingCSSFiles[url];\n if (cbs) {\n return cbs.push(callback);\n }\n\n this._loadingCSSFiles[url] = [callback];\n\n var linkEl = document.createElement('link');\n linkEl.type = 'text/css';\n linkEl.rel = 'stylesheet';\n linkEl.href = url;\n\n var headEl = document.getElementsByTagName('head')[0];\n headEl.appendChild(linkEl);\n\n var imgEl = document.createElement('img');\n /*\n var _self = this;\n (function(_url) {\n imgEl.onerror = function() {\n //var url = this;\n var url = _url;\n _self._loadedCSSFiles[url] = true;\n var callbacks = _self._loadingCSSFiles[url];\n for (var i = 0, f = callbacks.length; i < f; ++i) {\n callbacks[i](url);\n }\n delete _self._loadingCSSFiles[url];\n };\n })(url);\n */\n imgEl.onerror = Ink.bindEvent(function(event, _url) {\n //var url = this;\n var url = _url;\n this._loadedCSSFiles[url] = true;\n var callbacks = this._loadingCSSFiles[url];\n for (var i = 0, f = callbacks.length; i < f; ++i) {\n callbacks[i](url);\n }\n delete this._loadingCSSFiles[url];\n }, this, url);\n imgEl.src = url;\n },\n\n /**\n * Converts decimal to hexadecimal values\n * Useful to convert colors to their hexadecimal representation.\n *\n * @method decToHex\n * @param {String} dec Either a single decimal value, an rgb(r, g, b) string or an Object with r, g and b properties\n * @return {String} Hexadecimal value\n * @sample Ink_Dom_Css_decToHex.html \n */\n decToHex: function(dec) {\n var normalizeTo2 = function(val) {\n if (val.length === 1) {\n val = '0' + val;\n }\n val = val.toUpperCase();\n return val;\n };\n\n if (typeof dec === 'object') {\n var rDec = normalizeTo2(parseInt(dec.r, 10).toString(16));\n var gDec = normalizeTo2(parseInt(dec.g, 10).toString(16));\n var bDec = normalizeTo2(parseInt(dec.b, 10).toString(16));\n return rDec+gDec+bDec;\n }\n else {\n dec += '';\n var rgb = dec.match(/\\((\\d+),\\s?(\\d+),\\s?(\\d+)\\)/);\n if (rgb !== null) {\n return normalizeTo2(parseInt(rgb[1], 10).toString(16)) +\n normalizeTo2(parseInt(rgb[2], 10).toString(16)) +\n normalizeTo2(parseInt(rgb[3], 10).toString(16));\n }\n else {\n return normalizeTo2(parseInt(dec, 10).toString(16));\n }\n }\n },\n\n /**\n * Converts hexadecimal values to decimal\n * Useful to use with CSS colors\n *\n * @method hexToDec\n * @param {String} hex hexadecimal Value with 6, 3, 2 or 1 characters\n * @return {Number} Object with properties r, g, b if length of number is >= 3 or decimal value instead.\n * @sample Ink_Dom_Css_hexToDec.html \n */\n hexToDec: function(hex){\n if (hex.indexOf('#') === 0) {\n hex = hex.substr(1);\n }\n if (hex.length === 6) { // will return object RGB\n return {\n r: parseInt(hex.substr(0,2), 16),\n g: parseInt(hex.substr(2,2), 16),\n b: parseInt(hex.substr(4,2), 16)\n };\n }\n else if (hex.length === 3) { // will return object RGB\n return {\n r: parseInt(hex.charAt(0) + hex.charAt(0), 16),\n g: parseInt(hex.charAt(1) + hex.charAt(1), 16),\n b: parseInt(hex.charAt(2) + hex.charAt(2), 16)\n };\n }\n else if (hex.length <= 2) { // will return int\n return parseInt(hex, 16);\n }\n },\n\n /**\n * Get a single property from a stylesheet.\n * Use this to obtain the value of a CSS property (searched from loaded CSS documents)\n *\n * @method getPropertyFromStylesheet\n * @param {String} selector a CSS rule. must be an exact match\n * @param {String} property a CSS property\n * @return {String} value of the found property, or null if it wasn't matched\n */\n getPropertyFromStylesheet: function(selector, property) {\n var rule = this.getRuleFromStylesheet(selector);\n if (rule) {\n return rule.style[property];\n }\n return null;\n },\n\n getPropertyFromStylesheet2: function(selector, property) {\n var rules = this.getRulesFromStylesheet(selector);\n /*\n rules.forEach(function(rule) {\n var x = rule.style[property];\n if (x !== null && x !== undefined) {\n return x;\n }\n });\n */\n var x;\n for(var i=0, t=rules.length; i < t; i++) {\n x = rules[i].style[property];\n if (x !== null && x !== undefined) {\n return x;\n }\n }\n return null;\n },\n\n getRuleFromStylesheet: function(selector) {\n var sheet, rules, ri, rf, rule;\n var s = document.styleSheets;\n if (!s) {\n return null;\n }\n\n for (var si = 0, sf = document.styleSheets.length; si < sf; ++si) {\n sheet = document.styleSheets[si];\n rules = sheet.rules ? sheet.rules : sheet.cssRules;\n if (!rules) { return null; }\n\n for (ri = 0, rf = rules.length; ri < rf; ++ri) {\n rule = rules[ri];\n if (!rule.selectorText) { continue; }\n if (rule.selectorText === selector) {\n return rule;\n }\n }\n }\n\n return null;\n },\n\n getRulesFromStylesheet: function(selector) {\n var res = [];\n var sheet, rules, ri, rf, rule;\n var s = document.styleSheets;\n if (!s) { return res; }\n\n for (var si = 0, sf = document.styleSheets.length; si < sf; ++si) {\n sheet = document.styleSheets[si];\n rules = sheet.rules ? sheet.rules : sheet.cssRules;\n if (!rules) {\n return null;\n }\n\n for (ri = 0, rf = rules.length; ri < rf; ++ri) {\n rule = rules[ri];\n if (!rule.selectorText) { continue; }\n if (rule.selectorText === selector) {\n res.push(rule);\n }\n }\n }\n\n return res;\n },\n\n getPropertiesFromRule: function(selector) {\n var rule = this.getRuleFromStylesheet(selector);\n var props = {};\n var prop, i, f;\n\n /*if (typeof rule.style.length === 'snumber') {\n for (i = 0, f = rule.style.length; i < f; ++i) {\n prop = this._camelCase( rule.style[i] );\n props[prop] = rule.style[prop];\n }\n }\n else { // HANDLES IE 8, FIREFOX RULE JOINING... */\n rule = rule.style.cssText;\n var parts = rule.split(';');\n var steps, val, pre, pos;\n for (i = 0, f = parts.length; i < f; ++i) {\n if (parts[i].charAt(0) === ' ') {\n parts[i] = parts[i].substring(1);\n }\n steps = parts[i].split(':');\n prop = this._camelCase( steps[0].toLowerCase() );\n val = steps[1];\n if (val) {\n val = val.substring(1);\n\n if (prop === 'padding' || prop === 'margin' || prop === 'borderWidth') {\n\n if (prop === 'borderWidth') { pre = 'border'; pos = 'Width'; }\n else { pre = prop; pos = ''; }\n\n if (val.indexOf(' ') !== -1) {\n val = val.split(' ');\n props[pre + 'Top' + pos] = val[0];\n props[pre + 'Bottom'+ pos] = val[0];\n props[pre + 'Left' + pos] = val[1];\n props[pre + 'Right' + pos] = val[1];\n }\n else {\n props[pre + 'Top' + pos] = val;\n props[pre + 'Bottom'+ pos] = val;\n props[pre + 'Left' + pos] = val;\n props[pre + 'Right' + pos] = val;\n }\n }\n else if (prop === 'borderRadius') {\n if (val.indexOf(' ') !== -1) {\n val = val.split(' ');\n props.borderTopLeftRadius = val[0];\n props.borderBottomRightRadius = val[0];\n props.borderTopRightRadius = val[1];\n props.borderBottomLeftRadius = val[1];\n }\n else {\n props.borderTopLeftRadius = val;\n props.borderTopRightRadius = val;\n props.borderBottomLeftRadius = val;\n props.borderBottomRightRadius = val;\n }\n }\n else {\n props[prop] = val;\n }\n }\n }\n //}\n //console.log(props);\n\n return props;\n },\n\n /**\n * Change the font size of elements.\n * Changes the font size of the elements which match the given CSS rule\n * For this function to work, the CSS file must be in the same domain than the host page, otherwise JS can't access it.\n *\n * @method changeFontSize\n * @param {String} selector CSS selector rule\n * @param {Number} delta Number of pixels to change on font-size\n * @param {String} [op] Supported operations are '+' and '*'. defaults to '+'\n * @param {Number} [minVal] If result gets smaller than minVal, change does not occurr\n * @param {Number} [maxVal] If result gets bigger than maxVal, change does not occurr\n * @return {void}\n * @public\n */\n changeFontSize: function(selector, delta, op, minVal, maxVal) {\n var that = this;\n Ink.requireModules(['Ink.Dom.Selector_1'], function(Selector) {\n var e;\n if (typeof selector !== 'string') { e = '1st argument must be a CSS selector rule.'; }\n else if (typeof delta !== 'number') { e = '2nd argument must be a number.'; }\n else if (op !== undefined && op !== '+' && op !== '*') { e = '3rd argument must be one of \"+\", \"*\".'; }\n else if (minVal !== undefined && (typeof minVal !== 'number' || minVal <= 0)) { e = '4th argument must be a positive number.'; }\n else if (maxVal !== undefined && (typeof maxVal !== 'number' || maxVal < maxVal)) { e = '5th argument must be a positive number greater than minValue.'; }\n if (e) { throw new TypeError(e); }\n\n var val, el, els = Selector.select(selector);\n if (minVal === undefined) { minVal = 1; }\n op = (op === '*') ? function(a,b){return a*b;} : function(a,b){return a+b;};\n for (var i = 0, f = els.length; i < f; ++i) {\n el = els[i];\n val = parseFloat( that.getStyle(el, 'fontSize'));\n val = op(val, delta);\n if (val < minVal) { continue; }\n if (typeof maxVal === 'number' && val > maxVal) { continue; }\n el.style.fontSize = val + 'px';\n }\n });\n }\n\n };\n\n return Css;\n\n});\n","/**\n * DOM Traversal and manipulation\n * @module Ink.Dom.Element_1\n * @version 1\n */\n\nInk.createModule('Ink.Dom.Element', 1, [], function() {\n\n 'use strict';\n\n var createContextualFragmentSupport = (\n typeof document.createRange === 'function' &&\n typeof window.Range.prototype.createContextualFragment === 'function');\n\n var deleteThisTbodyToken = 'Ink.Dom.Element tbody: ' + Math.random();\n var browserCreatesTbodies = (function () {\n var div = document.createElement('div');\n div.innerHTML = '';\n return div.getElementsByTagName('tbody').length !== 0;\n }());\n\n function rect(elem){\n var dimensions = {};\n try {\n dimensions = elem.getBoundingClientRect();\n } catch(e){\n dimensions = { top: elem.offsetTop, left: elem.offsetLeft };\n }\n return dimensions;\n }\n\n /**\n * @namespace Ink.Dom.Element_1\n */\n\n var InkElement = {\n\n /**\n * Checks if something is a DOM Element.\n *\n * @method isDOMElement\n * @static\n * @param {Mixed} o The object to be checked.\n * @return {Boolean} True if it's a valid DOM Element.\n * @public\n * @example\n * var el = Ink.s('#element');\n * if( InkElement.isDOMElement( el ) === true ){\n * // It is a DOM Element.\n * } else {\n * // It is NOT a DOM Element.\n * }\n */\n isDOMElement: function(o) {\n return o !== null && typeof o === 'object' && 'nodeType' in o && o.nodeType === 1;\n },\n\n /**\n * Shortcut for `document.getElementById`\n *\n * @method get\n * @param {String|DOMElement} elm Either an ID of an element, or an element.\n * @return {DOMElement|null} The DOM element with the given id or null when it was not found\n * @public\n * @sample Ink_Dom_Element_1_get.html\n */\n get: function(elm) {\n if(typeof elm !== 'undefined') {\n if(typeof elm === 'string') {\n return document.getElementById(elm);\n }\n return elm;\n }\n return null;\n },\n\n /**\n * Creates a DOM element.\n *\n * Just a shortcut for `document.createElement(tag)`, but with the second argument you can call additional functions present in Ink.Dom.Element.\n *\n * @method create\n * @param {String} tag Tag name\n * @param {Object} properties Object with properties to be set on the element. You can also call other functions in Ink.Dom.Element like this\n * @return {Element} The newly created element.\n * @public\n * @sample Ink_Dom_Element_1_create.html\n */\n create: function(tag, properties) {\n var el = document.createElement(tag);\n //Ink.extendObj(el, properties);\n if (properties) {\n for(var property in properties) {\n if(properties.hasOwnProperty(property)) {\n if (property in InkElement) {\n InkElement[property](el, properties[property]);\n } else {\n if(property === 'className' || property === 'class') {\n el.className = properties.className || properties['class'];\n } else {\n el.setAttribute(property, properties[property]);\n }\n }\n }\n }\n }\n return el;\n },\n\n /**\n * Removes a DOM Element\n *\n * @method remove\n * @param {Element} elm The element to remove\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_remove.html\n */\n remove: function(elm) {\n elm = Ink.i(elm);\n var parEl;\n if (elm && (parEl = elm.parentNode)) {\n parEl.removeChild(elm);\n }\n },\n\n /**\n * Scrolls the window to an element\n *\n * @method scrollTo\n * @param {DOMElement|String} elm Element where to scroll\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_scrollTo.html\n */\n scrollTo: function(elm) {\n elm = InkElement.get(elm);\n if(elm) {\n if (elm.scrollIntoView) {\n return elm.scrollIntoView();\n }\n\n var elmOffset = {},\n elmTop = 0, elmLeft = 0;\n\n do {\n elmTop += elm.offsetTop || 0;\n elmLeft += elm.offsetLeft || 0;\n\n elm = elm.offsetParent;\n } while(elm);\n\n elmOffset = {x: elmLeft, y: elmTop};\n\n window.scrollTo(elmOffset.x, elmOffset.y);\n }\n },\n\n /**\n * Gets the top offset of an element\n *\n * @method offsetTop\n * @uses Ink.Dom.Browser\n *\n * @param {DOMElement|String} elm Target element\n * @return {Number} Offset from the target element to the top of the document.\n * @public\n * @sample Ink_Dom_Element_1_offsetTop.html\n */\n offsetTop: function(elm) {\n return InkElement.offset(elm)[1];\n },\n\n /**\n * Gets the left offset of an element\n *\n * @method offsetLeft\n * @uses Ink.Dom.Browser\n *\n * @param {DOMElement|String} elm Target element\n * @return {Number} Offset from the target element to the left of the document\n * @public\n * @sample Ink_Dom_Element_1_offsetLeft.html\n */\n offsetLeft: function(elm) {\n return InkElement.offset(elm)[0];\n },\n\n /**\n * Gets the relative offset of an element\n *\n * @method positionedOffset\n * @param {Element|String} element Target element\n * @return {Array} Array with the element offsetleft and offsettop relative to the closest positioned ancestor\n * @public\n * @sample Ink_Dom_Element_1_positionedOffset.html\n */\n positionedOffset: function(element) {\n var valueTop = 0, valueLeft = 0;\n element = InkElement.get(element);\n do {\n valueTop += element.offsetTop || 0;\n valueLeft += element.offsetLeft || 0;\n element = element.offsetParent;\n if (element) {\n if (element.tagName.toLowerCase() === 'body') { break; }\n\n var value = element.style.position;\n if (!value && element.currentStyle) {\n value = element.currentStyle.position;\n }\n if ((!value || value === 'auto') && typeof getComputedStyle !== 'undefined') {\n var css = getComputedStyle(element, null);\n value = css ? css.position : null;\n }\n if (value === 'relative' || value === 'absolute') { break; }\n }\n } while (element);\n return [valueLeft, valueTop];\n },\n\n /**\n * Gets the cumulative offset for an element\n *\n * Returns the top left position of the element on the page\n *\n * @method offset\n * @uses Ink.Dom.Browser\n *\n * @method offset\n * @param {DOMElement|String} elm Target element\n * @return {[Number, Number]} Array with pixel distance from the target element to the top left corner of the document\n * @public\n * @sample Ink_Dom_Element_1_offset.html\n */\n offset: function(elm) {\n /*jshint boss:true */\n elm = Ink.i(elm);\n var res = [0, 0];\n var doc = elm.ownerDocument,\n docElem = doc.documentElement,\n box = rect(elm),\n body = doc.body,\n clientTop = docElem.clientTop || body.clientTop || 0,\n clientLeft = docElem.clientLeft || body.clientLeft || 0,\n scrollTop = doc.pageYOffset || docElem.scrollTop || body.scrollTop,\n scrollLeft = doc.pageXOffset || docElem.scrollLeft || body.scrollLeft,\n top = box.top + scrollTop - clientTop,\n left = box.left + scrollLeft - clientLeft;\n res = [left, top];\n return res;\n },\n\n /**\n * Gets the scroll of the element\n *\n * @method scroll\n * @param {DOMElement|String} [elm] Target element or document.body\n * @returns {Array} offset values for x and y scroll\n * @public\n * @sample Ink_Dom_Element_1_scroll.html\n */\n scroll: function(elm) {\n elm = elm ? Ink.i(elm) : document.body;\n return [\n ( ( !window.pageXOffset ) ? elm.scrollLeft : window.pageXOffset ),\n ( ( !window.pageYOffset ) ? elm.scrollTop : window.pageYOffset )\n ];\n },\n\n _getPropPx: function(cs, prop) {\n var n, c;\n var val = cs.getPropertyValue ? cs.getPropertyValue(prop) : cs[prop];\n if (!val) { n = 0; }\n else {\n c = val.indexOf('px');\n if (c === -1) { n = 0; }\n else {\n n = parseFloat(val, 10);\n }\n }\n\n //console.log([prop, ' \"', val, '\" ', n].join(''));\n\n return n;\n },\n\n /**\n * Alias for offset()\n *\n * @method offset2\n * @param {Element} el Element to be passed to `offset()`\n * @return {void}\n * @public\n * @deprecated Kept for historic reasons. Use offset() instead.\n */\n offset2: function(el) {\n return InkElement.offset(el);\n },\n\n /**\n * Checks if an element has an attribute\n *\n * @method hasAttribute\n * @param {Object} elm Target element\n * @param {String} attr Attribute name\n * @return {Boolean} Boolean based on existance of attribute\n * @sample Ink_Dom_Element_1_hasAttribute.html\n */\n hasAttribute: function(elm, attr){\n elm = Ink.i(elm);\n return elm.hasAttribute ? elm.hasAttribute(attr) : !!elm.getAttribute(attr);\n },\n /**\n * Inserts an element right after another\n *\n * @method insertAfter\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertAfter.html\n */\n insertAfter: function(newElm, targetElm) {\n /*jshint boss:true */\n if (targetElm = InkElement.get(targetElm)) {\n if (targetElm.nextSibling !== null) {\n targetElm.parentNode.insertBefore(newElm, targetElm.nextSibling);\n } else {\n targetElm.parentNode.appendChild(newElm);\n }\n }\n },\n\n /**\n * Inserts an element before another\n *\n * @method insertBefore\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertBefore.html\n */\n insertBefore: function (newElm, targetElm) {\n /*jshint boss:true */\n if ( (targetElm = InkElement.get(targetElm)) ) {\n targetElm.parentNode.insertBefore(newElm, targetElm);\n }\n },\n\n /**\n * Inserts an element as the first child of another\n *\n * @method insertTop\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertTop.html\n */\n insertTop: function(newElm,targetElm) {\n /*jshint boss:true */\n if (targetElm = InkElement.get(targetElm)) {\n if (targetElm.firstChild) {\n targetElm.insertBefore(newElm, targetElm.firstChild);\n } else {\n targetElm.appendChild(newElm);\n }\n }\n },\n\n /**\n * Inserts an element as the last child of another\n *\n * @method insertBottom\n * @param {DOMElement} newElm Element to be inserted\n * @param {DOMElement|String} targetElm Key element\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_insertBottom.html\n */\n insertBottom: function(newElm, targetElm) {\n /*jshint boss:true */\n targetElm = Ink.i(targetElm);\n targetElm.appendChild(newElm);\n },\n\n /**\n * Retrieves textContent from node\n *\n * @method textContent\n * @param {DOMNode} node Where to retreive text from. Can be any node type.\n * @return {String} The text\n * @public\n * @sample Ink_Dom_Element_1_textContent.html\n */\n textContent: function(node){\n node = Ink.i(node);\n var text, k, cs, m;\n\n switch(node && node.nodeType) {\n case 9: /*DOCUMENT_NODE*/\n // IE quirks mode does not have documentElement\n return InkElement.textContent(node.documentElement || node.body && node.body.parentNode || node.body);\n\n case 1: /*ELEMENT_NODE*/\n text = ('textContent' in node) ? node.textContent : node.innerText;\n if (typeof text !== 'undefined') {\n return text;\n }\n /* falls through */\n case 11: /*DOCUMENT_FRAGMENT_NODE*/\n text = node.textContent;\n if (typeof text !== 'undefined') {\n return text;\n }\n\n if (node.firstChild === node.lastChild) {\n // Common case: 0 or 1 children\n return InkElement.textContent(node.firstChild);\n }\n\n text = [];\n cs = node.childNodes;\n for (k = 0, m = cs.length; k < m; ++k) {\n text.push( InkElement.textContent( cs[k] ) );\n }\n return text.join('');\n\n case 3: /*TEXT_NODE*/\n case 4: /*CDATA_SECTION_NODE*/\n return node.nodeValue;\n }\n return '';\n },\n\n /**\n * Replaces text content of a DOM Node\n * This method removes any child node previously present\n *\n * @method setTextContent\n * @param {Element} node Target node where the text will be added.\n * @param {String} text Text to be added on the node.\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_setTextContent.html\n */\n setTextContent: function(node, text){\n node = Ink.i(node);\n switch(node && node.nodeType)\n {\n case 1: /*ELEMENT_NODE*/\n if ('innerText' in node) {\n node.innerText = text;\n break;\n }\n /* falls through */\n case 11: /*DOCUMENT_FRAGMENT_NODE*/\n if ('textContent' in node) {\n node.textContent = text;\n break;\n }\n /* falls through */\n case 9: /*DOCUMENT_NODE*/\n while(node.firstChild) {\n node.removeChild(node.firstChild);\n }\n if (text !== '') {\n var doc = node.ownerDocument || node;\n node.appendChild(doc.createTextNode(text));\n }\n break;\n\n case 3: /*TEXT_NODE*/\n case 4: /*CDATA_SECTION_NODE*/\n node.nodeValue = text;\n break;\n }\n },\n\n /**\n * Checks if an element is a link\n *\n * @method isLink\n * @param {Element} element Element to check if it's a link.\n * @return {Boolean} Whether the element is a link.\n * @public\n * @sample Ink_Dom_Element_1_isLink.html\n */\n isLink: function(element){\n var b = element && element.nodeType === 1 && ((/^a|area$/i).test(element.tagName) ||\n element.hasAttributeNS && element.hasAttributeNS('http://www.w3.org/1999/xlink','href'));\n return !!b;\n },\n\n /**\n * Checks if a node is an ancestor of another\n *\n * @method isAncestorOf\n * @param {DOMNode} ancestor Ancestor node\n * @param {DOMNode} node Descendant node\n * @return {Boolean} Whether `ancestor` is an ancestor of `node`\n * @public\n * @sample Ink_Dom_Element_1_isAncestorOf.html\n */\n isAncestorOf: function(ancestor, node){\n /*jshint boss:true */\n if (!node || !ancestor) {\n return false;\n }\n if (node.compareDocumentPosition) {\n return (ancestor.compareDocumentPosition(node) & 0x10) !== 0;/*Node.DOCUMENT_POSITION_CONTAINED_BY*/\n }\n while (node = node.parentNode){\n if (node === ancestor){\n return true;\n }\n }\n return false;\n },\n\n /**\n * Checks if a node is descendant of another\n *\n * @method descendantOf\n * @param {DOMNode} node The ancestor\n * @param {DOMNode} descendant The descendant\n * @return {Boolean} `true` if 'descendant' is descendant of 'node'\n * @public\n * @sample Ink_Dom_Element_1_descendantOf.html\n */\n descendantOf: function(node, descendant){\n return node !== descendant && InkElement.isAncestorOf(node, descendant);\n },\n\n /**\n * Get first child element of another\n * @method firstElementChild\n * @param {DOMElement} elm Parent node\n * @return {DOMElement} the Element child\n * @public\n * @sample Ink_Dom_Element_1_firstElementChild.html\n */\n firstElementChild: function(elm){\n if(!elm) {\n return null;\n }\n if ('firstElementChild' in elm) {\n return elm.firstElementChild;\n }\n var child = elm.firstChild;\n while(child && child.nodeType !== 1) {\n child = child.nextSibling;\n }\n return child;\n },\n\n /**\n * Get the last child element of another\n * @method lastElementChild\n * @param {DOMElement} elm Parent node\n * @return {DOMElement} the Element child\n * @public\n * @sample Ink_Dom_Element_1_lastElementChild.html\n */\n lastElementChild: function(elm){\n if(!elm) {\n return null;\n }\n if ('lastElementChild' in elm) {\n return elm.lastElementChild;\n }\n var child = elm.lastChild;\n while(child && child.nodeType !== 1) {\n child = child.previousSibling;\n }\n return child;\n },\n\n /**\n * Get the first sibling element after the node\n *\n * @method nextElementSibling\n * @param {DOMNode} node The current node\n * @return {DOMElement|Null} The first sibling element after node or null if none is found\n * @public\n * @sample Ink_Dom_Element_1_nextElementSibling.html \n */\n nextElementSibling: function(node){\n var sibling = null;\n\n if(!node){ return sibling; }\n\n if(\"nextElementSibling\" in node){\n return node.nextElementSibling;\n } else {\n sibling = node.nextSibling;\n\n // 1 === Node.ELEMENT_NODE\n while(sibling && sibling.nodeType !== 1){\n sibling = sibling.nextSibling;\n }\n\n return sibling;\n }\n },\n\n /**\n * Get the first sibling element before the node\n *\n * @method previousElementSibling\n * @param {DOMNode} node The current node\n * @return {DOMElement|Null} The first element sibling before node or null if none is found\n * @public\n * @sample Ink_Dom_Element_1_previousElementSibling.html \n */\n previousElementSibling: function(node){\n var sibling = null;\n\n if(!node){ return sibling; }\n\n if(\"previousElementSibling\" in node){\n return node.previousElementSibling;\n } else {\n sibling = node.previousSibling;\n\n // 1 === Node.ELEMENT_NODE\n while(sibling && sibling.nodeType !== 1){\n sibling = sibling.previousSibling;\n }\n\n return sibling;\n }\n },\n\n /**\n * Get an element's width in pixels.\n *\n * @method elementWidth\n * @param {DOMElement|String} element Target DOM element or target ID\n * @return {Number} The element's width\n * @public\n * @sample Ink_Dom_Element_1_elementWidth.html \n */\n elementWidth: function(element) {\n if(typeof element === \"string\") {\n element = document.getElementById(element);\n }\n return element.offsetWidth;\n },\n\n /**\n * Get an element's height in pixels.\n *\n * @method elementHeight\n * @param {DOMElement|String} element DOM element or target ID\n * @return {Number} The element's height\n * @public\n * @sample Ink_Dom_Element_1_elementHeight.html \n */\n elementHeight: function(element) {\n if(typeof element === \"string\") {\n element = document.getElementById(element);\n }\n return element.offsetHeight;\n },\n\n /**\n * Deprecated. Alias for offsetLeft()\n *\n * @method elementLeft\n * @param {DOMElement|String} element DOM element or target ID\n * @return {Number} Element's left position\n */\n elementLeft: function(element) {\n return InkElement.offsetLeft(element);\n },\n\n /**\n * Deprecated. Alias for offsetTop()\n *\n * @method elementTop\n * @param {DOMElement|string} element Target DOM element or target ID\n * @return {Number} element's top position\n */\n elementTop: function(element) {\n return InkElement.offsetTop(element);\n },\n\n /**\n * Get an element's dimensions in pixels.\n *\n * @method elementDimensions\n * @param {DOMElement|string} element DOM element or target ID\n * @return {Array} Array with element's width and height\n * @sample Ink_Dom_Element_1_elementDimensions.html \n */\n elementDimensions: function(element) {\n element = Ink.i(element);\n return [element.offsetWidth, element.offsetHeight];\n },\n\n /**\n * Get the outer dimensions of an element in pixels.\n *\n * @method outerDimensions\n * @uses Ink.Dom.Css\n *\n * @param {DOMElement} element Target element\n * @return {Array} Array with element width and height.\n * @sample Ink_Dom_Element_1_outerDimensions.html \n */\n outerDimensions: function (element) {\n var bbox = rect(element);\n\n var Css = Ink.getModule('Ink.Dom.Css_1');\n var getStyle = Ink.bindMethod(Css, 'getStyle', element);\n\n return [\n bbox.right - bbox.left + parseFloat(getStyle('marginLeft') || 0) + parseFloat(getStyle('marginRight') || 0), // w\n bbox.bottom - bbox.top + parseFloat(getStyle('marginTop') || 0) + parseFloat(getStyle('marginBottom') || 0) // h\n ];\n },\n\n /**\n * Check if an element is inside the viewport\n *\n * @method inViewport\n * @param {DOMElement} element DOM Element\n * @param {Object} [options] Options object. If you pass a Boolean value here, it is interpreted as `options.partial`\n * @param {Boolean} [options.partial]=false Return `true` even if it is only partially visible.\n * @param {Number} [options.margin]=0 Consider a margin all around the viewport with `opts.margin` width a dead zone.\n * @return {Boolean} Whether the element is inside the viewport.\n * @public\n * @sample Ink_Dom_Element_1_inViewport.html \n */\n inViewport: function (element, options) {\n var dims = rect(Ink.i(element));\n if (typeof options === 'boolean') {\n options = {partial: options, margin: 0};\n }\n options = Ink.extendObj({ partial: false, margin: 0}, options || {});\n if (options.partial) {\n return dims.bottom + options.margin > 0 && // from the top\n dims.left - options.margin < InkElement.viewportWidth() && // from the right\n dims.top - options.margin < InkElement.viewportHeight() && // from the bottom\n dims.right + options.margin > 0; // from the left\n } else {\n return dims.top + options.margin > 0 && // from the top\n dims.right - options.margin < InkElement.viewportWidth() && // from the right\n dims.bottom - options.margin < InkElement.viewportHeight() && // from the bottom\n dims.left + options.margin > 0; // from the left\n }\n },\n\n /**\n * Check if an element is hidden.\n * Taken from Mootools Element extras ( https://gist.github.com/cheeaun/73342 )\n * Does not take into account visibility:hidden\n * @method isHidden\n * @param {DOMElement} element Element to check\n * @return {Boolean} Whether the element is hidden\n * @sample Ink_Dom_Element_1_isHidden.html \n */\n isHidden: function (element) {\n var w = element.offsetWidth, \n h = element.offsetHeight,\n force = (element.tagName.toLowerCase() === 'tr');\n\n var Css = Ink.getModule('Ink.Dom.Css_1');\n\n return (w===0 && h===0 && !force) ? true :\n (w!==0 && h!==0 && !force) ? false :\n Css.getStyle(element, 'display').toLowerCase() === 'none';\n },\n\n /**\n * Check if an element is visible \n *\n * @method isVisible\n * @uses isHidden\n * @param {DOMElement} element Element to check\n * @return {Boolean} Whether the element is visible\n * @sample Ink_Dom_Element_1_isVisible.html \n */\n isVisible: function (element) {\n return !this.isHidden(element);\n },\n\n /**\n * Clones an element's position to another\n *\n * @method clonePosition\n * @param {Element} cloneTo element to be position cloned\n * @param {Element} cloneFrom element to get the cloned position\n * @return {Element} The element with positionClone\n * @public\n * @sample Ink_Dom_Element_1_clonePosition.html \n */\n clonePosition: function(cloneTo, cloneFrom){\n var pos = InkElement.offset(cloneFrom);\n cloneTo.style.left = pos[0]+'px';\n cloneTo.style.top = pos[1]+'px';\n\n return cloneTo;\n },\n\n /**\n * Text-overflow: ellipsis emulation\n * Slices off a piece of text at the end of the element and adds the ellipsis so all text fits inside.\n *\n * @method ellipsizeText\n * @param {Element} element Element to modify text content\n * @param {String} [ellipsis='\\u2026'] String to append to the chopped text\n * @return {void}\n * @public\n */\n ellipsizeText: function(element/*, ellipsis*/){\n if ((element = Ink.i(element))) {\n element.style.overflow = 'hidden';\n element.style.whiteSpace = 'nowrap';\n element.style.textOverflow = 'ellipsis';\n }\n },\n\n /**\n * Finds the closest ancestor element matching your test function\n *\n * @method findUpwardsHaving\n * @param {Element} element Element to base the search from\n * @param {Function} boolTest Testing function\n * @return {Element|false} The matched element or false if did not match\n * @public\n * @sample Ink_Dom_Element_1_findUpwardsHaving.html \n */\n findUpwardsHaving: function(element, boolTest) {\n while (element && element.nodeType === 1) {\n if (boolTest(element)) {\n return element;\n }\n element = element.parentNode;\n }\n return false;\n },\n\n /**\n * Finds the closest ancestor by class name\n *\n * @method findUpwardsByClass\n * @uses findUpwardsHaving\n * @param {DOMElement} element Element to base the search from\n * @param {String} className Class name to search\n * @returns {DOMElement|false} The matched element or false if did not match\n * @public\n * @sample Ink_Dom_Element_1_findUpwardsByClass.html \n */\n findUpwardsByClass: function(element, className) {\n var re = new RegExp(\"(^|\\\\s)\" + className + \"(\\\\s|$)\");\n var tst = function(el) {\n var cls = el.className;\n return cls && re.test(cls);\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Finds the closest ancestor by tag name\n *\n * @method findUpwardsByTag\n * @param {DOMElement} element Element to base the search from\n * @param {String} tag Tag to search\n * @returns {DOMElement|false} the matched element or false if did not match\n * @sample Ink_Dom_Element_1_findUpwardsByTag.html \n */\n findUpwardsByTag: function(element, tag) {\n tag = tag.toUpperCase();\n var tst = function(el) {\n return el.nodeName && el.nodeName.toUpperCase() === tag;\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Finds the closest ancestor by id\n *\n * @method findUpwardsById\n * @param {HtmlElement} element Element to base the search from\n * @param {String} id ID to search\n * @returns {HtmlElement|false} The matched element or false if did not match\n * @sample Ink_Dom_Element_1_findUpwardsById.html \n */\n findUpwardsById: function(element, id) {\n var tst = function(el) {\n return el.id === id;\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Finds the closest ancestor by CSS selector\n *\n * @method findUpwardsBySelector\n * @param {HtmlElement} element Element to base the search from\n * @param {String} sel CSS selector\n * @returns {HtmlElement|false} The matched element or false if did not match\n * @sample Ink_Dom_Element_1_findUpwardsBySelector.html \n */\n findUpwardsBySelector: function(element, sel) {\n var Selector = Ink.getModule('Ink.Dom.Selector', '1');\n if (!Selector) {\n throw new Error('This method requires Ink.Dom.Selector');\n }\n var tst = function(el) {\n return Selector.matchesSelector(el, sel);\n };\n return InkElement.findUpwardsHaving(element, tst);\n },\n\n /**\n * Gets the trimmed text of an element\n *\n * @method getChildrenText\n * @param {DOMElement} el Element to base the search from\n * @param {Boolean} [removeIt] Flag to remove the text from the element\n * @return {String} Text found\n * @sample Ink_Dom_Element_1_getChildrenText.html \n */\n getChildrenText: function(el, removeIt) {\n var node,\n j,\n part,\n nodes = el.childNodes,\n jLen = nodes.length,\n text = '';\n\n if (!el) {\n return text;\n }\n\n for (j = 0; j < jLen; ++j) {\n node = nodes[j];\n if (!node) { continue; }\n if (node.nodeType === 3) { // TEXT NODE\n part = InkElement._trimString( String(node.data) );\n if (part.length > 0) {\n text += part;\n if (removeIt) { el.removeChild(node); }\n }\n else { el.removeChild(node); }\n }\n }\n\n return text;\n },\n\n /**\n * String trim implementation\n * Used by getChildrenText\n *\n * function _trimString\n * param {String} text\n * return {String} trimmed text\n */\n _trimString: function(text) {\n return (String.prototype.trim) ? text.trim() : text.replace(/^\\s*/, '').replace(/\\s*$/, '');\n },\n\n /**\n * Gets value of a select element\n *\n * @method getSelectValues\n * @param {DOMElement|String} select element\n * @return {Array} The selected values\n * @sample Ink_Dom_Element_1_getSelectValues.html \n */\n getSelectValues: function (select) {\n var selectEl = Ink.i(select);\n var values = [];\n for (var i = 0; i < selectEl.options.length; ++i) {\n values.push( selectEl.options[i].value );\n }\n return values;\n },\n\n\n /* used by fills */\n _normalizeData: function(data) {\n var d, data2 = [];\n for (var i = 0, f = data.length; i < f; ++i) {\n d = data[i];\n\n if (!(d instanceof Array)) { // if not array, wraps primitive twice: val -> [val, val]\n d = [d, d];\n }\n else if (d.length === 1) { // if 1 element array: [val] -> [val, val]\n d.push(d[0]);\n }\n data2.push(d);\n }\n return data2;\n },\n\n\n /**\n * Fills a select element with options\n *\n * @method fillSelect\n * @param {DOMElement|String} container Select element which will get filled\n * @param {Array} data Data to populate the component\n * @param {Boolean} [skipEmpty] Flag to skip empty option\n * @param {String|Number} [defaultValue] Initial selected value\n * @return {void}\n * @public\n *\n * @sample Ink_Dom_Element_1_fillSelect.html \n */\n fillSelect: function(container, data, skipEmpty, defaultValue) {\n var containerEl = Ink.i(container);\n if (!containerEl) { return; }\n\n containerEl.innerHTML = '';\n var d, optionEl;\n\n if (!skipEmpty) {\n // add initial empty option\n optionEl = document.createElement('option');\n optionEl.setAttribute('value', '');\n containerEl.appendChild(optionEl);\n }\n\n data = InkElement._normalizeData(data);\n\n for (var i = 0, f = data.length; i < f; ++i) {\n d = data[i];\n\n optionEl = document.createElement('option');\n optionEl.setAttribute('value', d[0]);\n if (d.length > 2) {\n optionEl.setAttribute('extra', d[2]);\n }\n optionEl.appendChild( document.createTextNode(d[1]) );\n\n if (d[0] === defaultValue) {\n optionEl.setAttribute('selected', 'selected');\n }\n\n containerEl.appendChild(optionEl);\n }\n },\n\n\n /**\n * Creates a set of radio buttons from an array of data\n *\n * @method fillRadios\n * @param {Element|String} insertAfterEl Element after which the input elements will be created\n * @param {String} name Name for the form field ([] is added if not present as a suffix)\n * @param {Array} data Data to populate the component\n * @param {Boolean} [skipEmpty] Flag to skip creation of empty options\n * @param {String|Number} [defaultValue] Initial selected value\n * @param {String} [splitEl] Name of element to add after each input element (example: 'br')\n * @return {DOMElement} Wrapper element around the radio buttons\n */\n fillRadios: function(insertAfterEl, name, data, skipEmpty, defaultValue, splitEl) {\n insertAfterEl = Ink.i(insertAfterEl);\n var containerEl = document.createElement('span');\n InkElement.insertAfter(containerEl, insertAfterEl);\n\n data = InkElement._normalizeData(data);\n\n /*\n if (name.substring(name.length - 1) !== ']') {\n name += '[]';\n }\n */\n\n var d, inputEl;\n\n if (!skipEmpty) {\n // add initial empty option\n inputEl = document.createElement('input');\n inputEl.setAttribute('type', 'radio');\n inputEl.setAttribute('name', name);\n inputEl.setAttribute('value', '');\n containerEl.appendChild(inputEl);\n if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); }\n }\n\n for (var i = 0; i < data.length; ++i) {\n d = data[i];\n\n inputEl = document.createElement('input');\n inputEl.setAttribute('type', 'radio');\n inputEl.setAttribute('name', name);\n inputEl.setAttribute('value', d[0]);\n containerEl.appendChild(inputEl);\n containerEl.appendChild( document.createTextNode(d[1]) );\n if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); }\n\n if (d[0] === defaultValue) {\n inputEl.checked = true;\n }\n }\n\n return containerEl;\n },\n\n\n /**\n * Creates set of checkbox buttons\n *\n * @method fillChecks\n * @param {Element|String} insertAfterEl Element after which the input elements will be created\n * @param {String} name Name for the form field ([] is added if not present as a suffix)\n * @param {Array} data Data to populate the component\n * @param {String|Number} [defaultValue] Initial selected value\n * @param {String} [splitEl] Name of element to add after each input element (example: 'br')\n * @return {Element} Wrapper element around the checkboxes\n * @public\n */\n fillChecks: function(insertAfterEl, name, data, defaultValue, splitEl) {\n insertAfterEl = Ink.i(insertAfterEl);\n var containerEl = document.createElement('span');\n InkElement.insertAfter(containerEl, insertAfterEl);\n\n data = InkElement._normalizeData(data);\n\n if (name.substring(name.length - 1) !== ']') {\n name += '[]';\n }\n\n var d, inputEl;\n\n for (var i = 0; i < data.length; ++i) {\n d = data[i];\n\n inputEl = document.createElement('input');\n inputEl.setAttribute('type', 'checkbox');\n inputEl.setAttribute('name', name);\n inputEl.setAttribute('value', d[0]);\n containerEl.appendChild(inputEl);\n containerEl.appendChild( document.createTextNode(d[1]) );\n if (splitEl) { containerEl.appendChild( document.createElement(splitEl) ); }\n\n if (d[0] === defaultValue) {\n inputEl.checked = true;\n }\n }\n\n return containerEl;\n },\n\n\n /**\n * Gets the index of an element relative to a parent\n *\n * @method parentIndexOf\n * @param {Element} [parentEl] childEl's parent. Deprecated.\n * @param {Element} childEl Child Element to look for\n * @return {Number} The index of the childEl inside parentEl. Returns -1 if it's not a direct child\n * @public\n * @sample Ink_Dom_Element_1_parentIndexOf.html \n */\n parentIndexOf: function(parentEl, childEl) {\n if (!childEl) {\n // one argument form\n childEl = parentEl;\n parentEl = parentEl.parentNode;\n }\n if (!parentEl) { return false; }\n for (var i = 0, f = parentEl.children.length; i < f; ++i) {\n if (parentEl.children[i] === childEl) {\n return i;\n }\n }\n return false;\n },\n\n\n /**\n * Gets the next siblings of an element\n *\n * @method nextSiblings\n * @param {String|DOMElement} elm Element\n * @return {Array} Array of next sibling elements\n * @sample Ink_Dom_Element_1_nextSiblings.html \n */\n nextSiblings: function(elm) {\n elm = Ink.i(elm);\n if(typeof(elm) === 'object' && elm !== null && elm.nodeType && elm.nodeType === 1) {\n var elements = [],\n siblings = elm.parentNode.children,\n index = InkElement.parentIndexOf(elm.parentNode, elm);\n\n for(var i = ++index, len = siblings.length; i\" + html + \"
              \" + deleteThisTbodyToken + \"
              \";\n } else {\n div.innerHTML = \"\" + html + \"
              \";\n }\n return div.firstChild;\n },\n TBODY: function (div, html) {\n div.innerHTML = '' + html + '
              ';\n return div.firstChild.getElementsByTagName('tbody')[0];\n },\n THEAD: function (div, html) {\n div.innerHTML = '' + html + '
              ';\n return div.firstChild.getElementsByTagName('thead')[0];\n },\n TFOOT: function (div, html) {\n div.innerHTML = '' + html + '
              ';\n return div.firstChild.getElementsByTagName('tfoot')[0];\n },\n TR: function (div, html) {\n div.innerHTML = '' + html + '
              ';\n return div.firstChild.firstChild.firstChild;\n }\n },\n\n /**\n * Gets a wrapper DIV with a certain HTML content to be inserted inside another element.\n * This is necessary for appendHTML,prependHTML functions, because they need a container element to copy the children from.\n *\n * Works around IE table quirks\n * @method _getWrapper\n * @private\n * @param elm\n * @param html\n */\n _getWrapper: function (elm, html) {\n var nodeName = elm.nodeName && elm.nodeName.toUpperCase();\n var wrapper = document.createElement('div');\n var wrapFunc = InkElement._wrapElements[nodeName];\n\n if ( !wrapFunc ) {\n wrapper.innerHTML = html;\n return wrapper;\n }\n // special cases\n wrapper = wrapFunc(wrapper, html);\n // worst case: tbody auto-creation even when our HTML has a tbody.\n if (browserCreatesTbodies && nodeName === 'TABLE') {\n // terrible case. Deal with tbody creation too.\n var tds = wrapper.getElementsByTagName('td');\n for (var i = 0, len = tds.length; i < len; i++) {\n if (tds[i].innerHTML === deleteThisTbodyToken) {\n var tbody = tds[i].parentNode.parentNode;\n tbody.parentNode.removeChild(tbody);\n }\n }\n }\n return wrapper;\n },\n\n /**\n * Appends HTML to an element.\n * This method parses the html string and doesn't modify its contents\n *\n * @method appendHTML\n * @param {String|DOMElement} elm Element\n * @param {String} html Markup string\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_appendHTML.html \n */\n appendHTML: function(elm, html){\n elm = Ink.i(elm);\n if(elm !== null) {\n var wrapper = InkElement._getWrapper(elm, html);\n while (wrapper.firstChild) {\n elm.appendChild(wrapper.firstChild);\n }\n }\n },\n\n /**\n * Prepends HTML to an element.\n * This method parses the html string and doesn't modify its contents\n *\n * @method prependHTML\n * @param {String|Element} elm Element\n * @param {String} html Markup string to prepend\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_prependHTML.html \n */\n prependHTML: function(elm, html){\n elm = Ink.i(elm);\n if(elm !== null) {\n var wrapper = InkElement._getWrapper(elm, html);\n while (wrapper.lastChild) {\n elm.insertBefore(wrapper.lastChild, elm.firstChild);\n }\n }\n },\n\n /**\n * Sets the inner HTML of an element.\n *\n * @method setHTML\n * @param {String|DOMElement} elm Element\n * @param {String} html Markup string\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_setHTML.html \n */\n setHTML: function (elm, html) {\n elm = Ink.i(elm);\n if(elm !== null) {\n try {\n elm.innerHTML = html;\n } catch (e) {\n // Tables in IE7\n while (elm.firstChild) {\n elm.removeChild(elm.firstChild);\n }\n InkElement.appendHTML(elm, html);\n }\n }\n },\n\n /**\n * Wraps an element inside a container.\n *\n * The container may or may not be in the document yet.\n *\n * @method wrap\n * @param {String|Element} target Element to be wrapped\n * @param {String|Element} container Element to wrap the target\n * @return {Element} Container element\n * @public\n * @sample Ink_Dom_Element_1_wrap.html \n *\n * @example\n * before:\n *\n *
              \n *\n * call this function to wrap #target with a wrapper div.\n *\n * InkElement.wrap('target', InkElement.create('div', {id: 'container'});\n * \n * after: \n *\n *
              \n */\n wrap: function (target, container) {\n target = Ink.i(target);\n container = Ink.i(container);\n \n var nextNode = target.nextSibling;\n var parent = target.parentNode;\n\n container.appendChild(target);\n\n if (nextNode !== null) {\n parent.insertBefore(container, nextNode);\n } else {\n parent.appendChild(container);\n }\n\n return container;\n },\n\n /**\n * Places an element outside a wrapper.\n *\n * @method unwrap\n * @param {DOMElement} elem The element you're trying to unwrap. This should be an ancestor of the wrapper.\n * @param {String} [wrapperSelector] CSS Selector for the ancestor. Use this if your wrapper is not the direct parent of elem.\n * @return {void}\n * @sample Ink_Dom_Element_1_unwrap.html \n *\n * @example\n *\n * When you have this:\n *\n *
              \n *
              \n *
              \n *\n * If you do this:\n *\n * InkElement.unwrap('unwrapMe');\n *\n * You get this:\n *\n *
              \n *
              \n * \n **/\n unwrap: function (elem, wrapperSelector) {\n elem = Ink.i(elem);\n var wrapper;\n if (typeof wrapperSelector === 'string') {\n wrapper = InkElement.findUpwardsBySelector(elem, wrapperSelector);\n } else if (typeof wrapperSelector === 'object' && wrapperSelector.tagName) {\n wrapper = InkElement.findUpwardsHaving(elem, function (ancestor) {\n return ancestor === wrapperSelector;\n });\n } else {\n wrapper = elem.parentNode;\n }\n if (!wrapper || !wrapper.parentNode) { return; }\n\n InkElement.insertBefore(elem, wrapper);\n },\n\n /**\n * Replaces an element with another.\n *\n * @method replace\n * @param {Element} element The element to be replaced.\n * @param {Element} replacement The new element.\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_replace.html \n *\n * @example\n * var newelement1 = InkElement.create('div');\n * // ...\n * replace(Ink.i('element1'), newelement1);\n */\n replace: function (element, replacement) {\n element = Ink.i(element);\n if(element !== null) {\n element.parentNode.replaceChild(replacement, element);\n }\n },\n\n /**\n * Removes direct text children.\n * Useful to remove nasty layout gaps generated by whitespace on the markup.\n *\n * @method removeTextNodeChildren\n * @param {Element} el Element to remove text from\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_removeTextNodeChildren.html \n */\n removeTextNodeChildren: function(el) {\n el = Ink.i(el);\n if(el !== null) {\n var prevEl, toRemove, parent = el;\n el = el.firstChild;\n while (el) {\n toRemove = (el.nodeType === 3);\n prevEl = el;\n el = el.nextSibling;\n if (toRemove) {\n parent.removeChild(prevEl);\n }\n }\n }\n },\n\n /**\n * Creates a documentFragment from an HTML string.\n *\n * @method htmlToFragment\n * @param {String} html HTML string\n * @return {DocumentFragment} DocumentFragment containing all of the elements from the html string\n * @sample Ink_Dom_Element_1_htmlToFragment.html \n */\n htmlToFragment: (createContextualFragmentSupport ?\n function(html){\n var range;\n\n if(typeof html !== 'string'){ return document.createDocumentFragment(); }\n\n range = document.createRange();\n\n // set the context to document.body (firefox does this already, webkit doesn't)\n range.selectNode(document.body);\n\n return range.createContextualFragment(html);\n } : function (html) {\n var fragment = document.createDocumentFragment(),\n tempElement,\n current;\n\n if(typeof html !== 'string'){ return fragment; }\n\n tempElement = document.createElement('div');\n tempElement.innerHTML = html;\n\n // append child removes elements from the original parent\n while( (current = tempElement.firstChild) ){ // intentional assignment\n fragment.appendChild(current);\n }\n\n return fragment;\n }),\n\n _camelCase: function(str)\n {\n return str ? str.replace(/-(\\w)/g, function (_, $1){\n return $1.toUpperCase();\n }) : str;\n },\n\n /**\n * Gets data attributes from an element\n *\n * @method data\n * @param {String|DOMElement} selector Element or CSS selector\n * @return {Object} Object with the data-* properties. If no data-attributes are present, an empty object is returned.\n * @sample Ink_Dom_Element_1_data.html \n */\n data: function(selector) {\n var el;\n if (typeof selector !== 'object' && typeof selector !== 'string') {\n throw '[Ink.Dom.Element.data] :: Invalid selector defined';\n }\n\n if (typeof selector === 'object') {\n el = selector;\n }\n else {\n var InkDomSelector = Ink.getModule('Ink.Dom.Selector', 1);\n if (!InkDomSelector) {\n throw \"[Ink.Dom.Element.data] :: this method requires Ink.Dom.Selector - v1\";\n }\n el = InkDomSelector.select(selector);\n if (el.length <= 0) {\n throw \"[Ink.Dom.Element.data] :: Can't find any element with the specified selector\";\n }\n el = el[0];\n }\n\n var dataset = {};\n var attrs = el.attributes || [];\n\n var curAttr, curAttrName, curAttrValue;\n if (attrs) {\n for (var i = 0, total = attrs.length; i < total; ++i) {\n curAttr = attrs[i];\n curAttrName = curAttr.name;\n curAttrValue = curAttr.value;\n if (curAttrName && curAttrName.indexOf('data-') === 0) {\n dataset[InkElement._camelCase(curAttrName.replace('data-', ''))] = curAttrValue;\n }\n }\n }\n\n return dataset;\n },\n\n /**\n * Move the cursor on an input or textarea element.\n * @method moveCursorTo\n * @param {Element} el Input or Textarea element\n * @param {Number} t Index of the character to move the cursor to\n * @return {void}\n * @public\n * @sample Ink_Dom_Element_1_moveCursorTo.html \n */\n moveCursorTo: function(el, t) {\n el = Ink.i(el);\n if(el !== null) {\n if (el.setSelectionRange) {\n el.setSelectionRange(t, t);\n //el.focus();\n }\n else {\n var range = el.createTextRange();\n range.collapse(true);\n range.moveEnd( 'character', t);\n range.moveStart('character', t);\n range.select();\n }\n }\n },\n\n /**\n * Get the page's width.\n * @method pageWidth\n * @return {Number} Page width in pixels\n * @sample Ink_Dom_Element_1_pageWidth.html \n */\n pageWidth: function() {\n var xScroll;\n\n if (window.innerWidth && window.scrollMaxX) {\n xScroll = window.innerWidth + window.scrollMaxX;\n } else if (document.body.scrollWidth > document.body.offsetWidth){\n xScroll = document.body.scrollWidth;\n } else {\n xScroll = document.body.offsetWidth;\n }\n\n var windowWidth;\n\n if (window.self.innerWidth) {\n if(document.documentElement.clientWidth){\n windowWidth = document.documentElement.clientWidth;\n } else {\n windowWidth = window.self.innerWidth;\n }\n } else if (document.documentElement && document.documentElement.clientWidth) {\n windowWidth = document.documentElement.clientWidth;\n } else if (document.body) {\n windowWidth = document.body.clientWidth;\n }\n\n if(xScroll < windowWidth){\n return xScroll;\n } else {\n return windowWidth;\n }\n },\n\n /**\n * Get the page's height.\n * @method pageHeight\n * @return {Number} Page height in pixels\n * @sample Ink_Dom_Element_1_pageHeight.html \n */\n pageHeight: function() {\n var yScroll;\n\n if (window.innerHeight && window.scrollMaxY) {\n yScroll = window.innerHeight + window.scrollMaxY;\n } else if (document.body.scrollHeight > document.body.offsetHeight){\n yScroll = document.body.scrollHeight;\n } else {\n yScroll = document.body.offsetHeight;\n }\n\n var windowHeight;\n\n if (window.self.innerHeight) {\n windowHeight = window.self.innerHeight;\n } else if (document.documentElement && document.documentElement.clientHeight) {\n windowHeight = document.documentElement.clientHeight;\n } else if (document.body) {\n windowHeight = document.body.clientHeight;\n }\n\n if(yScroll < windowHeight){\n return windowHeight;\n } else {\n return yScroll;\n }\n },\n\n /**\n * Get the viewport's width.\n * @method viewportWidth\n * @return {Number} Viewport width in pixels\n * @sample Ink_Dom_Element_1_viewportWidth.html \n */\n viewportWidth: function() {\n if(typeof window.innerWidth !== \"undefined\") {\n return window.innerWidth;\n }\n if (document.documentElement && typeof document.documentElement.offsetWidth !== \"undefined\") {\n return document.documentElement.offsetWidth;\n }\n },\n\n /**\n * Get the viewport's height.\n * @method viewportHeight\n * @return {Number} Viewport height in pixels\n * @sample Ink_Dom_Element_1_viewportHeight.html \n */\n viewportHeight: function() {\n if (typeof window.innerHeight !== \"undefined\") {\n return window.innerHeight;\n }\n if (document.documentElement && typeof document.documentElement.offsetHeight !== \"undefined\") {\n return document.documentElement.offsetHeight;\n }\n },\n\n /**\n * Get the scroll's width.\n * @method scrollWidth\n * @return {Number} Scroll width\n */\n scrollWidth: function() {\n if (typeof window.self.pageXOffset !== 'undefined') {\n return window.self.pageXOffset;\n }\n if (typeof document.documentElement !== 'undefined' && typeof document.documentElement.scrollLeft !== 'undefined') {\n return document.documentElement.scrollLeft;\n }\n return document.body.scrollLeft;\n },\n\n /**\n * Get the scroll's height.\n * @method scrollHeight\n * @return {Number} Scroll height\n */\n scrollHeight: function() {\n if (typeof window.self.pageYOffset !== 'undefined') {\n return window.self.pageYOffset;\n }\n if (typeof document.documentElement !== 'undefined' && typeof document.documentElement.scrollTop !== 'undefined') {\n return document.documentElement.scrollTop;\n }\n return document.body.scrollTop;\n }\n };\n\n return InkElement;\n\n});\n","/**\n * Event management\n * @module Ink.Dom.Event_1\n * @version 1\n */\n\nInk.createModule('Ink.Dom.Event', 1, [], function() {\n /* jshint\n asi:true,\n strict:false,\n laxcomma:true,\n eqeqeq:false,\n laxbreak:true,\n boss:true,\n curly:false,\n expr:true\n */\n\n /**\n * @namespace Ink.Dom.Event_1\n * @static\n */\n\n /*!\n * Bean - copyright (c) Jacob Thornton 2011-2012\n * https://github.com/fat/bean\n * MIT license\n */\n var bean = (function (name, context, definition) {\n return definition()\n })('bean', this, function (name, context) {\n name = name || 'bean'\n context = context || this\n\n var win = window\n , old = context[name]\n , namespaceRegex = /[^\\.]*(?=\\..*)\\.|.*/\n , nameRegex = /\\..*/\n , addEvent = 'addEventListener'\n , removeEvent = 'removeEventListener'\n , doc = document || {}\n , root = doc.documentElement || {}\n , W3C_MODEL = root[addEvent]\n , eventSupport = W3C_MODEL ? addEvent : 'attachEvent'\n , ONE = {} // singleton for quick matching making add() do one()\n\n , slice = Array.prototype.slice\n , str2arr = function (s, d) { return s.split(d || ' ') }\n , isString = function (o) { return typeof o == 'string' }\n , isFunction = function (o) { return typeof o == 'function' }\n\n // events that we consider to be 'native', anything not in this list will\n // be treated as a custom event\n , standardNativeEvents =\n 'click dblclick mouseup mousedown contextmenu ' + // mouse buttons\n 'mousewheel mousemultiwheel DOMMouseScroll ' + // mouse wheel\n 'mouseover mouseout mousemove selectstart selectend ' + // mouse movement\n 'keydown keypress keyup ' + // keyboard\n 'orientationchange ' + // mobile\n 'focus blur change reset select submit ' + // form elements\n 'load unload beforeunload resize move DOMContentLoaded ' + // window\n 'readystatechange message ' + // window\n 'error abort scroll ' // misc\n // element.fireEvent('onXYZ'... is not forgiving if we try to fire an event\n // that doesn't actually exist, so make sure we only do these on newer browsers\n , w3cNativeEvents =\n 'show ' + // mouse buttons\n 'input invalid ' + // form elements\n 'touchstart touchmove touchend touchcancel ' + // touch\n 'gesturestart gesturechange gestureend ' + // gesture\n 'textinput' + // TextEvent\n 'readystatechange pageshow pagehide popstate ' + // window\n 'hashchange offline online ' + // window\n 'afterprint beforeprint ' + // printing\n 'dragstart dragenter dragover dragleave drag drop dragend ' + // dnd\n 'loadstart progress suspend emptied stalled loadmetadata ' + // media\n 'loadeddata canplay canplaythrough playing waiting seeking ' + // media\n 'seeked ended durationchange timeupdate play pause ratechange ' + // media\n 'volumechange cuechange ' + // media\n 'checking noupdate downloading cached updateready obsolete ' // appcache\n\n // convert to a hash for quick lookups\n , nativeEvents = (function (hash, events, i) {\n for (i = 0; i < events.length; i++) events[i] && (hash[events[i]] = 1)\n return hash\n }({}, str2arr(standardNativeEvents + (W3C_MODEL ? w3cNativeEvents : ''))))\n\n // custom events are events that we *fake*, they are not provided natively but\n // we can use native events to generate them\n , customEvents = (function () {\n var isAncestor = 'compareDocumentPosition' in root\n ? function (element, container) {\n return container.compareDocumentPosition && (container.compareDocumentPosition(element) & 16) === 16\n }\n : 'contains' in root\n ? function (element, container) {\n container = container.nodeType === 9 || container === window ? root : container\n return container !== element && container.contains(element)\n }\n : function (element, container) {\n while (element = element.parentNode) if (element === container) return 1\n return 0\n }\n , check = function (event) {\n var related = event.relatedTarget\n return !related\n ? related == null\n : (related !== this && related.prefix !== 'xul' && !/document/.test(this.toString())\n && !isAncestor(related, this))\n }\n\n return {\n mouseenter: { base: 'mouseover', condition: check }\n , mouseleave: { base: 'mouseout', condition: check }\n , mousewheel: { base: /Firefox/.test(navigator.userAgent) ? 'DOMMouseScroll' : 'mousewheel' }\n }\n }())\n\n // we provide a consistent Event object across browsers by taking the actual DOM\n // event object and generating a new one from its properties.\n , Event = (function () {\n // a whitelist of properties (for different event types) tells us what to check for and copy\n var commonProps = str2arr('altKey attrChange attrName bubbles cancelable ctrlKey currentTarget ' +\n 'detail eventPhase getModifierState isTrusted metaKey relatedNode relatedTarget shiftKey ' +\n 'srcElement target timeStamp type view which propertyName path')\n , mouseProps = commonProps.concat(str2arr('button buttons clientX clientY dataTransfer ' +\n 'fromElement offsetX offsetY pageX pageY screenX screenY toElement movementX movementY region'))\n , mouseWheelProps = mouseProps.concat(str2arr('wheelDelta wheelDeltaX wheelDeltaY wheelDeltaZ ' +\n 'axis')) // 'axis' is FF specific\n , keyProps = commonProps.concat(str2arr('char charCode key keyCode keyIdentifier ' +\n 'keyLocation location isComposing code'))\n , textProps = commonProps.concat(str2arr('data'))\n , touchProps = commonProps.concat(str2arr('touches targetTouches changedTouches scale rotation'))\n , messageProps = commonProps.concat(str2arr('data origin source'))\n , stateProps = commonProps.concat(str2arr('state'))\n , overOutRegex = /over|out/\n // some event types need special handling and some need special properties, do that all here\n , typeFixers = [\n { // key events\n reg: /key/i\n , fix: function (event, newEvent) {\n newEvent.keyCode = event.keyCode || event.which\n return keyProps\n }\n }\n , { // mouse events\n reg: /click|mouse(?!(.*wheel|scroll))|menu|drag|drop/i\n , fix: function (event, newEvent, type) {\n newEvent.rightClick = event.which === 3 || event.button === 2\n newEvent.pos = { x: 0, y: 0 }\n if (event.pageX || event.pageY) {\n newEvent.clientX = event.pageX\n newEvent.clientY = event.pageY\n } else if (event.clientX || event.clientY) {\n newEvent.clientX = event.clientX + doc.body.scrollLeft + root.scrollLeft\n newEvent.clientY = event.clientY + doc.body.scrollTop + root.scrollTop\n }\n if (overOutRegex.test(type)) {\n newEvent.relatedTarget = event.relatedTarget\n || event[(type == 'mouseover' ? 'from' : 'to') + 'Element']\n }\n return mouseProps\n }\n }\n , { // mouse wheel events\n reg: /mouse.*(wheel|scroll)/i\n , fix: function () { return mouseWheelProps }\n }\n , { // TextEvent\n reg: /^text/i\n , fix: function () { return textProps }\n }\n , { // touch and gesture events\n reg: /^touch|^gesture/i\n , fix: function () { return touchProps }\n }\n , { // message events\n reg: /^message$/i\n , fix: function () { return messageProps }\n }\n , { // popstate events\n reg: /^popstate$/i\n , fix: function () { return stateProps }\n }\n , { // everything else\n reg: /.*/\n , fix: function () { return commonProps }\n }\n ]\n , typeFixerMap = {} // used to map event types to fixer functions (above), a basic cache mechanism\n\n , Event = function (event, element, isNative) {\n if (!arguments.length) return\n event = event || ((element.ownerDocument || element.document || element).parentWindow || win).event\n this.originalEvent = event\n this.isNative = isNative\n this.isBean = true\n\n if (!event) return\n\n var type = event.type\n , target = event.target || event.srcElement\n , i, l, p, props, fixer\n\n this.target = target && target.nodeType === 3 ? target.parentNode : target\n\n if (isNative) { // we only need basic augmentation on custom events, the rest expensive & pointless\n fixer = typeFixerMap[type]\n if (!fixer) { // haven't encountered this event type before, map a fixer function for it\n for (i = 0, l = typeFixers.length; i < l; i++) {\n if (typeFixers[i].reg.test(type)) { // guaranteed to match at least one, last is .*\n typeFixerMap[type] = fixer = typeFixers[i].fix\n break\n }\n }\n }\n\n props = fixer(event, this, type)\n for (i = props.length; i--;) {\n if (!((p = props[i]) in this) && p in event) this[p] = event[p]\n }\n }\n }\n\n // preventDefault() and stopPropagation() are a consistent interface to those functions\n // on the DOM, stop() is an alias for both of them together\n Event.prototype.preventDefault = function () {\n if (this.originalEvent.preventDefault) this.originalEvent.preventDefault()\n else this.originalEvent.returnValue = false\n }\n Event.prototype.stopPropagation = function () {\n if (this.originalEvent.stopPropagation) this.originalEvent.stopPropagation()\n else this.originalEvent.cancelBubble = true\n }\n Event.prototype.stop = function () {\n this.preventDefault()\n this.stopPropagation()\n this.stopped = true\n }\n // stopImmediatePropagation() has to be handled internally because we manage the event list for\n // each element\n // note that originalElement may be a Bean#Event object in some situations\n Event.prototype.stopImmediatePropagation = function () {\n if (this.originalEvent.stopImmediatePropagation) this.originalEvent.stopImmediatePropagation()\n this.isImmediatePropagationStopped = function () { return true }\n }\n Event.prototype.isImmediatePropagationStopped = function () {\n return this.originalEvent.isImmediatePropagationStopped && this.originalEvent.isImmediatePropagationStopped()\n }\n Event.prototype.clone = function (currentTarget) {\n //TODO: this is ripe for optimisation, new events are *expensive*\n // improving this will speed up delegated events\n var ne = new Event(this, this.element, this.isNative)\n ne.currentTarget = currentTarget\n return ne\n }\n\n return Event\n }())\n\n // if we're in old IE we can't do onpropertychange on doc or win so we use doc.documentElement for both\n , targetElement = function (element, isNative) {\n return !W3C_MODEL && !isNative && (element === doc || element === win) ? root : element\n }\n\n /**\n * Bean maintains an internal registry for event listeners. We don't touch elements, objects\n * or functions to identify them, instead we store everything in the registry.\n * Each event listener has a RegEntry object, we have one 'registry' for the whole instance.\n */\n , RegEntry = (function () {\n // each handler is wrapped so we can handle delegation and custom events\n var wrappedHandler = function (element, fn, condition, args) {\n var call = function (event, eargs) {\n return fn.apply(element, args ? slice.call(eargs, event ? 0 : 1).concat(args) : eargs)\n }\n , findTarget = function (event, eventElement) {\n return fn.__beanDel ? fn.__beanDel.ft(event.target, element) : eventElement\n }\n , handler = condition\n ? function (event) {\n var target = findTarget(event, this) // deleated event\n if (condition.apply(target, arguments)) {\n if (event) event.currentTarget = target\n return call(event, arguments)\n }\n }\n : function (event) {\n if (fn.__beanDel) event = event.clone(findTarget(event)) // delegated event, fix the fix\n return call(event, arguments)\n }\n handler.__beanDel = fn.__beanDel\n return handler\n }\n\n , RegEntry = function (element, type, handler, original, namespaces, args, root) {\n var customType = customEvents[type]\n , isNative\n\n if (type == 'unload') {\n // self clean-up\n handler = once(removeListener, element, type, handler, original)\n }\n\n if (customType) {\n if (customType.condition) {\n handler = wrappedHandler(element, handler, customType.condition, args)\n }\n type = customType.base || type\n }\n\n this.isNative = isNative = nativeEvents[type] && !!element[eventSupport]\n this.customType = !W3C_MODEL && !isNative && type\n this.element = element\n this.type = type\n this.original = original\n this.namespaces = namespaces\n this.eventType = W3C_MODEL || isNative ? type : 'propertychange'\n this.target = targetElement(element, isNative)\n this[eventSupport] = !!this.target[eventSupport]\n this.root = root\n this.handler = wrappedHandler(element, handler, null, args)\n }\n\n // given a list of namespaces, is our entry in any of them?\n RegEntry.prototype.inNamespaces = function (checkNamespaces) {\n var i, j, c = 0\n if (!checkNamespaces) return true\n if (!this.namespaces) return false\n for (i = checkNamespaces.length; i--;) {\n for (j = this.namespaces.length; j--;) {\n if (checkNamespaces[i] == this.namespaces[j]) c++\n }\n }\n return checkNamespaces.length === c\n }\n\n // match by element, original fn (opt), handler fn (opt)\n RegEntry.prototype.matches = function (checkElement, checkOriginal, checkHandler) {\n return this.element === checkElement &&\n (!checkOriginal || this.original === checkOriginal) &&\n (!checkHandler || this.handler === checkHandler)\n }\n\n return RegEntry\n }())\n\n , registry = (function () {\n // our map stores arrays by event type, just because it's better than storing\n // everything in a single array.\n // uses '$' as a prefix for the keys for safety and 'r' as a special prefix for\n // rootListeners so we can look them up fast\n var map = {}\n\n // generic functional search of our registry for matching listeners,\n // `fn` returns false to break out of the loop\n , forAll = function (element, type, original, handler, root, fn) {\n var pfx = root ? 'r' : '$'\n if (!type || type == '*') {\n // search the whole registry\n for (var t in map) {\n if (t.charAt(0) == pfx) {\n forAll(element, t.substr(1), original, handler, root, fn)\n }\n }\n } else {\n var i = 0, l, list = map[pfx + type], all = element == '*'\n if (!list) return\n for (l = list.length; i < l; i++) {\n if ((all || list[i].matches(element, original, handler)) && !fn(list[i], list, i, type)) return\n }\n }\n }\n\n , has = function (element, type, original, root) {\n // we're not using forAll here simply because it's a bit slower and this\n // needs to be fast\n var i, list = map[(root ? 'r' : '$') + type]\n if (list) {\n for (i = list.length; i--;) {\n if (!list[i].root && list[i].matches(element, original, null)) return true\n }\n }\n return false\n }\n\n , get = function (element, type, original, root) {\n var entries = []\n forAll(element, type, original, null, root, function (entry) {\n return entries.push(entry)\n })\n return entries\n }\n\n , put = function (entry) {\n var has = !entry.root && !this.has(entry.element, entry.type, null, false)\n , key = (entry.root ? 'r' : '$') + entry.type\n ;(map[key] || (map[key] = [])).push(entry)\n return has\n }\n\n , del = function (entry) {\n forAll(entry.element, entry.type, null, entry.handler, entry.root, function (entry, list, i) {\n list.splice(i, 1)\n entry.removed = true\n if (list.length === 0) delete map[(entry.root ? 'r' : '$') + entry.type]\n return false\n })\n }\n\n // dump all entries, used for onunload\n , entries = function () {\n var t, entries = []\n for (t in map) {\n if (t.charAt(0) == '$') entries = entries.concat(map[t])\n }\n return entries\n }\n\n return { has: has, get: get, put: put, del: del, entries: entries }\n }())\n\n // we need a selector engine for delegated events, use querySelectorAll if it exists\n // but for older browsers we need Qwery, Sizzle or similar\n , selectorEngine\n , setSelectorEngine = function (e) {\n if (!arguments.length) {\n selectorEngine = doc.querySelectorAll\n ? function (s, r) {\n return r.querySelectorAll(s)\n }\n : function () {\n throw new Error('Bean: No selector engine installed') // eeek\n }\n } else {\n selectorEngine = e\n }\n }\n\n // we attach this listener to each DOM event that we need to listen to, only once\n // per event type per DOM element\n , rootListener = function (event, type) {\n if (!W3C_MODEL && type && event && event.propertyName != '_on' + type) return\n\n var listeners = registry.get(this, type || event.type, null, false)\n , l = listeners.length\n , i = 0\n\n event = new Event(event, this, true)\n if (type) event.type = type\n\n // iterate through all handlers registered for this type, calling them unless they have\n // been removed by a previous handler or stopImmediatePropagation() has been called\n for (; i < l && !event.isImmediatePropagationStopped(); i++) {\n if (!listeners[i].removed) listeners[i].handler.call(this, event)\n }\n }\n\n // add and remove listeners to DOM elements\n , listener = W3C_MODEL\n ? function (element, type, add) {\n // new browsers\n element[add ? addEvent : removeEvent](type, rootListener, false)\n }\n : function (element, type, add, custom) {\n // IE8 and below, use attachEvent/detachEvent and we have to piggy-back propertychange events\n // to simulate event bubbling etc.\n var entry\n if (add) {\n registry.put(entry = new RegEntry(\n element\n , custom || type\n , function (event) { // handler\n rootListener.call(element, event, custom)\n }\n , rootListener\n , null\n , null\n , true // is root\n ))\n if (custom && element['_on' + custom] == null) element['_on' + custom] = 0\n entry.target.attachEvent('on' + entry.eventType, entry.handler)\n } else {\n entry = registry.get(element, custom || type, rootListener, true)[0]\n if (entry) {\n entry.target.detachEvent('on' + entry.eventType, entry.handler)\n registry.del(entry)\n }\n }\n }\n\n , once = function (rm, element, type, fn, originalFn) {\n // wrap the handler in a handler that does a remove as well\n return function () {\n fn.apply(this, arguments)\n rm(element, type, originalFn)\n }\n }\n\n , removeListener = function (element, orgType, handler, namespaces) {\n var type = orgType && orgType.replace(nameRegex, '')\n , handlers = registry.get(element, type, null, false)\n , removed = {}\n , i, l\n\n for (i = 0, l = handlers.length; i < l; i++) {\n if ((!handler || handlers[i].original === handler) && handlers[i].inNamespaces(namespaces)) {\n // TODO: this is problematic, we have a registry.get() and registry.del() that\n // both do registry searches so we waste cycles doing this. Needs to be rolled into\n // a single registry.forAll(fn) that removes while finding, but the catch is that\n // we'll be splicing the arrays that we're iterating over. Needs extra tests to\n // make sure we don't screw it up. @rvagg\n registry.del(handlers[i])\n if (!removed[handlers[i].eventType] && handlers[i][eventSupport])\n removed[handlers[i].eventType] = { t: handlers[i].eventType, c: handlers[i].type }\n }\n }\n // check each type/element for removed listeners and remove the rootListener where it's no longer needed\n for (i in removed) {\n if (removed.hasOwnProperty(i)) {\n if (!registry.has(element, removed[i].t, null, false)) {\n // last listener of this type, remove the rootListener\n listener(element, removed[i].t, false, removed[i].c)\n }\n }\n }\n }\n\n // set up a delegate helper using the given selector, wrap the handler function\n , delegate = function (selector, fn) {\n //TODO: findTarget (therefore $) is called twice, once for match and once for\n // setting e.currentTarget, fix this so it's only needed once\n var findTarget = function (target, root) {\n var i, array = isString(selector) ? selectorEngine(selector, root) : selector\n for (; target && target !== root; target = target.parentNode) {\n for (i = array.length; i--;) {\n if (array[i] === target) return target\n }\n }\n }\n , handler = function (e) {\n var match = findTarget(e.target, this)\n if (match) fn.apply(match, arguments)\n }\n\n // __beanDel isn't pleasant but it's a private function, not exposed outside of Bean\n handler.__beanDel = {\n ft : findTarget // attach it here for customEvents to use too\n , selector : selector\n }\n return handler\n }\n\n , fireListener = W3C_MODEL ? function (isNative, type, element) {\n // modern browsers, do a proper dispatchEvent()\n var evt = doc.createEvent(isNative ? 'HTMLEvents' : 'UIEvents')\n evt[isNative ? 'initEvent' : 'initUIEvent'](type, true, true, win, 1)\n element.dispatchEvent(evt)\n } : function (isNative, type, element) {\n // old browser use onpropertychange, just increment a custom property to trigger the event\n element = targetElement(element, isNative)\n isNative ? element.fireEvent('on' + type, doc.createEventObject()) : element['_on' + type]++\n }\n\n /**\n * Public API: off(), on(), add(), (remove()), one(), fire(), clone()\n */\n\n /**\n * off(element[, eventType(s)[, handler ]])\n */\n , off = function (element, typeSpec, fn) {\n var isTypeStr = isString(typeSpec)\n , k, type, namespaces, i\n\n if (isTypeStr && typeSpec.indexOf(' ') > 0) {\n // off(el, 't1 t2 t3', fn) or off(el, 't1 t2 t3')\n typeSpec = str2arr(typeSpec)\n for (i = typeSpec.length; i--;)\n off(element, typeSpec[i], fn)\n return element\n }\n\n type = isTypeStr && typeSpec.replace(nameRegex, '')\n if (type && customEvents[type]) type = customEvents[type].base\n\n if (!typeSpec || isTypeStr) {\n // off(el) or off(el, t1.ns) or off(el, .ns) or off(el, .ns1.ns2.ns3)\n if (namespaces = isTypeStr && typeSpec.replace(namespaceRegex, '')) namespaces = str2arr(namespaces, '.')\n removeListener(element, type, fn, namespaces)\n } else if (isFunction(typeSpec)) {\n // off(el, fn)\n removeListener(element, null, typeSpec)\n } else {\n // off(el, { t1: fn1, t2, fn2 })\n for (k in typeSpec) {\n if (typeSpec.hasOwnProperty(k)) off(element, k, typeSpec[k])\n }\n }\n\n return element\n }\n\n /**\n * on(element, eventType(s)[, selector], handler[, args ])\n */\n , on = function(element, events, selector, fn) {\n var originalFn, type, types, i, args, entry, first\n\n //TODO: the undefined check means you can't pass an 'args' argument, fix this perhaps?\n if (selector === undefined && typeof events == 'object') {\n //TODO: this can't handle delegated events\n for (type in events) {\n if (events.hasOwnProperty(type)) {\n on.call(this, element, type, events[type])\n }\n }\n return\n }\n\n if (!isFunction(selector)) {\n // delegated event\n originalFn = fn\n args = slice.call(arguments, 4)\n fn = delegate(selector, originalFn, selectorEngine)\n } else {\n args = slice.call(arguments, 3)\n fn = originalFn = selector\n }\n\n types = str2arr(events)\n\n // special case for one(), wrap in a self-removing handler\n if (this === ONE) {\n fn = once(off, element, events, fn, originalFn)\n }\n\n for (i = types.length; i--;) {\n // add new handler to the registry and check if it's the first for this element/type\n first = registry.put(entry = new RegEntry(\n element\n , types[i].replace(nameRegex, '') // event type\n , fn\n , originalFn\n , str2arr(types[i].replace(namespaceRegex, ''), '.') // namespaces\n , args\n , false // not root\n ))\n if (entry[eventSupport] && first) {\n // first event of this type on this element, add root listener\n listener(element, entry.eventType, true, entry.customType)\n }\n }\n\n return element\n }\n\n /**\n * add(element[, selector], eventType(s), handler[, args ])\n *\n * Deprecated: kept (for now) for backward-compatibility\n */\n , add = function (element, events, fn, delfn) {\n return on.apply(\n null\n , !isString(fn)\n ? slice.call(arguments)\n : [ element, fn, events, delfn ].concat(arguments.length > 3 ? slice.call(arguments, 5) : [])\n )\n }\n\n /**\n * one(element, eventType(s)[, selector], handler[, args ])\n */\n , one = function () {\n return on.apply(ONE, arguments)\n }\n\n /**\n * fire(element, eventType(s)[, args ])\n *\n * The optional 'args' argument must be an array, if no 'args' argument is provided\n * then we can use the browser's DOM event system, otherwise we trigger handlers manually\n */\n , fire = function (element, type, args) {\n var types = str2arr(type)\n , i, j, l, names, handlers\n\n for (i = types.length; i--;) {\n type = types[i].replace(nameRegex, '')\n if (names = types[i].replace(namespaceRegex, '')) names = str2arr(names, '.')\n if (!names && !args && element[eventSupport]) {\n fireListener(nativeEvents[type], type, element)\n } else {\n // non-native event, either because of a namespace, arguments or a non DOM element\n // iterate over all listeners and manually 'fire'\n handlers = registry.get(element, type, null, false)\n args = [false].concat(args)\n for (j = 0, l = handlers.length; j < l; j++) {\n if (handlers[j].inNamespaces(names)) {\n handlers[j].handler.apply(element, args)\n }\n }\n }\n }\n return element\n }\n\n /**\n * clone(dstElement, srcElement[, eventType ])\n *\n * TODO: perhaps for consistency we should allow the same flexibility in type specifiers?\n */\n , clone = function (element, from, type) {\n var handlers = registry.get(from, type, null, false)\n , l = handlers.length\n , i = 0\n , args, beanDel\n\n for (; i < l; i++) {\n if (handlers[i].original) {\n args = [ element, handlers[i].type ]\n if (beanDel = handlers[i].handler.__beanDel) args.push(beanDel.selector)\n args.push(handlers[i].original)\n on.apply(null, args)\n }\n }\n return element\n }\n\n , bean = {\n 'on' : on\n , 'add' : add\n , 'one' : one\n , 'off' : off\n , 'remove' : off\n , 'clone' : clone\n , 'fire' : fire\n , 'Event' : Event\n , 'setSelectorEngine' : setSelectorEngine\n , 'noConflict' : function () {\n context[name] = old\n return this\n }\n }\n\n // for IE, clean up on unload to avoid leaks\n if (win.attachEvent) {\n var cleanup = function () {\n var i, entries = registry.entries()\n for (i in entries) {\n if (entries[i].type && entries[i].type !== 'unload') off(entries[i].element, entries[i].type)\n }\n win.detachEvent('onunload', cleanup)\n win.CollectGarbage && win.CollectGarbage()\n }\n win.attachEvent('onunload', cleanup)\n }\n\n // initialize selector engine to internal default (qSA or throw Error)\n setSelectorEngine(Ink.ss)\n\n return bean\n });\n\n /**\n * Keep this declaration here and off Bean as it extends the Event\n * object and some properties are readonly in strict mode\n */\n 'use strict';\n\n var InkEvent = {\n\n KEY_BACKSPACE: 8,\n KEY_TAB: 9,\n KEY_RETURN: 13,\n KEY_ESC: 27,\n KEY_SPACE: 32,\n KEY_LEFT: 37,\n KEY_UP: 38,\n KEY_RIGHT: 39,\n KEY_DOWN: 40,\n KEY_DELETE: 46,\n KEY_HOME: 36,\n KEY_END: 35,\n KEY_PAGEUP: 33,\n KEY_PAGEDOWN: 34,\n KEY_INSERT: 45,\n \n /**\n * Creates a throttled version of a function.\n * Returns a function which calls `func`, waiting at least `wait` milliseconds between calls. This is useful for events such as `scroll` or `resize`, which can be triggered too many times per second, slowing down the browser with needless function calls.\n *\n * *note:* This does not delay the first function call to the function.\n *\n * @method throttle\n * @param {Function} func Function to call. Arguments and context are both passed.\n * @param {Number} [wait]=0 Milliseconds to wait between calls.\n * @return {Function} A function throttled which will only be called at most every `wait` milliseconds.\n * @sample Ink_Dom_Event_1_throttle.html \n **/\n throttle: function (func, wait) {\n wait = wait || 0;\n var lastCall = 0; // Warning: This breaks on Jan 1st 1970 0:00\n var timeout;\n function throttled() {\n var now = +new Date();\n var timeDiff = now - lastCall;\n if (timeDiff >= wait) {\n lastCall = now;\n return func.apply(this, [].slice.call(arguments));\n } else {\n var that = this;\n var args = [].slice.call(arguments);\n\n if (timeout) {\n // Clear the old timeout because that one has old arguments\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(function () {\n timeout = null;\n return throttled.apply(that, args);\n }, wait - timeDiff);\n }\n }\n return throttled;\n },\n\n /**\n * Gets the event's target element.\n *\n * @method element\n * @param {Object} ev Event object\n * @return {Element} The target\n * @public\n * @sample Ink_Dom_Event_1_element.html \n */\n element: function(ev) {\n var node = ev.delegationTarget ||\n ev.target ||\n // IE stuff\n (ev.type === 'mouseout' && ev.fromElement) ||\n (ev.type === 'mouseleave' && ev.fromElement) ||\n (ev.type === 'mouseover' && ev.toElement) ||\n (ev.type === 'mouseenter' && ev.toElement) ||\n ev.srcElement ||\n null;\n return node && (node.nodeType === 3 || node.nodeType === 4) ? node.parentNode : node;\n },\n\n /**\n * Gets the event's related target element.\n *\n * @method relatedTarget\n * @param {Object} ev event object\n * @return {DOMNode} The related target\n * @sample Ink_Dom_Event_1_relatedTarget.html \n */\n relatedTarget: function(ev){\n var node = ev.relatedTarget ||\n // IE stuff\n (ev.type === 'mouseout' && ev.toElement) ||\n (ev.type === 'mouseleave' && ev.toElement) ||\n (ev.type === 'mouseover' && ev.fromElement) ||\n (ev.type === 'mouseenter' && ev.fromElement) ||\n null;\n return node && (node.nodeType === 3 || node.nodeType === 4) ? node.parentNode : node;\n },\n\n /**\n * Find closest ancestor element by tag name related to the event target.\n * Navigate up the DOM tree, looking for a tag with the name `elmTagName`.\n *\n * If such tag is not found, `document` is returned.\n *\n * @method findElement\n * @param {Object} ev Event object\n * @param {String} elmTagName Tag name to find\n * @param {Boolean} [force]=false Flag to skip returning `document` and to return `false` instead.\n * @return {DOMElement} the first element which matches given tag name or the document element if the wanted tag is not found\n * @sample Ink_Dom_Event_1_findElement.html \n */\n findElement: function(ev, elmTagName, force)\n {\n var node = this.element(ev);\n while(true) {\n if(node.nodeName.toLowerCase() === elmTagName.toLowerCase()) {\n return node;\n } else {\n node = node.parentNode;\n if(!node) {\n if(force) {\n return false;\n }\n return document;\n }\n if(!node.parentNode){\n if(force){ return false; }\n return document;\n }\n }\n }\n },\n\n /**\n * Attaches an event to element\n *\n * @method observe\n * @param {DOMElement|String} element Element id or element\n * @param {String} eventName Event name\n * @param {Function} callBack Receives the event object as a parameter. If you're manually firing custom events, check it's eventName property to make sure you're handling the right event.\n * @param {Boolean} [useCapture] Flag to change event listening from bubbling to capture.\n * @return {Function} The event handler used. Hang on to this if you want to `stopObserving` later.\n * @sample Ink_Dom_Event_1_observe.html \n */\n observe: function(element, eventName, callBack, useCapture) {\n element = Ink.i(element);\n if(element) {\n if(element.addEventListener) {\n element.addEventListener(eventName, callBack, !!useCapture);\n } else {\n element.attachEvent('on' + eventName, (callBack = Ink.bind(callBack, element)));\n }\n return callBack;\n }\n },\n\n /**\n * Like observe, but listen to the event only once.\n *\n * @method observeOnce\n * @param {DOMElement|String} element Element id or element\n * @param {String} eventName Event name\n * @param {Function} callBack Receives the event object as a parameter. If you're manually firing custom events, check it's eventName property to make sure you're handling the right event.\n * @param {Boolean} [useCapture] Flag to change event listening from bubbling to capture.\n * @return {Function} The event handler used. Hang on to this if you want to `stopObserving` later.\n * @sample Ink_Dom_Event_1_observeOnce.html \n */\n observeOnce: function (element, eventName, callBack, useCapture) {\n var onceBack = function () {\n InkEvent.stopObserving(element, eventName, handler);\n return callBack.apply(this, arguments);\n };\n var handler = InkEvent.observe(element, eventName, onceBack, useCapture);\n return handler;\n },\n\n /**\n * Attaches an event to a selector or array of elements.\n *\n * @method observeMulti\n * @param {Array|String} elements Array of elements which are going to be observed. A selector is acceptable too.\n * @param {String} eventName Event name\n * @param {Function} callBack Receives the event object as a parameter. If you're manually firing custom events, check it's eventName property to make sure you're handling the right event.\n * @param {Boolean} [useCapture] Flag change event listening from bubbling to capture.\n * @return {Function} The used callback.\n * @sample Ink_Dom_Event_1_observeMulti.html \n */\n observeMulti: function (elements, eventName, callBack, useCapture) {\n if (typeof elements === 'string') {\n elements = Ink.ss(elements);\n } else if ( /* is an element */ elements && elements.nodeType === 1) {\n elements = [elements];\n }\n if (!elements[0]) { return false; }\n\n for (var i = 0, len = elements.length; i < len; i++) {\n this.observe(elements[i], eventName, callBack, useCapture);\n }\n return callBack;\n },\n\n /**\n * Observes an event on an element and its descendants matching the selector.\n *\n * Requires Ink.Dom.Selector if you need to use a selector.\n *\n * @method observeDelegated\n * @param {Element|String} element Element to observe.\n * @param {String} eventName Event name to observe.\n * @param {String} selector Child element selector. When null, finds any element.\n * @param {Function} callback Callback to be called when the event is fired\n * @return {Function} The used callback, for ceasing to listen to the event later.\n * @public\n * @sample Ink_Dom_Event_1_observeDelegated.html \n **/\n observeDelegated: function (element, eventName, selector, callback) {\n return InkEvent.observe(element, eventName, function (event) {\n var fromElement = InkEvent.element(event);\n if (!fromElement || fromElement === element) { return; }\n\n var cursor = fromElement;\n\n // Go up the document tree until we hit the element itself.\n while (cursor !== element && cursor !== document && cursor) {\n if (Ink.Dom.Selector_1.matchesSelector(cursor, selector)) {\n event.delegationTarget = cursor;\n return callback(event);\n }\n cursor = cursor.parentNode;\n }\n });\n },\n\n /**\n * Removes an event attached to an element.\n *\n * @method stopObserving\n * @param {DOMElement|String} element Element id or element\n * @param {String} eventName Event name\n * @param {Function} callBack Callback function\n * @param {Boolean} [useCapture] Set to true if the event was being observed with useCapture set to true as well.\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stopObserving.html \n */\n stopObserving: function(element, eventName, callBack, useCapture) {\n element = Ink.i(element);\n\n if(element) {\n if(element.removeEventListener) {\n element.removeEventListener(eventName, callBack, !!useCapture);\n } else {\n element.detachEvent('on' + eventName, callBack);\n }\n }\n },\n\n /**\n * Stops event propagation and bubbling.\n *\n * @method stop\n * @param {Object} event Event handle\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stop.html \n */\n stop: function(event)\n {\n if(event.cancelBubble !== null) {\n event.cancelBubble = true;\n }\n if(event.stopPropagation) {\n event.stopPropagation();\n }\n if(event.preventDefault) {\n event.preventDefault();\n }\n if(window.attachEvent) {\n event.returnValue = false;\n }\n if(event.cancel !== null) {\n event.cancel = true;\n }\n },\n\n /**\n * Stops event propagation.\n *\n * @method stopPropagation\n * @param {Object} event Event handle\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stopPropagation.html \n */\n stopPropagation: function(event) {\n if(event.cancelBubble !== null) {\n event.cancelBubble = true;\n }\n if(event.stopPropagation) {\n event.stopPropagation();\n }\n },\n\n /**\n * Stops event default behaviour.\n *\n * @method stopDefault\n * @param {Object} event Event handle\n * @return {void}\n * @public\n * @sample Ink_Dom_Event_1_stopDefault.html \n */\n stopDefault: function(event)\n {\n if(event.preventDefault) {\n event.preventDefault();\n }\n if(window.attachEvent) {\n event.returnValue = false;\n }\n if(event.cancel !== null) {\n event.cancel = true;\n }\n },\n\n /**\n * Gets the pointer's coordinates from the event object.\n *\n * @method pointer\n * @param {Object} ev Event object\n * @return {Object} An object with the mouse X and Y position\n * @public\n * @sample Ink_Dom_Event_1_pointer.html \n */\n pointer: function(ev)\n {\n return {\n x: this.pointerX(ev),\n y: this.pointerY(ev)\n };\n },\n\n /**\n * Gets the pointer's X coordinate.\n *\n * @method pointerX\n * @param {Object} ev Event object\n * @return {Number} Mouse X position\n * @public\n */\n pointerX: function(ev)\n {\n return (ev.touches && ev.touches[0] && ev.touches[0].clientX) ||\n (ev.pageX) ||\n (ev.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));\n },\n\n /**\n * Gets the pointer's Y coordinate.\n *\n * @method pointerY\n * @param {Object} ev Event object\n * @return {Number} Mouse Y position\n * @public\n */\n pointerY: function(ev)\n {\n return (ev.touches && ev.touches[0] && ev.touches[0].clientY) ||\n (ev.pageY) ||\n (ev.clientY + (document.documentElement.scrollTop || document.body.scrollTop));\n },\n\n /**\n * Checks if an event is a left click.\n *\n * @method isLeftClick\n * @param {Object} ev Event object\n * @return {Boolean} True if the event is a left click\n * @public\n * @sample Ink_Dom_Event_1_isLeftClick.html \n */\n isLeftClick: function(ev) {\n if (window.addEventListener) {\n if(ev.button === 0){\n return true;\n } else if(ev.type === 'touchend' && ev.button === null){\n // [todo] do the above check for pointerEvents too\n return true;\n }\n }\n else {\n if(ev.button === 1){ return true; }\n }\n return false;\n },\n\n /**\n * Checks if an event is a right click.\n *\n * @method isRightClick\n * @param {Object} ev Event object\n * @return {Boolean} True if the event is a right click\n * @public\n * @sample Ink_Dom_Event_1_isRightClick.html \n */\n isRightClick: function(ev) {\n return (ev.button === 2);\n },\n\n /**\n * Checks if an event is a middle click.\n *\n * @method isMiddleClick\n * @param {Object} ev Event object\n * @return {Boolean} True if the event is a middle click\n * @public\n * @sample Ink_Dom_Event_1_isMiddleClick.html \n */\n isMiddleClick: function(ev) {\n if (window.addEventListener) {\n return (ev.button === 1);\n }\n else {\n return (ev.button === 4);\n }\n return false;\n },\n\n /**\n * Gets character from an event.\n *\n * @method getCharFromKeyboardEvent\n * @param {Object} event Keyboard event\n * @param {Boolean} [changeCasing] If true uppercases, if false lowercases, otherwise keeps casing\n * @return {String} Character representation of pressed key combination\n * @public\n * @sample Ink_Dom_Event_1_getCharFromKeyboardEvent.html \n */\n getCharFromKeyboardEvent: function(event, changeCasing) {\n var k = event.keyCode;\n var c = String.fromCharCode(k);\n\n var shiftOn = event.shiftKey;\n if (k >= 65 && k <= 90) { // A-Z\n if (typeof changeCasing === 'boolean') {\n shiftOn = changeCasing;\n }\n return (shiftOn) ? c : c.toLowerCase();\n }\n else if (k >= 96 && k <= 105) { // numpad digits\n return String.fromCharCode( 48 + (k-96) );\n }\n switch (k) {\n case 109: case 189: return '-';\n case 107: case 187: return '+';\n }\n return c;\n },\n\n debug: function(){}\n};\n\n/**\n * Lets you attach event listeners to both elements and objects.\n * http://github.com/fat/bean#on\n *\n * @method on\n * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object\n * @param {String} eventType An Event (or multiple events, space separated) to listen to\n * @param {String} [selector] A CSS DOM Element selector string to bind the listener to child elements matching the selector\n * @param {Function} [handler] The callback function\n * @param {Object} [args...] Additional arguments to pass to the callback function when triggered\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_on.html \n */\n\n/**\n * Alias for `on` but will only be executed once.\n * bean.one() is an alias for bean.on() except that the handler will only be executed once and then removed for the event type(s).\n * http://github.com/fat/bean#one\n *\n * @method one\n * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object\n * @param {String} eventType An Event (or multiple events, space separated) to listen to\n * @param {String} [selector] A CSS DOM Element selector string to bind the listener to child elements matching the selector\n * @param {Function} [handler] The callback function\n * @param [args...] Additional arguments to pass to the callback function when triggered\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_one.html \n */\n\n/**\n * Removes event handlers.\n * bean.off() is how you get rid of handlers once you no longer want them active. It's also a good idea to call off on elements before you remove them from your DOM; this gives Bean a chance to clean up some things and prevents memory leaks.\n * http://github.com/fat/bean#off\n *\n * @method off\n * @param {DOMElement|Object} element An HTML DOM element or any JavaScript Object\n * @param {String} eventType An Event (or multiple events, space separated) to remove\n * @param {Function} [handler] The specific callback function to remove\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_off.html \n */\n\n/**\n * Clones events from one object to another\n * bean.clone() is a method for cloning events from one DOM element or object to another.\n * http://github.com/fat/bean#clone\n *\n * @method clone\n * @param {DOMElement|Object} destElement An HTML DOM element or any JavaScript Object to copy events to\n * @param {String} srcElement An HTML DOM element or any JavaScript Object to copy events from\n * @param {String} [eventType] An Event (or multiple events, space separated) to clone\n * \n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_clone.html \n */\n\n/**\n * Triggers events.\n * http://github.com/fat/bean#fire\n *\n * @method fire\n * @param {DOMElement|Object} destElement An HTML DOM element or any JavaScript Object fire the event on\n * @param {String} eventType An Event (or multiple events, space separated) to fire\n * @param [args...] Additional arguments to pass to the callback function when triggered\n *\n * @return {DOMElement|Object} Returns the original DOM Element or Javascript Object\n * @public\n * @sample Ink_Dom_Event_1_fire.html \n */\n\nreturn Ink.extendObj(InkEvent, bean);\n\n});\n","/**\n * @module Ink.Dom.FormSerialize_1\n * Two way serialization of form data and javascript objects.\n * Valid applications are ad hoc AJAX/syndicated submission of forms, restoring form values from server side state, etc.\n */\n\nInk.createModule('Ink.Dom.FormSerialize', 1, ['Ink.Util.Array_1', 'Ink.Dom.Element_1', 'Ink.Dom.Selector_1'], function (InkArray, InkElement, Selector) {\n 'use strict';\n\n // Check whether something is not a string or a DOM element, but still has length.\n function isArrayIsh(obj) {\n return obj != null &&\n (!InkElement.isDOMElement(obj)) &&\n (InkArray.isArray(obj) || (typeof obj !== 'string' && typeof obj.length === 'number'));\n }\n\n function toArray(obj) {\n if (isArrayIsh(obj)) { return obj; }\n else { return [obj]; }\n }\n\n /**\n * @namespace Ink.Dom.FormSerialize\n * @static\n **/\n var FormSerialize = {\n\n /**\n * Serializes a form element into a JS object\n * It turns field *names* (not IDs!) into keys and field values into values.\n *\n * note: Multi-select and checkboxes with multiple values will result in arrays\n *\n * @method serialize\n * @param {DOMElement|String} form Form element to extract data\n * @param {Object} [options] Options object, containing:\n * @param {Boolean} [options.outputUnchecked=false] Whether to emit unchecked checkboxes and unselected radio buttons.\n * @return {Object} Map of fieldName -> String|String[]|Boolean\n * @sample Ink_Dom_FormSerialize_serialize.html \n */\n serialize: function(form, options) {\n options = options || {};\n var out = {};\n var emptyArrayToken = {}; // A hack so that empty select[multiple] elements appear although empty.\n\n var pairs = this.asPairs(form, { elements: true, emptyArray: emptyArrayToken, outputUnchecked: options.outputUnchecked });\n if (pairs == null) { return pairs; }\n InkArray.forEach(pairs, function (pair) {\n var name = pair[0].replace(/\\[\\]$/, '');\n var value = pair[1];\n var el = pair[2];\n\n if (value === emptyArrayToken) {\n out[name] = []; // It's an empty select[multiple]\n } else if (!(FormSerialize._resultsInArray(el) || /\\[\\]$/.test(pair[0]))) {\n out[name] = value;\n } else {\n out[name] = out[name] || [];\n out[name].push(value);\n }\n });\n\n return out;\n },\n\n /**\n * Like `serialize`, but returns an array of [fieldName, value] pairs.\n *\n * @method asPairs\n * @param {DOMElement|String} form Form element\n * @param {Object} [options] Options object, containing:\n * @param {Boolean} [options.elements] Instead of returning an array of [fieldName, value] pairs, return an array of [fieldName, value, fieldElement] triples.\n * @param {Boolean} [options.emptyArray] What to emit as the value of an empty select[multiple]. If you don't pass this option, nothing comes out.\n * @param {Boolean} [options.outputUnchecked=false] Whether to emit unchecked checkboxes and unselected radio buttons.\n * @return {Array} Array of [fieldName, value] pairs.\n **/\n asPairs: function (form, options) {\n var out = [];\n options = options || {};\n\n function emit(name, val, el) {\n if (options.elements) {\n out.push([name, val, el]);\n } else {\n out.push([name, val]);\n }\n }\n\n function serializeEl(el) {\n var elNodeName = el.nodeName.toLowerCase();\n var elType = (el.type + '').toLowerCase();\n\n if (elNodeName === 'select' && el.multiple) {\n var didEmit = false;\n InkArray.forEach(Selector.select('option:checked', el), function (thisOption) {\n emit(el.name, thisOption.value, el);\n didEmit = true;\n });\n if (!didEmit && 'emptyArray' in options) {\n emit(el.name, options.emptyArray, el);\n }\n } else if (elNodeName === 'input' && (elType === 'checkbox' || elType === 'radio') && options.outputUnchecked) {\n // It's an empty checkbox and we wouldn't emit it otherwise but the user asked for it using outputUnchecked\n emit(el.name, null, el);\n } else {\n emit(el.name, el.value, el);\n }\n }\n\n if ((form = Ink.i(form))) {\n var inputs = InkArray.filter(form.elements, function (elm) {\n return FormSerialize._isSerialized(elm, options);\n });\n for (var i = 0, len = inputs.length; i < len; i++) {\n serializeEl(inputs[i]);\n }\n return out;\n }\n\n return null;\n },\n\n /**\n * Sets form elements' values with values from an object\n *\n * Note: You can't set the values of an input with `type=\"file\"` (browser prohibits it)\n *\n * @method fillIn \n * @param {Element|String} form Form element to be populated\n * @param {Object|Array} map2 Mapping of fields to values contained in fields. Can be a hash (keys as names, strings or arrays for values), or an array of [name, value] pairs.\n * @return {void}\n * @sample Ink_Dom_FormSerialize_fillIn.html \n */\n fillIn: function(form, map2) {\n if (!(form = Ink.i(form))) { return null; }\n\n var pairs;\n\n if (typeof map2 === 'object' && !isArrayIsh(map2)) {\n pairs = FormSerialize._objToPairs(map2);\n } else if (isArrayIsh(map2)) {\n pairs = map2;\n } else {\n return null;\n }\n\n return FormSerialize._fillInPairs(form, pairs);\n },\n\n _objToPairs: function (obj) {\n var pairs = [];\n var val;\n for (var name in obj) if (obj.hasOwnProperty(name)) {\n val = toArray(obj[name]);\n for (var i = 0, len = val.length; i < len; i++) {\n pairs.push([name, val[i]]);\n }\n if (len === 0) {\n pairs.push([name, []]);\n }\n }\n return pairs;\n },\n\n _fillInPairs: function (form, pairs) {\n pairs = InkArray.groupBy(pairs, {\n key: function (pair) { return pair[0].replace(/\\[\\]$/, ''); }\n });\n\n // For each chunk...\n pairs = InkArray.map(pairs, function (pair) {\n // Join the items in the chunk by concatenating the values together and leaving the names alone\n var values = InkArray.reduce(pair, function (left, right) {\n return [null, left[1].concat([right[1]])];\n }, [null, []])[1];\n return [pair[0][0], values];\n });\n\n var name;\n var inputs;\n var values;\n for (var i = 0, len = pairs.length; i < len; i++) {\n name = pairs[i][0];\n\n if (name in form) {\n inputs = form[name];\n } else if ((name + '[]') in form) {\n inputs = form[name + '[]'];\n name = name + '[]';\n } else {\n continue;\n }\n\n inputs = toArray(inputs);\n values = pairs[i][1];\n\n FormSerialize._fillInOne(name, inputs, values);\n }\n },\n\n _fillInOne: function (name, inputs, values) {\n var firstOne = inputs[0];\n var firstNodeName = firstOne.nodeName.toLowerCase();\n var firstType = firstOne.getAttribute('type');\n firstType = firstType && firstType.toLowerCase();\n var isSelectMulti = firstNodeName === 'select' && InkElement.hasAttribute(firstOne, 'multiple');\n\n if (firstType === 'checkbox' || firstType === 'radio') {\n FormSerialize._fillInBoolean(inputs, values, 'checked');\n } else if (isSelectMulti) {\n FormSerialize._fillInBoolean(inputs[0].options, values, 'selected');\n } else {\n if (inputs.length !== values.length) {\n Ink.warn('Form had ' + inputs.length + ' inputs named \"' + name + '\", but received ' + values.length + ' values.');\n }\n\n for (var i = 0, len = Math.min(inputs.length, values.length); i < len; i += 1) {\n inputs[i].value = values[i];\n }\n }\n },\n\n _fillInBoolean: function (inputs, values, checkAttr /* 'selected' or 'checked' */) {\n InkArray.forEach(inputs, function (input) {\n var isChecked = InkArray.inArray(input.value, values);\n input[checkAttr] = isChecked;\n });\n },\n\n /**\n * Whether FormSerialize.serialize() should produce an array when looking at this element.\n * @method _resultsInArray\n * @private\n * @param element\n **/\n _resultsInArray: function (element) {\n var type = element.getAttribute('type');\n var nodeName = element.nodeName.toLowerCase();\n\n return type === 'checkbox' ||\n (nodeName === 'select' && InkElement.hasAttribute(element, 'multiple'));\n },\n\n _isSerialized: function (element, options) {\n options = options || {};\n if (!InkElement.isDOMElement(element)) { return false; }\n if (!InkElement.hasAttribute(element, 'name')) { return false; }\n\n var nodeName = element.nodeName.toLowerCase();\n\n if (!nodeName || nodeName === 'fieldset') { return false; }\n\n if (element.type === 'checkbox' || element.type === 'radio') {\n if (options.outputUnchecked) { return true; }\n return !!element.checked;\n }\n\n return true;\n }\n };\n\n return FormSerialize;\n});\n","/**\n * Execute code only when the DOM is loaded.\n * @module Ink.Dom.Loaded_1\n * @version 1\n */\n \nInk.createModule('Ink.Dom.Loaded', 1, [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Dom.Loaded_1\n **/\n var Loaded = {\n\n /**\n * Callbacks and their contexts. Array of 2-arrays.\n *\n * []\n *\n * @attribute _contexts Array\n * @private\n * \n */\n _contexts: [], // Callbacks' queue\n\n /**\n * Specify a function to execute when the DOM is fully loaded.\n *\n * @method run\n * @param {Object} [win]=window Window object to attach/add the event\n * @param {Function} fn Callback function to be executed after the DOM is ready\n * @return {void}\n * @public\n * @sample Ink_Dom_Loaded_run.html \n */\n run: function(win, fn) {\n if (!fn) {\n fn = win;\n win = window;\n }\n\n var context;\n\n for (var i = 0, len = this._contexts.length; i < len; i++) {\n if (this._contexts[i][0] === win) {\n context = this._contexts[i][1];\n break;\n }\n }\n if (!context) {\n context = {\n cbQueue: [],\n win: win,\n doc: win.document,\n root: win.document.documentElement,\n done: false,\n top: true\n };\n context.handlers = {\n checkState: Ink.bindEvent(this._checkState, this, context),\n poll: Ink.bind(this._poll, this, context)\n };\n this._contexts.push(\n [win, context] // Javascript Objects cannot map different windows to\n // different values.\n );\n }\n\n var ael = context.doc.addEventListener;\n context.add = ael ? 'addEventListener' : 'attachEvent';\n context.rem = ael ? 'removeEventListener' : 'detachEvent';\n context.pre = ael ? '' : 'on';\n context.det = ael ? 'DOMContentLoaded' : 'onreadystatechange';\n context.wet = context.pre + 'load';\n\n var csf = context.handlers.checkState;\n var alreadyLoaded = (\n /complete|loaded/.test(context.doc.readyState) &&\n context.win.location.toString() !== 'about:blank'); // https://code.google.com/p/chromium/issues/detail?id=32357\n\n if (alreadyLoaded){\n setTimeout(Ink.bind(function () {\n fn.call(context.win, 'lazy');\n }, this), 0);\n } else {\n context.cbQueue.push(fn);\n\n context.doc[context.add]( context.det , csf );\n context.win[context.add]( context.wet , csf );\n\n var frameElement = 1;\n try{\n frameElement = context.win.frameElement;\n } catch(e) {}\n if ( !ael && context.root && context.root.doScroll ) { // IE HACK\n try {\n context.top = !frameElement;\n } catch(e) { }\n if (context.top) {\n this._poll(context);\n }\n }\n }\n },\n\n /**\n * Function that will be running the callbacks after the page is loaded\n *\n * @method _checkState\n * @param {Event} event Triggered event\n * @private\n */\n _checkState: function(event, context) {\n if ( !event || (event.type === 'readystatechange' && !/complete|loaded/.test(context.doc.readyState))) {\n return;\n }\n var where = (event.type === 'load') ? context.win : context.doc;\n where[context.rem](context.pre+event.type, context.handlers.checkState, false);\n this._ready(context);\n },\n\n /**\n * Polls the load progress of the page to see if it has already loaded or not\n *\n * @method _poll\n * @private\n */\n\n /**\n * (old IE only) wait until a doScroll() call does not throw an error\n *\n * @method _poll\n * @private\n */\n _poll: function(context) {\n try {\n context.root.doScroll('left');\n } catch(e) {\n return setTimeout(context.handlers.poll, 50);\n }\n this._ready(context);\n },\n\n /**\n * Function that runs the callbacks from the queue when the document is ready.\n *\n * @method _ready\n * @private\n */\n _ready: function(context) {\n if (!context.done) {\n context.done = true;\n for (var i = 0; i < context.cbQueue.length; ++i) {\n context.cbQueue[i].call(context.win);\n }\n context.cbQueue = [];\n }\n }\n };\n\n return Loaded;\n\n});\n","/**\n * CSS selector engine\n * @module Ink.Dom.Selector_1\n * @version 1\n */\n \nInk.createModule('Ink.Dom.Selector', 1, [], function() {\n /*jshint forin:false, eqnull:true, noempty:false, expr:true, boss:true, maxdepth:false*/\n\t'use strict';\n\n/*!\n * Sizzle CSS Selector Engine\n * Copyright 2013 jQuery Foundation and other contributors\n * Released under the MIT license\n * http://sizzlejs.com/\n */\n\nvar i,\n\tcachedruns,\n\tExpr,\n\tgetText,\n\tisXML,\n\tcompile,\n\toutermostContext,\n\trecompare,\n\tsortInput,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + -(new Date()),\n\tpreferredDoc = window.document,\n\tsupport = {},\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\thasDuplicate = false,\n\tsortOrder = function() { return 0; },\n\n\t// General-purpose constants\n\tstrundefined = typeof undefined,\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Array methods\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf if we can't use a native one\n\tindexOf = arr.indexOf || function( elem ) {\n\t\tvar i = 0,\n\t\t\tlen = this.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( this[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\toperators = \"([*^$|!~]?=)\",\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:\" + operators + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\n\t// Prefer arguments quoted,\n\t// then not containing pseudos/brackets,\n\t// then attribute selectors/non-parenthetical expressions,\n\t// then anything else\n\t// These preferences are here to reduce the number of selectors\n\t// needing tokenize in the PSEUDO preFilter\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes.replace( 3, 8 ) + \")*)|.*)\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([\\\\x20\\\\t\\\\r\\\\n\\\\f>+~])\" + whitespace + \"*\" ),\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"NAME\": new RegExp( \"^\\\\[name=['\\\"]?(\" + characterEncoding + \")['\\\"]?\\\\]\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trsibling = /[\\x20\\t\\r\\n\\f]*[+~]/,\n\n\trnative = /^[^{]+\\{\\s*\\[native code/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trescape = /'|\\\\/g,\n\trattributeQuotes = /\\=[\\x20\\t\\r\\n\\f]*([^'\"\\]]*)[\\x20\\t\\r\\n\\f]*\\]/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = /\\\\([\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|.)/g,\n\tfunescape = function( _, escaped ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\treturn high !== high ?\n\t\t\tescaped :\n\t\t\t// BMP codepoint\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\n/*\n * For feature detection\n * @param {Function} fn The function to test for native support\n */\nfunction isNative( fn ) {\n\treturn rnative.test( fn + \"\" );\n}\n\n/*\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar cache,\n\t\tkeys = [];\n\n\treturn (cache = function( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key += \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key ] = value);\n\t});\n}\n\n/*\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/*\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( documentIsHTML && !seed ) {\n\n\t\t// Shortcuts\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && !rbuggyQSA.test(selector) ) {\n\t\t\told = true;\n\t\t\tnid = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType === 9 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/*\n * Detect xml\n * @param {Element|Object} elem An element or a document\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/*\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar doc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\n\t// Support tests\n\tdocumentIsHTML = !isXML( doc );\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Check if attributes should be retrieved by attribute nodes\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.innerHTML = \"\";\n\t\tvar type = typeof div.lastChild.getAttribute(\"multiple\");\n\t\t// IE8 returns a string for some attributes even when not present\n\t\treturn type !== \"boolean\" && type !== \"string\";\n\t});\n\n\t// Check if getElementsByClassName can be trusted\n\tsupport.getElementsByClassName = assert(function( div ) {\n\t\t// Opera can't find a second classname (in 9.6)\n\t\tdiv.innerHTML = \"\";\n\t\tif ( !div.getElementsByClassName || !div.getElementsByClassName(\"e\").length ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Safari 3.2 caches class attributes and doesn't catch changes\n\t\tdiv.lastChild.className = \"e\";\n\t\treturn div.getElementsByClassName(\"e\").length === 2;\n\t});\n\n\t// Check if getElementsByName privileges form controls or returns elements by ID\n\t// If so, assume (for broader support) that getElementById returns elements by name\n\tsupport.getByName = assert(function( div ) {\n\t\t// Inject content\n\t\tdiv.id = expando + 0;\n\t\t// Support: Windows 8 Native Apps\n\t\t// Assigning innerHTML with \"name\" attributes throws uncatchable exceptions\n\t\t// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx\n\t\tdiv.appendChild( document.createElement(\"a\") ).setAttribute( \"name\", expando );\n\t\tdiv.appendChild( document.createElement(\"i\") ).setAttribute( \"name\", expando );\n\t\tdocElem.appendChild( div );\n\n\t\t// Test\n\t\tvar pass = doc.getElementsByName &&\n\t\t\t// buggy browsers will return fewer than the correct 2\n\t\t\tdoc.getElementsByName( expando ).length === 2 +\n\t\t\t// buggy browsers will return more than the correct 0\n\t\t\tdoc.getElementsByName( expando + 0 ).length;\n\n\t\t// Cleanup\n\t\tdocElem.removeChild( div );\n\n\t\treturn pass;\n\t});\n\n\t// Support: Webkit<537.32\n\t// Detached nodes confoundingly follow *each other*\n\tsupport.sortDetached = assert(function( div1 ) {\n\t\treturn div1.compareDocumentPosition &&\n\t\t\t// Should return 1, but Webkit returns 4 (following)\n\t\t\t(div1.compareDocumentPosition( document.createElement(\"div\") ) & 1);\n\t});\n\n\t// IE6/7 return modified attributes\n\tExpr.attrHandle = assert(function( div ) {\n\t\tdiv.innerHTML = \"
              \";\n\t\treturn div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&\n\t\t\tdiv.firstChild.getAttribute(\"href\") === \"#\";\n\t}) ?\n\t\t{} :\n\t\t{\n\t\t\t\"href\": function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"href\", 2 );\n\t\t\t},\n\t\t\t\"type\": function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"type\");\n\t\t\t}\n\t\t};\n\n\t// ID find and filter\n\tif ( support.getByName ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\n\t\t\t\treturn m ?\n\t\t\t\t\tm.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode(\"id\").value === id ?\n\t\t\t\t\t\t[m] :\n\t\t\t\t\t\tundefined :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t}\n\t\t} :\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Name\n\tExpr.find[\"NAME\"] = support.getByName && function( tag, context ) {\n\t\tif ( typeof context.getElementsByName !== strundefined ) {\n\t\t\treturn context.getElementsByName( name );\n\t\t}\n\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21),\n\t// no need to also add to buggyMatches since matches checks buggyQSA\n\t// A support test would require too much code (would include document ready)\n\trbuggyQSA = [ \":focus\" ];\n\n\tif ( (support.qsa = isNative(doc.querySelectorAll)) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdiv.innerHTML = \"\";\n\n\t\t\t// IE8 - Some boolean attributes are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:checked|disabled|ismap|multiple|readonly|selected|value)\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Opera 10-12/IE8 - ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tif ( div.querySelectorAll(\"[i^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:\\\"\\\"|'')\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = isNative(docElem.contains) || docElem.compareDocumentPosition ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t// Document order sorting\n\tsortOrder = docElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );\n\n\t\tif ( compare ) {\n\t\t\t// Disconnected nodes\n\t\t\tif ( compare & 1 ||\n\t\t\t\t(recompare && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t\tif ( a === doc || contains(preferredDoc, a) ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( b === doc || contains(preferredDoc, b) ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\t// Maintain original order\n\t\t\t\treturn sortInput ?\n\t\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t\t0;\n\t\t\t}\n\n\t\t\treturn compare & 4 ? -1 : 1;\n\t\t}\n\n\t\t// Not directly comparable, sort on existence of method\n\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\t} else if ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\t// rbuggyQSA always contains :focus, so no need for an existence check\n\tif ( support.matchesSelector && documentIsHTML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) {\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch(e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [elem] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\tvar val;\n\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tif ( documentIsHTML ) {\n\t\tname = name.toLowerCase();\n\t}\n\tif ( (val = Expr.attrHandle[ name ]) ) {\n\t\treturn val( elem );\n\t}\n\tif ( !documentIsHTML || support.attributes ) {\n\t\treturn elem.getAttribute( name );\n\t}\n\treturn ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?\n\t\tname :\n\t\tval && val.specified ? val.value : null;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n// Document sorting and removing duplicates\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\t// Compensate for sort limitations\n\trecompare = !support.sortDetached;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\treturn results;\n};\n\n/*\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns Returns -1 if a precedes b, 1 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n// Returns a function to use in pseudos for input types\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n// Returns a function to use in pseudos for buttons\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n// Returns a function to use in pseudos for positionals\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/*\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( ; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (see #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[5] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[4] ) {\n\t\t\t\tmatch[2] = match[4];\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeName ) {\n\t\t\tif ( nodeName === \"*\" ) {\n\t\t\t\treturn function() { return true; };\n\t\t\t}\n\n\t\t\tnodeName = nodeName.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\")) || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\n\t\t\t// not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t// Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === elem.type );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( tokens = [] );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar data, cache, outerCache,\n\t\t\t\tdirkey = dirruns + \" \" + doneName;\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {\n\t\t\t\t\t\t\tif ( (data = cache[1]) === true || data === cachedruns ) {\n\t\t\t\t\t\t\t\treturn data === true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcache = outerCache[ dir ] = [ dirkey ];\n\t\t\t\t\t\t\tcache[1] = matcher( elem, context, xml ) || cachedruns;\n\t\t\t\t\t\t\tif ( cache[1] === true ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\t// A counter to specify which element is currently being matched\n\tvar matcherCachedRuns = 0,\n\t\tbySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, expandContext ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tsetMatched = [],\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\toutermost = expandContext != null,\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", expandContext && context.parentNode || context ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t\tcachedruns = matcherCachedRuns;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t\tcachedruns = ++matcherCachedRuns;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !group ) {\n\t\t\tgroup = tokenize( selector );\n\t\t}\n\t\ti = group.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( group[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\t}\n\treturn cached;\n};\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tmatch = tokenize( selector );\n\n\tif ( !seed ) {\n\t\t// Try to minimize operations if there is only one group\n\t\tif ( match.length === 1 ) {\n\n\t\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t\ttokens = match[0] = match[0].slice( 0 );\n\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\t\tcontext.nodeType === 9 && documentIsHTML &&\n\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\t\tif ( !context ) {\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\n\t\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t\t}\n\n\t\t\t// Fetch a seed set for right-to-left matching\n\t\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\ttoken = tokens[i];\n\n\t\t\t\t// Abort if we hit a combinator\n\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\t\tif ( (seed = find(\n\t\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\t\trsibling.test( tokens[0].type ) && context.parentNode || context\n\t\t\t\t\t)) ) {\n\n\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\tcompile( selector, match )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector )\n\t);\n\treturn results;\n}\n\n// Deprecated\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\n// Check sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Initialize with the default document\nsetDocument();\n\n// Always assume the presence of duplicates if sort doesn't\n// pass them to our comparison function (as in Google Chrome).\n[0, 0].sort( sortOrder );\nsupport.detectDuplicates = hasDuplicate;\n\n// EXPOSE\n/*if ( typeof define === \"function\" && define.amd ) {\n\tdefine(function() { return Sizzle; });\n} else {\n\twindow.Sizzle = Sizzle;\n}*/\n// EXPOSE\n\n/**\n * @namespace Ink.Dom.Selector\n * @static\n */\n\n/**\n * Alias for the Sizzle selector engine\n *\n * @method select\n * @param {String} selector CSS selector to search for elements\n * @param {DOMElement} [context] By default the search is done in the document element. However, you can specify an element as search context\n * @param {Array} [results] By default this is considered an empty array. But if you want to merge it with other searches you did, pass their result array through here.\n * @return {Array} Array of resulting DOM Elements\n * @sample Ink_Dom_Selector_select.html\n */\n\n/**\n * Filters elements that match a CSS selector.\n *\n * @method matches\n * @param {String} selector CSS selector to search for elements\n * @param {Array} matches Elements to be 'matched' with\n * @return {Array} Elements that matched\n * @sample Ink_Dom_Selector_matches.html\n */\n\n/**\n * Checks if an element matches a given selector\n *\n * @method matchesSelector\n * @param {DOMElement} element Element to test\n * @param {String} selector CSS selector to test the element with\n * @return {Boolean} True if element matches the CSS selector\n * @sample Ink_Dom_Selector_matchesSelector.html \n */\n\nreturn {\n select: Sizzle,\n matches: Sizzle.matches,\n matchesSelector: Sizzle.matchesSelector\n};\n\n\n}); //( window );\n","/**\n * Array Utilities\n * @module Ink.Util.Array_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Array', '1', [], function() {\n\n 'use strict';\n\n var arrayProto = Array.prototype;\n\n /**\n * @namespace Ink.Util.Array_1\n */\n\n var InkArray = {\n\n /**\n * Checks if a value is an array\n *\n * @method isArray\n * @param {Mixed} testedObject The object we want to check\n * @return {Boolean} Whether the given value is a javascript Array.\n **/\n isArray: Array.isArray || function (testedObject) {\n return {}.toString.call(testedObject) === '[object Array]';\n },\n\n /**\n * Loops through an array, grouping similar items together.\n * @method groupBy\n * @param {Array} arr The input array.\n * @param {Object} [options] Options object, containing:\n * @param {Function} [options.key] A function which computes the group key by which the items are grouped.\n * @param {Boolean} [options.pairs] Set to `true` if you want to output an array of `[key, [group...]]` pairs instead of an array of groups.\n * @return {Array} An array containing arrays of chunks.\n *\n * @example\n * InkArray.groupBy([1, 1, 2, 2, 3, 1]) // -> [ [1, 1], [2, 2], [3], [1] ]\n * InkArray.groupBy([1.1, 1.2, 2.1], { key: Math.floor }) // -> [ [1.1, 1.2], [2.1] ]\n * InkArray.groupBy([1.1, 1.2, 2.1], { key: Math.floor, pairs: true }) // -> [ [1, [1.1, 1.2]], [2, [2.1]] ]\n *\n **/\n groupBy: function (arr, options) {\n options = options || {};\n var ret = [];\n var latestGroup;\n function eq(a, b) {\n return outKey(a) === outKey(b);\n }\n function outKey(item) {\n if (typeof options.key === 'function') {\n return options.key(item);\n } else {\n return item;\n }\n }\n\n for (var i = 0, len = arr.length; i < len; i++) {\n latestGroup = [arr[i]];\n\n // Chunkin'\n while ((i + 1 < len) && eq(arr[i], arr[i + 1])) {\n latestGroup.push(arr[i + 1]);\n i++;\n }\n\n if (options.pairs) {\n ret.push([outKey(arr[i]), latestGroup]);\n } else {\n ret.push(latestGroup);\n }\n }\n return ret;\n },\n\n /**\n * Replacement for Array.prototype.reduce.\n *\n * Uses Array.prototype.reduce if available.\n *\n * Produces a single result from a list of values by calling an \"aggregator\" function.\n *\n * Falls back to Array.prototype.reduce if available.\n *\n * @method reduce\n * @param {Array} array Input array to be reduced.\n * @param {Function} callback `function (previousValue, currentValue, index, all) { return {Mixed} }` to execute for each value.\n * @param {Mixed} initial Object used as the first argument to the first call of `callback`\n * @return {Mixed} Reduced array.\n *\n * @example\n * var sum = InkArray.reduce([1, 2, 3], function (a, b) { return a + b; }); // -> 6\n */\n reduce: function (array, callback, initial) {\n if (arrayProto.reduce) {\n return arrayProto.reduce.apply(array, arrayProto.slice.call(arguments, 1));\n }\n\n // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Polyfill\n var t = Object( array ), len = t.length >>> 0, k = 0, value;\n if ( arguments.length >= 3 ) {\n value = initial;\n } else {\n while ( k < len && !(k in t) ) k++;\n if ( k >= len )\n throw new TypeError('Reduce of empty array with no initial value');\n value = t[ k++ ];\n }\n for ( ; k < len ; k++ ) {\n if ( k in t ) {\n value = callback( value, t[k], k, t );\n }\n }\n return value;\n },\n\n /**\n * Checks if a value exists in array\n *\n * @method inArray\n * @public\n * @static\n * @param {Mixed} value Value to check\n * @param {Array} arr Array to search in\n * @return {Boolean} True if value exists in the array\n * @sample Ink_Util_Array_inArray.html\n */\n inArray: function(value, arr) {\n if (typeof arr === 'object') {\n for (var i = 0, f = arr.length; i < f; ++i) {\n if (arr[i] === value) {\n return true;\n }\n }\n }\n return false;\n },\n\n /**\n * Sorts an array of objects by an object property\n *\n * @method sortMulti\n * @param {Array} arr Array of objects to sort\n * @param {String} key Property to sort by\n * @return {Array|Boolean} False if it's not an array, returns a sorted array if it's an array.\n * @public\n * @static\n * @sample Ink_Util_Array_sortMulti.html\n */\n sortMulti: function(arr, key) {\n if (typeof arr === 'undefined' || arr.constructor !== Array) { return false; }\n if (typeof key !== 'string') { return arr.sort(); }\n if (arr.length > 0) {\n if (typeof(arr[0][key]) === 'undefined') { return false; }\n arr.sort(function(a, b){\n var x = a[key];\n var y = b[key];\n return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n });\n }\n return arr;\n },\n\n /**\n * Gets the indexes of a value in an array\n *\n * @method keyValue\n * @param {String} value Value to search for.\n * @param {Array} arr Array to run the search in.\n * @param {Boolean} [first] Flag to stop the search at the first match. It also returns an index number instead of an array of indexes.\n * @return {Boolean|Number|Array} False for no matches. Array of matches or first match index.\n * @public\n * @static\n * @sample Ink_Util_Array_keyValue.html\n */\n keyValue: function(value, arr, first) {\n if (typeof value !== 'undefined' && typeof arr === 'object' && this.inArray(value, arr)) {\n var aKeys = [];\n for (var i = 0, f = arr.length; i < f; ++i) {\n if (arr[i] === value) {\n if (typeof first !== 'undefined' && first === true) {\n return i;\n } else {\n aKeys.push(i);\n }\n }\n }\n return aKeys;\n }\n return false;\n },\n\n /**\n * Shuffles an array.\n *\n * @method shuffle\n * @param {Array} arr Array to shuffle\n * @return {Array|Boolean} Shuffled Array or false if not an array.\n * @public\n * @static\n * @sample Ink_Util_Array_shuffle.html\n */\n shuffle: function(arr) {\n if (typeof(arr) !== 'undefined' && arr.constructor !== Array) { return false; }\n var total = arr.length,\n tmp1 = false,\n rnd = false;\n\n while (total--) {\n rnd = Math.floor(Math.random() * (total + 1));\n tmp1 = arr[total];\n arr[total] = arr[rnd];\n arr[rnd] = tmp1;\n }\n return arr;\n },\n\n /**\n * Runs a function through each of the elements of an array.\n *\n * Uses Array.prototype.forEach if available.\n *\n * @method forEach\n * @param {Array} array The array to be cycled/iterated\n * @param {Function} callback The function receives as arguments the value, index and array.\n * @param {Mixed} context The value of `this` inside the `callback` you passed.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Array_forEach.html\n */\n forEach: function(array, callback, context) {\n if (arrayProto.forEach) {\n return arrayProto.forEach.call(array, callback, context);\n }\n for (var i = 0, len = array.length >>> 0; i < len; i++) {\n callback.call(context, array[i], i, array);\n }\n },\n\n /**\n * Alias for backwards compatibility. See forEach\n *\n * @method each\n * @param {Mixed} [forEachArguments] (see forEach)\n * @return {void} (see forEach)\n */\n each: function () {\n InkArray.forEach.apply(InkArray, arrayProto.slice.call(arguments));\n },\n\n /**\n * Runs a function for each item in the array.\n * Uses Array.prototype.map if available.\n * That function will receive each item as an argument and its return value will change the corresponding array item.\n * @method map\n * @param {Array} array The array to map over\n * @param {Function} mapFn The map function. Will take `(item, index, array)` as arguments and the `this` value will be the `context` argument you pass to this function.\n * @param {Object} [context] Object to be `this` in the map function.\n * @return {Array} A copy of the original array, with all of its items processed by the map function.\n *\n * @sample Ink_Util_Array_map.html\n */\n map: function (array, mapFn, context) {\n if (arrayProto.map) {\n return arrayProto.map.call(array, mapFn, context);\n }\n var mapped = new Array(len);\n for (var i = 0, len = array.length >>> 0; i < len; i++) {\n mapped[i] = mapFn.call(context, array[i], i, array);\n }\n return mapped;\n },\n\n /**\n * Filters an array based on a truth test.\n * This method runs a test function on all the array values and returns a new array with all the values that pass the test.\n * @method filter\n * @param {Array} array The array to filter\n * @param {Function} test A test function taking `(item, index, array)`\n * @param {Object} [context] Object to be `this` in the test function.\n * @return {Array} Returns the filtered array\n *\n * @sample Ink_Util_Array_filter.html\n */\n filter: function (array, test, context) {\n if (arrayProto.filter) {\n return arrayProto.filter.call(array, test, context);\n }\n var filtered = [],\n val = null;\n for (var i = 0, len = array.length; i < len; i++) {\n val = array[i]; // it might be mutated\n if (test.call(context, val, i, array)) {\n filtered.push(val);\n }\n }\n return filtered;\n },\n\n /**\n * Checks if some element in the array passes a truth test\n *\n * @method some\n * @param {Array} arr The array to iterate through\n * @param {Function} cb The callback to be called on the array's elements. It receives the value, the index and the array as arguments.\n * @param {Object} context Object of the callback function\n * @return {Boolean} True if the callback returns true at any point, false otherwise\n * @public\n * @static\n * @sample Ink_Util_Array_some.html\n */\n some: function(arr, cb, context){\n\n if (arr === null){\n throw new TypeError('First argument is invalid.');\n }\n\n var t = Object(arr);\n var len = t.length >>> 0;\n if (typeof cb !== \"function\"){ throw new TypeError('Second argument must be a function.'); }\n\n for (var i = 0; i < len; i++) {\n if (i in t && cb.call(context, t[i], i, t)){ return true; }\n }\n\n return false;\n },\n\n /**\n * Compares the values of two arrays and return the matches\n *\n * @method intersect\n * @param {Array} arr1 First array\n * @param {Array} arr2 Second array\n * @return {Array} Empty array if one of the arrays is false (or do not intersect) | Array with the intersected values\n * @public\n * @static\n * @sample Ink_Util_Array_intersect.html\n */\n intersect: function(arr1, arr2) {\n if (!arr1 || !arr2 || arr1 instanceof Array === false || arr2 instanceof Array === false) {\n return [];\n }\n\n var shared = [];\n for (var i = 0, I = arr1.length; i 0) {\n for (x = start; x < stop; x += step) {\n r.push(x);\n }\n } else {\n for (x = start; x > stop; x += step) {\n r.push(x);\n }\n }\n\n return r;\n },\n\n /**\n * Inserts a value on a specified index\n *\n * @method insert\n * @param {Array} arr Array where the value will be inserted\n * @param {Number} idx Index of the array where the value should be inserted\n * @param {Mixed} value Value to be inserted\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Array_insert.html\n */\n insert: function(arr, idx, value) {\n arr.splice(idx, 0, value);\n },\n\n /**\n * Removes a range of values from the array\n *\n * @method remove\n * @param {Array} arr Array where the value will be removed\n * @param {Number} from Index of the array where the removal will start removing.\n * @param {Number} rLen Number of items to be removed from the index onwards.\n * @return {Array} An array with the remaining values\n * @public\n * @static\n * @sample Ink_Util_Array_remove.html\n */\n remove: function(arr, from, rLen){\n var output = [];\n\n for(var i = 0, iLen = arr.length; i < iLen; i++){\n if(i >= from && i < from + rLen){\n continue;\n }\n\n output.push(arr[i]);\n }\n\n return output;\n }\n };\n\n return InkArray;\n\n});\n","/**\n * Binary Packing algorithm implementation\n * @module Ink.Util.BinPack_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.BinPack', '1', [], function() {\n\n 'use strict';\n\n /*jshint boss:true */\n\n // https://github.com/jakesgordon/bin-packing/\n\n /*\n Copyright (c) 2011, 2012, 2013 Jake Gordon and contributors\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n */\n\n\n\n var Packer = function(w, h) {\n this.init(w, h);\n };\n\n Packer.prototype = {\n\n init: function(w, h) {\n this.root = { x: 0, y: 0, w: w, h: h };\n },\n\n fit: function(blocks) {\n var n, node, block;\n for (n = 0; n < blocks.length; ++n) {\n block = blocks[n];\n if (node = this.findNode(this.root, block.w, block.h)) {\n block.fit = this.splitNode(node, block.w, block.h);\n }\n }\n },\n\n findNode: function(root, w, h) {\n if (root.used) {\n return this.findNode(root.right, w, h) || this.findNode(root.down, w, h);\n }\n else if ((w <= root.w) && (h <= root.h)) {\n return root;\n }\n else {\n return null;\n }\n },\n\n splitNode: function(node, w, h) {\n node.used = true;\n node.down = { x: node.x, y: node.y + h, w: node.w, h: node.h - h };\n node.right = { x: node.x + w, y: node.y, w: node.w - w, h: h };\n return node;\n }\n\n };\n\n\n\n var GrowingPacker = function() {};\n\n GrowingPacker.prototype = {\n\n fit: function(blocks) {\n var n, node, block, len = blocks.length;\n var w = len > 0 ? blocks[0].w : 0;\n var h = len > 0 ? blocks[0].h : 0;\n this.root = { x: 0, y: 0, w: w, h: h };\n for (n = 0; n < len ; n++) {\n block = blocks[n];\n if (node = this.findNode(this.root, block.w, block.h)) {\n block.fit = this.splitNode(node, block.w, block.h);\n }\n else {\n block.fit = this.growNode(block.w, block.h);\n }\n }\n },\n\n findNode: function(root, w, h) {\n if (root.used) {\n return this.findNode(root.right, w, h) || this.findNode(root.down, w, h);\n }\n else if ((w <= root.w) && (h <= root.h)) {\n return root;\n }\n else {\n return null;\n }\n },\n\n splitNode: function(node, w, h) {\n node.used = true;\n node.down = { x: node.x, y: node.y + h, w: node.w, h: node.h - h };\n node.right = { x: node.x + w, y: node.y, w: node.w - w, h: h };\n return node;\n },\n\n growNode: function(w, h) {\n var canGrowDown = (w <= this.root.w);\n var canGrowRight = (h <= this.root.h);\n\n var shouldGrowRight = canGrowRight && (this.root.h >= (this.root.w + w)); // attempt to keep square-ish by growing right when height is much greater than width\n var shouldGrowDown = canGrowDown && (this.root.w >= (this.root.h + h)); // attempt to keep square-ish by growing down when width is much greater than height\n\n if (shouldGrowRight) {\n return this.growRight(w, h);\n }\n else if (shouldGrowDown) {\n return this.growDown(w, h);\n }\n else if (canGrowRight) {\n return this.growRight(w, h);\n }\n else if (canGrowDown) {\n return this.growDown(w, h);\n }\n else {\n return null; // need to ensure sensible root starting size to avoid this happening\n }\n },\n\n growRight: function(w, h) {\n this.root = {\n used: true,\n x: 0,\n y: 0,\n w: this.root.w + w,\n h: this.root.h,\n down: this.root,\n right: { x: this.root.w, y: 0, w: w, h: this.root.h }\n };\n var node;\n if (node = this.findNode(this.root, w, h)) {\n return this.splitNode(node, w, h);\n }\n else {\n return null;\n }\n },\n\n growDown: function(w, h) {\n this.root = {\n used: true,\n x: 0,\n y: 0,\n w: this.root.w,\n h: this.root.h + h,\n down: { x: 0, y: this.root.h, w: this.root.w, h: h },\n right: this.root\n };\n var node;\n if (node = this.findNode(this.root, w, h)) {\n return this.splitNode(node, w, h);\n }\n else {\n return null;\n }\n }\n\n };\n\n\n\n var sorts = {\n random: function() { return Math.random() - 0.5; },\n w: function(a, b) { return b.w - a.w; },\n h: function(a, b) { return b.h - a.h; },\n a: function(a, b) { return b.area - a.area; },\n max: function(a, b) { return Math.max(b.w, b.h) - Math.max(a.w, a.h); },\n min: function(a, b) { return Math.min(b.w, b.h) - Math.min(a.w, a.h); },\n height: function(a, b) { return sorts.msort(a, b, ['h', 'w']); },\n width: function(a, b) { return sorts.msort(a, b, ['w', 'h']); },\n area: function(a, b) { return sorts.msort(a, b, ['a', 'h', 'w']); },\n maxside: function(a, b) { return sorts.msort(a, b, ['max', 'min', 'h', 'w']); },\n msort: function(a, b, criteria) { /* sort by multiple criteria */\n var diff, n;\n for (n = 0; n < criteria.length; ++n) {\n diff = sorts[ criteria[n] ](a, b);\n if (diff !== 0) {\n return diff;\n }\n }\n return 0;\n }\n };\n\n\n\n // end of Jake's code\n\n\n\n // aux, used to display blocks in unfitted property\n var toString = function() {\n return [this.w, ' x ', this.h].join('');\n };\n\n\n\n /**\n * Binary Packing algorithm implementation\n *\n * Based on the work of Jake Gordon\n *\n * see https://github.com/jakesgordon/bin-packing/\n *\n * @namespace Ink.Util.BinPack\n * @version 1\n * @static\n */\n var BinPack = {\n\n /**\n * @method binPack\n * @param {Object} o Options\n * @param {Array} o.blocks Array of items with width and height integer attributes.\n * @param {Array} [o.dimensions] Flag to fix container dimensions\n * @param {String} [o.sorter] Sorting function. One of: random, height, width, area, maxside\n * @return {Object} Returns an object containing container dimensions, filled ratio, fitted blocks, unfitted blocks and all blocks\n * @static\n */\n binPack: function(o) {\n var i, f, bl;\n\n\n\n // calculate area if not there already\n for (i = 0, f = o.blocks.length; i < f; ++i) {\n bl = o.blocks[i];\n if (! ('area' in bl) ) {\n bl.area = bl.w * bl.h;\n }\n }\n\n\n\n // apply algorithm\n var packer = o.dimensions ? new Packer(o.dimensions[0], o.dimensions[1]) : new GrowingPacker();\n\n if (!o.sorter) { o.sorter = 'maxside'; }\n\n o.blocks.sort( sorts[ o.sorter ] );\n\n packer.fit(o.blocks);\n\n var dims2 = [packer.root.w, packer.root.h];\n\n\n\n // layout is done here, generating report data...\n var fitted = [];\n var unfitted = [];\n\n for (i = 0, f = o.blocks.length; i < f; ++i) {\n bl = o.blocks[i];\n if (bl.fit) {\n fitted.push(bl);\n }\n else {\n bl.toString = toString; // TO AID SERIALIZATION\n unfitted.push(bl);\n }\n }\n\n var area = dims2[0] * dims2[1];\n var fit = 0;\n for (i = 0, f = fitted.length; i < f; ++i) {\n bl = fitted[i];\n fit += bl.area;\n }\n\n return {\n dimensions: dims2,\n filled: fit / area,\n blocks: o.blocks,\n fitted: fitted,\n unfitted: unfitted\n };\n }\n };\n\n\n\n return BinPack;\n\n});","/**\n * Cookie Utilities\n * @module Ink.Util.Cookie_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Cookie', '1', [], function() {\n 'use strict';\n\n /**\n * @namespace Ink.Util.Cookie_1\n */\n var Cookie = {\n\n /**\n * Gets an object with the current page cookies, or a specific cookie if you specify the `name`.\n *\n * @method get\n * @param {String} [name] The cookie name.\n * @return {String|Object} If the name is specified, it returns the value of that key. Otherwise it returns the full cookie object\n * @public\n * @static\n * @sample Ink_Util_Cookie_get.html\n */\n get: function(name)\n {\n var cookie = document.cookie || false;\n\n var _Cookie = {};\n\n if(cookie) {\n cookie = cookie.replace(new RegExp(\"; \", \"g\"), ';');\n\n var aCookie = cookie.split(';');\n var aItem = [];\n if(aCookie.length > 0) {\n for(var i=0; i < aCookie.length; i++) {\n aItem = aCookie[i].split('=');\n if(aItem.length === 2) {\n _Cookie[aItem[0]] = decodeURIComponent(aItem[1]);\n }\n }\n }\n if(name) {\n if(typeof(_Cookie[name]) !== 'undefined') {\n return _Cookie[name];\n } else {\n return null;\n }\n }\n }\n return _Cookie;\n },\n\n /**\n * Sets a cookie.\n *\n * @method set\n * @param {String} name Cookie name.\n * @param {String} value Cookie value.\n * @param {Number} [expires] Number of seconds the cookie will be valid for.\n * @param {String} [path] Path for the cookie. Defaults to '/'.\n * @param {String} [domain] Domain for the cookie. Defaults to current hostname.\n * @param {Boolean} [secure] Flag for secure. Default 'false'.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Cookie_set.html\n */\n set: function(name, value, expires, path, domain, secure)\n {\n var sName;\n if(!name || value===false || typeof(name) === 'undefined' || typeof(value) === 'undefined') {\n return false;\n } else {\n sName = name+'='+encodeURIComponent(value);\n }\n var sExpires = false;\n var sPath = false;\n var sDomain = false;\n var sSecure = false;\n\n if(expires && typeof(expires) !== 'undefined' && !isNaN(expires)) {\n var oDate = new Date();\n var sDate = (parseInt(Number(oDate.valueOf()), 10) + (Number(parseInt(expires, 10)) * 1000));\n\n var nDate = new Date(sDate);\n var expiresString = nDate.toGMTString();\n\n var re = new RegExp(\"([^\\\\s]+)(\\\\s\\\\d\\\\d)\\\\s(\\\\w\\\\w\\\\w)\\\\s(.*)\");\n expiresString = expiresString.replace(re, \"$1$2-$3-$4\");\n\n sExpires = 'expires='+expiresString;\n } else {\n if(typeof(expires) !== 'undefined' && !isNaN(expires) && Number(parseInt(expires, 10))===0) {\n sExpires = '';\n } else {\n sExpires = 'expires=Thu, 01-Jan-2037 00:00:01 GMT';\n }\n }\n\n if(path && typeof(path) !== 'undefined') {\n sPath = 'path='+path;\n } else {\n sPath = 'path=/';\n }\n\n if(domain) {\n sDomain = 'domain='+domain;\n } else if (/\\./.test(window.location.hostname)) {\n // When trying to set domain=localhost or any other domain\n // without dots, setting the cookie fails.\n // Anyways, the cookies are bound to the current domain by default so let it be.\n sDomain = 'domain='+window.location.hostname;\n }\n\n if(secure && typeof(secure) !== 'undefined') {\n sSecure = secure;\n } else {\n sSecure = false;\n }\n\n document.cookie = sName +\n '; ' + sExpires +\n '; ' + sPath +\n (sDomain ? '; ' + sDomain : '') +\n '; ' + sSecure;\n },\n\n /**\n * Deletes a cookie.\n *\n * @method remove\n * @param {String} cookieName Cookie name.\n * @param {String} [path] Path of the cookie. Defaults to '/'.\n * @param {String} [domain] Domain of the cookie. Defaults to current hostname.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Cookie_remove.html\n */\n remove: function(cookieName, path, domain) {\n var expiresDate = -1;\n\n this.set(cookieName, 'deleted', expiresDate, path, domain);\n }\n };\n\n return Cookie;\n\n});\n","/**\n * Date utility functions\n * @module Ink.Util.Date_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Date', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Date_1 \n */\n var InkDate = {\n\n /**\n * Function that returns the string representation of the month [PT only]\n *\n * @method _months\n * @param {Number} index Month javascript (0 to 11)\n * @return {String} The month's name\n * @private\n * @static\n * @example\n * console.log( InkDate._months(0) ); // Result: Janeiro\n */\n _months: function(index){\n var _m = ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];\n return _m[index];\n },\n\n /**\n * Function that returns the month [PT only] ( 0 to 11 )\n *\n * @method _iMonth\n * @param {String} month Month javascript (0 to 11)\n * @return {Number} The month's number\n * @private\n * @static\n * @example\n * console.log( InkDate._iMonth('maio') ); // Result: 4\n */\n _iMonth : function( month )\n {\n if ( Number( month ) ) { return +month - 1; }\n return {\n 'janeiro' : 0 ,\n 'jan' : 0 ,\n 'fevereiro' : 1 ,\n 'fev' : 1 ,\n 'março' : 2 ,\n 'mar' : 2 ,\n 'abril' : 3 ,\n 'abr' : 3 ,\n 'maio' : 4 ,\n 'mai' : 4 ,\n 'junho' : 5 ,\n 'jun' : 5 ,\n 'julho' : 6 ,\n 'jul' : 6 ,\n 'agosto' : 7 ,\n 'ago' : 7 ,\n 'setembro' : 8 ,\n 'set' : 8 ,\n 'outubro' : 9 ,\n 'out' : 9 ,\n 'novembro' : 10 ,\n 'nov' : 10 ,\n 'dezembro' : 11 ,\n 'dez' : 11\n }[ month.toLowerCase( ) ];\n } ,\n\n /**\n * Function that returns the representation the day of the week [PT Only]\n *\n * @method _wDays\n * @param {Number} index Week's day index\n * @return {String} The week's day name\n * @private\n * @static\n * @example\n * console.log( InkDate._wDays(0) ); // Result: Domingo\n */\n _wDays: function(index){\n var _d = ['Domingo', 'Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado'];\n return _d[index];\n },\n\n /**\n * Function that returns day of the week in javascript 1 to 7\n *\n * @method _iWeek\n * @param {String} week Week's day name\n * @return {Number} The week's day index\n * @private\n * @static\n * @example\n * console.log( InkDate._iWeek('quarta') ); // Result: 3\n */\n _iWeek: function( week )\n {\n if ( Number( week ) ) { return +week || 7; }\n return {\n 'segunda' : 1 ,\n 'seg' : 1 ,\n 'terça' : 2 ,\n 'ter' : 2 ,\n 'quarta' : 3 ,\n 'qua' : 3 ,\n 'quinta' : 4 ,\n 'qui' : 4 ,\n 'sexta' : 5 ,\n 'sex' : 5 ,\n 'sábado' : 6 ,\n 'sáb' : 6 ,\n 'domingo' : 7 ,\n 'dom' : 7\n }[ week.toLowerCase( ) ];\n },\n\n /**\n * Function that returns the number of days of a given month (m) on a given year (y)\n *\n * @method _daysInMonth\n * @param {Number} _m Month\n * @param {Number} _y Year\n * @return {Number} Number of days of a give month on a given year\n * @private\n * @static\n * @example\n * console.log( InkDate._daysInMonth(2,2013) ); // Result: 28\n */\n _daysInMonth: function(_m,_y){\n var nDays;\n\n if(_m===1 || _m===3 || _m===5 || _m===7 || _m===8 || _m===10 || _m===12)\n {\n nDays= 31;\n }\n else if ( _m===4 || _m===6 || _m===9 || _m===11)\n {\n nDays = 30;\n }\n else\n {\n if((_y%400===0) || (_y%4===0 && _y%100!==0))\n {\n nDays = 29;\n }\n else\n {\n nDays = 28;\n }\n }\n return nDays;\n },\n\n /**\n * Formats a date object.\n * This works exactly as php date() function. http://php.net/manual/en/function.date.php\n *\n * @method get\n * @param {String} format The format in which the date it will be formatted.\n * @param {Date} [_date] The date to format. Can receive unix timestamp or a date object. Defaults to current time.\n * @return {String} Formatted date\n * @public\n * @static\n * @sample Ink_Util_Date_get.html \n */\n get: function(format, _date){\n /*jshint maxcomplexity:65 */\n if(typeof(format) === 'undefined' || format === ''){\n format = \"Y-m-d\";\n }\n\n\n var iFormat = format.split(\"\");\n var result = new Array(iFormat.length);\n var escapeChar = \"\\\\\";\n var jsDate;\n\n if (typeof(_date) === 'undefined'){\n jsDate = new Date();\n } else if (typeof(_date)==='number'){\n jsDate = new Date(_date*1000);\n } else {\n jsDate = new Date(_date);\n }\n\n var jsFirstDay, jsThisDay, jsHour;\n /* This switch is presented in the same order as in php date function (PHP 5.2.2) */\n for (var i = 0; i < iFormat.length; i++) {\n switch(iFormat[i]) {\n case escapeChar:\n result[i] = iFormat[i+1];\n i++;\n break;\n\n\n /* DAY */\n case \"d\": /* Day of the month, 2 digits with leading zeros; ex: 01 to 31 */\n var jsDay = jsDate.getDate();\n result[i] = (String(jsDay).length > 1) ? jsDay : \"0\" + jsDay;\n break;\n\n case \"D\": /* A textual representation of a day, three letters; Seg to Dom */\n result[i] = this._wDays(jsDate.getDay()).substring(0, 3);\n break;\n\n case \"j\": /* Day of the month without leading zeros; ex: 1 to 31 */\n result[i] = jsDate.getDate();\n break;\n\n case \"l\": /* A full textual representation of the day of the week; Domingo to Sabado */\n result[i] = this._wDays(jsDate.getDay());\n break;\n\n case \"N\": /* ISO-8601 numeric representation of the day of the week; 1 (Segunda) to 7 (Domingo) */\n result[i] = jsDate.getDay() || 7;\n break;\n\n case \"S\": /* English ordinal suffix for the day of the month, 2 characters; st, nd, rd or th. Works well with j */\n var temp = jsDate.getDate();\n var suffixes = [\"st\", \"nd\", \"rd\"];\n var suffix = \"\";\n\n if (temp >= 11 && temp <= 13) {\n result[i] = \"th\";\n } else {\n result[i] = (suffix = suffixes[String(temp).substr(-1) - 1]) ? (suffix) : (\"th\");\n }\n break;\n\n case \"w\": /* Numeric representation of the day of the week; 0 (for Sunday) through 6 (for Saturday) */\n result[i] = jsDate.getDay();\n break;\n\n case \"z\": /* The day of the year (starting from 0); 0 to 365 */\n jsFirstDay = Date.UTC(jsDate.getFullYear(), 0, 0);\n jsThisDay = Date.UTC(jsDate.getFullYear(), jsDate.getMonth(), jsDate.getDate());\n result[i] = Math.floor((jsThisDay - jsFirstDay) / (1000 * 60 * 60 * 24));\n break;\n\n /* WEEK */\n case \"W\": /* ISO-8601 week number of year, weeks starting on Monday; ex: 42 (the 42nd week in the year) */\n var jsYearStart = new Date( jsDate.getFullYear( ) , 0 , 1 );\n jsFirstDay = jsYearStart.getDay() || 7;\n\n var days = Math.floor( ( jsDate - jsYearStart ) / ( 24 * 60 * 60 * 1000 ) + 1 );\n\n result[ i ] = Math.ceil( ( days - ( 8 - jsFirstDay ) ) / 7 ) + 1;\n break;\n\n\n /* MONTH */\n case \"F\": /* A full textual representation of a month, such as Janeiro or Marco; Janeiro a Dezembro */\n result[i] = this._months(jsDate.getMonth());\n break;\n\n case \"m\": /* Numeric representation of a month, with leading zeros; 01 to 12 */\n var jsMonth = String(jsDate.getMonth() + 1);\n result[i] = (jsMonth.length > 1) ? jsMonth : \"0\" + jsMonth;\n break;\n\n case \"M\": /* A short textual representation of a month, three letters; Jan a Dez */\n result[i] = this._months(jsDate.getMonth()).substring(0,3);\n break;\n\n case \"n\": /* Numeric representation of a month, without leading zeros; 1 a 12 */\n result[i] = jsDate.getMonth() + 1;\n break;\n\n case \"t\": /* Number of days in the given month; ex: 28 */\n result[i] = this._daysInMonth(jsDate.getMonth()+1,jsDate.getYear());\n break;\n\n /* YEAR */\n case \"L\": /* Whether it's a leap year; 1 if it is a leap year, 0 otherwise. */\n var jsYear = jsDate.getFullYear();\n result[i] = (jsYear % 4) ? false : ( (jsYear % 100) ? true : ( (jsYear % 400) ? false : true ) );\n break;\n\n case \"o\": /* ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. */\n throw '\"o\" not implemented!';\n\n case \"Y\": /* A full numeric representation of a year, 4 digits; 1999 */\n result[i] = jsDate.getFullYear();\n break;\n\n case \"y\": /* A two digit representation of a year; 99 */\n result[i] = String(jsDate.getFullYear()).substring(2);\n break;\n\n /* TIME */\n case \"a\": /* Lowercase Ante meridiem and Post meridiem; am or pm */\n result[i] = (jsDate.getHours() < 12) ? \"am\" : \"pm\";\n break;\n\n case \"A\": /* Uppercase Ante meridiem and Post meridiem; AM or PM */\n result[i] = (jsDate.getHours < 12) ? \"AM\" : \"PM\";\n break;\n\n case \"B\": /* Swatch Internet time; 000 through 999 */\n throw '\"B\" not implemented!';\n\n case \"g\": /* 12-hour format of an hour without leading zeros; 1 to 12 */\n jsHour = jsDate.getHours();\n result[i] = (jsHour <= 12) ? jsHour : (jsHour - 12);\n break;\n\n case \"G\": /* 24-hour format of an hour without leading zeros; 1 to 23 */\n result[i] = String(jsDate.getHours());\n break;\n\n case \"h\": /* 12-hour format of an hour with leading zeros; 01 to 12 */\n jsHour = String(jsDate.getHours());\n jsHour = (jsHour <= 12) ? jsHour : (jsHour - 12);\n result[i] = (jsHour.length > 1) ? jsHour : \"0\" + jsHour;\n break;\n\n case \"H\": /* 24-hour format of an hour with leading zeros; 01 to 24 */\n jsHour = String(jsDate.getHours());\n result[i] = (jsHour.length > 1) ? jsHour : \"0\" + jsHour;\n break;\n\n case \"i\": /* Minutes with leading zeros; 00 to 59 */\n var jsMinute = String(jsDate.getMinutes());\n result[i] = (jsMinute.length > 1) ? jsMinute : \"0\" + jsMinute;\n break;\n\n case \"s\": /* Seconds with leading zeros; 00 to 59; */\n var jsSecond = String(jsDate.getSeconds());\n result[i] = (jsSecond.length > 1) ? jsSecond : \"0\" + jsSecond;\n break;\n\n case \"u\": /* Microseconds */\n throw '\"u\" not implemented!';\n\n\n /* TIMEZONE */\n\n case \"e\": /* Timezone identifier */\n throw '\"e\" not implemented!';\n\n case \"I\": /* \"1\" if Daylight Savings Time, \"0\" otherwise. Works only on the northern hemisphere */\n jsFirstDay = new Date(jsDate.getFullYear(), 0, 1);\n result[i] = (jsDate.getTimezoneOffset() !== jsFirstDay.getTimezoneOffset()) ? (1) : (0);\n break;\n\n case \"O\": /* Difference to Greenwich time (GMT) in hours */\n var jsMinZone = jsDate.getTimezoneOffset();\n var jsMinutes = jsMinZone % 60;\n jsHour = String(((jsMinZone - jsMinutes) / 60) * -1);\n\n if (jsHour.charAt(0) !== \"-\") {\n jsHour = \"+\" + jsHour;\n }\n\n jsHour = (jsHour.length === 3) ? (jsHour) : (jsHour.replace(/([+\\-])(\\d)/, \"$1\" + 0 + \"$2\"));\n result[i] = jsHour + jsMinutes + \"0\";\n break;\n\n case \"P\": /* Difference to Greenwich time (GMT) with colon between hours and minutes */\n throw '\"P\" not implemented!';\n\n case \"T\": /* Timezone abbreviation */\n throw '\"T\" not implemented!';\n\n case \"Z\": /* Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. */\n result[i] = jsDate.getTimezoneOffset() * 60;\n break;\n\n\n /* FULL DATE/TIME */\n\n case \"c\": /* ISO 8601 date */\n throw '\"c\" not implemented!';\n\n case \"r\": /* RFC 2822 formatted date */\n var jsDayName = this._wDays(jsDate.getDay()).substr(0, 3);\n var jsMonthName = this._months(jsDate.getMonth()).substr(0, 3);\n result[i] = jsDayName + \", \" + jsDate.getDate() + \" \" + jsMonthName + this.get(\" Y H:i:s O\",jsDate);\n break;\n\n case \"U\": /* Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) */\n result[i] = Math.floor(jsDate.getTime() / 1000);\n break;\n\n default:\n result[i] = iFormat[i];\n }\n }\n\n return result.join('');\n\n },\n\n /**\n * Creates a date object based on a format string.\n * This works exactly as php date() function. http://php.net/manual/en/function.date.php\n *\n * @method set\n * @param {String} [format] The format in which the date will be formatted. Defaults to 'Y-m-d'\n * @param {String} str_date The date formatted.\n * @return {Date} Date object based on the formatted date and format\n * @public\n * @static\n * @sample Ink_Util_Date_set.html \n */\n set : function( format , str_date ) {\n if ( typeof str_date === 'undefined' ) { return ; }\n if ( typeof format === 'undefined' || format === '' ) { format = \"Y-m-d\"; }\n\n var iFormat = format.split(\"\");\n var result = new Array( iFormat.length );\n var escapeChar = \"\\\\\";\n var mList;\n\n var objIndex = {\n year : undefined ,\n month : undefined ,\n day : undefined ,\n dayY : undefined ,\n dayW : undefined ,\n week : undefined ,\n hour : undefined ,\n hourD : undefined ,\n min : undefined ,\n sec : undefined ,\n msec : undefined ,\n ampm : undefined ,\n diffM : undefined ,\n diffH : undefined ,\n date : undefined\n };\n\n var matches = 0;\n\n /* This switch is presented in the same order as in php date function (PHP 5.2.2) */\n for ( var i = 0; i < iFormat.length; i++) {\n switch( iFormat[ i ] ) {\n case escapeChar:\n result[i] = iFormat[ i + 1 ];\n i++;\n break;\n\n /* DAY */\n case \"d\": /* Day of the month, 2 digits with leading zeros; ex: 01 to 31 */\n result[ i ] = '(\\\\d{2})';\n objIndex.day = { original : i , match : matches++ };\n break;\n\n case \"j\": /* Day of the month without leading zeros; ex: 1 to 31 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.day = { original : i , match : matches++ };\n break;\n\n case \"D\": /* A textual representation of a day, three letters; Seg to Dom */\n result[ i ] = '([\\\\wá]{3})';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"l\": /* A full textual representation of the day of the week; Domingo to Sabado */\n result[i] = '([\\\\wá]{5,7})';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"N\": /* ISO-8601 numeric representation of the day of the week; 1 (Segunda) to 7 (Domingo) */\n result[ i ] = '(\\\\d)';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"w\": /* Numeric representation of the day of the week; 0 (for Sunday) through 6 (for Saturday) */\n result[ i ] = '(\\\\d)';\n objIndex.dayW = { original : i , match : matches++ };\n break;\n\n case \"S\": /* English ordinal suffix for the day of the month, 2 characters; st, nd, rd or th. Works well with j */\n result[ i ] = '\\\\w{2}';\n break;\n\n case \"z\": /* The day of the year (starting from 0); 0 to 365 */\n result[ i ] = '(\\\\d{1,3})';\n objIndex.dayY = { original : i , match : matches++ };\n break;\n\n /* WEEK */\n case \"W\": /* ISO-8601 week number of year, weeks starting on Monday; ex: 42 (the 42nd week in the year) */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.week = { original : i , match : matches++ };\n break;\n\n /* MONTH */\n case \"F\": /* A full textual representation of a month, such as Janeiro or Marco; Janeiro a Dezembro */\n result[ i ] = '([\\\\wç]{4,9})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"M\": /* A short textual representation of a month, three letters; Jan a Dez */\n result[ i ] = '(\\\\w{3})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"m\": /* Numeric representation of a month, with leading zeros; 01 to 12 */\n result[ i ] = '(\\\\d{2})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"n\": /* Numeric representation of a month, without leading zeros; 1 a 12 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.month = { original : i , match : matches++ };\n break;\n\n case \"t\": /* Number of days in the given month; ex: 28 */\n result[ i ] = '\\\\d{2}';\n break;\n\n /* YEAR */\n case \"L\": /* Whether it's a leap year; 1 if it is a leap year, 0 otherwise. */\n result[ i ] = '\\\\w{4,5}';\n break;\n\n case \"o\": /* ISO-8601 year number. This has the same value as Y, except that if the ISO week number (W) belongs to the previous or next year, that year is used instead. */\n throw '\"o\" not implemented!';\n\n case \"Y\": /* A full numeric representation of a year, 4 digits; 1999 */\n result[ i ] = '(\\\\d{4})';\n objIndex.year = { original : i , match : matches++ };\n break;\n\n case \"y\": /* A two digit representation of a year; 99 */\n result[ i ] = '(\\\\d{2})';\n if ( typeof objIndex.year === 'undefined' || iFormat[ objIndex.year.original ] !== 'Y' ) {\n objIndex.year = { original : i , match : matches++ };\n }\n break;\n\n /* TIME */\n case \"a\": /* Lowercase Ante meridiem and Post meridiem; am or pm */\n result[ i ] = '(am|pm)';\n objIndex.ampm = { original : i , match : matches++ };\n break;\n\n case \"A\": /* Uppercase Ante meridiem and Post meridiem; AM or PM */\n result[ i ] = '(AM|PM)';\n objIndex.ampm = { original : i , match : matches++ };\n break;\n\n case \"B\": /* Swatch Internet time; 000 through 999 */\n throw '\"B\" not implemented!';\n\n case \"g\": /* 12-hour format of an hour without leading zeros; 1 to 12 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.hourD = { original : i , match : matches++ };\n break;\n\n case \"G\": /* 24-hour format of an hour without leading zeros; 1 to 23 */\n result[ i ] = '(\\\\d{1,2})';\n objIndex.hour = { original : i , match : matches++ };\n break;\n\n case \"h\": /* 12-hour format of an hour with leading zeros; 01 to 12 */\n result[ i ] = '(\\\\d{2})';\n objIndex.hourD = { original : i , match : matches++ };\n break;\n\n case \"H\": /* 24-hour format of an hour with leading zeros; 01 to 24 */\n result[ i ] = '(\\\\d{2})';\n objIndex.hour = { original : i , match : matches++ };\n break;\n\n case \"i\": /* Minutes with leading zeros; 00 to 59 */\n result[ i ] = '(\\\\d{2})';\n objIndex.min = { original : i , match : matches++ };\n break;\n\n case \"s\": /* Seconds with leading zeros; 00 to 59; */\n result[ i ] = '(\\\\d{2})';\n objIndex.sec = { original : i , match : matches++ };\n break;\n\n case \"u\": /* Microseconds */\n throw '\"u\" not implemented!';\n\n /* TIMEZONE */\n case \"e\": /* Timezone identifier */\n throw '\"e\" not implemented!';\n\n case \"I\": /* \"1\" if Daylight Savings Time, \"0\" otherwise. Works only on the northern hemisphere */\n result[i] = '\\\\d';\n break;\n\n case \"O\": /* Difference to Greenwich time (GMT) in hours */\n result[ i ] = '([-+]\\\\d{4})';\n objIndex.diffH = { original : i , match : matches++ };\n break;\n\n case \"P\": /* Difference to Greenwich time (GMT) with colon between hours and minutes */\n throw '\"P\" not implemented!';\n\n case \"T\": /* Timezone abbreviation */\n throw '\"T\" not implemented!';\n\n case \"Z\": /* Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive. */\n result[ i ] = '(\\\\-?\\\\d{1,5})';\n objIndex.diffM = { original : i , match : matches++ };\n break;\n\n /* FULL DATE/TIME */\n case \"c\": /* ISO 8601 date */\n throw '\"c\" not implemented!';\n\n case \"r\": /* RFC 2822 formatted date */\n result[ i ] = '([\\\\wá]{3}, \\\\d{1,2} \\\\w{3} \\\\d{4} \\\\d{2}:\\\\d{2}:\\\\d{2} [+\\\\-]\\\\d{4})';\n objIndex.date = { original : i , match : matches++ };\n break;\n\n case \"U\": /* Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) */\n result[ i ] = '(\\\\d{1,13})';\n objIndex.date = { original : i , match : matches++ };\n break;\n\n default:\n result[ i ] = iFormat[ i ];\n }\n }\n\n var pattr = new RegExp( result.join('') );\n\n try {\n mList = str_date.match( pattr );\n if ( !mList ) { return; }\n }\n catch ( e ) { return ; }\n\n var _haveDatetime = typeof objIndex.date !== 'undefined';\n\n var _haveYear = typeof objIndex.year !== 'undefined';\n\n var _haveYDay = typeof objIndex.dayY !== 'undefined';\n\n var _haveDay = typeof objIndex.day !== 'undefined';\n var _haveMonth = typeof objIndex.month !== 'undefined';\n var _haveMonthDay = _haveMonth && _haveDay;\n var _haveOnlyDay = !_haveMonth && _haveDay;\n\n var _haveWDay = typeof objIndex.dayW !== 'undefined';\n var _haveWeek = typeof objIndex.week !== 'undefined';\n var _haveWeekWDay = _haveWeek && _haveWDay;\n var _haveOnlyWDay = !_haveWeek && _haveWDay;\n\n var _validDate = _haveYDay || _haveMonthDay || !_haveYear && _haveOnlyDay || _haveWeekWDay || !_haveYear && _haveOnlyWDay;\n var _noDate = !_haveYear && !_haveYDay && !_haveDay && !_haveMonth && !_haveWDay && !_haveWeek;\n\n var _haveHour12 = typeof objIndex.hourD !== 'undefined' && typeof objIndex.ampm !== 'undefined';\n var _haveHour24 = typeof objIndex.hour !== 'undefined';\n var _haveHour = _haveHour12 || _haveHour24;\n\n var _haveMin = typeof objIndex.min !== 'undefined';\n var _haveSec = typeof objIndex.sec !== 'undefined';\n var _haveMSec = typeof objIndex.msec !== 'undefined';\n\n var _haveMoreM = !_noDate || _haveHour;\n var _haveMoreS = _haveMoreM || _haveMin;\n\n var _haveDiffM = typeof objIndex.diffM !== 'undefined';\n var _haveDiffH = typeof objIndex.diffH !== 'undefined';\n //var _haveGMT = _haveDiffM || _haveDiffH;\n var hour;\n var min;\n\n if ( _haveDatetime ) {\n if ( iFormat[ objIndex.date.original ] === 'U' ) {\n return new Date( +mList[ objIndex.date.match + 1 ] * 1000 );\n }\n\n var dList = mList[ objIndex.date.match + 1 ].match( /\\w{3}, (\\d{1,2}) (\\w{3}) (\\d{4}) (\\d{2}):(\\d{2}):(\\d{2}) ([+\\-]\\d{4})/ );\n hour = +dList[ 4 ] + ( +dList[ 7 ].slice( 0 , 3 ) );\n min = +dList[ 5 ] + ( dList[ 7 ].slice( 0 , 1 ) + dList[ 7 ].slice( 3 ) ) / 100 * 60;\n\n return new Date( dList[ 3 ] , this._iMonth( dList[ 2 ] ) , dList[ 1 ] , hour , min , dList[ 6 ] );\n }\n\n var _d = new Date( );\n var year;\n var month;\n var day;\n var sec;\n var msec;\n var gmt;\n\n if ( !_validDate && !_noDate ) { return ; }\n\n if ( _validDate ) {\n if ( _haveYear ) {\n var _y = _d.getFullYear( ) - 50 + '';\n year = mList[ objIndex.year.match + 1 ];\n if ( iFormat[ objIndex.year.original ] === 'y' ) {\n year = +_y.slice( 0 , 2 ) + ( year >= ( _y ).slice( 2 ) ? 0 : 1 ) + year;\n }\n } else {\n year = _d.getFullYear();\n }\n\n if ( _haveYDay ) {\n month = 0;\n day = mList[ objIndex.dayY.match + 1 ];\n } else if ( _haveDay ) {\n if ( _haveMonth ) {\n month = this._iMonth( mList[ objIndex.month.match + 1 ] );\n } else {\n month = _d.getMonth( );\n }\n\n day = mList[ objIndex.day.match + 1 ];\n } else {\n month = 0;\n\n var week;\n if ( _haveWeek ) {\n week = mList[ objIndex.week.match + 1 ];\n } else {\n week = this.get( 'W' , _d );\n }\n\n day = ( week - 2 ) * 7 + ( 8 - ( ( new Date( year , 0 , 1 ) ).getDay( ) || 7 ) ) + this._iWeek( mList[ objIndex.week.match + 1 ] );\n }\n\n if ( month === 0 && day > 31 ) {\n var aux = new Date( year , month , day );\n month = aux.getMonth( );\n day = aux.getDate( );\n }\n }\n else {\n year = _d.getFullYear( );\n month = _d.getMonth( );\n day = _d.getDate( );\n }\n\n if ( _haveHour12 ) { hour = +mList[ objIndex.hourD.match + 1 ] + ( mList[ objIndex.ampm.match + 1 ] === 'pm' ? 12 : 0 ); }\n else if ( _haveHour24 ) { hour = mList[ objIndex.hour.match + 1 ]; }\n else if ( _noDate ) { hour = _d.getHours( ); }\n else { hour = '00'; }\n\n if ( _haveMin ) { min = mList[ objIndex.min.match + 1 ]; }\n else if ( !_haveMoreM ) { min = _d.getMinutes( ); }\n else { min = '00'; }\n\n if ( _haveSec ) { sec = mList[ objIndex.sec.match + 1 ]; }\n else if ( !_haveMoreS ) { sec = _d.getSeconds( ); }\n else { sec = '00'; }\n\n if ( _haveMSec ) { msec = mList[ objIndex.msec.match + 1 ]; }\n else { msec = '000'; }\n\n if ( _haveDiffH ) { gmt = mList[ objIndex.diffH.match + 1 ]; }\n else if ( _haveDiffM ) { gmt = String( -1 * mList[ objIndex.diffM.match + 1 ] / 60 * 100 ).replace( /^(\\d)/ , '+$1' ).replace( /(^[\\-+])(\\d{3}$)/ , '$10$2' ); }\n else { gmt = '+0000'; }\n\n return new Date( year, month, day, hour, min, sec );\n }\n };\n\n\n return InkDate;\n\n});\n","/**\n * Dump/Profiling Utilities\n * @module Ink.Util.Dumper_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Dumper', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Dumper_1 \n */\n\n var Dumper = {\n\n /**\n * Hex code for the 'tab'\n * \n * @property _tab\n * @type {String}\n * @private\n * @readOnly\n * @static\n *\n */\n _tab: '\\xA0\\xA0\\xA0\\xA0',\n\n /**\n * Function that returns the argument passed formatted\n *\n * @method _formatParam\n * @param {Mixed} param The thing to format.\n * @return {String} The argument passed formatted\n * @private\n * @static\n */\n _formatParam: function(param)\n {\n var formated = '';\n\n switch(typeof(param)) {\n case 'string':\n formated = '(string) '+param;\n break;\n case 'number':\n formated = '(number) '+param;\n break;\n case 'boolean':\n formated = '(boolean) '+param;\n break;\n case 'object':\n if(param !== null) {\n if(param.constructor === Array) {\n formated = 'Array \\n{\\n' + this._outputFormat(param, 0) + '\\n}';\n } else {\n formated = 'Object \\n{\\n' + this._outputFormat(param, 0) + '\\n}';\n }\n } else {\n formated = 'null';\n }\n break;\n default:\n formated = false;\n }\n\n return formated;\n },\n\n /**\n * Function that returns the tabs concatenated\n *\n * @method _getTabs\n * @param {Number} numberOfTabs Number of Tabs\n * @return {String} Tabs concatenated\n * @private\n * @static\n */\n _getTabs: function(numberOfTabs)\n {\n var tabs = '';\n for(var _i = 0; _i < numberOfTabs; _i++) {\n tabs += this._tab;\n }\n return tabs;\n },\n\n /**\n * Function that formats the parameter to display.\n *\n * @method _outputFormat\n * @param {Mixed} param The thing to format.\n * @param {Number} indent Indentation level.\n * @return {String} The parameter passed formatted to displat\n * @private\n * @static\n */\n _outputFormat: function(param, indent)\n {\n var formated = '';\n //var _strVal = false;\n var _typeof = false;\n for(var key in param) {\n if(param[key] !== null) {\n if(typeof(param[key]) === 'object' && (param[key].constructor === Array || param[key].constructor === Object)) {\n if(param[key].constructor === Array) {\n _typeof = 'Array';\n } else if(param[key].constructor === Object) {\n _typeof = 'Object';\n }\n formated += this._tab + this._getTabs(indent) + '[' + key + '] => '+_typeof+'\\n';\n formated += this._tab + this._getTabs(indent) + '{\\n';\n formated += this._outputFormat(param[key], indent + 1) + this._tab + this._getTabs(indent) + '}\\n';\n } else if(param[key].constructor === Function) {\n continue;\n } else {\n formated = formated + this._tab + this._getTabs(indent) + '[' + key + '] => ' + param[key] + '\\n';\n }\n } else {\n formated = formated + this._tab + this._getTabs(indent) + '[' + key + '] => null \\n';\n }\n }\n return formated;\n },\n\n /**\n * Prints variable structure.\n *\n * @method printDump\n * @param {Mixed} param Variable to be dumped.\n * @param {DOMElement|String} [target] Element to print the dump on.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Dumper_printDump.html \n */\n printDump: function(param, target)\n {\n /*jshint evil:true */\n if(!target || typeof(target) === 'undefined') {\n document.write('
              '+this._formatParam(param)+'
              ');\n } else {\n if(typeof(target) === 'string') {\n document.getElementById(target).innerHTML = '
              ' + this._formatParam(param) + '
              ';\n } else if(typeof(target) === 'object') {\n target.innerHTML = '
              '+this._formatParam(param)+'
              ';\n } else {\n throw \"TARGET must be an element or an element ID\";\n }\n }\n },\n\n /**\n * Get a variable's structure.\n *\n * @method returnDump\n * @param {Mixed} param Variable to get the structure.\n * @return {String} The variable's structure.\n * @public\n * @static\n * @sample Ink_Util_Dumper_returnDump.html \n */\n returnDump: function(param)\n {\n return this._formatParam(param);\n },\n\n /**\n * Alert a variable's structure.\n *\n * @method alertDump\n * @param {Mixed} param Variable to be dumped.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Dumper_alertDump.html \n */\n alertDump: function(param)\n {\n window.alert(this._formatParam(param).replace(/()(Array|Object)(<\\/b>)/g, \"$2\"));\n },\n\n /**\n * Prints the variable structure to a new window.\n *\n * @method windowDump\n * @param {Mixed} param Variable to be dumped.\n * @return {void}\n * @public\n * @static\n * @sample Ink_Util_Dumper_windowDump.html \n */\n windowDump: function(param)\n {\n var dumperwindow = 'dumperwindow_'+(Math.random() * 10000);\n var win = window.open('',\n dumperwindow,\n 'width=400,height=300,left=50,top=50,status,menubar,scrollbars,resizable'\n );\n win.document.open();\n win.document.write('
              '+this._formatParam(param)+'
              ');\n win.document.close();\n win.focus();\n }\n\n };\n\n return Dumper;\n\n});\n","/**\n * Internationalization Utilities \n * @module Ink.Util.I18n_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.I18n', '1', [], function () {\n 'use strict';\n\n var pattrText = /\\{(?:(\\{.*?})|(?:%s:)?(\\d+)|(?:%s)?|([\\w-]+))}/g;\n\n var funcOrVal = function( ret , args ) {\n if ( typeof ret === 'function' ) {\n return ret.apply(this, args);\n } else if (typeof ret !== undefined) {\n return ret;\n } else {\n return '';\n }\n };\n\n /**\n * You can use this module to internationalize your applications. It roughly emulates GNU gettext's API.\n *\n * @class Ink.Util.I18n\n * @constructor\n *\n * @param {Object} dict Object mapping language codes (in the form of `pt_PT`, `pt_BR`, `fr`, `en_US`, etc.) to their `dictionaries`\n * @param {String} [lang='pt_PT'] language code of the target language\n * @param {Boolean} [testMode=false] Sets the test mode (see `testMode()`) on construction.\n *\n * @sample Ink_Util_I18n_1.html\n */\n var I18n = function( dict , lang , testMode ) {\n if ( !( this instanceof I18n ) ) { return new I18n( dict , lang , testMode ); }\n\n this.reset( )\n .lang( lang )\n .testMode( testMode )\n .append( dict || { } , lang );\n };\n\n I18n.prototype = {\n reset: function( ) {\n this._dicts = [ ];\n this._dict = { };\n this._testMode = false;\n this._lang = this._gLang;\n\n return this;\n },\n /**\n * Adds translation strings for the helper to use.\n *\n * @method append\n * @param {Object} dict Object containing language objects identified by their language code\n * @return {I18n} (itself)\n *\n * @sample Ink_Util_I18n_1_append.html\n */\n append: function( dict ) {\n this._dicts.push( dict );\n\n this._dict = Ink.extendObj(this._dict , dict[ this._lang ] );\n\n return this;\n },\n /**\n * Gets or sets the language.\n * If there are more dictionaries available in cache, they will be loaded.\n *\n * @method lang\n * @param {String} [lang] Language code to set this instance to. Omit this argument if you want to get the language code instead.\n * @return {String|I18n} The language code, if called without arguments, or this I18n instance if called with an argument.\n */\n lang: function( lang ) {\n if ( !arguments.length ) { return this._lang; }\n\n if ( lang && this._lang !== lang ) {\n this._lang = lang;\n\n this._dict = { };\n\n for ( var i = 0, l = this._dicts.length; i < l; i++ ) {\n this._dict = Ink.extendObj( this._dict , this._dicts[ i ][ lang ] || { } );\n }\n }\n\n return this;\n },\n /**\n * Sets or unsets test mode.\n * In test mode, unknown strings are wrapped in `[ ... ]`. This is useful for debugging your application and to make sure all your translation keys are in place.\n *\n * @method testMode\n * @param {Boolean} [newTestMode] Flag to set the test mode state. Omit this argument to *get* the current testMode instead.\n * @return {String|I18n} The current testMode, if called without arguments, or this I18n instance if called with an argument.\n *\n */\n testMode: function( newTestMode ) {\n if ( !arguments.length ) { return !!this._testMode; }\n\n if ( newTestMode !== undefined ) { this._testMode = !!newTestMode; }\n\n return this;\n },\n\n /**\n * Gest a key from the current dictionary\n *\n * @method getKey\n * @param {String} key Key you wish to get from the dictionary.\n * @return {Mixed} The object which happened to be in the current language dictionary on the given key.\n *\n * @sample Ink_Util_I18n_1_getKey.html\n */\n getKey: function( key ) {\n var ret;\n var gLang = this._gLang;\n var lang = this._lang;\n \n if ( key in this._dict ) {\n ret = this._dict[ key ];\n } else {\n I18n.langGlobal( lang );\n \n ret = this._gDict[ key ];\n \n I18n.langGlobal( gLang );\n }\n \n return ret;\n },\n\n /**\n * Translates a string.\n * Given a translation key, return a translated string, with replaced parameters.\n * When a translated string is not available, the original string is returned unchanged.\n *\n * @method text\n * @param {String} str Key to look for in i18n dictionary (which is returned verbatim if unknown)\n * @param {Object} [namedParms] Named replacements. Replaces {named} with values in this object.\n * @param {String} [args] Replacement #1 (replaces first {} and all {1})\n * @param {String} [arg2] Replacement #2 (replaces second {} and all {2})\n * @param {String} [argn...] Replacement #n (replaces nth {} and all {n})\n *\n * @return {String} Translated string.\n *\n * @sample Ink_Util_I18n_1_text.html\n */\n text: function( str /*, replacements...*/ ) {\n if ( typeof str !== 'string' ) { return; } // Backwards-compat\n\n var pars = Array.prototype.slice.call( arguments , 1 );\n var idx = 0;\n var isObj = typeof pars[ 0 ] === 'object';\n\n var original = this.getKey( str );\n if ( original === undefined ) { original = this._testMode ? '[' + str + ']' : str; }\n if ( typeof original === 'number' ) { original += ''; }\n\n if (typeof original === 'string') {\n original = original.replace( pattrText , function( m , $1 , $2 , $3 ) {\n var ret =\n $1 ? $1 :\n $2 ? pars[ $2 - ( isObj ? 0 : 1 ) ] :\n $3 ? pars[ 0 ][ $3 ] || '' :\n pars[ (idx++) + ( isObj ? 1 : 0 ) ];\n return funcOrVal( ret , [idx].concat(pars) );\n });\n return original;\n }\n \n return (\n typeof original === 'function' ? original.apply( this , pars ) :\n original instanceof Array ? funcOrVal( original[ pars[ 0 ] ] , pars ) :\n typeof original === 'object' ? funcOrVal( original[ pars[ 0 ] ] , pars ) :\n '');\n },\n\n /**\n * Translates and pluralizes text.\n * Given a singular string, a plural string and a number, translates either the singular or plural string.\n *\n * @method ntext\n *\n * @param {String} strSin Word to use when count is 1\n * @param {String} strPlur Word to use otherwise\n * @param {Number} count Number which defines which word to use\n * @param {Mixed} [args...] Extra arguments, to be passed to `text()`\n *\n * @return {String} Pluralized text string.\n *\n * @sample Ink_Util_I18n_1_ntext.html\n */\n ntext: function( strSin , strPlur , count ) {\n var pars = Array.prototype.slice.apply( arguments );\n var original;\n\n if ( pars.length === 2 && typeof strPlur === 'number' ) {\n original = this.getKey( strSin );\n if ( !( original instanceof Array ) ) { return ''; }\n\n pars.splice( 0 , 1 );\n original = original[ strPlur === 1 ? 0 : 1 ];\n } else {\n pars.splice( 0 , 2 );\n original = count === 1 ? strSin : strPlur;\n }\n\n return this.text.apply( this , [ original ].concat( pars ) );\n },\n\n /**\n * Gets the ordinal suffix of a number.\n *\n * This works by using transforms (in the form of Objects or Functions) passed into the function or found in the special key `_ordinals` in the active language dictionary.\n *\n * @method ordinal\n *\n * @param {Number} num Input number\n * @param {Object|Function} [options]={} Dictionaries for translating. Each of these options' fallback is found in the current language's dictionary. The lookup order is the following: `exceptions`, `byLastDigit`, `default`. Each of these may be either an `Object` or a `Function`. If it's a function, it is called (with `number` and `digit` for any function except for byLastDigit, which is called with the `lastDigit` of the number in question), and if the function returns a string, that is used. If it's an object, the property is looked up using `obj[prop]`. If what is found is a string, it is used directly.\n * @param {Object|Function} [options.byLastDigit]={} If the language requires the last digit to be considered, mappings of last digits to ordinal suffixes can be created here.\n * @param {Object|Function} [options.exceptions]={} Map unique, special cases to their ordinal suffixes.\n *\n * @returns {String} Ordinal suffix for `num`.\n *\n * @sample Ink_Util_I18n_1_ordinal.html\n **/\n ordinal: function( num ) {\n if ( num === undefined ) { return ''; }\n\n var lastDig = +num.toString( ).slice( -1 );\n\n var ordDict = this.getKey( '_ordinals' );\n if ( ordDict === undefined ) { return ''; }\n\n if ( typeof ordDict === 'string' ) { return ordDict; }\n\n var ret;\n\n if ( typeof ordDict === 'function' ) {\n ret = ordDict( num , lastDig );\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n if ( 'exceptions' in ordDict ) {\n ret = typeof ordDict.exceptions === 'function' ? ordDict.exceptions( num , lastDig ) :\n num in ordDict.exceptions ? funcOrVal( ordDict.exceptions[ num ] , [num , lastDig] ) :\n undefined;\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n if ( 'byLastDigit' in ordDict ) {\n ret = typeof ordDict.byLastDigit === 'function' ? ordDict.byLastDigit( lastDig , num ) :\n lastDig in ordDict.byLastDigit ? funcOrVal( ordDict.byLastDigit[ lastDig ] , [lastDig , num] ) :\n undefined;\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n if ( 'default' in ordDict ) {\n ret = funcOrVal( ordDict['default'] , [ num , lastDig ] );\n\n if ( typeof ret === 'string' ) { return ret; }\n }\n\n return '';\n },\n\n /**\n * Create an alias.\n *\n * Returns an alias to this I18n instance. It contains the I18n methods documented here, but is also a function. If you call it, it just calls `text()`. This is commonly assigned to \"_\".\n *\n * @method alias\n * @returns {Function} an alias to `text()` on this instance. You can also access the rest of the translation API through this alias.\n *\n * @sample Ink_Util_I18n_1_alias.html\n */\n alias: function( ) {\n var ret = Ink.bind( I18n.prototype.text , this );\n ret.ntext = Ink.bind( I18n.prototype.ntext , this );\n ret.append = Ink.bind( I18n.prototype.append , this );\n ret.ordinal = Ink.bind( I18n.prototype.ordinal , this );\n ret.testMode = Ink.bind( I18n.prototype.testMode , this );\n\n return ret;\n }\n };\n\n /**\n * Resets I18n global state (global dictionaries, and default language for instances)\n *\n * @method reset\n * @return {void}\n * @static\n *\n **/\n I18n.reset = function( ) {\n I18n.prototype._gDicts = [ ];\n I18n.prototype._gDict = { };\n I18n.prototype._gLang = 'pt_PT';\n };\n I18n.reset( );\n\n /**\n * Adds a dictionary to be used in all I18n instances for the corresponding language.\n *\n * @method appendGlobal\n * @static\n *\n * @param {Object} dict Dictionary to be added\n * @param {String} lang Language fo the dictionary being added\n * @return {void}\n *\n */\n I18n.appendGlobal = function( dict , lang ) {\n if ( lang ) {\n if ( !( lang in dict ) ) {\n var obj = { };\n\n obj[ lang ] = dict;\n\n dict = obj;\n }\n\n if ( lang !== I18n.prototype._gLang ) { I18n.langGlobal( lang ); }\n }\n\n I18n.prototype._gDicts.push( dict );\n\n Ink.extendObj( I18n.prototype._gDict , dict[ I18n.prototype._gLang ] );\n };\n\n /**\n * Gets or sets the current default language of I18n instances.\n *\n * @method langGlobal\n * @param {String} [lang] the new language for all I18n instances. Omit this argument if you wish to *get* the current default language instead.\n *\n * @static\n *\n * @return {String} language code, or nothing if not used as a setter.\n */\n I18n.langGlobal = function( lang ) {\n if ( !arguments.length ) { return I18n.prototype._gLang; }\n\n if ( lang && I18n.prototype._gLang !== lang ) {\n I18n.prototype._gLang = lang;\n\n I18n.prototype._gDict = { };\n\n for ( var i = 0, l = I18n.prototype._gDicts.length; i < l; i++ ) {\n Ink.extendObj( I18n.prototype._gDict , I18n.prototype._gDicts[ i ][ lang ] || { } );\n }\n }\n };\n\n return I18n;\n});","/**\n * JSON Utilities\n * @module Ink.Util.Json_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Json', '1', [], function() {\n 'use strict';\n\n var function_call = Function.prototype.call;\n var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n\n function twoDigits(n) {\n var r = '' + n;\n if (r.length === 1) {\n return '0' + r;\n } else {\n return r;\n }\n }\n\n var dateToISOString = Date.prototype.toISOString ?\n Ink.bind(function_call, Date.prototype.toISOString) :\n function(date) {\n // Adapted from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString\n return date.getUTCFullYear() +\n '-' + twoDigits( date.getUTCMonth() + 1 ) +\n '-' + twoDigits( date.getUTCDate() ) +\n 'T' + twoDigits( date.getUTCHours() ) +\n ':' + twoDigits( date.getUTCMinutes() ) +\n ':' + twoDigits( date.getUTCSeconds() ) +\n '.' + String( (date.getUTCMilliseconds()/1000).toFixed(3) ).slice( 2, 5 ) +\n 'Z';\n };\n\n /**\n * Use this class to convert JSON strings to JavaScript objects\n * `.parse()` and also to do the opposite operation `.stringify()`.\n * Internally, the standard JSON implementation is used if available\n * Otherwise, the functions mimic the standard implementation.\n *\n * Here's how to produce JSON from an existing object:\n * \n * Ink.requireModules(['Ink.Util.Json_1'], function (Json) {\n * var obj = {\n * key1: 'value1',\n * key2: 'value2',\n * keyArray: ['arrayValue1', 'arrayValue2', 'arrayValue3']\n * };\n * Json.stringify(obj); // The above object as a JSON string\n * });\n *\n * And here is how to parse JSON:\n *\n * Ink.requireModules(['Ink.Util.Json_1'], function (Json) {\n * var source = '{\"key\": \"value\", \"array\": [true, null, false]}';\n * Json.parse(source); // The above JSON string as an object\n * });\n *\n * @namespace Ink.Util.Json_1 \n * @static\n * \n */\n var InkJson = {\n _nativeJSON: window.JSON || null,\n\n _convertToUnicode: false,\n\n // Escape characters so as to embed them in JSON strings\n _escape: function (theString) {\n var _m = { '\\b': '\\\\b', '\\t': '\\\\t', '\\n': '\\\\n', '\\f': '\\\\f', '\\r': '\\\\r', '\"': '\\\\\"', '\\\\': '\\\\\\\\' };\n\n if (/[\"\\\\\\x00-\\x1f]/.test(theString)) {\n theString = theString.replace(/([\\x00-\\x1f\\\\\"])/g, function(a, b) {\n var c = _m[b];\n if (c) {\n return c;\n }\n c = b.charCodeAt();\n return '\\\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16);\n });\n }\n\n return theString;\n },\n\n // A character conversion map\n _toUnicode: function (theString)\n {\n if(!this._convertToUnicode) {\n return this._escape(theString);\n } else {\n var unicodeString = '';\n var inInt = false;\n var theUnicode = false;\n var i = 0;\n var total = theString.length;\n while(i < total) {\n inInt = theString.charCodeAt(i);\n if( (inInt >= 32 && inInt <= 126) ||\n //(inInt >= 48 && inInt <= 57) ||\n //(inInt >= 65 && inInt <= 90) ||\n //(inInt >= 97 && inInt <= 122) ||\n inInt === 8 ||\n inInt === 9 ||\n inInt === 10 ||\n inInt === 12 ||\n inInt === 13 ||\n inInt === 32 ||\n inInt === 34 ||\n inInt === 47 ||\n inInt === 58 ||\n inInt === 92) {\n\n if(inInt === 34 || inInt === 92 || inInt === 47) {\n theUnicode = '\\\\'+theString.charAt(i);\n } else if(inInt === 8) {\n theUnicode = '\\\\b';\n } else if(inInt === 9) {\n theUnicode = '\\\\t';\n } else if(inInt === 10) {\n theUnicode = '\\\\n';\n } else if(inInt === 12) {\n theUnicode = '\\\\f';\n } else if(inInt === 13) {\n theUnicode = '\\\\r';\n } else {\n theUnicode = theString.charAt(i);\n }\n } else {\n if(this._convertToUnicode) {\n theUnicode = theString.charCodeAt(i).toString(16)+''.toUpperCase();\n while (theUnicode.length < 4) {\n theUnicode = '0' + theUnicode;\n }\n theUnicode = '\\\\u' + theUnicode;\n } else {\n theUnicode = theString.charAt(i);\n }\n }\n unicodeString += theUnicode;\n\n i++;\n }\n\n return unicodeString;\n }\n\n },\n\n _stringifyValue: function(param) {\n if (typeof param === 'string') {\n return '\"' + this._toUnicode(param) + '\"';\n } else if (typeof param === 'number' && (isNaN(param) || !isFinite(param))) { // Unusable numbers go null\n return 'null';\n } else if (typeof param === 'undefined' || param === null) { // And so does undefined\n return 'null';\n } else if (typeof param.toJSON === 'function') {\n var t = param.toJSON();\n if (typeof t === 'string') {\n return '\"' + this._escape(t) + '\"';\n } else {\n return this._escape(t.toString());\n }\n } else if (typeof param === 'number' || typeof param === 'boolean') { // These ones' toString methods return valid JSON.\n return '' + param;\n } else if (typeof param === 'function') {\n return 'null'; // match JSON.stringify\n } else if (param.constructor === Date) {\n return '\"' + this._escape(dateToISOString(param)) + '\"';\n } else if (param.constructor === Array) {\n var arrayString = '';\n for (var i = 0, len = param.length; i < len; i++) {\n if (i > 0) {\n arrayString += ',';\n }\n arrayString += this._stringifyValue(param[i]);\n }\n return '[' + arrayString + ']';\n } else { // Object\n var objectString = '';\n for (var k in param) {\n if ({}.hasOwnProperty.call(param, k)) {\n if (objectString !== '') {\n objectString += ',';\n }\n objectString += '\"' + this._escape(k) + '\": ' + this._stringifyValue(param[k]);\n }\n }\n return '{' + objectString + '}';\n }\n },\n\n /**\n * Serializes a JSON object into a string.\n *\n * @method stringify\n * @param {Object} input Data to be serialized into JSON\n * @param {Boolean} convertToUnicode When `true`, converts string contents to unicode \\uXXXX\n * @return {String} Serialized string\n *\n * @sample Ink_Util_Json_stringify.html \n */\n stringify: function(input, convertToUnicode) {\n this._convertToUnicode = !!convertToUnicode;\n if(!this._convertToUnicode && this._nativeJSON) {\n return this._nativeJSON.stringify(input);\n }\n return this._stringifyValue(input); // And recurse.\n },\n \n /**\n * Parses a JSON text through a function\n * \n * @method parse\n * @param text {String} Input string\n * @param reviver {Function} Function receiving `(key, value)`, and `this`=(containing object), used to walk objects.\n * \n * @return {Object} JSON object\n *\n * @sample Ink_Util_Json_parse.html \n */\n /* From https://github.com/douglascrockford/JSON-js/blob/master/json.js */\n parse: function (text, reviver) {\n /*jshint evil:true*/\n\n// The parse method takes a text and an optional reviver function, and returns\n// a JavaScript value if the text is a valid JSON text.\n\n var j;\n\n function walk(holder, key) {\n\n// The walk method is used to recursively walk the resulting structure so\n// that modifications can be made.\n\n var k, v, value = holder[key];\n if (value && typeof value === 'object') {\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = walk(value, k);\n if (v !== undefined) {\n value[k] = v;\n } else {\n delete value[k];\n }\n }\n }\n }\n return reviver.call(holder, key, value);\n }\n\n\n// Parsing happens in four stages. In the first stage, we replace certain\n// Unicode characters with escape sequences. JavaScript handles many characters\n// incorrectly, either silently deleting them, or treating them as line endings.\n\n text = String(text);\n cx.lastIndex = 0;\n if (cx.test(text)) {\n text = text.replace(cx, function (a) {\n return '\\\\u' +\n ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n });\n }\n\n// In the second stage, we run the text against regular expressions that look\n// for non-JSON patterns. We are especially concerned with '()' and 'new'\n// because they can cause invocation, and '=' because it can cause mutation.\n// But just to be safe, we want to reject all unexpected forms.\n\n// We split the second stage into 4 regexp operations in order to work around\n// crippling inefficiencies in IE's and Safari's regexp engines. First we\n// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we\n// replace all simple value tokens with ']' characters. Third, we delete all\n// open brackets that follow a colon or comma or that begin the text. Finally,\n// we look to see that the remaining characters are only whitespace or ']' or\n// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.\n\n if (/^[\\],:{}\\s]*$/\n .test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')\n .replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']')\n .replace(/(?:^|:|,)(?:\\s*\\[)+/g, ''))) {\n\n// In the third stage we use the eval function to compile the text into a\n// JavaScript structure. The '{' operator is subject to a syntactic ambiguity\n// in JavaScript: it can begin a block or an object literal. We wrap the text\n// in parens to eliminate the ambiguity.\n\n j = eval('(' + text + ')');\n\n// In the optional fourth stage, we recursively walk the new structure, passing\n// each name/value pair to a reviver function for possible transformation.\n\n return typeof reviver === 'function' ?\n walk({'': j}, '') :\n j;\n }\n\n// If the text is not JSON parseable, then a SyntaxError is thrown.\n\n throw new SyntaxError('JSON.parse');\n }\n };\n\n return InkJson;\n});\n","/**\n * String Utilities\n * @module Ink.Util.String_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.String', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.String_1 \n */\n var InkUtilString = {\n\n /**\n * List of special chars\n * \n * @property _chars\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _chars: ['&','à','á','â','ã','ä','å','æ','ç','è','é',\n 'ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô',\n 'õ','ö','ø','ù','ú','û','ü','ý','þ','ÿ','À',\n 'Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë',\n 'Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö',\n 'Ø','Ù','Ú','Û','Ü','Ý','Þ','€','\\\"','ß','<',\n '>','¢','£','¤','¥','¦','§','¨','©','ª','«',\n '¬','\\xad','®','¯','°','±','²','³','´','µ','¶',\n '·','¸','¹','º','»','¼','½','¾'],\n\n /**\n * List of the special characters' html entities\n * \n * @property _entities\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _entities: ['amp','agrave','aacute','acirc','atilde','auml','aring',\n 'aelig','ccedil','egrave','eacute','ecirc','euml','igrave',\n 'iacute','icirc','iuml','eth','ntilde','ograve','oacute',\n 'ocirc','otilde','ouml','oslash','ugrave','uacute','ucirc',\n 'uuml','yacute','thorn','yuml','Agrave','Aacute','Acirc',\n 'Atilde','Auml','Aring','AElig','Ccedil','Egrave','Eacute',\n 'Ecirc','Euml','Igrave','Iacute','Icirc','Iuml','ETH','Ntilde',\n 'Ograve','Oacute','Ocirc','Otilde','Ouml','Oslash','Ugrave',\n 'Uacute','Ucirc','Uuml','Yacute','THORN','euro','quot','szlig',\n 'lt','gt','cent','pound','curren','yen','brvbar','sect','uml',\n 'copy','ordf','laquo','not','shy','reg','macr','deg','plusmn',\n 'sup2','sup3','acute','micro','para','middot','cedil','sup1',\n 'ordm','raquo','frac14','frac12','frac34'],\n\n /**\n * List of accented chars\n * \n * @property _accentedChars\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _accentedChars:['à','á','â','ã','ä','å',\n 'è','é','ê','ë',\n 'ì','í','î','ï',\n 'ò','ó','ô','õ','ö',\n 'ù','ú','û','ü',\n 'ç','ñ',\n 'À','Á','Â','Ã','Ä','Å',\n 'È','É','Ê','Ë',\n 'Ì','Í','Î','Ï',\n 'Ò','Ó','Ô','Õ','Ö',\n 'Ù','Ú','Û','Ü',\n 'Ç','Ñ'],\n\n /**\n * List of the accented chars (above), but without the accents\n * \n * @property _accentedRemovedChars\n * @type {Array}\n * @private\n * @readOnly\n * @static\n */\n _accentedRemovedChars:['a','a','a','a','a','a',\n 'e','e','e','e',\n 'i','i','i','i',\n 'o','o','o','o','o',\n 'u','u','u','u',\n 'c','n',\n 'A','A','A','A','A','A',\n 'E','E','E','E',\n 'I','I','I','I',\n 'O','O','O','O','O',\n 'U','U','U','U',\n 'C','N'],\n /**\n * Object that contains the basic HTML unsafe chars, as keys, and their HTML entities as values\n * \n * @property _htmlUnsafeChars\n * @type {Object}\n * @private\n * @readOnly\n * @static\n */\n _htmlUnsafeChars:{'<':'<','>':'>','&':'&','\"':'"',\"'\":'''},\n\n /**\n * Capitalizes a word.\n * If param as more than one word, it converts first letter of all words that have more than 2 letters\n *\n * @method ucFirst\n * @param {String} string String to capitalize.\n * @param {Boolean} [firstWordOnly]=false Flag to capitalize only the first word.\n * @return {String} Camel cased string.\n * @public\n * @static\n * @sample Ink_Util_String_ucFirst.html \n */\n ucFirst: function(string, firstWordOnly) {\n var replacer = firstWordOnly ? /(^|\\s)(\\w)(\\S{2,})/ : /(^|\\s)(\\w)(\\S{2,})/g;\n return string ? String(string).replace(replacer, function(_, $1, $2, $3){\n return $1 + $2.toUpperCase() + $3.toLowerCase();\n }) : string;\n },\n\n /**\n * Trims whitespace from strings\n *\n * @method trim\n * @param {String} string String to be trimmed\n * @return {String} Trimmed string\n * @public\n * @static\n * @sample Ink_Util_String_trim.html \n */\n trim: function(string)\n {\n if (typeof string === 'string') {\n return string.replace(/^\\s+|\\s+$|\\n+$/g, '');\n }\n return string;\n },\n\n /**\n * Strips HTML tags from strings\n *\n * @method stripTags\n * @param {String} string String to strip tags from.\n * @param {String} allowed Comma separated list of allowed tags.\n * @return {String} Stripped string\n * @public\n * @static\n * @sample Ink_Util_String_stripTags.html \n */\n stripTags: function(string, allowed)\n {\n if (allowed && typeof allowed === 'string') {\n var aAllowed = InkUtilString.trim(allowed).split(',');\n var aNewAllowed = [];\n var cleanedTag = false;\n for(var i=0; i < aAllowed.length; i++) {\n if(InkUtilString.trim(aAllowed[i]) !== '') {\n cleanedTag = InkUtilString.trim(aAllowed[i].replace(/(<|\\>)/g, '').replace(/\\s/, ''));\n aNewAllowed.push('(<'+cleanedTag+'\\\\s[^>]+>|<(\\\\s|\\\\/)?(\\\\s|\\\\/)?'+cleanedTag+'>)');\n }\n }\n var strAllowed = aNewAllowed.join('|');\n var reAllowed = new RegExp(strAllowed, \"i\");\n\n var aFoundTags = string.match(new RegExp(\"<[^>]*>\", \"g\"));\n\n for(var j=0; j < aFoundTags.length; j++) {\n if(!aFoundTags[j].match(reAllowed)) {\n string = string.replace((new RegExp(aFoundTags[j], \"gm\")), '');\n }\n }\n return string;\n } else {\n return string.replace(/<[^\\>]+\\>/g, '');\n }\n },\n\n /**\n * Encodes string into HTML entities.\n *\n * @method htmlEntitiesEncode\n * @param {String} string Input string.\n * @return {String} HTML encoded string.\n * @public\n * @static\n * @sample Ink_Util_String_htmlEntitiesEncode.html \n */\n htmlEntitiesEncode: function(string)\n {\n if (string && string.replace) {\n var re = false;\n for (var i = 0; i < InkUtilString._chars.length; i++) {\n re = new RegExp(InkUtilString._chars[i], \"gm\");\n string = string.replace(re, '&' + InkUtilString._entities[i] + ';');\n }\n }\n return string;\n },\n\n /**\n * Decodes string from HTML entities.\n *\n * @method htmlEntitiesDecode\n * @param {String} string String to be decoded\n * @return {String} Decoded string\n * @public\n * @static\n * @sample Ink_Util_String_htmlEntitiesDecode.html \n */\n htmlEntitiesDecode: function(string)\n {\n if (string && string.replace) {\n var re = false;\n for (var i = 0; i < InkUtilString._entities.length; i++) {\n re = new RegExp(\"&\"+InkUtilString._entities[i]+\";\", \"gm\");\n string = string.replace(re, InkUtilString._chars[i]);\n }\n string = string.replace(/&#[^;]+;?/g, function($0){\n if ($0.charAt(2) === 'x') {\n return String.fromCharCode(parseInt($0.substring(3), 16));\n }\n else {\n return String.fromCharCode(parseInt($0.substring(2), 10));\n }\n });\n }\n return string;\n },\n\n /**\n * Encode a string to UTF-8.\n *\n * @method utf8Encode\n * @param {String} string String to be encoded\n * @return {String} string UTF-8 encoded string\n * @public\n * @static\n */\n utf8Encode: function(string) {\n /*jshint bitwise:false*/\n string = string.replace(/\\r\\n/g,\"\\n\");\n var utfstring = \"\";\n\n for (var n = 0; n < string.length; n++) {\n\n var c = string.charCodeAt(n);\n\n if (c < 128) {\n utfstring += String.fromCharCode(c);\n }\n else if((c > 127) && (c < 2048)) {\n utfstring += String.fromCharCode((c >> 6) | 192);\n utfstring += String.fromCharCode((c & 63) | 128);\n }\n else {\n utfstring += String.fromCharCode((c >> 12) | 224);\n utfstring += String.fromCharCode(((c >> 6) & 63) | 128);\n utfstring += String.fromCharCode((c & 63) | 128);\n }\n\n }\n return utfstring;\n },\n\n /**\n * Truncates a string without breaking words. Inserts an ellipsis HTML entity at the end of the string if it's too long.\n *\n * @method shortString\n * @param {String} str String to truncate\n * @param {Number} n Number of chars of the short string\n * @return {String} Truncated string, or the original `str` if it's shorter than `n`\n * @public\n * @static\n * @sample Ink_Util_String_shortString.html \n */\n shortString: function(str,n) {\n var words = str.split(' ');\n var resultstr = '';\n for(var i = 0; i < words.length; i++ ){\n if((resultstr + words[i] + ' ').length>=n){\n resultstr += '…';\n break;\n }\n resultstr += words[i] + ' ';\n }\n return resultstr;\n },\n\n /**\n * Truncates a string, breaking words and adding ... at the end.\n *\n * @method truncateString\n * @param {String} str String to truncate\n * @param {Number} length Limit for the returned string, ellipsis included.\n * @return {String} Truncated String\n * @public\n * @static\n * @sample Ink_Util_String_truncateString.html \n */\n truncateString: function(str, length) {\n if(str.length - 1 > length) {\n return str.substr(0, length - 1) + \"\\u2026\";\n } else {\n return str;\n }\n },\n\n /**\n * Decodes a string from UTF-8.\n *\n * @method utf8Decode\n * @param {String} string String to be decoded\n * @return {String} Decoded string\n * @public\n * @static\n */\n utf8Decode: function(string) {\n /*jshint bitwise:false*/\n var ret = \"\";\n var i = 0, c = 0, c2 = 0, c3 = 0;\n\n while ( i < string.length ) {\n\n c = string.charCodeAt(i);\n\n if (c < 128) {\n ret += String.fromCharCode(c);\n i++;\n }\n else if((c > 191) && (c < 224)) {\n c2 = string.charCodeAt(i+1);\n ret += String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n i += 2;\n }\n else {\n c2 = string.charCodeAt(i+1);\n c3 = string.charCodeAt(i+2);\n ret += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n i += 3;\n }\n\n }\n return ret;\n },\n\n /**\n * Removes all accented characters from a string.\n *\n * @method removeAccentedChars\n * @param {String} string String to remove accents from\n * @return {String} String without accented chars\n * @public\n * @static\n * @sample Ink_Util_String_removeAccentedChars.html \n */\n removeAccentedChars: function(string)\n {\n var newString = string;\n var re = false;\n for (var i = 0; i < InkUtilString._accentedChars.length; i++) {\n re = new RegExp(InkUtilString._accentedChars[i], \"gm\");\n newString = newString.replace(re, '' + InkUtilString._accentedRemovedChars[i] + '');\n }\n return newString;\n },\n\n /**\n * Count the number of occurrences of a specific needle in a haystack\n *\n * @method substrCount\n * @param {String} haystack String to search in\n * @param {String} needle String to search for\n * @return {Number} Number of occurrences\n * @public\n * @static\n * @sample Ink_Util_String_substrCount.html \n */\n substrCount: function(haystack,needle)\n {\n return haystack ? haystack.split(needle).length - 1 : 0;\n },\n\n /**\n * Eval a JSON - We recommend you Ink.Util.Json\n *\n * @method evalJSON\n * @param {String} strJSON JSON string to eval\n * @param {Boolean} sanitize Flag to sanitize input\n * @return {Object} JS Object\n * @public\n * @static\n */\n evalJSON: function(strJSON, sanitize) {\n /* jshint evil:true */\n if( (typeof sanitize === 'undefined' || sanitize === null) || InkUtilString.isJSON(strJSON)) {\n try {\n if(typeof(JSON) !== \"undefined\" && typeof(JSON.parse) !== 'undefined'){\n return JSON.parse(strJSON);\n }\n return eval('('+strJSON+')');\n } catch(e) {\n throw new Error('ERROR: Bad JSON string...');\n }\n }\n },\n\n /**\n * Checks if a string is a valid JSON object (string encoded)\n *\n * @method isJSON\n * @param {String} str String to check\n * @return {Boolean} Return whether it's JSON.\n * @public\n * @static\n */\n isJSON: function(str)\n {\n str = str.replace(/\\\\./g, '@').replace(/\"[^\"\\\\\\n\\r]*\"/g, '');\n return (/^[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t]*$/).test(str);\n },\n\n /**\n * Escapes unsafe html chars as HTML entities\n *\n * @method htmlEscapeUnsafe\n * @param {String} str String to escape\n * @return {String} Escaped string\n * @public\n * @static\n * @sample Ink_Util_String_htmlEscapeUnsafe.html \n */\n htmlEscapeUnsafe: function(str){\n var chars = InkUtilString._htmlUnsafeChars;\n return str !== null ? String(str).replace(/[<>&'\"]/g,function(c){return chars[c];}) : str;\n },\n\n /**\n * Normalizes whitespace in string.\n * String is trimmed and sequences of whitespaces are collapsed.\n *\n * @method normalizeWhitespace\n * @param {String} str String to normalize\n * @return {String} Normalized string\n * @public\n * @static\n * @sample Ink_Util_String_normalizeWhitespace.html \n */\n normalizeWhitespace: function(str){\n return str !== null ? InkUtilString.trim(String(str).replace(/\\s+/g,' ')) : str;\n },\n\n /**\n * Converts string to unicode.\n *\n * @method toUnicode\n * @param {String} str String to convert\n * @return {String} Unicoded String\n * @public\n * @static\n * @sample Ink_Util_String_toUnicode.html \n */\n toUnicode: function(str) {\n if (typeof str === 'string') {\n var unicodeString = '';\n var inInt = false;\n var theUnicode = false;\n var total = str.length;\n var i=0;\n\n while(i < total)\n {\n inInt = str.charCodeAt(i);\n if( (inInt >= 32 && inInt <= 126) ||\n inInt === 8 ||\n inInt === 9 ||\n inInt === 10 ||\n inInt === 12 ||\n inInt === 13 ||\n inInt === 32 ||\n inInt === 34 ||\n inInt === 47 ||\n inInt === 58 ||\n inInt === 92) {\n\n /*\n if(inInt == 34 || inInt == 92 || inInt == 47) {\n theUnicode = '\\\\'+str.charAt(i);\n } else {\n }\n */\n if(inInt === 8) {\n theUnicode = '\\\\b';\n } else if(inInt === 9) {\n theUnicode = '\\\\t';\n } else if(inInt === 10) {\n theUnicode = '\\\\n';\n } else if(inInt === 12) {\n theUnicode = '\\\\f';\n } else if(inInt === 13) {\n theUnicode = '\\\\r';\n } else {\n theUnicode = str.charAt(i);\n }\n } else {\n theUnicode = str.charCodeAt(i).toString(16)+''.toUpperCase();\n while (theUnicode.length < 4) {\n theUnicode = '0' + theUnicode;\n }\n theUnicode = '\\\\u' + theUnicode;\n }\n unicodeString += theUnicode;\n\n i++;\n }\n return unicodeString;\n }\n },\n\n /**\n * Escapes a unicode character.\n *\n * @method escape\n * @param {String} c Character to escape\n * @return {String} Escaped character. Returns \\xXX if hex smaller than 0x100, otherwise \\uXXXX\n * @public\n * @static\n * @sample Ink_Util_String_escape.html \n */\n escape: function(c) {\n var hex = (c).charCodeAt(0).toString(16).split('');\n if (hex.length < 3) {\n while (hex.length < 2) { hex.unshift('0'); }\n hex.unshift('x');\n }\n else {\n while (hex.length < 4) { hex.unshift('0'); }\n hex.unshift('u');\n }\n\n hex.unshift('\\\\');\n return hex.join('');\n },\n\n /**\n * Unescapes a unicode character escape sequence\n *\n * @method unescape\n * @param {String} es Escape sequence\n * @return {String} String un-unicoded\n * @public\n * @static\n * @sample Ink_Util_String_unescape.html \n */\n unescape: function(es) {\n var idx = es.lastIndexOf('0');\n idx = idx === -1 ? 2 : Math.min(idx, 2);\n //console.log(idx);\n var hexNum = es.substring(idx);\n //console.log(hexNum);\n var num = parseInt(hexNum, 16);\n return String.fromCharCode(num);\n },\n\n /**\n * Escapes unicode characters in a string as unicode character entities (`\\x##`, where the `##` are hex digits).\n *\n * @method escapeText\n * @param {String} txt String with characters outside the ASCII printable range (32 < charCode < 127)\n * @param {Array} [whiteList] Whitelist of characters which should NOT be escaped\n * @return {String} String escaped with unicode character entities.\n * @public\n * @static\n * @sample Ink_Util_String_escapeText.html \n */\n escapeText: function(txt, whiteList) {\n if (whiteList === undefined) {\n whiteList = ['[', ']', '\\'', ','];\n }\n var txt2 = [];\n var c, C;\n for (var i = 0, f = txt.length; i < f; ++i) {\n c = txt[i];\n C = c.charCodeAt(0);\n if (C < 32 || C > 126 && whiteList.indexOf(c) === -1) {\n c = InkUtilString.escape(c);\n }\n txt2.push(c);\n }\n return txt2.join('');\n },\n\n /**\n * Regex to check escaped strings\n *\n * @property escapedCharRegex\n * @type {Regex}\n * @public\n * @readOnly\n * @static\n */\n escapedCharRegex: /(\\\\x[0-9a-fA-F]{2})|(\\\\u[0-9a-fA-F]{4})/g,\n\n /**\n * Removes unicode entities (in the format \"\\x##\" or \"\\u####\", where \"#\" is a hexadecimal digit)\n *\n * @method unescapeText\n * @param {String} txt Text you intend to remove unicode character entities.\n * @return {String} Unescaped string\n * @public\n * @static\n * @sample Ink_Util_String_unescapeText.html \n */\n unescapeText: function(txt) {\n /*jshint boss:true */\n var m;\n while (m = InkUtilString.escapedCharRegex.exec(txt)) {\n m = m[0];\n txt = txt.replace(m, InkUtilString.unescape(m));\n InkUtilString.escapedCharRegex.lastIndex = 0;\n }\n return txt;\n },\n\n /**\n * Compares two strings.\n *\n * @method strcmp\n * @param {String} str1 First String\n * @param {String} str2 Second String\n * @return {Number} 0 if given strings are equal, 1 if str1 is greater than str2, and -1 if str2 is greater than str1.\n * @public\n * @static\n * @sample Ink_Util_String_strcmp.html \n */\n strcmp: function(str1, str2) {\n return ((str1 === str2) ? 0 : ((str1 > str2) ? 1 : -1));\n },\n\n /**\n * Splits a string into smaller chunks\n *\n * @method packetize\n * @param {String} str String to divide\n * @param {Number} maxLen Maximum chunk size (in characters)\n * @return {Array} Chunks of the original string\n * @public\n * @static\n * @sample Ink_Util_String_packetize.html \n */\n packetize: function(str, maxLen) {\n var len = str.length;\n var parts = new Array( Math.ceil(len / maxLen) );\n var chars = str.split('');\n var sz, i = 0;\n while (len) {\n sz = Math.min(maxLen, len);\n parts[i++] = chars.splice(0, sz).join('');\n len -= sz;\n }\n return parts;\n }\n };\n\n return InkUtilString;\n\n});\n","/**\n * URL Utilities\n * @module Ink.Util.Url_1\n * @version 1\n */\n\nInk.createModule('Ink.Util.Url', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Url_1\n */\n var Url = {\n\n /**\n * Auxiliary string for encoding\n *\n * @property _keyStr\n * @type {String}\n * @readOnly\n * @private\n */\n _keyStr : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',\n\n\n /**\n * Gets URL of current page\n *\n * @method getUrl\n * @return {String} Current URL\n * @public\n * @static\n * @sample Ink_Util_Url_getUrl.html \n */\n getUrl: function()\n {\n return window.location.href;\n },\n\n /**\n * Generates an URL string.\n *\n * @method genQueryString\n * @param {String} uri Base URL\n * @param {Object} params Object to transform to query string\n * @return {String} URI with query string set\n * @public\n * @static\n * @sample Ink_Util_Url_genQueryString.html \n */\n genQueryString: function(uri, params) {\n var hasQuestionMark = uri.indexOf('?') !== -1;\n var sep, pKey, pValue, parts = [uri];\n\n for (pKey in params) {\n if (params.hasOwnProperty(pKey)) {\n if (!hasQuestionMark) {\n sep = '?';\n hasQuestionMark = true;\n } else {\n sep = '&';\n }\n pValue = params[pKey];\n if (typeof pValue !== 'number' && !pValue) {\n pValue = '';\n }\n parts = parts.concat([sep, encodeURIComponent(pKey), '=', encodeURIComponent(pValue)]);\n }\n }\n\n return parts.join('');\n },\n\n /**\n * Gets an object from an URL encoded string.\n *\n * @method getQueryString\n * @param {String} [str] URL String. When not specified it uses the current URL.\n * @return {Object} Key-Value pair object\n * @public\n * @static\n * @sample Ink_Util_Url_getQueryString.html \n */\n getQueryString: function(str)\n {\n var url;\n if(str && typeof(str) !== 'undefined') {\n url = str;\n } else {\n url = this.getUrl();\n }\n var aParams = {};\n if(url.match(/\\?(.+)/i)) {\n var queryStr = url.replace(/^(.*)\\?([^\\#]+)(\\#(.*))?/g, \"$2\");\n if(queryStr.length > 0) {\n var aQueryStr = queryStr.split(/[;&]/);\n for(var i=0; i < aQueryStr.length; i++) {\n var pairVar = aQueryStr[i].split('=');\n aParams[decodeURIComponent(pairVar[0])] = (typeof(pairVar[1]) !== 'undefined' && pairVar[1]) ? decodeURIComponent(pairVar[1]) : false;\n }\n }\n }\n return aParams;\n },\n\n /**\n * Gets the URL hash value\n *\n * @method getAnchor\n * @param {String} [str] URL String. Defaults to current page URL.\n * @return {String|Boolean} Hash in the URL. If there's no hash, returns false.\n * @public\n * @static\n * @sample Ink_Util_Url_getAnchor.html \n */\n getAnchor: function(str)\n {\n var url;\n if(str && typeof(str) !== 'undefined') {\n url = str;\n } else {\n url = this.getUrl();\n }\n var anchor = false;\n if(url.match(/#(.+)/)) {\n anchor = url.replace(/([^#]+)#(.*)/, \"$2\");\n }\n return anchor;\n },\n\n /**\n * Gets the anchor string of an URL\n *\n * @method getAnchorString\n * @param {String} [string] URL to parse. Defaults to current URL.\n * @return {Object} Key-value pair object of the URL's hashtag 'variables'\n * @public\n * @static\n * @sample Ink_Util_Url_getAnchorString.html \n */\n getAnchorString: function(string)\n {\n var url;\n if(string && typeof(string) !== 'undefined') {\n url = string;\n } else {\n url = this.getUrl();\n }\n var aParams = {};\n if(url.match(/#(.+)/i)) {\n var anchorStr = url.replace(/^([^#]+)#(.*)?/g, \"$2\");\n if(anchorStr.length > 0) {\n var aAnchorStr = anchorStr.split(/[;&]/);\n for(var i=0; i < aAnchorStr.length; i++) {\n var pairVar = aAnchorStr[i].split('=');\n aParams[decodeURIComponent(pairVar[0])] = (typeof(pairVar[1]) !== 'undefined' && pairVar[1]) ? decodeURIComponent(pairVar[1]) : false;\n }\n }\n }\n return aParams;\n },\n\n\n /**\n * Parses URL string into URL parts\n *\n * @method parseUrl\n * @param {String} url URL to be parsed\n * @return {Object} Parsed URL as a key-value object.\n * @public\n * @static\n * @sample Ink_Util_Url_parseUrl.html \n */\n parseUrl: function(url) {\n var aURL = {};\n if(url && typeof url === 'string') {\n if(url.match(/^([^:]+):\\/\\//i)) {\n var re = /^([^:]+):\\/\\/([^\\/]*)\\/?([^\\?#]*)\\??([^#]*)#?(.*)/i;\n if(url.match(re)) {\n aURL.scheme = url.replace(re, \"$1\");\n aURL.host = url.replace(re, \"$2\");\n aURL.path = '/'+url.replace(re, \"$3\");\n aURL.query = url.replace(re, \"$4\") || false;\n aURL.fragment = url.replace(re, \"$5\") || false;\n }\n } else {\n var re1 = new RegExp(\"^([^\\\\?]+)\\\\?([^#]+)#(.*)\", \"i\");\n var re2 = new RegExp(\"^([^\\\\?]+)\\\\?([^#]+)#?\", \"i\");\n var re3 = new RegExp(\"^([^\\\\?]+)\\\\??\", \"i\");\n if(url.match(re1)) {\n aURL.scheme = false;\n aURL.host = false;\n aURL.path = url.replace(re1, \"$1\");\n aURL.query = url.replace(re1, \"$2\");\n aURL.fragment = url.replace(re1, \"$3\");\n } else if(url.match(re2)) {\n aURL.scheme = false;\n aURL.host = false;\n aURL.path = url.replace(re2, \"$1\");\n aURL.query = url.replace(re2, \"$2\");\n aURL.fragment = false;\n } else if(url.match(re3)) {\n aURL.scheme = false;\n aURL.host = false;\n aURL.path = url.replace(re3, \"$1\");\n aURL.query = false;\n aURL.fragment = false;\n }\n }\n if(aURL.host) {\n var regPort = /^(.*?)\\\\:(\\\\d+)$/i;\n // check for port\n if(aURL.host.match(regPort)) {\n var tmpHost1 = aURL.host;\n aURL.host = tmpHost1.replace(regPort, \"$1\");\n aURL.port = tmpHost1.replace(regPort, \"$2\");\n } else {\n aURL.port = false;\n }\n // check for user and pass\n if(aURL.host.match(/@/i)) {\n var tmpHost2 = aURL.host;\n aURL.host = tmpHost2.split('@')[1];\n var tmpUserPass = tmpHost2.split('@')[0];\n if(tmpUserPass.match(/\\:/)) {\n aURL.user = tmpUserPass.split(':')[0];\n aURL.pass = tmpUserPass.split(':')[1];\n } else {\n aURL.user = tmpUserPass;\n aURL.pass = false;\n }\n }\n }\n }\n return aURL;\n },\n\n /**\n * Formats an URL object into an URL string.\n *\n * @method format\n * @param {String|Location|Object} urlObj Window.location, a.href, or parseUrl object to format\n * @return {String} Full URL.\n */\n format: function (urlObj) {\n var protocol = '';\n var host = '';\n var path = '';\n var frag = '';\n var query = '';\n\n if (typeof urlObj.protocol === 'string') {\n protocol = urlObj.protocol + '//'; // here it comes with the colon\n } else if (typeof urlObj.scheme === 'string') {\n protocol = urlObj.scheme + '://';\n }\n\n host = urlObj.host || urlObj.hostname || '';\n path = urlObj.path || '';\n\n if (typeof urlObj.query === 'string') {\n query = urlObj.query;\n } else if (typeof urlObj.search === 'string') {\n query = urlObj.search.replace(/^\\?/, '');\n }\n if (typeof urlObj.fragment === 'string') {\n frag = urlObj.fragment;\n } else if (typeof urlObj.hash === 'string') {\n frag = urlObj.hash.replace(/#$/, '');\n }\n\n return [\n protocol,\n host,\n path,\n query && '?' + query,\n frag && '#' + frag\n ].join('');\n },\n\n /**\n * Gets the last loaded script element\n *\n * @method currentScriptElement\n * @param {String} [match] String to match against the script src attribute\n * @return {DOMElement|Boolean} Returns the `script` DOM Element or false if unable to find it.\n * @public\n * @static\n * @sample Ink_Util_Url_currentScriptElement.html \n */\n currentScriptElement: function(match)\n {\n var aScripts = document.getElementsByTagName('script');\n if(typeof(match) === 'undefined') {\n if(aScripts.length > 0) {\n return aScripts[(aScripts.length - 1)];\n } else {\n return false;\n }\n } else {\n var curScript = false;\n var re = new RegExp(\"\"+match+\"\", \"i\");\n for(var i=0, total = aScripts.length; i < total; i++) {\n curScript = aScripts[i];\n if(re.test(curScript.src)) {\n return curScript;\n }\n }\n return false;\n }\n }\n };\n\n return Url;\n\n});\n","/**\n * Validation Utilities\n * @module Ink.Util.Validator_1\n * @version 1\n */\n \nInk.createModule('Ink.Util.Validator', '1', [], function() {\n\n 'use strict';\n\n /**\n * @namespace Ink.Util.Validator_1 \n */\n var Validator = {\n\n /**\n * List of country codes avaible for the isPhone method\n *\n * @property _countryCodes\n * @type {Array}\n * @private\n * @static\n * @readOnly\n */\n _countryCodes : [\n 'AO',\n 'CV',\n 'MZ',\n 'PT'\n ],\n\n /**\n * International number for portugal\n *\n * @property _internacionalPT\n * @type {Number}\n * @private\n * @static\n * @readOnly\n *\n */\n _internacionalPT: 351,\n\n /**\n * List of all portuguese number prefixes\n *\n * @property _indicativosPT\n * @type {Object}\n * @private\n * @static\n * @readOnly\n *\n */\n _indicativosPT: {\n 21: 'lisboa',\n 22: 'porto',\n 231: 'mealhada',\n 232: 'viseu',\n 233: 'figueira da foz',\n 234: 'aveiro',\n 235: 'arganil',\n 236: 'pombal',\n 238: 'seia',\n 239: 'coimbra',\n 241: 'abrantes',\n 242: 'ponte de sôr',\n 243: 'santarém',\n 244: 'leiria',\n 245: 'portalegre',\n 249: 'torres novas',\n 251: 'valença',\n 252: 'vila nova de famalicão',\n 253: 'braga',\n 254: 'peso da régua',\n 255: 'penafiel',\n 256: 'são joão da madeira',\n 258: 'viana do castelo',\n 259: 'vila real',\n 261: 'torres vedras',\n 262: 'caldas da raínha',\n 263: 'vila franca de xira',\n 265: 'setúbal',\n 266: 'évora',\n 268: 'estremoz',\n 269: 'santiago do cacém',\n 271: 'guarda',\n 272: 'castelo branco',\n 273: 'bragança',\n 274: 'proença-a-nova',\n 275: 'covilhã',\n 276: 'chaves',\n 277: 'idanha-a-nova',\n 278: 'mirandela',\n 279: 'moncorvo',\n 281: 'tavira',\n 282: 'portimão',\n 283: 'odemira',\n 284: 'beja',\n 285: 'moura',\n 286: 'castro verde',\n 289: 'faro',\n 291: 'funchal, porto santo',\n 292: 'corvo, faial, flores, horta, pico',\n 295: 'angra do heroísmo, graciosa, são jorge, terceira',\n 296: 'ponta delgada, são miguel, santa maria',\n\n 91 : 'rede móvel 91 (Vodafone / Yorn)',\n 93 : 'rede móvel 93 (Optimus)',\n 96 : 'rede móvel 96 (TMN)',\n 92 : 'rede móvel 92 (TODOS)',\n //925 : 'rede móvel 925 (TMN 925)',\n //926 : 'rede móvel 926 (TMN 926)',\n //927 : 'rede móvel 927 (TMN 927)',\n //922 : 'rede móvel 922 (Phone-ix)',\n\n 707: 'número único',\n 760: 'número único',\n 800: 'número grátis',\n 808: 'chamada local',\n 30: 'voip'\n },\n /**\n * International number for Cabo Verde\n *\n * @property _internacionalCV\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalCV: 238,\n\n /**\n * List of all Cabo Verde number prefixes\n *\n * @property _indicativosCV\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosCV: {\n 2: 'fixo',\n 91: 'móvel 91',\n 95: 'móvel 95',\n 97: 'móvel 97',\n 98: 'móvel 98',\n 99: 'móvel 99'\n },\n /**\n * International number for Angola\n *\n * @property _internacionalAO\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalAO: 244,\n\n /**\n * List of all Angola number prefixes\n *\n * @property _indicativosAO\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosAO: {\n 2: 'fixo',\n 91: 'móvel 91',\n 92: 'móvel 92'\n },\n /**\n * International number for Mozambique\n *\n * @property _internacionalMZ\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalMZ: 258,\n\n /**\n * List of all Mozambique number prefixes\n *\n * @property _indicativosMZ\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosMZ: {\n 2: 'fixo',\n 82: 'móvel 82',\n 84: 'móvel 84'\n },\n\n /**\n * International number for Timor\n *\n * @property _internacionalTL\n * @type {Number}\n * @private\n * @static\n * @readOnly\n */\n _internacionalTL: 670,\n\n /**\n * List of all Timor number prefixes\n *\n * @property _indicativosTL\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _indicativosTL: {\n 3: 'fixo',\n 7: 'móvel 7'\n },\n\n /**\n * Regular expression groups for several groups of characters\n *\n * http://en.wikipedia.org/wiki/C0_Controls_and_Basic_Latin\n * http://en.wikipedia.org/wiki/Plane_%28Unicode%29#Basic_Multilingual_Plane\n * http://en.wikipedia.org/wiki/ISO_8859-1\n *\n * @property _characterGroups\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _characterGroups: {\n numbers: ['0-9'],\n asciiAlpha: ['a-zA-Z'],\n latin1Alpha: ['a-zA-Z', '\\u00C0-\\u00FF'],\n unicodeAlpha: ['a-zA-Z', '\\u00C0-\\u00FF', '\\u0100-\\u1FFF', '\\u2C00-\\uD7FF'],\n /* whitespace characters */\n space: [' '],\n dash: ['-'],\n underscore: ['_'],\n nicknamePunctuation: ['_.-'],\n\n singleLineWhitespace: ['\\t '],\n newline: ['\\n'],\n whitespace: ['\\t\\n\\u000B\\f\\r\\u00A0 '],\n\n asciiPunctuation: ['\\u0021-\\u002F', '\\u003A-\\u0040', '\\u005B-\\u0060', '\\u007B-\\u007E'],\n latin1Punctuation: ['\\u0021-\\u002F', '\\u003A-\\u0040', '\\u005B-\\u0060', '\\u007B-\\u007E', '\\u00A1-\\u00BF', '\\u00D7', '\\u00F7'],\n unicodePunctuation: ['\\u0021-\\u002F', '\\u003A-\\u0040', '\\u005B-\\u0060', '\\u007B-\\u007E', '\\u00A1-\\u00BF', '\\u00D7', '\\u00F7', '\\u2000-\\u206F', '\\u2E00-\\u2E7F', '\\u3000-\\u303F']\n },\n\n /**\n * Creates a regular expression for several character groups.\n *\n * @method createRegExp\n *\n * @param {Object} groups\n * Groups to build regular expressions for. Possible keys are:\n *\n * - **numbers**: 0-9\n * - **asciiAlpha**: a-z, A-Z\n * - **latin1Alpha**: asciiAlpha, plus printable characters in latin-1\n * - **unicodeAlpha**: unicode alphanumeric characters.\n * - **space**: ' ', the space character.\n * - **dash**: dash character.\n * - **underscore**: underscore character.\n * - **nicknamePunctuation**: dash, dot, underscore\n * - **singleLineWhitespace**: space and tab (whitespace which only spans one line).\n * - **newline**: newline character ('\\n')\n * - **whitespace**: whitespace characters in the ASCII character set.\n * - **asciiPunctuation**: punctuation characters in the ASCII character set.\n * - **latin1Punctuation**: punctuation characters in latin-1.\n * - **unicodePunctuation**: punctuation characters in unicode.\n *\n * @returns {RegExp} A regular expression with the given groups.\n */\n createRegExp: function (groups) {\n var re = '^[';\n for (var key in groups) if (groups.hasOwnProperty(key)) {\n if (!(key in Validator._characterGroups)) {\n throw new Error('group ' + key + ' is not a valid character group');\n } else if (groups[key]) {\n re += Validator._characterGroups[key].join('');\n }\n }\n if (re === '^[') {\n // No changes\n return new RegExp('$^'); // match nothing\n }\n return new RegExp(re + ']*?$');\n },\n\n /**\n * Checks if a field has the required groups.\n *\n * @method checkCharacterGroups\n * @param {String} s The validation string\n * @param {Object} [groups={}] What groups are included. See `createRegExp`\n * @return {Boolean} Whether this is a valid string (all groups pass).\n * @sample Ink_Util_Validator_checkCharacterGroups.html \n */\n checkCharacterGroups: function (s, groups) {\n return Validator.createRegExp(groups).test(s);\n },\n\n /**\n * Checks if a field contains unicode printable characters.\n *\n * @method unicode\n * @param {String} s The validation string\n * @param {Object} [options={}] Optional configuration object. See createRegexp\n * @return {Boolean} Whether this is a valid unicode string.\n */\n unicode: function (s, options) {\n return Validator.checkCharacterGroups(s, Ink.extendObj({\n unicodeAlpha: true}, options));\n },\n\n /**\n * Checks if a field only contains latin-1 alphanumeric characters. \n * Takes options for allowing singleline whitespace, cross-line whitespace and punctuation.\n *\n * @method latin1\n *\n * @param {String} s The validation string\n * @param {Object} [options={}] Optional configuration object. See createRegexp\n * @return {Boolean} Whether this is a valid latin1 string.\n * @sample Ink_Util_Validator_latin1.html \n */\n latin1: function (s, options) {\n return Validator.checkCharacterGroups(s, Ink.extendObj({\n latin1Alpha: true}, options));\n },\n\n /**\n * Checks if a field only contains only ASCII alphanumeric characters. \n * Takes options for allowing singleline whitespace, cross-line whitespace and punctuation.\n *\n * @method ascii\n *\n * @param {String} s The validation string\n * @param {Object} [options={}] Optional configuration object. See createRegexp\n * @return {Boolean} Whether this is a valid ascii string.\n * @sample Ink_Util_Validator_ascii.html \n */\n ascii: function (s, options) {\n return Validator.checkCharacterGroups(s, Ink.extendObj({\n asciiAlpha: true}, options));\n },\n\n /**\n * Checks if a number is a valid\n *\n * @method number\n * @param {String} numb The number\n * @param {Object} [options] Further options\n * @param {String} [options.decimalSep='.'] Allow decimal separator.\n * @param {String} [options.thousandSep=\",\"] Strip this character from the number.\n * @param {String} [options.negative=false] Allow negative numbers.\n * @param {String} [options.decimalPlaces=null] Maximum number of decimal places. Use `0` for an integer number.\n * @param {Number} [options.max=null] Maximum number\n * @param {Number} [options.min=null] Minimum number\n * @param {Boolean}[options.returnNumber=false] When this option is `true`, return the number itself when the value is valid.\n * @return {Boolean|Number} `false` when invalid, `true` when valid. If `options.returnNumber` is `true`, return the parsed, valid number or `false`.\n * @sample Ink_Util_Validator_number.html \n */\n number: function (numb, options) {\n numb = numb + '';\n options = Ink.extendObj({\n decimalSep: '.',\n thousandSep: '',\n negative: true,\n decimalPlaces: null,\n maxDigits: null,\n max: null,\n min: null,\n returnNumber: false\n }, options || {});\n // smart recursion thing sets up aliases for options.\n if (options.thousandSep) {\n numb = numb.replace(new RegExp('\\\\' + options.thousandSep, 'g'), '');\n options.thousandSep = '';\n return Validator.number(numb, options);\n }\n if (options.negative === false) {\n options.min = 0;\n options.negative = true;\n return Validator.number(numb, options);\n }\n if (options.decimalSep !== '.') {\n numb = numb.replace(new RegExp('\\\\' + options.decimalSep, 'g'), '.');\n }\n\n if (!/^(-)?(\\d+)?(\\.\\d+)?$/.test(numb) || numb === '') {\n return false; // forbidden character found\n }\n \n var split;\n if (options.decimalSep && numb.indexOf(options.decimalSep) !== -1) {\n split = numb.split(options.decimalSep);\n if (options.decimalPlaces !== null &&\n split[1].length > options.decimalPlaces) {\n return false;\n }\n } else {\n split = ['' + numb, ''];\n }\n \n if (options.maxDigits!== null) {\n if (split[0].replace(/-/g, '').length > options.maxDigits) {\n return split;\n }\n }\n \n // Now look at the actual float\n var ret = parseFloat(numb);\n \n if (options.maxExcl !== null && ret >= options.maxExcl ||\n options.minExcl !== null && ret <= options.minExcl) {\n return false;\n }\n if (options.max !== null && ret > options.max ||\n options.min !== null && ret < options.min) {\n return false;\n }\n \n if (options.returnNumber) {\n return ret;\n } else {\n return true;\n }\n },\n\n /**\n * Checks if a year is Leap \"Bissexto\"\n *\n * @method _isLeapYear\n * @param {Number} year Year to be checked\n * @return {Boolean} True if it is a leap year.\n * @private\n * @static\n * @example\n * Ink.requireModules(['Ink.Util.Validator_1'], function( InkValidator ){\n * console.log( InkValidator._isLeapYear( 2004 ) ); // Result: true\n * console.log( InkValidator._isLeapYear( 2006 ) ); // Result: false\n * });\n */\n _isLeapYear: function(year){\n var yearRegExp = /^\\d{4}$/;\n\n if(yearRegExp.test(year)){\n return ((year%4) ? false: ((year%100) ? true : ((year%400)? false : true)) );\n }\n\n return false;\n },\n\n /**\n * Object with the date formats available for validation\n *\n * @property _dateParsers\n * @type {Object}\n * @private\n * @static\n * @readOnly\n */\n _dateParsers: {\n 'yyyy-mm-dd': {day:5, month:3, year:1, sep: '-', parser: /^(\\d{4})(\\-)(\\d{1,2})(\\-)(\\d{1,2})$/},\n 'yyyy/mm/dd': {day:5, month:3, year:1, sep: '/', parser: /^(\\d{4})(\\/)(\\d{1,2})(\\/)(\\d{1,2})$/},\n 'yy-mm-dd': {day:5, month:3, year:1, sep: '-', parser: /^(\\d{2})(\\-)(\\d{1,2})(\\-)(\\d{1,2})$/},\n 'yy/mm/dd': {day:5, month:3, year:1, sep: '/', parser: /^(\\d{2})(\\/)(\\d{1,2})(\\/)(\\d{1,2})$/},\n 'dd-mm-yyyy': {day:1, month:3, year:5, sep: '-', parser: /^(\\d{1,2})(\\-)(\\d{1,2})(\\-)(\\d{4})$/},\n 'dd/mm/yyyy': {day:1, month:3, year:5, sep: '/', parser: /^(\\d{1,2})(\\/)(\\d{1,2})(\\/)(\\d{4})$/},\n 'dd-mm-yy': {day:1, month:3, year:5, sep: '-', parser: /^(\\d{1,2})(\\-)(\\d{1,2})(\\-)(\\d{2})$/},\n 'dd/mm/yy': {day:1, month:3, year:5, sep: '/', parser: /^(\\d{1,2})(\\/)(\\d{1,2})(\\/)(\\d{2})$/}\n },\n\n /**\n * Gets the number of days in a given month of a given year\n *\n * @method _daysInMonth\n * @param {Number} _m Month (1 to 12)\n * @param {Number} _y Year\n * @return {Number} Returns the number of days in a given month of a given year\n * @private\n * @static\n * @example\n * Ink.requireModules(['Ink.Util.Validator_1'], function( InkValidator ){\n * console.log( InkValidator._daysInMonth( 2, 2004 ) ); // Result: 29\n * console.log( InkValidator._daysInMonth( 2, 2006 ) ); // Result: 28\n * });\n */\n _daysInMonth: function(_m,_y){\n var nDays=0;\n\n _m = parseInt(_m, 10);\n _y = parseInt(_y, 10);\n\n if(_m===1 || _m===3 || _m===5 || _m===7 || _m===8 || _m===10 || _m===12) {\n nDays= 31;\n } else if ( _m===4 || _m===6 || _m===9 || _m===11) {\n nDays = 30;\n } else if (_m===2) {\n if((_y%400===0) || (_y%4===0 && _y%100!==0)) {\n nDays = 29;\n } else {\n nDays = 28;\n }\n }\n\n return nDays;\n },\n\n\n\n /**\n * Checks if a date is valid\n *\n * @method _isValidDate\n * @param {Number} year Year fragment of your date.\n * @param {Number} month Month fragment of your date.\n * @param {Number} day Day fragment of your date.\n * @return {Boolean} True if valid\n * @private\n * @static\n * @example\n * Ink.requireModules(['Ink.Util.Validator_1'], function( InkValidator ){\n * console.log( InkValidator._isValidDate( 2004, 2, 29 ) ); // Result: true\n * console.log( InkValidator._isValidDate( 2006, 2, 29 ) ); // Result: false\n * });\n */\n _isValidDate: function(year, month, day){\n var yearRegExp = /^\\d{4}$/;\n var validOneOrTwo = /^\\d{1,2}$/;\n if(yearRegExp.test(year) && validOneOrTwo.test(month) && validOneOrTwo.test(day)){\n if(month>=1 && month<=12 && day>=1 && this._daysInMonth(month,year)>=day){\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if an email address is valid\n *\n * @method email\n * @param {String} email String containing the e-mail.\n * @return {Boolean} `true` if it's a valid e-mail address.\n * @public\n * @static\n * @sample Ink_Util_Validator_mail.html \n */\n email: function(email)\n {\n var emailValido = new RegExp(\"^[_a-z0-9-]+((\\\\.|\\\\+)[_a-z0-9-]+)*@([\\\\w]*-?[\\\\w]*\\\\.)+[a-z]{2,4}$\", \"i\");\n return !!emailValido.test(email);\n },\n\n /**\n * Deprecated. Alias for email(). Use it instead.\n *\n * @method mail\n * @public\n * @param {String} mail See `email`\n * @returns {Boolean} See `email`\n * @static\n * @private\n */\n mail: function (mail) { return Validator.email(mail); },\n\n /**\n * Checks if an url is valid\n *\n * @method url\n * @param {String} url URL to be checked\n * @param {Boolean} [full] If true, validates a full URL (one that should start with 'http')\n * @return {Boolean} True if valid\n * @public\n * @static\n * @sample Ink_Util_Validator_url.html \n */\n url: function(url, full)\n {\n if(typeof full === \"undefined\" || full === false) {\n var reHTTP = new RegExp(\"(^(http\\\\:\\\\/\\\\/|https\\\\:\\\\/\\\\/)(.+))\", \"i\");\n if(reHTTP.test(url) === false) {\n url = 'http://'+url;\n }\n }\n\n var reUrl = new RegExp(\"^(http:\\\\/\\\\/|https:\\\\/\\\\/)([\\\\w]*(-?[\\\\w]*)*\\\\.)+[a-z]{2,4}\", \"i\");\n if(reUrl.test(url) === false) {\n return false;\n } else {\n return true;\n }\n },\n\n /**\n * Checks if a phone is valid in Portugal\n *\n * @method isPTPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Portuguese Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isPTPhone.html\n */\n isPTPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosPT) {\n if(typeof(this._indicativosPT[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n\n var re351 = /^(00351|\\+351)/;\n if(re351.test(phone)) {\n phone = phone.replace(re351, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{9}/i;\n if(phone.length === 9 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Alias function for isPTPhone\n *\n * @method isPortuguesePhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Portuguese Phone\n * @public\n * @static\n */\n isPortuguesePhone: function(phone)\n {\n return this.isPTPhone(phone);\n },\n\n /**\n * Checks if a phone is valid in Cabo Verde\n *\n * @method isCVPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Cape Verdean Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isCVPhone.html \n */\n isCVPhone: function(phone)\n {\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosCV) {\n if(typeof(this._indicativosCV[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n\n var re238 = /^(00238|\\+238)/;\n if(re238.test(phone)) {\n phone = phone.replace(re238, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{7}/i;\n if(phone.length === 7 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a phone is valid in Angola\n *\n * @method isAOPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Angolan Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isAOPhone.html \n */\n isAOPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosAO) {\n if(typeof(this._indicativosAO[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n\n var re244 = /^(00244|\\+244)/;\n if(re244.test(phone)) {\n phone = phone.replace(re244, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{9}/i;\n if(phone.length === 9 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a phone is valid in Mozambique\n *\n * @method isMZPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid Mozambican Phone\n * @public\n * @static\n * @sample Ink_Util_Validator_isMZPhone.html \n */\n isMZPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosMZ) {\n if(typeof(this._indicativosMZ[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n var re258 = /^(00258|\\+258)/;\n if(re258.test(phone)) {\n phone = phone.replace(re258, \"\");\n }\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{8,9}/i;\n if((phone.length === 9 || phone.length === 8) && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n if(phone.indexOf('2') === 0 && phone.length === 8) {\n return true;\n } else if(phone.indexOf('8') === 0 && phone.length === 9) {\n return true;\n }\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a phone is valid in Timor\n *\n * @method isTLPhone\n * @param {Number} phone Phone number to be checked\n * @return {Boolean} True if it's a valid phone from Timor-Leste\n * @public\n * @static\n * @sample Ink_Util_Validator_isTLPhone.html \n */\n isTLPhone: function(phone)\n {\n\n phone = phone.toString();\n var aInd = [];\n for(var i in this._indicativosTL) {\n if(typeof(this._indicativosTL[i]) === 'string') {\n aInd.push(i);\n }\n }\n var strInd = aInd.join('|');\n var re670 = /^(00670|\\+670)/;\n if(re670.test(phone)) {\n phone = phone.replace(re670, \"\");\n }\n\n\n var reSpecialChars = /(\\s|\\-|\\.)+/g;\n phone = phone.replace(reSpecialChars, '');\n //var reInt = new RegExp(\"\\\\d\", \"i\");\n var reInt = /[\\d]{7}/i;\n if(phone.length === 7 && reInt.test(phone)) {\n var reValid = new RegExp(\"^(\"+strInd+\")\");\n if(reValid.test(phone)) {\n return true;\n }\n }\n\n return false;\n },\n\n /**\n * Checks if a number is a phone number.\n * This method validates the number in all country codes available the ones set in the second param\n *\n * @method isPhone\n * @param {String} phone Phone number to validate\n * @param {String|Array} [countryCode] Country code or array of countries to validate\n * @return {Boolean} True if it's a valid phone in any country available\n * @public\n * @static\n * @sample Ink_Util_Validator_isPhone.html\n */\n isPhone: function(){\n var index;\n\n if(arguments.length===0){\n return false;\n }\n\n var phone = arguments[0];\n\n if(arguments.length>1){\n if(arguments[1].constructor === Array){\n var func;\n for(index=0; index= 0 && match[i-1] <= 100){\n valid = true;\n } else {\n return false;\n }\n }\n // check 0 to 255 values\n if(i===1 || i===3 || i===5 && (typeof match[i+1] === \"undefined\" || match[i+1] === \"\")){\n if(typeof match[i] !== \"undefined\" && match[i] >= 0 && match[i] <= 255){\n valid = true;\n } else {\n return false;\n }\n }\n }\n }\n\n // hsl range check\n if((match = hsl.exec(str)) !== null || (match = hsla.exec(str)) !== null){\n i = match.length;\n while(i--){\n // check percentage values\n if(i===3 || i===5){\n if(typeof match[i-1] !== \"undefined\" && typeof match[i] !== \"undefined\" && match[i] !== \"\" &&\n match[i-1] >= 0 && match[i-1] <= 100){\n valid = true;\n } else {\n return false;\n }\n }\n // check 0 to 360 value\n if(i===1){\n if(typeof match[i] !== \"undefined\" && match[i] >= 0 && match[i] <= 360){\n valid = true;\n } else {\n return false;\n }\n }\n }\n }\n\n return valid;\n },\n\n /**\n * Checks if the value is a valid IP. \n *\n * @method isIP\n * @param {String} value Value to be checked\n * @param {String} ipType Type of IP to be validated. The values are: ipv4, ipv6. By default is ipv4.\n * @return {Boolean} True if the value is a valid IP address. False if not.\n * @sample Ink_Util_Validator_isIP.html \n */\n isIP: function( value, ipType ){\n if( typeof value !== 'string' ){\n return false;\n }\n\n ipType = (ipType || 'ipv4').toLowerCase();\n\n switch( ipType ){\n case 'ipv4':\n return (/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/).test(value);\n case 'ipv6':\n return (/^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/).test(value);\n default:\n return false;\n }\n },\n\n /**\n * Credit Card specifications, to be used in the credit card verification.\n *\n * @property _creditCardSpecs\n * @type {Object}\n * @private\n */\n _creditCardSpecs: {\n 'default': {\n 'length': '13,14,15,16,17,18,19',\n 'prefix': /^.+/,\n 'luhn': true\n },\n\n 'american express': {\n 'length': '15',\n 'prefix': /^3[47]/,\n 'luhn' : true\n },\n\n 'diners club': {\n 'length': '14,16',\n 'prefix': /^36|55|30[0-5]/,\n 'luhn' : true\n },\n\n 'discover': {\n 'length': '16',\n 'prefix': /^6(?:5|011)/,\n 'luhn' : true\n },\n\n 'jcb': {\n 'length': '15,16',\n 'prefix': /^3|1800|2131/,\n 'luhn' : true\n },\n\n 'maestro': {\n 'length': '16,18',\n 'prefix': /^50(?:20|38)|6(?:304|759)/,\n 'luhn' : true\n },\n\n 'mastercard': {\n 'length': '16',\n 'prefix': /^5[1-5]/,\n 'luhn' : true\n },\n\n 'visa': {\n 'length': '13,16',\n 'prefix': /^4/,\n 'luhn' : true\n }\n },\n\n /**\n * Luhn function, to be used when validating credit card numbers\n * @method _luhn\n * @private\n * @param {Number} num Given credit card number\n * @returns {Boolean} Whether the credit card number is valid.\n */\n _luhn: function (num){\n\n num = parseInt(num,10);\n\n if ( (typeof num !== 'number') && (num % 1 !== 0) ){\n // Luhn can only be used on nums!\n return false;\n }\n\n num = num+'';\n // Check num length\n var length = num.length;\n\n // Checksum of the card num\n var i;\n var checksum = 0;\n\n for (i = length - 1; i >= 0; i -= 2)\n {\n // Add up every 2nd digit, starting from the right\n checksum += parseInt(num.substr(i, 1),10);\n }\n\n for (i = length - 2; i >= 0; i -= 2)\n {\n // Add up every 2nd digit doubled, starting from the right\n var dbl = parseInt(num.substr(i, 1) * 2,10);\n\n // Subtract 9 from the dbl where value is greater than 10\n checksum += (dbl >= 10) ? (dbl - 9) : dbl;\n }\n\n // If the checksum is a multiple of 10, the number is valid\n return (checksum % 10 === 0);\n },\n\n /**\n * Checks if a number is of a specific credit card type\n * @method isCreditCard\n * @param {String} num Number to be validates\n * @param {String|Array} creditCardType Credit card type or list of types. See _creditCardSpecs for the list of supported values.\n * @return {Boolean} Whether the number is of that credit card type (or at least one of `creditCardType` if you pass in an array).\n * @sample Ink_Util_Validator_isCreditCard.html \n */\n isCreditCard: function(num, creditCardType){\n\n if ( /\\d+/.test(num) === false ){\n return false;\n }\n\n if ( typeof creditCardType === 'undefined' ){\n creditCardType = 'default';\n }\n else if ( creditCardType instanceof Array ){\n var i, ccLength = creditCardType.length;\n for ( i=0; i < ccLength; i++ ){\n // Test each type for validity\n if (this.isCreditCard(num, creditCardType[i]) ){\n return true;\n }\n }\n\n return false;\n }\n\n // Check card type\n creditCardType = creditCardType.toLowerCase();\n\n if ( typeof this._creditCardSpecs[creditCardType] === 'undefined' ){\n return false;\n }\n\n // Check card number length\n var length = num.length+'';\n\n // Validate the card length by the card type\n if ( this._creditCardSpecs[creditCardType]['length'].split(\",\").indexOf(length) === -1 ){\n return false;\n }\n\n // Check card number prefix\n if ( !this._creditCardSpecs[creditCardType]['prefix'].test(num) ){\n return false;\n }\n\n // No Luhn check required\n if (this._creditCardSpecs[creditCardType]['luhn'] === false){\n return true;\n }\n\n return this._luhn(num);\n }\n };\n\n return Validator;\n\n});\n"]} \ No newline at end of file diff --git a/package.json b/package.json index b84b0a9a9..d2dd856f8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sapo_ink", - "version": "3.1.3", + "version": "3.1.4", "description": "SAPO InK - Interface Toolkit", "homepage": "http://ink.sapo.pt", "main": "dist/js/ink-all.js", diff --git a/src/js/Ink/1/lib.js b/src/js/Ink/1/lib.js index 020c7395c..efc08a546 100644 --- a/src/js/Ink/1/lib.js +++ b/src/js/Ink/1/lib.js @@ -47,7 +47,7 @@ /** * @property {String} VERSION **/ - VERSION: '3.1.2', + VERSION: '3.1.4', _checkPendingRequireModules: function() { var I, F, o, dep, mod, cb, pRMs = []; var toApply = [];