├── CNAME ├── .nojekyll ├── 404.html ├── imgs └── scout-app-corner.svg ├── .gitignore ├── LICENSE ├── sass ├── _ven.svglinegraph.sass ├── style.scss ├── _ven.meyer.sass └── _ven.normalize.sass ├── README.md ├── example.scss ├── js ├── ven.selectorstoarray.js ├── ven.svglinegraph.js ├── ven.specificity.js ├── ven.reworkcss.js └── ven.jquery-2.2.3.min.js ├── css └── style.css └── index.html /CNAME: -------------------------------------------------------------------------------- 1 | graphmycss.com 2 | -------------------------------------------------------------------------------- /.nojekyll: -------------------------------------------------------------------------------- 1 | Without this file github.io ignores files and folders that start with _. 2 | -------------------------------------------------------------------------------- /404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /imgs/scout-app-corner.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # nyc test coverage 18 | .nyc_output 19 | 20 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 21 | .grunt 22 | 23 | # node-waf configuration 24 | .lock-wscript 25 | 26 | # Compiled binary addons (http://nodejs.org/api/addons.html) 27 | build/Release 28 | 29 | # Dependency directories 30 | node_modules 31 | jspm_packages 32 | 33 | # Optional npm cache directory 34 | .npm 35 | 36 | # Optional REPL history 37 | .node_repl_history 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 The Jared Wilcurt 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /sass/_ven.svglinegraph.sass: -------------------------------------------------------------------------------- 1 | body 2 | background: #F2F2F2 3 | color: $graphBg 4 | font: 400 16px roboto, helvetica, arial 5 | 6 | h1 7 | margin-bottom: 0px 8 | 9 | #wrapper 10 | width: 650px 11 | background: white 12 | margin: 2em auto 13 | padding: 1em 14 | box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.1) 15 | 16 | .explanation 17 | display: inline-block 18 | margin-bottom: 3em 19 | 20 | .chart 21 | position: relative 22 | display: flex 23 | width: 600px 24 | height: 300px 25 | border-bottom: 1px solid lighten($graphBg, 35%) 26 | margin: auto 27 | padding-left: 50px 28 | justify-content: space-between 29 | .chartMeasurements 30 | position: absolute 31 | top: 0px 32 | left: 0px 33 | display: flex 34 | width: 100% 35 | height: 100% 36 | text-align: left 37 | justify-content: space-between 38 | flex-direction: column 39 | z-index: 1 40 | .chartMeasurement 41 | width: 100% 42 | border-top: 1px solid lighten($graphBg, 35%) 43 | flex-grow: 1 44 | svg 45 | position: relative 46 | z-index: 2 47 | polygon 48 | box-shadow: inset 2px 0px red 49 | fill: rgba($graphBg, 0.6) 50 | -------------------------------------------------------------------------------- /sass/style.scss: -------------------------------------------------------------------------------- 1 | $graphBg: #4183D7; 2 | 3 | @mixin user-select-none { 4 | -webkit-touch-callout: none; 5 | -webkit-user-select: none; 6 | -khtml-user-select: none; 7 | -moz-user-select: none; 8 | -ms-user-select: none; 9 | user-select: none; 10 | } 11 | 12 | @import "ven.meyer"; 13 | @import "ven.normalize"; 14 | @import "ven.svglinegraph"; 15 | 16 | .chart { 17 | margin: 0px auto 30px; 18 | } 19 | 20 | .explanation { 21 | display: none; 22 | } 23 | 24 | textarea { 25 | font-family: monospace; 26 | font-size: 15px; 27 | } 28 | 29 | #paste { 30 | width: 100%; 31 | height: 90px; 32 | margin: 8px 0px 20px 0px; 33 | } 34 | 35 | #data { 36 | display: inline-block; 37 | margin: 10px 0px 38 | } 39 | 40 | .data { 41 | width: 100%; 42 | height: 300px; 43 | margin: 0px 0px 28px 0px; 44 | } 45 | 46 | #pills { 47 | @include user-select-none; 48 | position: relative; 49 | top: 1px; 50 | display: inline-block; 51 | margin: 13px 0px 0px 0px; 52 | float: right; 53 | li { 54 | display: inline-block; 55 | border: 1px solid $graphBg; 56 | border-radius: 11px 11px 0px 0px; 57 | margin: 0px; 58 | padding: 3px 5px; 59 | cursor: pointer; 60 | &.selected { 61 | background: $graphBg; 62 | color: #FFF; 63 | cursor: default; 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ITCSS: CSS Specificity Graph 2 | 3 | A CSS Selector Specificity graph based on the Inverted Triangle CSS Methodology 4 | 5 | * **[View and use the graph online](http://TheJaredWilcurt.github.io/itcss-specificity-graph)** :arrow_left: (this is what you want) 6 | * [Harry Roberts - Managing CSS Projects with ITCSS](https://www.youtube.com/watch?v=1OKZOV-iLj4&t=6m47s) (YouTube) 7 | * [ITCSS Slides from the above talk](https://speakerdeck.com/dafed/managing-css-projects-with-itcss) 8 | 9 | 10 | ## This repo uses: 11 | 12 | * [Alan Menhennet's SVG Line Graph](http://codepen.io/alanmenhennet/pen/WxrXww) 13 | * [CSS Selectors to JS Array](http://github.com/TheJaredWilcurt/css-selectors-to-js-array) 14 | * [SPECIFICITY](https://github.com/keeganstreet/specificity) 15 | * [GitHub Corners](http://tholman.com/github-corners/) 16 | * [jQuery](http://jquery.com) 17 | * [Meyer Resets](http://github.com/TheJaredWilcurt/meyer-sass) 18 | * [Normalize](https://necolas.github.io/normalize.css/) 19 | 20 | 21 | ## Contribute: 22 | 23 | * The design could be improved 24 | * Need to go and clean up the Sass folder, it should *really* be set up to use ITCSS (yeah, that needs fixed) 25 | * We need lots of testing of the [CSS Selectors to JS Array](http://github.com/TheJaredWilcurt/css-selectors-to-js-array) library. To make sure all valid CSS can be parsed correctly. 26 | * Add in a CSS Validator library. Prevent CSS parsing unless the file is valid. If the file is invalid, display a warning. 27 | * Would be nice to have some simple ITCSS [explaination](http://imgur.com/a/6fS7V) on the page. 28 | 29 | 30 | ## License 31 | 32 | MIT License (2016) 33 | -------------------------------------------------------------------------------- /sass/_ven.meyer.sass: -------------------------------------------------------------------------------- 1 | 2 | //Resets the default styles in all browsers so they don't render things differently by default. 3 | // 4 | //The Meyer resets a great at catching fringe cases and old browser compatibility. 5 | //It is recommended that you load "Normalize.css" after this file as it is more up to date and 6 | //will support more modern browsers and mobile better. They work very good together. 7 | 8 | // http://github.com/TheJaredWilcurt/meyer-sass 9 | // http://meyerweb.com/eric/tools/css/reset/ 10 | // v2.0 | 20110126 11 | // License: none (public domain) 12 | 13 | html, body, div, span, applet, object, iframe, 14 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 15 | a, abbr, acronym, address, big, cite, code, 16 | del, dfn, em, img, ins, kbd, q, s, samp, 17 | small, strike, strong, sub, sup, tt, var, 18 | b, u, i, center, 19 | dl, dt, dd, ol, ul, li, 20 | fieldset, form, label, legend, 21 | table, caption, tbody, tfoot, thead, tr, th, td, 22 | article, aside, canvas, details, embed, 23 | figure, figcaption, footer, header, hgroup, 24 | menu, nav, output, ruby, section, summary, 25 | time, mark, audio, video 26 | margin: 0 27 | padding: 0 28 | border: 0 29 | font-size: 100% 30 | font: inherit 31 | vertical-align: baseline 32 | 33 | // HTML5 display-role reset for older browsers 34 | 35 | article, aside, details, figcaption, figure, 36 | footer, header, hgroup, menu, nav, section 37 | display: block 38 | 39 | body 40 | line-height: 1 41 | 42 | ol, ul 43 | list-style: none 44 | 45 | blockquote, q 46 | quotes: none 47 | &:before, &:after 48 | content: '' 49 | content: none 50 | 51 | table 52 | border-collapse: collapse 53 | border-spacing: 0 54 | -------------------------------------------------------------------------------- /example.scss: -------------------------------------------------------------------------------- 1 | 2 | @charset "utf-8"; // Character type for the stylesheet 3 | 4 | // ITCSS: SETTINGS 5 | @import "_var.sass"; // Sass Variables - Does not effect page, but other Sass files reference this file. 6 | 7 | 8 | // ITCSS: TOOLS 9 | @import "_mixins.sass"; // Sass Mixins - Does not effect page, but other Sass files reference this file. 10 | @import "_functions.sass"; // Sass Functions - Does not effect page, but other Sass files reference this file. 11 | 12 | 13 | // ITCSS: RESETS - Remove inconsistencies in the way different browsers render elements by default 14 | // npm install --save-dev meyer-sass normalize.css 15 | @import "../node_modules/meyer-sass/_meyer.sass"; // The Eric Meyers resets - Good for older browsers and fringe cases. 16 | @import "../node_modules/normalize.css/normalize"; // Normalize.css - Good for mobile and modern browsers 17 | 18 | 19 | // ITCSS: FRAMEWORKS/THEMES 20 | 21 | 22 | // ITCSS: PLUGINS 23 | 24 | 25 | // ITCSS: GENERIC (ELEMENTS/BASE) 26 | @import "_base.sass"; // h1, h2, h3, p, etc. 27 | @import "_layout.sass"; // General layout classes, like .col-xs-4 28 | @import "_utility.sass"; // Utility classes, like .wrapper or .text-center 29 | 30 | 31 | // ITCSS: OBJECTS - Grouped reusable chunks 32 | @import "_hamburger.sass"; // pure css hamburger menu that animates on click 33 | 34 | 35 | // ITCSS: COMPONENTS - Component-specific styles 36 | @import "_nav.sass"; // General navigation styles used in the top/side nav 37 | 38 | 39 | // ITCSS: CONTAINERS 40 | @import "_topnav.sass"; // Nav styles unique to when it is in the header 41 | @import "_sidenav.sass"; // Nav styles unique to when it is in the sidebar 42 | 43 | 44 | // ITCSS: TRUMPS 45 | @import "_atomic.sass"; // Atomic classes are typically added to elements to override a specific css property 46 | @import "_mediaqueries.sass"; // Adjusts the CSS of elements depending on browser or device resolution. Adaptive Web Design. 47 | @import "_trumps.sass"; // Use sparingly. These are meant to override above styles by using more specific selectors 48 | @import "_shame.sass"; // This is code you wrote to meet a deadline and need to come back and fix later 49 | -------------------------------------------------------------------------------- /js/ven.selectorstoarray.js: -------------------------------------------------------------------------------- 1 | // github.com/TheJaredWilcurt/css-selectors-to-js-array | Public Domain | v1.0.2 2 | 3 | function selectorsToArray (css) { 4 | // Regex to detect @media (stuff) then { 5 | var mediaQ = /(?:@media.*?\{)/igm; 6 | // Regex to detect //single line comments 7 | var comment = /(?:\/\/.*?\n)/ig; 8 | // Regex to detext /* multi-line comments */ 9 | var comments = /(?:\/\*(.|\n)*?\*\/)/igm; 10 | // Check if the CSS contains any media queries 11 | if (mediaQ.test(css)) { 12 | // Remove all media queries, they are not selectors 13 | css = css.replace(mediaQ, ''); 14 | } 15 | // Check if the CSS contains single line comments 16 | if (comment.test(css)) { 17 | // Remove all comments, they are not selectors 18 | css = css.replace(comment, ''); 19 | } 20 | // Check if the CSS contains multi-line comments 21 | if (comments.test(css)) { 22 | // Remove all comments, they are not selectors 23 | css = css.replace(comments, ''); 24 | } 25 | 26 | // Split the whole thing based on opening curly braces 27 | css = css.split("{"); 28 | // Loop through the split in the most performant way possible 29 | for (var i = (css.length - 1); i >= 0; i--) { 30 | // Remove excess whitespace and split on the ending curly brace 31 | var splitEndBracket = css[i].trim().split("}"); 32 | // If there was a ending curly brace grab the last item in the split array 33 | // I'm not sure if that .trim(); actually does anything here, but leaving it in case it fixes fringe cases. 34 | css[i] = splitEndBracket[splitEndBracket.length - 1] || css[i].trim(); 35 | // If there are comma separated CSS selectors 36 | if (css[i].indexOf(',') > -1) { 37 | // Split based on comma separation 38 | css[i] = css[i].split(',') 39 | // Loop through the comma separated selectors performantly 40 | for (var j = (css[i].length - 1); j >= 0; j--) { 41 | // Remove excess white space from each selector 42 | css[i][j] = css[i][j].trim(); 43 | } 44 | // Flatten the CSS array so it does not contain arrays within arrays 45 | // .me, .you, .everyone-we-know ==> [[".me", ".you", ".everyone-we-know"]] ==> [".me", ".you", ".everyone-we-know"] 46 | css = [].concat.apply([], css); 47 | } 48 | // One last remove whitespace (this does actually catch things) 49 | css[i] = css[i].trim(); 50 | } 51 | 52 | // Remove the last property/value pair and ending closing brace 53 | // [".thing", "", "h1", "font-size: 20px;}"] ==> [".thing", "", "h1"] 54 | css.pop(); 55 | 56 | // Remove any empty strings from the array 57 | // [".thing", "", "h1"] ==> [".thing", "h1"] 58 | css = css.filter(Boolean) 59 | 60 | var arrayOfSelectors = css; 61 | 62 | // Return an array of CSS Selectors in the order they were in the CSS file with none removed/missing 63 | return(arrayOfSelectors); 64 | } 65 | -------------------------------------------------------------------------------- /css/style.css: -------------------------------------------------------------------------------- 1 | html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none}table{border-collapse:collapse;border-spacing:0}/*!normalize.css v2.1.3|MIT License|git.io/normalize*/article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:0.67em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{box-sizing:content-box;height:0}mark{background:#FF0;color:#000}code,kbd,pre,samp{font-family:monospace, serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{border:1px solid #C0C0C0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}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}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}body{background:#F2F2F2;color:#4183D7;font:400 16px roboto, helvetica, arial}h1{margin-bottom:0px}#wrapper{width:650px;background:white;margin:2em auto;padding:1em;box-shadow:0px 5px 10px rgba(0,0,0,0.1)}.explanation{display:inline-block;margin-bottom:3em}.chart{position:relative;display:flex;width:600px;height:300px;border-bottom:1px solid #d4e3f6;margin:auto;padding-left:50px;justify-content:space-between}.chart .chartMeasurements{position:absolute;top:0px;left:0px;display:flex;width:100%;height:100%;text-align:left;justify-content:space-between;flex-direction:column;z-index:1}.chart .chartMeasurements .chartMeasurement{width:100%;border-top:1px solid #d4e3f6;flex-grow:1}.chart svg{position:relative;z-index:2}.chart svg polygon{box-shadow:inset 2px 0px red;fill:rgba(65,131,215,0.6)}.chart{margin:0px auto 30px}.explanation{display:none}textarea{font-family:monospace;font-size:15px}#paste{width:100%;height:90px;margin:8px 0px 20px 0px}#data{display:inline-block;margin:10px 0px}.data{width:100%;height:300px;margin:0px 0px 28px 0px}#pills{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;top:1px;display:inline-block;margin:13px 0px 0px 0px;float:right}#pills li{display:inline-block;border:1px solid #4183D7;border-radius:11px 11px 0px 0px;margin:0px;padding:3px 5px;cursor:pointer}#pills li.selected{background:#4183D7;color:#FFF;cursor:default} 2 | -------------------------------------------------------------------------------- /js/ven.svglinegraph.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | //http://codepen.io/alanmenhennet/pen/WxrXww 4 | 5 | 6 | var chart = { 7 | element : "", 8 | chart : "", 9 | polygon : "", 10 | width : 100, 11 | height : 50, 12 | maxValue : 0, 13 | values : [], 14 | points : [], 15 | vSteps : 5, 16 | measurements : [], 17 | 18 | calcMeasure: function () { 19 | this.measurements = []; 20 | for (var x = 0; x < this.vSteps; x++) { 21 | var measurement = Math.ceil((this.maxValue / this.vSteps) * (x +1)); 22 | this.measurements.push(measurement); 23 | } 24 | 25 | this.measurements.reverse(); 26 | }, 27 | /** 28 | * Get Element 29 | * Take the selector being passed, determine if 30 | * the selector is a class (".") or an id ("#"), and get the element 31 | * @param {String} element - the element selector 32 | */ 33 | getElement: function (element) { 34 | if (element.indexOf(".") == 0) { 35 | this.element = document.getElementsByClassName("chart")[0] 36 | } 37 | else if (element.indexOf("#") == 0) { 38 | this.element = document.getElementById("chart"); 39 | } 40 | else { 41 | console.error("Please select a valid element"); 42 | } 43 | }, 44 | /** 45 | * Create Chart 46 | * - calc the max value 47 | * - calc the points for the polygon 48 | * - create a chart 49 | * - set width, height, and viewbox attributes on 50 | * - create a 51 | * - set points on 52 | * - calc the vertical measurements 53 | * @param {array} values - the values to plot on the chart 54 | */ 55 | createChart: function (element, values) { 56 | this.getElement(element); 57 | this.values = values; 58 | 59 | // Do some calculations 60 | this.calcMaxValue(); 61 | this.calcPoints(); 62 | this.calcMeasure(); 63 | 64 | // Clear any existing 65 | this.element.innerHTML = ""; 66 | 67 | // Create the 68 | this.chart = document.createElementNS("http://www.w3.org/2000/svg", "svg"); 69 | this.chart.setAttribute("width", "100%"); 70 | this.chart.setAttribute("height", "100%"); 71 | this.chart.setAttribute("viewBox", "0 0 " + chart.width + " " + chart.height); 72 | 73 | // Create the 74 | this.polygon = document.createElementNS('http://www.w3.org/2000/svg','polygon'); 75 | this.polygon.setAttribute("points", this.points); 76 | this.polygon.setAttribute("class", "line"); 77 | 78 | if (this.values.length > 1) { 79 | var measurements = document.createElement("div"); 80 | measurements.setAttribute("class", "chartMeasurements"); 81 | for (var x = 0; x < this.measurements.length; x++) { 82 | var measurement = document.createElement("div"); 83 | measurement.setAttribute("class", "chartMeasurement"); 84 | measurement.innerHTML = this.measurements[x]; 85 | measurements.appendChild(measurement); 86 | } 87 | 88 | this.element.appendChild(measurements); 89 | // Append the to the target
90 | this.element.appendChild(this.chart); 91 | // Append the polygon to the target 92 | this.chart.appendChild(this.polygon); 93 | } 94 | }, 95 | /** 96 | * Calc Points 97 | * Calculate all the points for the polygon 98 | */ 99 | calcPoints: function () { 100 | this.points = []; 101 | if (this.values.length > 1) { 102 | // First point is bottom left hand side (max value is the bottom of graph) 103 | var points = "0," + chart.height + " "; 104 | // Loop through each value 105 | for (var x = 0; x < this.values.length; x++) { 106 | // Calculate the perecentage of this value/the max value 107 | var perc = this.values[x] / this.maxValue; 108 | // Steps is a percentage (100) / the total amount of values 109 | var steps = 100 / ( this.values.length - 1 ); 110 | // Create the point, limit points to 2 decimal points, 111 | // Y co-ord is calculated by the taking the chart height, 112 | // then subtracting (chart height * the percentage of this point) 113 | // Remember the & co-ord is measured from the top not the bottom like a traditional graph 114 | var point = (steps * (x )).toFixed(2) + "," + (this.height - (this.height * perc)).toFixed(2) + " "; 115 | // Add this point 116 | points += point; 117 | } 118 | // Add the final point (bottom right) 119 | points += "100," + this.height; 120 | this.points = points; 121 | } 122 | // output the values for display 123 | document.getElementById("yourValues").innerHTML= this.values; 124 | }, 125 | /** 126 | * Calculate Max Value 127 | * Find the highest value in the array, and then 128 | * add 10% to it so the graph doesn't touch the top of the chart 129 | */ 130 | calcMaxValue: function () { 131 | this.maxValue = 0; 132 | for (var x = 0; x < this.values.length; x++) { 133 | if (this.values[x] > this.maxValue) { 134 | this.maxValue = this.values[x]; 135 | } 136 | } 137 | // Round up to next integer 138 | this.maxValue = Math.ceil(this.maxValue); 139 | } 140 | } 141 | 142 | var values = []; 143 | 144 | function addValue() { 145 | var input = document.getElementById("value"); 146 | var value = parseInt(input.value); 147 | 148 | if (!isNaN(value)) { 149 | values.push(value); 150 | chart.createChart('.chart',values); 151 | } 152 | 153 | input.value = ""; 154 | } 155 | 156 | function clearChart() { 157 | values = []; 158 | chart.createChart('.chart',values); 159 | } 160 | -------------------------------------------------------------------------------- /sass/_ven.normalize.sass: -------------------------------------------------------------------------------- 1 | 2 | //Resets the default styles in all browsers so they don't render things differently by default. 3 | 4 | /*!normalize.css v2.1.3|MIT License|git.io/normalize*/ 5 | 6 | // HTML5 DISPLAY DEFINITIONS 7 | 8 | // Correct `block` display not defined in IE 8/9. 9 | 10 | article, 11 | aside, 12 | details, 13 | figcaption, 14 | figure, 15 | footer, 16 | header, 17 | hgroup, 18 | main, 19 | nav, 20 | section, 21 | summary 22 | display: block 23 | 24 | // Correct `inline-block` display not defined in IE 8/9. 25 | 26 | audio, 27 | canvas, 28 | video 29 | display: inline-block 30 | 31 | // Prevent modern browsers from displaying `audio` without controls. 32 | // Remove excess height in iOS 5 devices. 33 | 34 | audio:not([controls]) 35 | display: none 36 | height: 0 37 | 38 | // Address `[hidden]` styling not present in IE 8/9. 39 | // Hide the `template` element in IE, Safari, and Firefox < 22. 40 | 41 | [hidden], 42 | template 43 | display: none 44 | 45 | // BASE 46 | 47 | // 1. Set default font family to sans-serif. 48 | // 2. Prevent iOS text size adjust after orientation change, without disabling 49 | // user zoom. 50 | 51 | html 52 | font-family: sans-serif 53 | -webkit-text-size-adjust: 100% 54 | 55 | // Remove default margin. 56 | 57 | body 58 | margin: 0 59 | 60 | // LINKS 61 | 62 | // Remove the gray background color from active links in IE 10. 63 | 64 | a 65 | background: transparent 66 | 67 | // Address `outline` inconsistency between Chrome and other browsers. 68 | 69 | a:focus 70 | outline: thin dotted 71 | 72 | // Improve readability when focused and also mouse hovered in all browsers. 73 | 74 | a:active, 75 | a:hover 76 | outline: 0 77 | 78 | // TYPOGRAPHY 79 | 80 | // Address variable `h1` font-size and margin within `section` and `article` 81 | // contexts in Firefox 4+, Safari 5, and Chrome. 82 | 83 | h1 84 | font-size: 2em 85 | margin: 0.67em 0 86 | 87 | // Address styling not present in IE 8/9, Safari 5, and Chrome. 88 | 89 | abbr[title] 90 | border-bottom: 1px dotted 91 | 92 | // Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. 93 | 94 | b, 95 | strong 96 | font-weight: bold 97 | 98 | // Address styling not present in Safari 5 and Chrome. 99 | 100 | dfn 101 | font-style: italic 102 | 103 | // Address differences between Firefox and other browsers. 104 | 105 | hr 106 | box-sizing: content-box 107 | height: 0 108 | 109 | // Address styling not present in IE 8/9. 110 | 111 | mark 112 | background: #FF0 113 | color: #000 114 | 115 | // Correct font family set oddly in Safari 5 and Chrome. 116 | 117 | code, 118 | kbd, 119 | pre, 120 | samp 121 | font-family: monospace, serif 122 | font-size: 1em 123 | 124 | // Improve readability of pre-formatted text in all browsers. 125 | 126 | pre 127 | white-space: pre-wrap 128 | 129 | // Set consistent quote types. 130 | 131 | q 132 | quotes: "\201C" "\201D" "\2018" "\2019" 133 | 134 | // Address inconsistent and variable font size in all browsers. 135 | 136 | small 137 | font-size: 80% 138 | 139 | // Prevent `sub` and `sup` affecting `line-height` in all browsers. 140 | 141 | sub, 142 | sup 143 | font-size: 75% 144 | line-height: 0 145 | position: relative 146 | vertical-align: baseline 147 | 148 | sup 149 | top: -0.5em 150 | 151 | sub 152 | bottom: -0.25em 153 | 154 | // EMBEDDED CONTENT 155 | 156 | // Remove border when inside `a` element in IE 8/9. 157 | 158 | img 159 | border: 0 160 | 161 | // Correct overflow displayed oddly in IE 9. 162 | 163 | svg:not(:root) 164 | overflow: hidden 165 | 166 | // FIGURES 167 | 168 | // Address margin not present in IE 8/9 and Safari 5. 169 | 170 | figure 171 | margin: 0 172 | 173 | // FORMS 174 | 175 | // Define consistent border, margin, and padding. 176 | 177 | fieldset 178 | border: 1px solid #C0C0C0 179 | margin: 0 2px 180 | padding: 0.35em 0.625em 0.75em 181 | 182 | // 1. Correct `color` not being inherited in IE 8/9. 183 | // 2. Remove padding so people aren't caught out if they zero out fieldsets. 184 | 185 | legend 186 | border: 0 187 | padding: 0 188 | 189 | // 1. Correct font family not being inherited in all browsers. 190 | // 2. Correct font size not being inherited in all browsers. 191 | // 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. 192 | 193 | button, 194 | input, 195 | select, 196 | textarea 197 | font-family: inherit 198 | font-size: 100% 199 | margin: 0 200 | 201 | // Address Firefox 4+ setting `line-height` on `input` using `!important` in 202 | // the UA stylesheet. 203 | 204 | button, 205 | input 206 | line-height: normal 207 | 208 | // Address inconsistent `text-transform` inheritance for `button` and `select`. 209 | // All other form control elements do not inherit `text-transform` values. 210 | // Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. 211 | // Correct `select` style inheritance in Firefox 4+ and Opera. 212 | 213 | button, 214 | select 215 | text-transform: none 216 | 217 | // 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` 218 | // and `video` controls. 219 | // 2. Correct inability to style clickable `input` types in iOS. 220 | // 3. Improve usability and consistency of cursor style between image-type 221 | // `input` and others. 222 | 223 | button, 224 | html input[type="button"], 225 | input[type="reset"], 226 | input[type="submit"] 227 | -webkit-appearance: button 228 | cursor: pointer 229 | 230 | // Re-set default cursor for disabled elements. 231 | 232 | button[disabled], 233 | html input[disabled] 234 | cursor: default 235 | 236 | // 1. Address box sizing set to `content-box` in IE 8/9/10. 237 | // 2. Remove excess padding in IE 8/9/10. 238 | 239 | input[type="checkbox"], 240 | input[type="radio"] 241 | box-sizing: border-box 242 | padding: 0 243 | 244 | // 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 245 | // 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome 246 | // (include `-moz` to future-proof). 247 | 248 | input[type="search"] 249 | -webkit-appearance: textfield 250 | box-sizing: content-box 251 | 252 | // Remove inner padding and search cancel button in Safari 5 and Chrome 253 | // on OS X. 254 | 255 | input[type="search"]::-webkit-search-cancel-button, 256 | input[type="search"]::-webkit-search-decoration 257 | -webkit-appearance: none 258 | 259 | // Remove inner padding and border in Firefox 4+. 260 | 261 | button::-moz-focus-inner, 262 | input::-moz-focus-inner 263 | border: 0 264 | padding: 0 265 | 266 | // 1. Remove default vertical scrollbar in IE 8/9. 267 | // 2. Improve readability and alignment in all browsers. 268 | 269 | textarea 270 | overflow: auto 271 | vertical-align: top 272 | 273 | // TABLES 274 | 275 | // Remove most spacing between table cells. 276 | 277 | table 278 | border-collapse: collapse 279 | border-spacing: 0 280 | -------------------------------------------------------------------------------- /js/ven.specificity.js: -------------------------------------------------------------------------------- 1 | //MIT: https://github.com/keeganstreet/specificity 2 | 3 | var SPECIFICITY = (function() { 4 | var calculate, 5 | calculateSingle, 6 | compare; 7 | 8 | // Calculate the specificity for a selector by dividing it into simple selectors and counting them 9 | calculate = function(input) { 10 | var selectors, 11 | selector, 12 | i, 13 | len, 14 | results = []; 15 | 16 | // Separate input by commas 17 | selectors = input.split(','); 18 | 19 | for (i = 0, len = selectors.length; i < len; i += 1) { 20 | selector = selectors[i]; 21 | if (selector.length > 0) { 22 | results.push(calculateSingle(selector)); 23 | } 24 | } 25 | 26 | return results; 27 | }; 28 | 29 | /** 30 | * Calculates the specificity of CSS selectors 31 | * http://www.w3.org/TR/css3-selectors/#specificity 32 | * 33 | * Returns an object with the following properties: 34 | * - selector: the input 35 | * - specificity: e.g. 0,1,0,0 36 | * - parts: array with details about each part of the selector that counts towards the specificity 37 | * - specificityArray: e.g. [0, 1, 0, 0] 38 | */ 39 | calculateSingle = function(input) { 40 | var selector = input, 41 | findMatch, 42 | typeCount = { 43 | 'a': 0, 44 | 'b': 0, 45 | 'c': 0 46 | }, 47 | parts = [], 48 | // The following regular expressions assume that selectors matching the preceding regular expressions have been removed 49 | attributeRegex = /(\[[^\]]+\])/g, 50 | idRegex = /(#[^\s\+>~\.\[:]+)/g, 51 | classRegex = /(\.[^\s\+>~\.\[:]+)/g, 52 | pseudoElementRegex = /(::[^\s\+>~\.\[:]+|:first-line|:first-letter|:before|:after)/gi, 53 | // A regex for pseudo classes with brackets - :nth-child(), :nth-last-child(), :nth-of-type(), :nth-last-type(), :lang() 54 | pseudoClassWithBracketsRegex = /(:[\w-]+\([^\)]*\))/gi, 55 | // A regex for other pseudo classes, which don't have brackets 56 | pseudoClassRegex = /(:[^\s\+>~\.\[:]+)/g, 57 | elementRegex = /([^\s\+>~\.\[:]+)/g; 58 | 59 | // Find matches for a regular expression in a string and push their details to parts 60 | // Type is "a" for IDs, "b" for classes, attributes and pseudo-classes and "c" for elements and pseudo-elements 61 | findMatch = function(regex, type) { 62 | var matches, i, len, match, index, length; 63 | if (regex.test(selector)) { 64 | matches = selector.match(regex); 65 | for (i = 0, len = matches.length; i < len; i += 1) { 66 | typeCount[type] += 1; 67 | match = matches[i]; 68 | index = selector.indexOf(match); 69 | length = match.length; 70 | parts.push({ 71 | selector: input.substr(index, length), 72 | type: type, 73 | index: index, 74 | length: length 75 | }); 76 | // Replace this simple selector with whitespace so it won't be counted in further simple selectors 77 | selector = selector.replace(match, Array(length + 1).join(' ')); 78 | } 79 | } 80 | }; 81 | 82 | // Replace escaped characters with plain text, using the "A" character 83 | // https://www.w3.org/TR/CSS21/syndata.html#characters 84 | (function() { 85 | var replaceWithPlainText = function(regex) { 86 | var matches, i, len, match; 87 | if (regex.test(selector)) { 88 | matches = selector.match(regex); 89 | for (i = 0, len = matches.length; i < len; i += 1) { 90 | match = matches[i]; 91 | selector = selector.replace(match, Array(match.length + 1).join('A')); 92 | } 93 | } 94 | }, 95 | // Matches a backslash followed by six hexadecimal digits followed by an optional single whitespace character 96 | escapeHexadecimalRegex = /\\[0-9A-Fa-f]{6}\s?/g, 97 | // Matches a backslash followed by fewer than six hexadecimal digits followed by a mandatory single whitespace character 98 | escapeHexadecimalRegex2 = /\\[0-9A-Fa-f]{1,5}\s/g, 99 | // Matches a backslash followed by any character 100 | escapeSpecialCharacter = /\\./g; 101 | 102 | replaceWithPlainText(escapeHexadecimalRegex); 103 | replaceWithPlainText(escapeHexadecimalRegex2); 104 | replaceWithPlainText(escapeSpecialCharacter); 105 | }()); 106 | 107 | // Remove the negation psuedo-class (:not) but leave its argument because specificity is calculated on its argument 108 | (function() { 109 | var regex = /:not\(([^\)]*)\)/g; 110 | if (regex.test(selector)) { 111 | selector = selector.replace(regex, ' $1 '); 112 | } 113 | }()); 114 | 115 | // Remove anything after a left brace in case a user has pasted in a rule, not just a selector 116 | (function() { 117 | var regex = /{[^]*/gm, 118 | matches, i, len, match; 119 | if (regex.test(selector)) { 120 | matches = selector.match(regex); 121 | for (i = 0, len = matches.length; i < len; i += 1) { 122 | match = matches[i]; 123 | selector = selector.replace(match, Array(match.length + 1).join(' ')); 124 | } 125 | } 126 | }()); 127 | 128 | // Add attribute selectors to parts collection (type b) 129 | findMatch(attributeRegex, 'b'); 130 | 131 | // Add ID selectors to parts collection (type a) 132 | findMatch(idRegex, 'a'); 133 | 134 | // Add class selectors to parts collection (type b) 135 | findMatch(classRegex, 'b'); 136 | 137 | // Add pseudo-element selectors to parts collection (type c) 138 | findMatch(pseudoElementRegex, 'c'); 139 | 140 | // Add pseudo-class selectors to parts collection (type b) 141 | findMatch(pseudoClassWithBracketsRegex, 'b'); 142 | findMatch(pseudoClassRegex, 'b'); 143 | 144 | // Remove universal selector and separator characters 145 | selector = selector.replace(/[\*\s\+>~]/g, ' '); 146 | 147 | // Remove any stray dots or hashes which aren't attached to words 148 | // These may be present if the user is live-editing this selector 149 | selector = selector.replace(/[#\.]/g, ' '); 150 | 151 | // The only things left should be element selectors (type c) 152 | findMatch(elementRegex, 'c'); 153 | 154 | // Order the parts in the order they appear in the original selector 155 | // This is neater for external apps to deal with 156 | parts.sort(function(a, b) { 157 | return a.index - b.index; 158 | }); 159 | 160 | return { 161 | selector: input, 162 | specificity: '0,' + typeCount.a.toString() + ',' + typeCount.b.toString() + ',' + typeCount.c.toString(), 163 | specificityArray: [0, typeCount.a, typeCount.b, typeCount.c], 164 | parts: parts 165 | }; 166 | }; 167 | 168 | /** 169 | * Compares two CSS selectors for specificity 170 | * Alternatively you can replace one of the CSS selectors with a specificity array 171 | * 172 | * - it returns -1 if a has a lower specificity than b 173 | * - it returns 1 if a has a higher specificity than b 174 | * - it returns 0 if a has the same specificity than b 175 | */ 176 | compare = function(a, b) { 177 | var aSpecificity, 178 | bSpecificity, 179 | i; 180 | 181 | if (typeof a ==='string') { 182 | if (a.indexOf(',') !== -1) { 183 | throw 'Invalid CSS selector'; 184 | } else { 185 | aSpecificity = calculateSingle(a)['specificityArray']; 186 | } 187 | } else if (Array.isArray(a)) { 188 | if (a.filter(function(e) { return (typeof e === 'number'); }).length !== 4) { 189 | throw 'Invalid specificity array'; 190 | } else { 191 | aSpecificity = a; 192 | } 193 | } else { 194 | throw 'Invalid CSS selector or specificity array'; 195 | } 196 | 197 | if (typeof b ==='string') { 198 | if (b.indexOf(',') !== -1) { 199 | throw 'Invalid CSS selector'; 200 | } else { 201 | bSpecificity = calculateSingle(b)['specificityArray']; 202 | } 203 | } else if (Array.isArray(b)) { 204 | if (b.filter(function(e) { return (typeof e === 'number'); }).length !== 4) { 205 | throw 'Invalid specificity array'; 206 | } else { 207 | bSpecificity = b; 208 | } 209 | } else { 210 | throw 'Invalid CSS selector or specificity array'; 211 | } 212 | 213 | for (i = 0; i < 4; i += 1) { 214 | if (aSpecificity[i] < bSpecificity[i]) { 215 | return -1; 216 | } else if (aSpecificity[i] > bSpecificity[i]) { 217 | return 1; 218 | } 219 | } 220 | 221 | return 0; 222 | }; 223 | 224 | return { 225 | calculate: calculate, 226 | compare: compare 227 | }; 228 | }()); 229 | 230 | // Export for Node JS 231 | if (typeof exports !== 'undefined') { 232 | exports.calculate = SPECIFICITY.calculate; 233 | exports.compare = SPECIFICITY.compare; 234 | } -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ITCSS Specificity Graph 6 | 7 | 8 | 9 | 10 | 11 | 47 | Scout-App logo icon 48 | 49 | 50 | 51 | 52 | 53 | 54 |
55 |

Graph My CSS

56 | 57 |

This graph shows the specificity of your CSS selectors throughout your file. The left side is the first selector and the right side is the last one. Idealy you will have very low specificity throughout your whole file, and any higher specificity selectors will come at the end. This means you are overriding fewer things, and in turn, writing less redundent, and more maintainable CSS. This is heavily influenced by the ITCSS methodology.

Watch an hour long video explaining these ideas in detail, or get the TLDR in 3 pictures.

58 | 59 |
60 |

61 |
62 |
63 | 64 |

Paste your CSS:

65 | 73 | 74 |

Your data:

75 | 80 | 81 | 82 | 83 |

How should I organize my Sass files? Here's an example of one way.

84 |
85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 157 | 158 | 159 | 160 | 161 | 162 | 184 | 185 | 186 | -------------------------------------------------------------------------------- /js/ven.reworkcss.js: -------------------------------------------------------------------------------- 1 | // This file is from: 2 | // https://github.com/reworkcss/css/blob/master/lib/parse/index.js 3 | // We modified line 9 for browser use. 4 | 5 | // http://www.w3.org/TR/CSS21/grammar.html 6 | // https://github.com/visionmedia/css-parse/pull/49#issuecomment-30088027 7 | var commentre = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//g 8 | 9 | window.cssParse = function (css, options) { 10 | options = options || {}; 11 | 12 | /** 13 | * Positional. 14 | */ 15 | 16 | var lineno = 1; 17 | var column = 1; 18 | 19 | /** 20 | * Update lineno and column based on `str`. 21 | */ 22 | 23 | function updatePosition(str) { 24 | var lines = str.match(/\n/g); 25 | if (lines) lineno += lines.length; 26 | var i = str.lastIndexOf('\n'); 27 | column = ~i ? str.length - i : column + str.length; 28 | } 29 | 30 | /** 31 | * Mark position and patch `node.position`. 32 | */ 33 | 34 | function position() { 35 | var start = { line: lineno, column: column }; 36 | return function(node){ 37 | node.position = new Position(start); 38 | whitespace(); 39 | return node; 40 | }; 41 | } 42 | 43 | /** 44 | * Store position information for a node 45 | */ 46 | 47 | function Position(start) { 48 | this.start = start; 49 | this.end = { line: lineno, column: column }; 50 | this.source = options.source; 51 | } 52 | 53 | /** 54 | * Non-enumerable source string 55 | */ 56 | 57 | Position.prototype.content = css; 58 | 59 | /** 60 | * Error `msg`. 61 | */ 62 | 63 | var errorsList = []; 64 | 65 | function error(msg) { 66 | var err = new Error(options.source + ':' + lineno + ':' + column + ': ' + msg); 67 | err.reason = msg; 68 | err.filename = options.source; 69 | err.line = lineno; 70 | err.column = column; 71 | err.source = css; 72 | 73 | if (options.silent) { 74 | errorsList.push(err); 75 | } else { 76 | throw err; 77 | } 78 | } 79 | 80 | /** 81 | * Parse stylesheet. 82 | */ 83 | 84 | function stylesheet() { 85 | var rulesList = rules(); 86 | 87 | return { 88 | type: 'stylesheet', 89 | stylesheet: { 90 | source: options.source, 91 | rules: rulesList, 92 | parsingErrors: errorsList 93 | } 94 | }; 95 | } 96 | 97 | /** 98 | * Opening brace. 99 | */ 100 | 101 | function open() { 102 | return match(/^{\s*/); 103 | } 104 | 105 | /** 106 | * Closing brace. 107 | */ 108 | 109 | function close() { 110 | return match(/^}/); 111 | } 112 | 113 | /** 114 | * Parse ruleset. 115 | */ 116 | 117 | function rules() { 118 | var node; 119 | var rules = []; 120 | whitespace(); 121 | comments(rules); 122 | while (css.length && css.charAt(0) != '}' && (node = atrule() || rule())) { 123 | if (node !== false) { 124 | rules.push(node); 125 | comments(rules); 126 | } 127 | } 128 | return rules; 129 | } 130 | 131 | /** 132 | * Match `re` and return captures. 133 | */ 134 | 135 | function match(re) { 136 | var m = re.exec(css); 137 | if (!m) return; 138 | var str = m[0]; 139 | updatePosition(str); 140 | css = css.slice(str.length); 141 | return m; 142 | } 143 | 144 | /** 145 | * Parse whitespace. 146 | */ 147 | 148 | function whitespace() { 149 | match(/^\s*/); 150 | } 151 | 152 | /** 153 | * Parse comments; 154 | */ 155 | 156 | function comments(rules) { 157 | var c; 158 | rules = rules || []; 159 | while (c = comment()) { 160 | if (c !== false) { 161 | rules.push(c); 162 | } 163 | } 164 | return rules; 165 | } 166 | 167 | /** 168 | * Parse comment. 169 | */ 170 | 171 | function comment() { 172 | var pos = position(); 173 | if ('/' != css.charAt(0) || '*' != css.charAt(1)) return; 174 | 175 | var i = 2; 176 | while ("" != css.charAt(i) && ('*' != css.charAt(i) || '/' != css.charAt(i + 1))) ++i; 177 | i += 2; 178 | 179 | if ("" === css.charAt(i-1)) { 180 | return error('End of comment missing'); 181 | } 182 | 183 | var str = css.slice(2, i - 2); 184 | column += 2; 185 | updatePosition(str); 186 | css = css.slice(i); 187 | column += 2; 188 | 189 | return pos({ 190 | type: 'comment', 191 | comment: str 192 | }); 193 | } 194 | 195 | /** 196 | * Parse selector. 197 | */ 198 | 199 | function selector() { 200 | var m = match(/^([^{]+)/); 201 | if (!m) return; 202 | /* @fix Remove all comments from selectors 203 | * http://ostermiller.org/findcomment.html */ 204 | return trim(m[0]) 205 | .replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*\/+/g, '') 206 | .replace(/"(?:\\"|[^"])*"|'(?:\\'|[^'])*'/g, function(m) { 207 | return m.replace(/,/g, '\u200C'); 208 | }) 209 | .split(/\s*(?![^(]*\)),\s*/) 210 | .map(function(s) { 211 | return s.replace(/\u200C/g, ','); 212 | }); 213 | } 214 | 215 | /** 216 | * Parse declaration. 217 | */ 218 | 219 | function declaration() { 220 | var pos = position(); 221 | 222 | // prop 223 | var prop = match(/^(\*?[-#\/\*\\\w]+(\[[0-9a-z_-]+\])?)\s*/); 224 | if (!prop) return; 225 | prop = trim(prop[0]); 226 | 227 | // : 228 | if (!match(/^:\s*/)) return error("property missing ':'"); 229 | 230 | // val 231 | var val = match(/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^\)]*?\)|[^};])+)/); 232 | 233 | var ret = pos({ 234 | type: 'declaration', 235 | property: prop.replace(commentre, ''), 236 | value: val ? trim(val[0]).replace(commentre, '') : '' 237 | }); 238 | 239 | // ; 240 | match(/^[;\s]*/); 241 | 242 | return ret; 243 | } 244 | 245 | /** 246 | * Parse declarations. 247 | */ 248 | 249 | function declarations() { 250 | var decls = []; 251 | 252 | if (!open()) return error("missing '{'"); 253 | comments(decls); 254 | 255 | // declarations 256 | var decl; 257 | while (decl = declaration()) { 258 | if (decl !== false) { 259 | decls.push(decl); 260 | comments(decls); 261 | } 262 | } 263 | 264 | if (!close()) return error("missing '}'"); 265 | return decls; 266 | } 267 | 268 | /** 269 | * Parse keyframe. 270 | */ 271 | 272 | function keyframe() { 273 | var m; 274 | var vals = []; 275 | var pos = position(); 276 | 277 | while (m = match(/^((\d+\.\d+|\.\d+|\d+)%?|[a-z]+)\s*/)) { 278 | vals.push(m[1]); 279 | match(/^,\s*/); 280 | } 281 | 282 | if (!vals.length) return; 283 | 284 | return pos({ 285 | type: 'keyframe', 286 | values: vals, 287 | declarations: declarations() 288 | }); 289 | } 290 | 291 | /** 292 | * Parse keyframes. 293 | */ 294 | 295 | function atkeyframes() { 296 | var pos = position(); 297 | var m = match(/^@([-\w]+)?keyframes\s*/); 298 | 299 | if (!m) return; 300 | var vendor = m[1]; 301 | 302 | // identifier 303 | var m = match(/^([-\w]+)\s*/); 304 | if (!m) return error("@keyframes missing name"); 305 | var name = m[1]; 306 | 307 | if (!open()) return error("@keyframes missing '{'"); 308 | 309 | var frame; 310 | var frames = comments(); 311 | while (frame = keyframe()) { 312 | frames.push(frame); 313 | frames = frames.concat(comments()); 314 | } 315 | 316 | if (!close()) return error("@keyframes missing '}'"); 317 | 318 | return pos({ 319 | type: 'keyframes', 320 | name: name, 321 | vendor: vendor, 322 | keyframes: frames 323 | }); 324 | } 325 | 326 | /** 327 | * Parse supports. 328 | */ 329 | 330 | function atsupports() { 331 | var pos = position(); 332 | var m = match(/^@supports *([^{]+)/); 333 | 334 | if (!m) return; 335 | var supports = trim(m[1]); 336 | 337 | if (!open()) return error("@supports missing '{'"); 338 | 339 | var style = comments().concat(rules()); 340 | 341 | if (!close()) return error("@supports missing '}'"); 342 | 343 | return pos({ 344 | type: 'supports', 345 | supports: supports, 346 | rules: style 347 | }); 348 | } 349 | 350 | /** 351 | * Parse host. 352 | */ 353 | 354 | function athost() { 355 | var pos = position(); 356 | var m = match(/^@host\s*/); 357 | 358 | if (!m) return; 359 | 360 | if (!open()) return error("@host missing '{'"); 361 | 362 | var style = comments().concat(rules()); 363 | 364 | if (!close()) return error("@host missing '}'"); 365 | 366 | return pos({ 367 | type: 'host', 368 | rules: style 369 | }); 370 | } 371 | 372 | /** 373 | * Parse media. 374 | */ 375 | 376 | function atmedia() { 377 | var pos = position(); 378 | var m = match(/^@media *([^{]+)/); 379 | 380 | if (!m) return; 381 | var media = trim(m[1]); 382 | 383 | if (!open()) return error("@media missing '{'"); 384 | 385 | var style = comments().concat(rules()); 386 | 387 | if (!close()) return error("@media missing '}'"); 388 | 389 | return pos({ 390 | type: 'media', 391 | media: media, 392 | rules: style 393 | }); 394 | } 395 | 396 | 397 | /** 398 | * Parse custom-media. 399 | */ 400 | 401 | function atcustommedia() { 402 | var pos = position(); 403 | var m = match(/^@custom-media\s+(--[^\s]+)\s*([^{;]+);/); 404 | if (!m) return; 405 | 406 | return pos({ 407 | type: 'custom-media', 408 | name: trim(m[1]), 409 | media: trim(m[2]) 410 | }); 411 | } 412 | 413 | /** 414 | * Parse paged media. 415 | */ 416 | 417 | function atpage() { 418 | var pos = position(); 419 | var m = match(/^@page */); 420 | if (!m) return; 421 | 422 | var sel = selector() || []; 423 | 424 | if (!open()) return error("@page missing '{'"); 425 | var decls = comments(); 426 | 427 | // declarations 428 | var decl; 429 | while (decl = declaration()) { 430 | decls.push(decl); 431 | decls = decls.concat(comments()); 432 | } 433 | 434 | if (!close()) return error("@page missing '}'"); 435 | 436 | return pos({ 437 | type: 'page', 438 | selectors: sel, 439 | declarations: decls 440 | }); 441 | } 442 | 443 | /** 444 | * Parse document. 445 | */ 446 | 447 | function atdocument() { 448 | var pos = position(); 449 | var m = match(/^@([-\w]+)?document *([^{]+)/); 450 | if (!m) return; 451 | 452 | var vendor = trim(m[1]); 453 | var doc = trim(m[2]); 454 | 455 | if (!open()) return error("@document missing '{'"); 456 | 457 | var style = comments().concat(rules()); 458 | 459 | if (!close()) return error("@document missing '}'"); 460 | 461 | return pos({ 462 | type: 'document', 463 | document: doc, 464 | vendor: vendor, 465 | rules: style 466 | }); 467 | } 468 | 469 | /** 470 | * Parse font-face. 471 | */ 472 | 473 | function atfontface() { 474 | var pos = position(); 475 | var m = match(/^@font-face\s*/); 476 | if (!m) return; 477 | 478 | if (!open()) return error("@font-face missing '{'"); 479 | var decls = comments(); 480 | 481 | // declarations 482 | var decl; 483 | while (decl = declaration()) { 484 | decls.push(decl); 485 | decls = decls.concat(comments()); 486 | } 487 | 488 | if (!close()) return error("@font-face missing '}'"); 489 | 490 | return pos({ 491 | type: 'font-face', 492 | declarations: decls 493 | }); 494 | } 495 | 496 | /** 497 | * Parse import 498 | */ 499 | 500 | var atimport = _compileAtrule('import'); 501 | 502 | /** 503 | * Parse charset 504 | */ 505 | 506 | var atcharset = _compileAtrule('charset'); 507 | 508 | /** 509 | * Parse namespace 510 | */ 511 | 512 | var atnamespace = _compileAtrule('namespace'); 513 | 514 | /** 515 | * Parse non-block at-rules 516 | */ 517 | 518 | 519 | function _compileAtrule(name) { 520 | var re = new RegExp('^@' + name + '\\s*([^;]+);'); 521 | return function() { 522 | var pos = position(); 523 | var m = match(re); 524 | if (!m) return; 525 | var ret = { type: name }; 526 | ret[name] = m[1].trim(); 527 | return pos(ret); 528 | } 529 | } 530 | 531 | /** 532 | * Parse at rule. 533 | */ 534 | 535 | function atrule() { 536 | if (css[0] != '@') return; 537 | 538 | return atkeyframes() 539 | || atmedia() 540 | || atcustommedia() 541 | || atsupports() 542 | || atimport() 543 | || atcharset() 544 | || atnamespace() 545 | || atdocument() 546 | || atpage() 547 | || athost() 548 | || atfontface(); 549 | } 550 | 551 | /** 552 | * Parse rule. 553 | */ 554 | 555 | function rule() { 556 | var pos = position(); 557 | var sel = selector(); 558 | 559 | if (!sel) return error('selector missing'); 560 | comments(); 561 | 562 | return pos({ 563 | type: 'rule', 564 | selectors: sel, 565 | declarations: declarations() 566 | }); 567 | } 568 | 569 | return addParent(stylesheet()); 570 | }; 571 | 572 | /** 573 | * Trim `str`. 574 | */ 575 | 576 | function trim(str) { 577 | return str ? str.replace(/^\s+|\s+$/g, '') : ''; 578 | } 579 | 580 | /** 581 | * Adds non-enumerable parent node reference to each node. 582 | */ 583 | 584 | function addParent(obj, parent) { 585 | var isNode = obj && typeof obj.type === 'string'; 586 | var childParent = isNode ? obj : parent; 587 | 588 | for (var k in obj) { 589 | var value = obj[k]; 590 | if (Array.isArray(value)) { 591 | value.forEach(function(v) { addParent(v, childParent); }); 592 | } else if (value && typeof value === 'object') { 593 | addParent(value, childParent); 594 | } 595 | } 596 | 597 | if (isNode) { 598 | Object.defineProperty(obj, 'parent', { 599 | configurable: true, 600 | writable: true, 601 | enumerable: false, 602 | value: parent || null 603 | }); 604 | } 605 | 606 | return obj; 607 | } 608 | -------------------------------------------------------------------------------- /js/ven.jquery-2.2.3.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v2.2.3 | (c) jQuery Foundation | jquery.org/license */ 2 | !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.3",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){var b;if("object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype||{},"isPrototypeOf"))return!1;for(b in a);return void 0===b||k.call(a,b)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?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)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===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]||fa.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]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(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){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.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,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?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(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.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.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.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"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(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 va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c; 3 | }catch(e){}O.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length",""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,la=/\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("