'use strict'; var build = require('./dep-66eb515d.js'); var os = require('os'); var http = require('http'); var https = require('https'); var url = require('url'); var path = require('path'); var fs = require('fs'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e['default'] : e; } var os__default = /*#__PURE__*/_interopDefaultLegacy(os); var http__default = /*#__PURE__*/_interopDefaultLegacy(http); var https__default = /*#__PURE__*/_interopDefaultLegacy(https); var url__default = /*#__PURE__*/_interopDefaultLegacy(url); var path__default = /*#__PURE__*/_interopDefaultLegacy(path); var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs); function level0Optimize(tokens) { // noop as level 0 means no optimizations! return tokens; } var optimize$3 = level0Optimize; var COLORS = { aliceblue: '#f0f8ff', antiquewhite: '#faebd7', aqua: '#0ff', aquamarine: '#7fffd4', azure: '#f0ffff', beige: '#f5f5dc', bisque: '#ffe4c4', black: '#000', blanchedalmond: '#ffebcd', blue: '#00f', blueviolet: '#8a2be2', brown: '#a52a2a', burlywood: '#deb887', cadetblue: '#5f9ea0', chartreuse: '#7fff00', chocolate: '#d2691e', coral: '#ff7f50', cornflowerblue: '#6495ed', cornsilk: '#fff8dc', crimson: '#dc143c', cyan: '#0ff', darkblue: '#00008b', darkcyan: '#008b8b', darkgoldenrod: '#b8860b', darkgray: '#a9a9a9', darkgreen: '#006400', darkgrey: '#a9a9a9', darkkhaki: '#bdb76b', darkmagenta: '#8b008b', darkolivegreen: '#556b2f', darkorange: '#ff8c00', darkorchid: '#9932cc', darkred: '#8b0000', darksalmon: '#e9967a', darkseagreen: '#8fbc8f', darkslateblue: '#483d8b', darkslategray: '#2f4f4f', darkslategrey: '#2f4f4f', darkturquoise: '#00ced1', darkviolet: '#9400d3', deeppink: '#ff1493', deepskyblue: '#00bfff', dimgray: '#696969', dimgrey: '#696969', dodgerblue: '#1e90ff', firebrick: '#b22222', floralwhite: '#fffaf0', forestgreen: '#228b22', fuchsia: '#f0f', gainsboro: '#dcdcdc', ghostwhite: '#f8f8ff', gold: '#ffd700', goldenrod: '#daa520', gray: '#808080', green: '#008000', greenyellow: '#adff2f', grey: '#808080', honeydew: '#f0fff0', hotpink: '#ff69b4', indianred: '#cd5c5c', indigo: '#4b0082', ivory: '#fffff0', khaki: '#f0e68c', lavender: '#e6e6fa', lavenderblush: '#fff0f5', lawngreen: '#7cfc00', lemonchiffon: '#fffacd', lightblue: '#add8e6', lightcoral: '#f08080', lightcyan: '#e0ffff', lightgoldenrodyellow: '#fafad2', lightgray: '#d3d3d3', lightgreen: '#90ee90', lightgrey: '#d3d3d3', lightpink: '#ffb6c1', lightsalmon: '#ffa07a', lightseagreen: '#20b2aa', lightskyblue: '#87cefa', lightslategray: '#778899', lightslategrey: '#778899', lightsteelblue: '#b0c4de', lightyellow: '#ffffe0', lime: '#0f0', limegreen: '#32cd32', linen: '#faf0e6', magenta: '#ff00ff', maroon: '#800000', mediumaquamarine: '#66cdaa', mediumblue: '#0000cd', mediumorchid: '#ba55d3', mediumpurple: '#9370db', mediumseagreen: '#3cb371', mediumslateblue: '#7b68ee', mediumspringgreen: '#00fa9a', mediumturquoise: '#48d1cc', mediumvioletred: '#c71585', midnightblue: '#191970', mintcream: '#f5fffa', mistyrose: '#ffe4e1', moccasin: '#ffe4b5', navajowhite: '#ffdead', navy: '#000080', oldlace: '#fdf5e6', olive: '#808000', olivedrab: '#6b8e23', orange: '#ffa500', orangered: '#ff4500', orchid: '#da70d6', palegoldenrod: '#eee8aa', palegreen: '#98fb98', paleturquoise: '#afeeee', palevioletred: '#db7093', papayawhip: '#ffefd5', peachpuff: '#ffdab9', peru: '#cd853f', pink: '#ffc0cb', plum: '#dda0dd', powderblue: '#b0e0e6', purple: '#800080', rebeccapurple: '#663399', red: '#f00', rosybrown: '#bc8f8f', royalblue: '#4169e1', saddlebrown: '#8b4513', salmon: '#fa8072', sandybrown: '#f4a460', seagreen: '#2e8b57', seashell: '#fff5ee', sienna: '#a0522d', silver: '#c0c0c0', skyblue: '#87ceeb', slateblue: '#6a5acd', slategray: '#708090', slategrey: '#708090', snow: '#fffafa', springgreen: '#00ff7f', steelblue: '#4682b4', tan: '#d2b48c', teal: '#008080', thistle: '#d8bfd8', tomato: '#ff6347', turquoise: '#40e0d0', violet: '#ee82ee', wheat: '#f5deb3', white: '#fff', whitesmoke: '#f5f5f5', yellow: '#ff0', yellowgreen: '#9acd32' }; var toHex = {}; var toName = {}; for (var name in COLORS) { var hex = COLORS[name]; if (name.length < hex.length) { toName[hex] = name; } else { toHex[name] = hex; } } var toHexPattern = new RegExp('(^| |,|\\))(' + Object.keys(toHex).join('|') + ')( |,|\\)|$)', 'ig'); var toNamePattern = new RegExp('(' + Object.keys(toName).join('|') + ')([^a-f0-9]|$)', 'ig'); function hexConverter(match, prefix, colorValue, suffix) { return prefix + toHex[colorValue.toLowerCase()] + suffix; } function nameConverter(match, colorValue, suffix) { return toName[colorValue.toLowerCase()] + suffix; } function shortenHex(value) { var hasHex = value.indexOf('#') > -1; var shortened = value.replace(toHexPattern, hexConverter); if (shortened != value) { shortened = shortened.replace(toHexPattern, hexConverter); } return hasHex ? shortened.replace(toNamePattern, nameConverter) : shortened; } var shortenHex_1 = shortenHex; // HSL to RGB converter. Both methods adapted from: // http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript function hslToRgb(h, s, l) { var r, g, b; // normalize hue orientation b/w 0 and 360 degrees h = h % 360; if (h < 0) h += 360; h = ~~h / 360; if (s < 0) s = 0; else if (s > 100) s = 100; s = ~~s / 100; if (l < 0) l = 0; else if (l > 100) l = 100; l = ~~l / 100; if (s === 0) { r = g = b = l; // achromatic } else { var q = l < 0.5 ? l * (1 + s) : l + s - l * s; var p = 2 * l - q; r = hueToRgb(p, q, h + 1/3); g = hueToRgb(p, q, h); b = hueToRgb(p, q, h - 1/3); } return [~~(r * 255), ~~(g * 255), ~~(b * 255)]; } function hueToRgb(p, q, t) { if (t < 0) t += 1; if (t > 1) t -= 1; if (t < 1/6) return p + (q - p) * 6 * t; if (t < 1/2) return q; if (t < 2/3) return p + (q - p) * (2/3 - t) * 6; return p; } function shortenHsl(hue, saturation, lightness) { var asRgb = hslToRgb(hue, saturation, lightness); var redAsHex = asRgb[0].toString(16); var greenAsHex = asRgb[1].toString(16); var blueAsHex = asRgb[2].toString(16); return '#' + ((redAsHex.length == 1 ? '0' : '') + redAsHex) + ((greenAsHex.length == 1 ? '0' : '') + greenAsHex) + ((blueAsHex.length == 1 ? '0' : '') + blueAsHex); } var shortenHsl_1 = shortenHsl; function shortenRgb(red, green, blue) { var normalizedRed = Math.max(0, Math.min(parseInt(red), 255)); var normalizedGreen = Math.max(0, Math.min(parseInt(green), 255)); var normalizedBlue = Math.max(0, Math.min(parseInt(blue), 255)); // Credit: Asen http://jsbin.com/UPUmaGOc/2/edit?js,console return '#' + ('00000' + (normalizedRed << 16 | normalizedGreen << 8 | normalizedBlue).toString(16)).slice(-6); } var shortenRgb_1 = shortenRgb; // adapted from http://nedbatchelder.com/blog/200712.html#e20071211T054956 var NUMBER_PATTERN = /([0-9]+)/; function naturalCompare(value1, value2) { var keys1 = ('' + value1).split(NUMBER_PATTERN).map(tryParseInt); var keys2 = ('' + value2).split(NUMBER_PATTERN).map(tryParseInt); var key1; var key2; var compareFirst = Math.min(keys1.length, keys2.length); var i, l; for (i = 0, l = compareFirst; i < l; i++) { key1 = keys1[i]; key2 = keys2[i]; if (key1 != key2) { return key1 > key2 ? 1 : -1; } } return keys1.length > keys2.length ? 1 : (keys1.length == keys2.length ? 0 : -1); } function tryParseInt(value) { return ('' + parseInt(value)) == value ? parseInt(value) : value; } var naturalCompare_1 = naturalCompare; function naturalSorter$1(scope1, scope2) { return naturalCompare_1(scope1[1], scope2[1]); } function standardSorter(scope1, scope2) { return scope1[1] > scope2[1] ? 1 : -1; } function sortSelectors(selectors, method) { switch (method) { case 'natural': return selectors.sort(naturalSorter$1); case 'standard': return selectors.sort(standardSorter); case 'none': case false: return selectors; } } var sortSelectors_1 = sortSelectors; function override$1(source1, source2) { var target = {}; var key1; var key2; var item; for (key1 in source1) { item = source1[key1]; if (Array.isArray(item)) { target[key1] = item.slice(0); } else if (typeof item == 'object' && item !== null) { target[key1] = override$1(item, {}); } else { target[key1] = item; } } for (key2 in source2) { item = source2[key2]; if (key2 in target && Array.isArray(item)) { target[key2] = item.slice(0); } else if (key2 in target && typeof item == 'object' && item !== null) { target[key2] = override$1(target[key2], item); } else { target[key2] = item; } } return target; } var override_1 = override$1; var systemLineBreak = os__default.EOL; var Breaks$1 = { AfterAtRule: 'afterAtRule', AfterBlockBegins: 'afterBlockBegins', AfterBlockEnds: 'afterBlockEnds', AfterComment: 'afterComment', AfterProperty: 'afterProperty', AfterRuleBegins: 'afterRuleBegins', AfterRuleEnds: 'afterRuleEnds', BeforeBlockEnds: 'beforeBlockEnds', BetweenSelectors: 'betweenSelectors' }; var BreakWith = { CarriageReturnLineFeed: '\r\n', LineFeed: '\n', System: systemLineBreak }; var IndentWith = { Space: ' ', Tab: '\t' }; var Spaces$2 = { AroundSelectorRelation: 'aroundSelectorRelation', BeforeBlockBegins: 'beforeBlockBegins', BeforeValue: 'beforeValue' }; var DEFAULTS$2 = { breaks: breaks(false), breakWith: BreakWith.System, indentBy: 0, indentWith: IndentWith.Space, spaces: spaces(false), wrapAt: false, semicolonAfterLastProperty: false }; var BEAUTIFY_ALIAS = 'beautify'; var KEEP_BREAKS_ALIAS = 'keep-breaks'; var OPTION_SEPARATOR$1 = ';'; var OPTION_NAME_VALUE_SEPARATOR = ':'; var HASH_VALUES_OPTION_SEPARATOR = ','; var HASH_VALUES_NAME_VALUE_SEPARATOR = '='; var FALSE_KEYWORD_1$1 = 'false'; var FALSE_KEYWORD_2$1 = 'off'; var TRUE_KEYWORD_1$1 = 'true'; var TRUE_KEYWORD_2$1 = 'on'; function breaks(value) { var breakOptions = {}; breakOptions[Breaks$1.AfterAtRule] = value; breakOptions[Breaks$1.AfterBlockBegins] = value; breakOptions[Breaks$1.AfterBlockEnds] = value; breakOptions[Breaks$1.AfterComment] = value; breakOptions[Breaks$1.AfterProperty] = value; breakOptions[Breaks$1.AfterRuleBegins] = value; breakOptions[Breaks$1.AfterRuleEnds] = value; breakOptions[Breaks$1.BeforeBlockEnds] = value; breakOptions[Breaks$1.BetweenSelectors] = value; return breakOptions; } function spaces(value) { var spaceOptions = {}; spaceOptions[Spaces$2.AroundSelectorRelation] = value; spaceOptions[Spaces$2.BeforeBlockBegins] = value; spaceOptions[Spaces$2.BeforeValue] = value; return spaceOptions; } function formatFrom(source) { if (source === undefined || source === false) { return false; } if (typeof source == 'object' && 'breakWith' in source) { source = override_1(source, { breakWith: mapBreakWith(source.breakWith) }); } if (typeof source == 'object' && 'indentBy' in source) { source = override_1(source, { indentBy: parseInt(source.indentBy) }); } if (typeof source == 'object' && 'indentWith' in source) { source = override_1(source, { indentWith: mapIndentWith(source.indentWith) }); } if (typeof source == 'object') { return override_1(DEFAULTS$2, source); } if (typeof source == 'object') { return override_1(DEFAULTS$2, source); } if (typeof source == 'string' && source == BEAUTIFY_ALIAS) { return override_1(DEFAULTS$2, { breaks: breaks(true), indentBy: 2, spaces: spaces(true) }); } if (typeof source == 'string' && source == KEEP_BREAKS_ALIAS) { return override_1(DEFAULTS$2, { breaks: { afterAtRule: true, afterBlockBegins: true, afterBlockEnds: true, afterComment: true, afterRuleEnds: true, beforeBlockEnds: true } }); } if (typeof source == 'string') { return override_1(DEFAULTS$2, toHash(source)); } return DEFAULTS$2; } function toHash(string) { return string .split(OPTION_SEPARATOR$1) .reduce(function (accumulator, directive) { var parts = directive.split(OPTION_NAME_VALUE_SEPARATOR); var name = parts[0]; var value = parts[1]; if (name == 'breaks' || name == 'spaces') { accumulator[name] = hashValuesToHash(value); } else if (name == 'indentBy' || name == 'wrapAt') { accumulator[name] = parseInt(value); } else if (name == 'indentWith') { accumulator[name] = mapIndentWith(value); } else if (name == 'breakWith') { accumulator[name] = mapBreakWith(value); } return accumulator; }, {}); } function hashValuesToHash(string) { return string .split(HASH_VALUES_OPTION_SEPARATOR) .reduce(function (accumulator, directive) { var parts = directive.split(HASH_VALUES_NAME_VALUE_SEPARATOR); var name = parts[0]; var value = parts[1]; accumulator[name] = normalizeValue$1(value); return accumulator; }, {}); } function normalizeValue$1(value) { switch (value) { case FALSE_KEYWORD_1$1: case FALSE_KEYWORD_2$1: return false; case TRUE_KEYWORD_1$1: case TRUE_KEYWORD_2$1: return true; default: return value; } } function mapBreakWith(value) { switch (value) { case 'windows': case 'crlf': case BreakWith.CarriageReturnLineFeed: return BreakWith.CarriageReturnLineFeed; case 'unix': case 'lf': case BreakWith.LineFeed: return BreakWith.LineFeed; default: return systemLineBreak; } } function mapIndentWith(value) { switch (value) { case 'space': return IndentWith.Space; case 'tab': return IndentWith.Tab; default: return value; } } var format = { Breaks: Breaks$1, Spaces: Spaces$2, formatFrom: formatFrom }; var Marker = { ASTERISK: '*', AT: '@', BACK_SLASH: '\\', CARRIAGE_RETURN: '\r', CLOSE_CURLY_BRACKET: '}', CLOSE_ROUND_BRACKET: ')', CLOSE_SQUARE_BRACKET: ']', COLON: ':', COMMA: ',', DOUBLE_QUOTE: '"', EXCLAMATION: '!', FORWARD_SLASH: '/', INTERNAL: '-clean-css-', NEW_LINE_NIX: '\n', OPEN_CURLY_BRACKET: '{', OPEN_ROUND_BRACKET: '(', OPEN_SQUARE_BRACKET: '[', SEMICOLON: ';', SINGLE_QUOTE: '\'', SPACE: ' ', TAB: '\t', UNDERSCORE: '_' }; var marker = Marker; function formatPosition(metadata) { var line = metadata[0]; var column = metadata[1]; var source = metadata[2]; return source ? source + ':' + line + ':' + column : line + ':' + column; } var formatPosition_1 = formatPosition; var Spaces$1 = format.Spaces; var CASE_ATTRIBUTE_PATTERN = /[\s"'][iI]\s*\]/; var CASE_RESTORE_PATTERN = /([\d\w])([iI])\]/g; var DOUBLE_QUOTE_CASE_PATTERN = /="([a-zA-Z][a-zA-Z\d\-_]+)"([iI])/g; var DOUBLE_QUOTE_PATTERN = /="([a-zA-Z][a-zA-Z\d\-_]+)"(\s|\])/g; var HTML_COMMENT_PATTERN = /^(?:(?:)\s*)+/; var SINGLE_QUOTE_CASE_PATTERN = /='([a-zA-Z][a-zA-Z\d\-_]+)'([iI])/g; var SINGLE_QUOTE_PATTERN = /='([a-zA-Z][a-zA-Z\d\-_]+)'(\s|\])/g; var RELATION_PATTERN$1 = /[>\+~]/; var WHITESPACE_PATTERN$1 = /\s/; var ASTERISK_PLUS_HTML_HACK = '*+html '; var ASTERISK_FIRST_CHILD_PLUS_HTML_HACK = '*:first-child+html '; var LESS_THAN = '<'; function hasInvalidCharacters(value) { var isEscaped; var isInvalid = false; var character; var isQuote = false; var i, l; for (i = 0, l = value.length; i < l; i++) { character = value[i]; if (isEscaped) ; else if (character == marker.SINGLE_QUOTE || character == marker.DOUBLE_QUOTE) { isQuote = !isQuote; } else if (!isQuote && (character == marker.CLOSE_CURLY_BRACKET || character == marker.EXCLAMATION || character == LESS_THAN || character == marker.SEMICOLON)) { isInvalid = true; break; } else if (!isQuote && i === 0 && RELATION_PATTERN$1.test(character)) { isInvalid = true; break; } isEscaped = character == marker.BACK_SLASH; } return isInvalid; } function removeWhitespace(value, format) { var stripped = []; var character; var isNewLineNix; var isNewLineWin; var isEscaped; var wasEscaped; var isQuoted; var isSingleQuoted; var isDoubleQuoted; var isAttribute; var isRelation; var isWhitespace; var roundBracketLevel = 0; var wasRelation = false; var wasWhitespace = false; var withCaseAttribute = CASE_ATTRIBUTE_PATTERN.test(value); var spaceAroundRelation = format && format.spaces[Spaces$1.AroundSelectorRelation]; var i, l; for (i = 0, l = value.length; i < l; i++) { character = value[i]; isNewLineNix = character == marker.NEW_LINE_NIX; isNewLineWin = character == marker.NEW_LINE_NIX && value[i - 1] == marker.CARRIAGE_RETURN; isQuoted = isSingleQuoted || isDoubleQuoted; isRelation = !isAttribute && !isEscaped && roundBracketLevel === 0 && RELATION_PATTERN$1.test(character); isWhitespace = WHITESPACE_PATTERN$1.test(character); if (wasEscaped && isQuoted && isNewLineWin) { // swallow escaped new windows lines in comments stripped.pop(); stripped.pop(); } else if (isEscaped && isQuoted && isNewLineNix) { // swallow escaped new *nix lines in comments stripped.pop(); } else if (isEscaped) { stripped.push(character); } else if (character == marker.OPEN_SQUARE_BRACKET && !isQuoted) { stripped.push(character); isAttribute = true; } else if (character == marker.CLOSE_SQUARE_BRACKET && !isQuoted) { stripped.push(character); isAttribute = false; } else if (character == marker.OPEN_ROUND_BRACKET && !isQuoted) { stripped.push(character); roundBracketLevel++; } else if (character == marker.CLOSE_ROUND_BRACKET && !isQuoted) { stripped.push(character); roundBracketLevel--; } else if (character == marker.SINGLE_QUOTE && !isQuoted) { stripped.push(character); isSingleQuoted = true; } else if (character == marker.DOUBLE_QUOTE && !isQuoted) { stripped.push(character); isDoubleQuoted = true; } else if (character == marker.SINGLE_QUOTE && isQuoted) { stripped.push(character); isSingleQuoted = false; } else if (character == marker.DOUBLE_QUOTE && isQuoted) { stripped.push(character); isDoubleQuoted = false; } else if (isWhitespace && wasRelation && !spaceAroundRelation) { continue; } else if (!isWhitespace && wasRelation && spaceAroundRelation) { stripped.push(marker.SPACE); stripped.push(character); } else if (isWhitespace && (isAttribute || roundBracketLevel > 0) && !isQuoted) ; else if (isWhitespace && wasWhitespace && !isQuoted) ; else if ((isNewLineWin || isNewLineNix) && (isAttribute || roundBracketLevel > 0) && isQuoted) ; else if (isRelation && wasWhitespace && !spaceAroundRelation) { stripped.pop(); stripped.push(character); } else if (isRelation && !wasWhitespace && spaceAroundRelation) { stripped.push(marker.SPACE); stripped.push(character); } else if (isWhitespace) { stripped.push(marker.SPACE); } else { stripped.push(character); } wasEscaped = isEscaped; isEscaped = character == marker.BACK_SLASH; wasRelation = isRelation; wasWhitespace = isWhitespace; } return withCaseAttribute ? stripped.join('').replace(CASE_RESTORE_PATTERN, '$1 $2]') : stripped.join(''); } function removeQuotes$1(value) { if (value.indexOf('\'') == -1 && value.indexOf('"') == -1) { return value; } return value .replace(SINGLE_QUOTE_CASE_PATTERN, '=$1 $2') .replace(SINGLE_QUOTE_PATTERN, '=$1$2') .replace(DOUBLE_QUOTE_CASE_PATTERN, '=$1 $2') .replace(DOUBLE_QUOTE_PATTERN, '=$1$2'); } function tidyRules(rules, removeUnsupported, adjacentSpace, format, warnings) { var list = []; var repeated = []; function removeHTMLComment(rule, match) { warnings.push('HTML comment \'' + match + '\' at ' + formatPosition_1(rule[2][0]) + '. Removing.'); return ''; } for (var i = 0, l = rules.length; i < l; i++) { var rule = rules[i]; var reduced = rule[1]; reduced = reduced.replace(HTML_COMMENT_PATTERN, removeHTMLComment.bind(null, rule)); if (hasInvalidCharacters(reduced)) { warnings.push('Invalid selector \'' + rule[1] + '\' at ' + formatPosition_1(rule[2][0]) + '. Ignoring.'); continue; } reduced = removeWhitespace(reduced, format); reduced = removeQuotes$1(reduced); if (adjacentSpace && reduced.indexOf('nav') > 0) { reduced = reduced.replace(/\+nav(\S|$)/, '+ nav$1'); } if (removeUnsupported && reduced.indexOf(ASTERISK_PLUS_HTML_HACK) > -1) { continue; } if (removeUnsupported && reduced.indexOf(ASTERISK_FIRST_CHILD_PLUS_HTML_HACK) > -1) { continue; } if (reduced.indexOf('*') > -1) { reduced = reduced .replace(/\*([:#\.\[])/g, '$1') .replace(/^(\:first\-child)?\+html/, '*$1+html'); } if (repeated.indexOf(reduced) > -1) { continue; } rule[1] = reduced; repeated.push(reduced); list.push(rule); } if (list.length == 1 && list[0][1].length === 0) { warnings.push('Empty selector \'' + list[0][1] + '\' at ' + formatPosition_1(list[0][2][0]) + '. Ignoring.'); list = []; } return list; } var tidyRules_1 = tidyRules; var SUPPORTED_COMPACT_BLOCK_MATCHER = /^@media\W/; function tidyBlock(values, spaceAfterClosingBrace) { var withoutSpaceAfterClosingBrace; var i; for (i = values.length - 1; i >= 0; i--) { withoutSpaceAfterClosingBrace = !spaceAfterClosingBrace && SUPPORTED_COMPACT_BLOCK_MATCHER.test(values[i][1]); values[i][1] = values[i][1] .replace(/\n|\r\n/g, ' ') .replace(/\s+/g, ' ') .replace(/(,|:|\() /g, '$1') .replace(/ \)/g, ')') .replace(/'([a-zA-Z][a-zA-Z\d\-_]+)'/, '$1') .replace(/"([a-zA-Z][a-zA-Z\d\-_]+)"/, '$1') .replace(withoutSpaceAfterClosingBrace ? /\) /g : null, ')'); } return values; } var tidyBlock_1 = tidyBlock; function tidyAtRule(value) { return value .replace(/\s+/g, ' ') .replace(/url\(\s+/g, 'url(') .replace(/\s+\)/g, ')') .trim(); } var tidyAtRule_1 = tidyAtRule; var Hack = { ASTERISK: 'asterisk', BANG: 'bang', BACKSLASH: 'backslash', UNDERSCORE: 'underscore' }; var hack = Hack; function removeUnused(properties) { for (var i = properties.length - 1; i >= 0; i--) { var property = properties[i]; if (property.unused) { property.all.splice(property.position, 1); } } } var removeUnused_1 = removeUnused; var ASTERISK_HACK = '*'; var BACKSLASH_HACK = '\\'; var IMPORTANT_TOKEN = '!important'; var UNDERSCORE_HACK = '_'; var BANG_HACK = '!ie'; function restoreFromOptimizing(properties, restoreCallback) { var property; var restored; var current; var i; for (i = properties.length - 1; i >= 0; i--) { property = properties[i]; if (property.unused) { continue; } if (!property.dirty && !property.important && !property.hack) { continue; } if (restoreCallback) { restored = restoreCallback(property); property.value = restored; } else { restored = property.value; } if (property.important) { restoreImportant(property); } if (property.hack) { restoreHack(property); } if ('all' in property) { current = property.all[property.position]; current[1][1] = property.name; current.splice(2, current.length - 1); Array.prototype.push.apply(current, restored); } } } function restoreImportant(property) { property.value[property.value.length - 1][1] += IMPORTANT_TOKEN; } function restoreHack(property) { if (property.hack[0] == hack.UNDERSCORE) { property.name = UNDERSCORE_HACK + property.name; } else if (property.hack[0] == hack.ASTERISK) { property.name = ASTERISK_HACK + property.name; } else if (property.hack[0] == hack.BACKSLASH) { property.value[property.value.length - 1][1] += BACKSLASH_HACK + property.hack[1]; } else if (property.hack[0] == hack.BANG) { property.value[property.value.length - 1][1] += marker.SPACE + BANG_HACK; } } var restoreFromOptimizing_1 = restoreFromOptimizing; var Token = { AT_RULE: 'at-rule', // e.g. `@import`, `@charset` AT_RULE_BLOCK: 'at-rule-block', // e.g. `@font-face{...}` AT_RULE_BLOCK_SCOPE: 'at-rule-block-scope', // e.g. `@font-face` COMMENT: 'comment', // e.g. `/* comment */` NESTED_BLOCK: 'nested-block', // e.g. `@media screen{...}`, `@keyframes animation {...}` NESTED_BLOCK_SCOPE: 'nested-block-scope', // e.g. `@media`, `@keyframes` PROPERTY: 'property', // e.g. `color:red` PROPERTY_BLOCK: 'property-block', // e.g. `--var:{color:red}` PROPERTY_NAME: 'property-name', // e.g. `color` PROPERTY_VALUE: 'property-value', // e.g. `red` RAW: 'raw', // e.g. anything between /* clean-css ignore:start */ and /* clean-css ignore:end */ comments RULE: 'rule', // e.g `div > a{...}` RULE_SCOPE: 'rule-scope' // e.g `div > a` }; var token = Token; var Match = { ASTERISK: '*', BACKSLASH: '\\', BANG: '!', BANG_SUFFIX_PATTERN: /!\w+$/, IMPORTANT_TOKEN: '!important', IMPORTANT_TOKEN_PATTERN: new RegExp('!important$', 'i'), IMPORTANT_WORD: 'important', IMPORTANT_WORD_PATTERN: new RegExp('important$', 'i'), SUFFIX_BANG_PATTERN: /!$/, UNDERSCORE: '_', VARIABLE_REFERENCE_PATTERN: /var\(--.+\)$/ }; function wrapAll(properties, includeVariable, skipProperties) { var wrapped = []; var single; var property; var i; for (i = properties.length - 1; i >= 0; i--) { property = properties[i]; if (property[0] != token.PROPERTY) { continue; } if (!includeVariable && someVariableReferences(property)) { continue; } if (skipProperties && skipProperties.indexOf(property[1][1]) > -1) { continue; } single = wrapSingle$3(property); single.all = properties; single.position = i; wrapped.unshift(single); } return wrapped; } function someVariableReferences(property) { var i, l; var value; // skipping `property` and property name tokens for (i = 2, l = property.length; i < l; i++) { value = property[i]; if (value[0] != token.PROPERTY_VALUE) { continue; } if (isVariableReference(value[1])) { return true; } } return false; } function isVariableReference(value) { return Match.VARIABLE_REFERENCE_PATTERN.test(value); } function isMultiplex(property) { var value; var i, l; for (i = 3, l = property.length; i < l; i++) { value = property[i]; if (value[0] == token.PROPERTY_VALUE && (value[1] == marker.COMMA || value[1] == marker.FORWARD_SLASH)) { return true; } } return false; } function hackFrom(property) { var match = false; var name = property[1][1]; var lastValue = property[property.length - 1]; if (name[0] == Match.UNDERSCORE) { match = [hack.UNDERSCORE]; } else if (name[0] == Match.ASTERISK) { match = [hack.ASTERISK]; } else if (lastValue[1][0] == Match.BANG && !lastValue[1].match(Match.IMPORTANT_WORD_PATTERN)) { match = [hack.BANG]; } else if (lastValue[1].indexOf(Match.BANG) > 0 && !lastValue[1].match(Match.IMPORTANT_WORD_PATTERN) && Match.BANG_SUFFIX_PATTERN.test(lastValue[1])) { match = [hack.BANG]; } else if (lastValue[1].indexOf(Match.BACKSLASH) > 0 && lastValue[1].indexOf(Match.BACKSLASH) == lastValue[1].length - Match.BACKSLASH.length - 1) { match = [hack.BACKSLASH, lastValue[1].substring(lastValue[1].indexOf(Match.BACKSLASH) + 1)]; } else if (lastValue[1].indexOf(Match.BACKSLASH) === 0 && lastValue[1].length == 2) { match = [hack.BACKSLASH, lastValue[1].substring(1)]; } return match; } function isImportant(property) { if (property.length < 3) return false; var lastValue = property[property.length - 1]; if (Match.IMPORTANT_TOKEN_PATTERN.test(lastValue[1])) { return true; } else if (Match.IMPORTANT_WORD_PATTERN.test(lastValue[1]) && Match.SUFFIX_BANG_PATTERN.test(property[property.length - 2][1])) { return true; } return false; } function stripImportant(property) { var lastValue = property[property.length - 1]; var oneButLastValue = property[property.length - 2]; if (Match.IMPORTANT_TOKEN_PATTERN.test(lastValue[1])) { lastValue[1] = lastValue[1].replace(Match.IMPORTANT_TOKEN_PATTERN, ''); } else { lastValue[1] = lastValue[1].replace(Match.IMPORTANT_WORD_PATTERN, ''); oneButLastValue[1] = oneButLastValue[1].replace(Match.SUFFIX_BANG_PATTERN, ''); } if (lastValue[1].length === 0) { property.pop(); } if (oneButLastValue[1].length === 0) { property.pop(); } } function stripPrefixHack(property) { property[1][1] = property[1][1].substring(1); } function stripSuffixHack(property, hackFrom) { var lastValue = property[property.length - 1]; lastValue[1] = lastValue[1] .substring(0, lastValue[1].indexOf(hackFrom[0] == hack.BACKSLASH ? Match.BACKSLASH : Match.BANG)) .trim(); if (lastValue[1].length === 0) { property.pop(); } } function wrapSingle$3(property) { var importantProperty = isImportant(property); if (importantProperty) { stripImportant(property); } var whichHack = hackFrom(property); if (whichHack[0] == hack.ASTERISK || whichHack[0] == hack.UNDERSCORE) { stripPrefixHack(property); } else if (whichHack[0] == hack.BACKSLASH || whichHack[0] == hack.BANG) { stripSuffixHack(property, whichHack); } return { block: property[2] && property[2][0] == token.PROPERTY_BLOCK, components: [], dirty: false, hack: whichHack, important: importantProperty, name: property[1][1], multiplex: property.length > 3 ? isMultiplex(property) : false, position: 0, shorthand: false, unused: false, value: property.slice(2) }; } var wrapForOptimizing$3 = { all: wrapAll, single: wrapSingle$3 }; var INTEGER_PATTERN = /^\d+$/; var ALL_UNITS = ['*', 'all']; var DEFAULT_PRECISION = 'off'; // all precision changes are disabled var DIRECTIVES_SEPARATOR = ','; // e.g. *=5,px=3 var DIRECTIVE_VALUE_SEPARATOR = '='; // e.g. *=5 function roundingPrecisionFrom$1(source) { return override_1(defaults$1(DEFAULT_PRECISION), buildPrecisionFrom(source)); } function defaults$1(value) { return { 'ch': value, 'cm': value, 'em': value, 'ex': value, 'in': value, 'mm': value, 'pc': value, 'pt': value, 'px': value, 'q': value, 'rem': value, 'vh': value, 'vmax': value, 'vmin': value, 'vw': value, '%': value }; } function buildPrecisionFrom(source) { if (source === null || source === undefined) { return {}; } if (typeof source == 'boolean') { return {}; } if (typeof source == 'number' && source == -1) { return defaults$1(DEFAULT_PRECISION); } if (typeof source == 'number') { return defaults$1(source); } if (typeof source == 'string' && INTEGER_PATTERN.test(source)) { return defaults$1(parseInt(source)); } if (typeof source == 'string' && source == DEFAULT_PRECISION) { return defaults$1(DEFAULT_PRECISION); } if (typeof source == 'object') { return source; } return source .split(DIRECTIVES_SEPARATOR) .reduce(function (accumulator, directive) { var directiveParts = directive.split(DIRECTIVE_VALUE_SEPARATOR); var name = directiveParts[0]; var value = parseInt(directiveParts[1]); if (isNaN(value) || value == -1) { value = DEFAULT_PRECISION; } if (ALL_UNITS.indexOf(name) > -1) { accumulator = override_1(accumulator, defaults$1(value)); } else { accumulator[name] = value; } return accumulator; }, {}); } var roundingPrecision = { DEFAULT: DEFAULT_PRECISION, roundingPrecisionFrom: roundingPrecisionFrom$1 }; var roundingPrecisionFrom = roundingPrecision.roundingPrecisionFrom; var OptimizationLevel$6 = { Zero: '0', One: '1', Two: '2' }; var DEFAULTS$1 = {}; DEFAULTS$1[OptimizationLevel$6.Zero] = {}; DEFAULTS$1[OptimizationLevel$6.One] = { cleanupCharsets: true, normalizeUrls: true, optimizeBackground: true, optimizeBorderRadius: true, optimizeFilter: true, optimizeFontWeight: true, optimizeOutline: true, removeEmpty: true, removeNegativePaddings: true, removeQuotes: true, removeWhitespace: true, replaceMultipleZeros: true, replaceTimeUnits: true, replaceZeroUnits: true, roundingPrecision: roundingPrecisionFrom(undefined), selectorsSortingMethod: 'standard', specialComments: 'all', tidyAtRules: true, tidyBlockScopes: true, tidySelectors: true, transform: noop }; DEFAULTS$1[OptimizationLevel$6.Two] = { mergeAdjacentRules: true, mergeIntoShorthands: true, mergeMedia: true, mergeNonAdjacentRules: true, mergeSemantically: false, overrideProperties: true, removeEmpty: true, reduceNonAdjacentRules: true, removeDuplicateFontRules: true, removeDuplicateMediaBlocks: true, removeDuplicateRules: true, removeUnusedAtRules: false, restructureRules: false, skipProperties: [] }; var ALL_KEYWORD_1 = '*'; var ALL_KEYWORD_2 = 'all'; var FALSE_KEYWORD_1 = 'false'; var FALSE_KEYWORD_2 = 'off'; var TRUE_KEYWORD_1 = 'true'; var TRUE_KEYWORD_2 = 'on'; var LIST_VALUE_SEPARATOR = ','; var OPTION_SEPARATOR = ';'; var OPTION_VALUE_SEPARATOR = ':'; function noop() {} function optimizationLevelFrom(source) { var level = override_1(DEFAULTS$1, {}); var Zero = OptimizationLevel$6.Zero; var One = OptimizationLevel$6.One; var Two = OptimizationLevel$6.Two; if (undefined === source) { delete level[Two]; return level; } if (typeof source == 'string') { source = parseInt(source); } if (typeof source == 'number' && source === parseInt(Two)) { return level; } if (typeof source == 'number' && source === parseInt(One)) { delete level[Two]; return level; } if (typeof source == 'number' && source === parseInt(Zero)) { delete level[Two]; delete level[One]; return level; } if (typeof source == 'object') { source = covertValuesToHashes(source); } if (One in source && 'roundingPrecision' in source[One]) { source[One].roundingPrecision = roundingPrecisionFrom(source[One].roundingPrecision); } if (Two in source && 'skipProperties' in source[Two] && typeof(source[Two].skipProperties) == 'string') { source[Two].skipProperties = source[Two].skipProperties.split(LIST_VALUE_SEPARATOR); } if (Zero in source || One in source || Two in source) { level[Zero] = override_1(level[Zero], source[Zero]); } if (One in source && ALL_KEYWORD_1 in source[One]) { level[One] = override_1(level[One], defaults(One, normalizeValue(source[One][ALL_KEYWORD_1]))); delete source[One][ALL_KEYWORD_1]; } if (One in source && ALL_KEYWORD_2 in source[One]) { level[One] = override_1(level[One], defaults(One, normalizeValue(source[One][ALL_KEYWORD_2]))); delete source[One][ALL_KEYWORD_2]; } if (One in source || Two in source) { level[One] = override_1(level[One], source[One]); } else { delete level[One]; } if (Two in source && ALL_KEYWORD_1 in source[Two]) { level[Two] = override_1(level[Two], defaults(Two, normalizeValue(source[Two][ALL_KEYWORD_1]))); delete source[Two][ALL_KEYWORD_1]; } if (Two in source && ALL_KEYWORD_2 in source[Two]) { level[Two] = override_1(level[Two], defaults(Two, normalizeValue(source[Two][ALL_KEYWORD_2]))); delete source[Two][ALL_KEYWORD_2]; } if (Two in source) { level[Two] = override_1(level[Two], source[Two]); } else { delete level[Two]; } return level; } function defaults(level, value) { var options = override_1(DEFAULTS$1[level], {}); var key; for (key in options) { if (typeof options[key] == 'boolean') { options[key] = value; } } return options; } function normalizeValue(value) { switch (value) { case FALSE_KEYWORD_1: case FALSE_KEYWORD_2: return false; case TRUE_KEYWORD_1: case TRUE_KEYWORD_2: return true; default: return value; } } function covertValuesToHashes(source) { var clonedSource = override_1(source, {}); var level; var i; for (i = 0; i <= 2; i++) { level = '' + i; if (level in clonedSource && (clonedSource[level] === undefined || clonedSource[level] === false)) { delete clonedSource[level]; } if (level in clonedSource && clonedSource[level] === true) { clonedSource[level] = {}; } if (level in clonedSource && typeof clonedSource[level] == 'string') { clonedSource[level] = covertToHash(clonedSource[level], level); } } return clonedSource; } function covertToHash(asString, level) { return asString .split(OPTION_SEPARATOR) .reduce(function (accumulator, directive) { var parts = directive.split(OPTION_VALUE_SEPARATOR); var name = parts[0]; var value = parts[1]; var normalizedValue = normalizeValue(value); if (ALL_KEYWORD_1 == name || ALL_KEYWORD_2 == name) { accumulator = override_1(accumulator, defaults(level, normalizedValue)); } else { accumulator[name] = normalizedValue; } return accumulator; }, {}); } var optimizationLevel = { OptimizationLevel: OptimizationLevel$6, optimizationLevelFrom: optimizationLevelFrom, }; function split(value, separator) { var openLevel = marker.OPEN_ROUND_BRACKET; var closeLevel = marker.CLOSE_ROUND_BRACKET; var level = 0; var cursor = 0; var lastStart = 0; var lastValue; var lastCharacter; var len = value.length; var parts = []; if (value.indexOf(separator) == -1) { return [value]; } if (value.indexOf(openLevel) == -1) { return value.split(separator); } while (cursor < len) { if (value[cursor] == openLevel) { level++; } else if (value[cursor] == closeLevel) { level--; } if (level === 0 && cursor > 0 && cursor + 1 < len && value[cursor] == separator) { parts.push(value.substring(lastStart, cursor)); lastStart = cursor + 1; } cursor++; } if (lastStart < cursor + 1) { lastValue = value.substring(lastStart); lastCharacter = lastValue[lastValue.length - 1]; if (lastCharacter == separator) { lastValue = lastValue.substring(0, lastValue.length - 1); } parts.push(lastValue); } return parts; } var split_1 = split; var emptyCharacter = ''; var Breaks = format.Breaks; var Spaces = format.Spaces; function supportsAfterClosingBrace(token) { return token[1][1] == 'background' || token[1][1] == 'transform' || token[1][1] == 'src'; } function afterClosingBrace(token, valueIndex) { return token[valueIndex][1][token[valueIndex][1].length - 1] == marker.CLOSE_ROUND_BRACKET; } function afterComma(token, valueIndex) { return token[valueIndex][1] == marker.COMMA; } function afterSlash(token, valueIndex) { return token[valueIndex][1] == marker.FORWARD_SLASH; } function beforeComma(token, valueIndex) { return token[valueIndex + 1] && token[valueIndex + 1][1] == marker.COMMA; } function beforeSlash(token, valueIndex) { return token[valueIndex + 1] && token[valueIndex + 1][1] == marker.FORWARD_SLASH; } function inFilter(token) { return token[1][1] == 'filter' || token[1][1] == '-ms-filter'; } function disallowsSpace(context, token, valueIndex) { return !context.spaceAfterClosingBrace && supportsAfterClosingBrace(token) && afterClosingBrace(token, valueIndex) || beforeSlash(token, valueIndex) || afterSlash(token, valueIndex) || beforeComma(token, valueIndex) || afterComma(token, valueIndex); } function rules$1(context, tokens) { var store = context.store; for (var i = 0, l = tokens.length; i < l; i++) { store(context, tokens[i]); if (i < l - 1) { store(context, comma(context)); } } } function body$1(context, tokens) { var lastPropertyAt = lastPropertyIndex(tokens); for (var i = 0, l = tokens.length; i < l; i++) { property$1(context, tokens, i, lastPropertyAt); } } function lastPropertyIndex(tokens) { var index = tokens.length - 1; for (; index >= 0; index--) { if (tokens[index][0] != token.COMMENT) { break; } } return index; } function property$1(context, tokens, position, lastPropertyAt) { var store = context.store; var token$1 = tokens[position]; var propertyValue = token$1[2]; var isPropertyBlock = propertyValue && propertyValue[0] === token.PROPERTY_BLOCK; var needsSemicolon; if ( context.format ) { if ( context.format.semicolonAfterLastProperty || isPropertyBlock ) { needsSemicolon = true; } else if ( position < lastPropertyAt ) { needsSemicolon = true; } else { needsSemicolon = false; } } else { needsSemicolon = position < lastPropertyAt || isPropertyBlock; } var isLast = position === lastPropertyAt; switch (token$1[0]) { case token.AT_RULE: store(context, token$1); store(context, semicolon(context, Breaks.AfterProperty, false)); break; case token.AT_RULE_BLOCK: rules$1(context, token$1[1]); store(context, openBrace(context, Breaks.AfterRuleBegins, true)); body$1(context, token$1[2]); store(context, closeBrace(context, Breaks.AfterRuleEnds, false, isLast)); break; case token.COMMENT: store(context, token$1); break; case token.PROPERTY: store(context, token$1[1]); store(context, colon(context)); if (propertyValue) { value$1(context, token$1); } store(context, needsSemicolon ? semicolon(context, Breaks.AfterProperty, isLast) : emptyCharacter); break; case token.RAW: store(context, token$1); } } function value$1(context, token$1) { var store = context.store; var j, m; if (token$1[2][0] == token.PROPERTY_BLOCK) { store(context, openBrace(context, Breaks.AfterBlockBegins, false)); body$1(context, token$1[2][1]); store(context, closeBrace(context, Breaks.AfterBlockEnds, false, true)); } else { for (j = 2, m = token$1.length; j < m; j++) { store(context, token$1[j]); if (j < m - 1 && (inFilter(token$1) || !disallowsSpace(context, token$1, j))) { store(context, marker.SPACE); } } } } function allowsBreak(context, where) { return context.format && context.format.breaks[where]; } function allowsSpace(context, where) { return context.format && context.format.spaces[where]; } function openBrace(context, where, needsPrefixSpace) { if (context.format) { context.indentBy += context.format.indentBy; context.indentWith = context.format.indentWith.repeat(context.indentBy); return (needsPrefixSpace && allowsSpace(context, Spaces.BeforeBlockBegins) ? marker.SPACE : emptyCharacter) + marker.OPEN_CURLY_BRACKET + (allowsBreak(context, where) ? context.format.breakWith : emptyCharacter) + context.indentWith; } else { return marker.OPEN_CURLY_BRACKET; } } function closeBrace(context, where, beforeBlockEnd, isLast) { if (context.format) { context.indentBy -= context.format.indentBy; context.indentWith = context.format.indentWith.repeat(context.indentBy); return (allowsBreak(context, Breaks.AfterProperty) || beforeBlockEnd && allowsBreak(context, Breaks.BeforeBlockEnds) ? context.format.breakWith : emptyCharacter) + context.indentWith + marker.CLOSE_CURLY_BRACKET + (isLast ? emptyCharacter : (allowsBreak(context, where) ? context.format.breakWith : emptyCharacter) + context.indentWith); } else { return marker.CLOSE_CURLY_BRACKET; } } function colon(context) { return context.format ? marker.COLON + (allowsSpace(context, Spaces.BeforeValue) ? marker.SPACE : emptyCharacter) : marker.COLON; } function semicolon(context, where, isLast) { return context.format ? marker.SEMICOLON + (isLast || !allowsBreak(context, where) ? emptyCharacter : context.format.breakWith + context.indentWith) : marker.SEMICOLON; } function comma(context) { return context.format ? marker.COMMA + (allowsBreak(context, Breaks.BetweenSelectors) ? context.format.breakWith : emptyCharacter) + context.indentWith : marker.COMMA; } function all$4(context, tokens) { var store = context.store; var token$1; var isLast; var i, l; for (i = 0, l = tokens.length; i < l; i++) { token$1 = tokens[i]; isLast = i == l - 1; switch (token$1[0]) { case token.AT_RULE: store(context, token$1); store(context, semicolon(context, Breaks.AfterAtRule, isLast)); break; case token.AT_RULE_BLOCK: rules$1(context, token$1[1]); store(context, openBrace(context, Breaks.AfterRuleBegins, true)); body$1(context, token$1[2]); store(context, closeBrace(context, Breaks.AfterRuleEnds, false, isLast)); break; case token.NESTED_BLOCK: rules$1(context, token$1[1]); store(context, openBrace(context, Breaks.AfterBlockBegins, true)); all$4(context, token$1[2]); store(context, closeBrace(context, Breaks.AfterBlockEnds, true, isLast)); break; case token.COMMENT: store(context, token$1); store(context, allowsBreak(context, Breaks.AfterComment) ? context.format.breakWith : emptyCharacter); break; case token.RAW: store(context, token$1); break; case token.RULE: rules$1(context, token$1[1]); store(context, openBrace(context, Breaks.AfterRuleBegins, true)); body$1(context, token$1[2]); store(context, closeBrace(context, Breaks.AfterRuleEnds, false, isLast)); break; } } } var helpers = { all: all$4, body: body$1, property: property$1, rules: rules$1, value: value$1 }; function store$2(serializeContext, token) { serializeContext.output.push(typeof token == 'string' ? token : token[1]); } function context() { var newContext = { output: [], store: store$2 }; return newContext; } function all$3(tokens) { var oneTimeContext = context(); helpers.all(oneTimeContext, tokens); return oneTimeContext.output.join(''); } function body(tokens) { var oneTimeContext = context(); helpers.body(oneTimeContext, tokens); return oneTimeContext.output.join(''); } function property(tokens, position) { var oneTimeContext = context(); helpers.property(oneTimeContext, tokens, position, true); return oneTimeContext.output.join(''); } function rules(tokens) { var oneTimeContext = context(); helpers.rules(oneTimeContext, tokens); return oneTimeContext.output.join(''); } function value(tokens) { var oneTimeContext = context(); helpers.value(oneTimeContext, tokens); return oneTimeContext.output.join(''); } var oneTime = { all: all$3, body: body, property: property, rules: rules, value: value }; var wrapForOptimizing$2 = wrapForOptimizing$3.all; var OptimizationLevel$5 = optimizationLevel.OptimizationLevel; var serializeRules$9 = oneTime.rules; var IgnoreProperty = 'ignore-property'; var CHARSET_TOKEN = '@charset'; var CHARSET_REGEXP = new RegExp('^' + CHARSET_TOKEN, 'i'); var DEFAULT_ROUNDING_PRECISION = roundingPrecision.DEFAULT; var WHOLE_PIXEL_VALUE = /(?:^|\s|\()(-?\d+)px/; var TIME_VALUE = /^(\-?[\d\.]+)(m?s)$/; var HEX_VALUE_PATTERN = /[0-9a-f]/i; var PROPERTY_NAME_PATTERN = /^(?:\-chrome\-|\-[\w\-]+\w|\w[\w\-]+\w|\-\-\S+)$/; var IMPORT_PREFIX_PATTERN$2 = /^@import/i; var QUOTED_PATTERN = /^('.*'|".*")$/; var QUOTED_BUT_SAFE_PATTERN = /^['"][a-zA-Z][a-zA-Z\d\-_]+['"]$/; var URL_PREFIX_PATTERN$2 = /^url\(/i; var LOCAL_PREFIX_PATTERN = /^local\(/i; var VARIABLE_NAME_PATTERN = /^--\S+$/; function isLocal(value){ return LOCAL_PREFIX_PATTERN.test(value); } function isNegative(value) { return value && value[1][0] == '-' && parseFloat(value[1]) < 0; } function isQuoted(value) { return QUOTED_PATTERN.test(value); } function isUrl$1(value) { return URL_PREFIX_PATTERN$2.test(value); } function normalizeUrl(value) { return value .replace(URL_PREFIX_PATTERN$2, 'url(') .replace(/\\?\n|\\?\r\n/g, ''); } function optimizeBackground(property) { var values = property.value; if (values.length == 1 && values[0][1] == 'none') { values[0][1] = '0 0'; } if (values.length == 1 && values[0][1] == 'transparent') { values[0][1] = '0 0'; } } function optimizeBorderRadius(property) { var values = property.value; var spliceAt; if (values.length == 3 && values[1][1] == '/' && values[0][1] == values[2][1]) { spliceAt = 1; } else if (values.length == 5 && values[2][1] == '/' && values[0][1] == values[3][1] && values[1][1] == values[4][1]) { spliceAt = 2; } else if (values.length == 7 && values[3][1] == '/' && values[0][1] == values[4][1] && values[1][1] == values[5][1] && values[2][1] == values[6][1]) { spliceAt = 3; } else if (values.length == 9 && values[4][1] == '/' && values[0][1] == values[5][1] && values[1][1] == values[6][1] && values[2][1] == values[7][1] && values[3][1] == values[8][1]) { spliceAt = 4; } if (spliceAt) { property.value.splice(spliceAt); property.dirty = true; } } /** * @param {string} name * @param {string} value * @param {Object} compatibility * @return {string} */ function optimizeColors(name, value, compatibility) { if (!value.match(/#|rgb|hsl/gi)) { return shortenHex_1(value); } value = value .replace(/(rgb|hsl)a?\((\-?\d+),(\-?\d+\%?),(\-?\d+\%?),(0*[1-9]+[0-9]*(\.?\d*)?)\)/gi, function (match, colorFn, p1, p2, p3, alpha) { return (parseInt(alpha, 10) >= 1 ? colorFn + '(' + [p1,p2,p3].join(',') + ')' : match); }) .replace(/rgb\((\-?\d+),(\-?\d+),(\-?\d+)\)/gi, function (match, red, green, blue) { return shortenRgb_1(red, green, blue); }) .replace(/hsl\((-?\d+),(-?\d+)%?,(-?\d+)%?\)/gi, function (match, hue, saturation, lightness) { return shortenHsl_1(hue, saturation, lightness); }) .replace(/(^|[^='"])#([0-9a-f]{6})/gi, function (match, prefix, color, at, inputValue) { var suffix = inputValue[at + match.length]; if (suffix && HEX_VALUE_PATTERN.test(suffix)) { return match; } else if (color[0] == color[1] && color[2] == color[3] && color[4] == color[5]) { return (prefix + '#' + color[0] + color[2] + color[4]).toLowerCase(); } else { return (prefix + '#' + color).toLowerCase(); } }) .replace(/(^|[^='"])#([0-9a-f]{3})/gi, function (match, prefix, color) { return prefix + '#' + color.toLowerCase(); }) .replace(/(rgb|rgba|hsl|hsla)\(([^\)]+)\)/gi, function (match, colorFunction, colorDef) { var tokens = colorDef.split(','); var colorFnLowercase = colorFunction && colorFunction.toLowerCase(); var applies = (colorFnLowercase == 'hsl' && tokens.length == 3) || (colorFnLowercase == 'hsla' && tokens.length == 4) || (colorFnLowercase == 'rgb' && tokens.length === 3 && colorDef.indexOf('%') > 0) || (colorFnLowercase == 'rgba' && tokens.length == 4 && colorDef.indexOf('%') > 0); if (!applies) { return match; } if (tokens[1].indexOf('%') == -1) { tokens[1] += '%'; } if (tokens[2].indexOf('%') == -1) { tokens[2] += '%'; } return colorFunction + '(' + tokens.join(',') + ')'; }); if (compatibility.colors.opacity && name.indexOf('background') == -1) { value = value.replace(/(?:rgba|hsla)\(0,0%?,0%?,0\)/g, function (match) { if (split_1(value, ',').pop().indexOf('gradient(') > -1) { return match; } return 'transparent'; }); } return shortenHex_1(value); } function optimizeFilter(property) { if (property.value.length == 1) { property.value[0][1] = property.value[0][1].replace(/progid:DXImageTransform\.Microsoft\.(Alpha|Chroma)(\W)/, function (match, filter, suffix) { return filter.toLowerCase() + suffix; }); } property.value[0][1] = property.value[0][1] .replace(/,(\S)/g, ', $1') .replace(/ ?= ?/g, '='); } function optimizeFontWeight(property, atIndex) { var value = property.value[atIndex][1]; if (value == 'normal') { value = '400'; } else if (value == 'bold') { value = '700'; } property.value[atIndex][1] = value; } function optimizeMultipleZeros(property) { var values = property.value; var spliceAt; if (values.length == 4 && values[0][1] === '0' && values[1][1] === '0' && values[2][1] === '0' && values[3][1] === '0') { if (property.name.indexOf('box-shadow') > -1) { spliceAt = 2; } else { spliceAt = 1; } } if (spliceAt) { property.value.splice(spliceAt); property.dirty = true; } } function optimizeOutline(property) { var values = property.value; if (values.length == 1 && values[0][1] == 'none') { values[0][1] = '0'; } } function optimizePixelLengths(_, value, compatibility) { if (!WHOLE_PIXEL_VALUE.test(value)) { return value; } return value.replace(WHOLE_PIXEL_VALUE, function (match, val) { var newValue; var intVal = parseInt(val); if (intVal === 0) { return match; } if (compatibility.properties.shorterLengthUnits && compatibility.units.pt && intVal * 3 % 4 === 0) { newValue = intVal * 3 / 4 + 'pt'; } if (compatibility.properties.shorterLengthUnits && compatibility.units.pc && intVal % 16 === 0) { newValue = intVal / 16 + 'pc'; } if (compatibility.properties.shorterLengthUnits && compatibility.units.in && intVal % 96 === 0) { newValue = intVal / 96 + 'in'; } if (newValue) { newValue = match.substring(0, match.indexOf(val)) + newValue; } return newValue && newValue.length < match.length ? newValue : match; }); } function optimizePrecision(_, value, precisionOptions) { if (!precisionOptions.enabled || value.indexOf('.') === -1) { return value; } return value .replace(precisionOptions.decimalPointMatcher, '$1$2$3') .replace(precisionOptions.zeroMatcher, function (match, integerPart, fractionPart, unit) { var multiplier = precisionOptions.units[unit].multiplier; var parsedInteger = parseInt(integerPart); var integer = isNaN(parsedInteger) ? 0 : parsedInteger; var fraction = parseFloat(fractionPart); return Math.round((integer + fraction) * multiplier) / multiplier + unit; }); } function optimizeTimeUnits(_, value) { if (!TIME_VALUE.test(value)) return value; return value.replace(TIME_VALUE, function (match, val, unit) { var newValue; if (unit == 'ms') { newValue = parseInt(val) / 1000 + 's'; } else if (unit == 's') { newValue = parseFloat(val) * 1000 + 'ms'; } return newValue.length < match.length ? newValue : match; }); } function optimizeUnits(name, value, unitsRegexp) { if (/^(?:\-moz\-calc|\-webkit\-calc|calc|rgb|hsl|rgba|hsla)\(/.test(value)) { return value; } if (name == 'flex' || name == '-ms-flex' || name == '-webkit-flex' || name == 'flex-basis' || name == '-webkit-flex-basis') { return value; } if (value.indexOf('%') > 0 && (name == 'height' || name == 'max-height' || name == 'width' || name == 'max-width')) { return value; } return value .replace(unitsRegexp, '$1' + '0' + '$2') .replace(unitsRegexp, '$1' + '0' + '$2'); } function optimizeWhitespace(name, value) { if (name.indexOf('filter') > -1 || value.indexOf(' ') == -1 || value.indexOf('expression') === 0) { return value; } if (value.indexOf(marker.SINGLE_QUOTE) > -1 || value.indexOf(marker.DOUBLE_QUOTE) > -1) { return value; } value = value.replace(/\s+/g, ' '); if (value.indexOf('calc') > -1) { value = value.replace(/\) ?\/ ?/g, ')/ '); } return value .replace(/(\(;?)\s+/g, '$1') .replace(/\s+(;?\))/g, '$1') .replace(/, /g, ','); } function optimizeZeroDegUnit(_, value) { if (value.indexOf('0deg') == -1) { return value; } return value.replace(/\(0deg\)/g, '(0)'); } function optimizeZeroUnits(name, value) { if (value.indexOf('0') == -1) { return value; } if (value.indexOf('-') > -1) { value = value .replace(/([^\w\d\-]|^)\-0([^\.]|$)/g, '$10$2') .replace(/([^\w\d\-]|^)\-0([^\.]|$)/g, '$10$2'); } return value .replace(/(^|\s)0+([1-9])/g, '$1$2') .replace(/(^|\D)\.0+(\D|$)/g, '$10$2') .replace(/(^|\D)\.0+(\D|$)/g, '$10$2') .replace(/\.([1-9]*)0+(\D|$)/g, function (match, nonZeroPart, suffix) { return (nonZeroPart.length > 0 ? '.' : '') + nonZeroPart + suffix; }) .replace(/(^|\D)0\.(\d)/g, '$1.$2'); } function removeQuotes(name, value) { if (name == 'content' || name.indexOf('font-variation-settings') > -1 || name.indexOf('font-feature-settings') > -1 || name == 'grid' || name.indexOf('grid-') > -1) { return value; } return QUOTED_BUT_SAFE_PATTERN.test(value) ? value.substring(1, value.length - 1) : value; } function removeUrlQuotes(value) { return /^url\(['"].+['"]\)$/.test(value) && !/^url\(['"].*[\*\s\(\)'"].*['"]\)$/.test(value) && !/^url\(['"]data:[^;]+;charset/.test(value) ? value.replace(/["']/g, '') : value; } function transformValue(propertyName, propertyValue, rule, transformCallback) { var selector = serializeRules$9(rule); var transformedValue = transformCallback(propertyName, propertyValue, selector); if (transformedValue === undefined) { return propertyValue; } else if (transformedValue === false) { return IgnoreProperty; } else { return transformedValue; } } // function optimizeBody(rule, properties, context) { var options = context.options; var levelOptions = options.level[OptimizationLevel$5.One]; var property, name, type, value; var valueIsUrl; var propertyToken; var _properties = wrapForOptimizing$2(properties, true); propertyLoop: for (var i = 0, l = _properties.length; i < l; i++) { property = _properties[i]; name = property.name; if (!PROPERTY_NAME_PATTERN.test(name)) { propertyToken = property.all[property.position]; context.warnings.push('Invalid property name \'' + name + '\' at ' + formatPosition_1(propertyToken[1][2][0]) + '. Ignoring.'); property.unused = true; } if (property.value.length === 0) { propertyToken = property.all[property.position]; context.warnings.push('Empty property \'' + name + '\' at ' + formatPosition_1(propertyToken[1][2][0]) + '. Ignoring.'); property.unused = true; } if (property.hack && ( (property.hack[0] == hack.ASTERISK || property.hack[0] == hack.UNDERSCORE) && !options.compatibility.properties.iePrefixHack || property.hack[0] == hack.BACKSLASH && !options.compatibility.properties.ieSuffixHack || property.hack[0] == hack.BANG && !options.compatibility.properties.ieBangHack)) { property.unused = true; } if (levelOptions.removeNegativePaddings && name.indexOf('padding') === 0 && (isNegative(property.value[0]) || isNegative(property.value[1]) || isNegative(property.value[2]) || isNegative(property.value[3]))) { property.unused = true; } if (!options.compatibility.properties.ieFilters && isLegacyFilter(property)) { property.unused = true; } if (property.unused) { continue; } if (property.block) { optimizeBody(rule, property.value[0][1], context); continue; } if (VARIABLE_NAME_PATTERN.test(name)) { continue; } for (var j = 0, m = property.value.length; j < m; j++) { type = property.value[j][0]; value = property.value[j][1]; valueIsUrl = isUrl$1(value); if (type == token.PROPERTY_BLOCK) { property.unused = true; context.warnings.push('Invalid value token at ' + formatPosition_1(value[0][1][2][0]) + '. Ignoring.'); break; } if (valueIsUrl && !context.validator.isUrl(value)) { property.unused = true; context.warnings.push('Broken URL \'' + value + '\' at ' + formatPosition_1(property.value[j][2][0]) + '. Ignoring.'); break; } if (valueIsUrl) { value = levelOptions.normalizeUrls ? normalizeUrl(value) : value; value = !options.compatibility.properties.urlQuotes ? removeUrlQuotes(value) : value; } else if (isQuoted(value) || isLocal(value)) { value = levelOptions.removeQuotes ? removeQuotes(name, value) : value; } else { value = levelOptions.removeWhitespace ? optimizeWhitespace(name, value) : value; value = optimizePrecision(name, value, options.precision); value = optimizePixelLengths(name, value, options.compatibility); value = levelOptions.replaceTimeUnits ? optimizeTimeUnits(name, value) : value; value = levelOptions.replaceZeroUnits ? optimizeZeroUnits(name, value) : value; if (options.compatibility.properties.zeroUnits) { value = optimizeZeroDegUnit(name, value); value = optimizeUnits(name, value, options.unitsRegexp); } if (options.compatibility.properties.colors) { value = optimizeColors(name, value, options.compatibility); } } value = transformValue(name, value, rule, levelOptions.transform); if (value === IgnoreProperty) { property.unused = true; continue propertyLoop; } property.value[j][1] = value; } if (levelOptions.replaceMultipleZeros) { optimizeMultipleZeros(property); } if (name == 'background' && levelOptions.optimizeBackground) { optimizeBackground(property); } else if (name.indexOf('border') === 0 && name.indexOf('radius') > 0 && levelOptions.optimizeBorderRadius) { optimizeBorderRadius(property); } else if (name == 'filter'&& levelOptions.optimizeFilter && options.compatibility.properties.ieFilters) { optimizeFilter(property); } else if (name == 'font-weight' && levelOptions.optimizeFontWeight) { optimizeFontWeight(property, 0); } else if (name == 'outline' && levelOptions.optimizeOutline) { optimizeOutline(property); } } restoreFromOptimizing_1(_properties); removeUnused_1(_properties); removeComments(properties, options); } function removeComments(tokens, options) { var token$1; var i; for (i = 0; i < tokens.length; i++) { token$1 = tokens[i]; if (token$1[0] != token.COMMENT) { continue; } optimizeComment(token$1, options); if (token$1[1].length === 0) { tokens.splice(i, 1); i--; } } } function optimizeComment(token, options) { if (token[1][2] == marker.EXCLAMATION && (options.level[OptimizationLevel$5.One].specialComments == 'all' || options.commentsKept < options.level[OptimizationLevel$5.One].specialComments)) { options.commentsKept++; return; } token[1] = []; } function cleanupCharsets(tokens) { var hasCharset = false; for (var i = 0, l = tokens.length; i < l; i++) { var token$1 = tokens[i]; if (token$1[0] != token.AT_RULE) continue; if (!CHARSET_REGEXP.test(token$1[1])) continue; if (hasCharset || token$1[1].indexOf(CHARSET_TOKEN) == -1) { tokens.splice(i, 1); i--; l--; } else { hasCharset = true; tokens.splice(i, 1); tokens.unshift([token.AT_RULE, token$1[1].replace(CHARSET_REGEXP, CHARSET_TOKEN)]); } } } function buildUnitRegexp(options) { var units = ['px', 'em', 'ex', 'cm', 'mm', 'in', 'pt', 'pc', '%']; var otherUnits = ['ch', 'rem', 'vh', 'vm', 'vmax', 'vmin', 'vw']; otherUnits.forEach(function (unit) { if (options.compatibility.units[unit]) { units.push(unit); } }); return new RegExp('(^|\\s|\\(|,)0(?:' + units.join('|') + ')(\\W|$)', 'g'); } function buildPrecisionOptions(roundingPrecision) { var precisionOptions = { matcher: null, units: {}, }; var optimizable = []; var unit; var value; for (unit in roundingPrecision) { value = roundingPrecision[unit]; if (value != DEFAULT_ROUNDING_PRECISION) { precisionOptions.units[unit] = {}; precisionOptions.units[unit].value = value; precisionOptions.units[unit].multiplier = Math.pow(10, value); optimizable.push(unit); } } if (optimizable.length > 0) { precisionOptions.enabled = true; precisionOptions.decimalPointMatcher = new RegExp('(\\d)\\.($|' + optimizable.join('|') + ')($|\W)', 'g'); precisionOptions.zeroMatcher = new RegExp('(\\d*)(\\.\\d+)(' + optimizable.join('|') + ')', 'g'); } return precisionOptions; } function isImport$1(token) { return IMPORT_PREFIX_PATTERN$2.test(token[1]); } function isLegacyFilter(property) { var value; if (property.name == 'filter' || property.name == '-ms-filter') { value = property.value[0][1]; return value.indexOf('progid') > -1 || value.indexOf('alpha') === 0 || value.indexOf('chroma') === 0; } else { return false; } } function level1Optimize(tokens, context) { var options = context.options; var levelOptions = options.level[OptimizationLevel$5.One]; var ie7Hack = options.compatibility.selectors.ie7Hack; var adjacentSpace = options.compatibility.selectors.adjacentSpace; var spaceAfterClosingBrace = options.compatibility.properties.spaceAfterClosingBrace; var format = options.format; var mayHaveCharset = false; var afterRules = false; options.unitsRegexp = options.unitsRegexp || buildUnitRegexp(options); options.precision = options.precision || buildPrecisionOptions(levelOptions.roundingPrecision); options.commentsKept = options.commentsKept || 0; for (var i = 0, l = tokens.length; i < l; i++) { var token$1 = tokens[i]; switch (token$1[0]) { case token.AT_RULE: token$1[1] = isImport$1(token$1) && afterRules ? '' : token$1[1]; token$1[1] = levelOptions.tidyAtRules ? tidyAtRule_1(token$1[1]) : token$1[1]; mayHaveCharset = true; break; case token.AT_RULE_BLOCK: optimizeBody(token$1[1], token$1[2], context); afterRules = true; break; case token.NESTED_BLOCK: token$1[1] = levelOptions.tidyBlockScopes ? tidyBlock_1(token$1[1], spaceAfterClosingBrace) : token$1[1]; level1Optimize(token$1[2], context); afterRules = true; break; case token.COMMENT: optimizeComment(token$1, options); break; case token.RULE: token$1[1] = levelOptions.tidySelectors ? tidyRules_1(token$1[1], !ie7Hack, adjacentSpace, format, context.warnings) : token$1[1]; token$1[1] = token$1[1].length > 1 ? sortSelectors_1(token$1[1], levelOptions.selectorsSortingMethod) : token$1[1]; optimizeBody(token$1[1], token$1[2], context); afterRules = true; break; } if (token$1[0] == token.COMMENT && token$1[1].length === 0 || levelOptions.removeEmpty && (token$1[1].length === 0 || (token$1[2] && token$1[2].length === 0))) { tokens.splice(i, 1); i--; l--; } } if (levelOptions.cleanupCharsets && mayHaveCharset) { cleanupCharsets(tokens); } return tokens; } var optimize$2 = level1Optimize; var DEEP_SELECTOR_PATTERN = /\/deep\//; var DOUBLE_COLON_PATTERN = /^::/; var NOT_PSEUDO = ':not'; var PSEUDO_CLASSES_WITH_ARGUMENTS = [ ':dir', ':lang', ':not', ':nth-child', ':nth-last-child', ':nth-last-of-type', ':nth-of-type' ]; var RELATION_PATTERN = /[>\+~]/; var UNMIXABLE_PSEUDO_CLASSES = [ ':after', ':before', ':first-letter', ':first-line', ':lang' ]; var UNMIXABLE_PSEUDO_ELEMENTS = [ '::after', '::before', '::first-letter', '::first-line' ]; var Level$1 = { DOUBLE_QUOTE: 'double-quote', SINGLE_QUOTE: 'single-quote', ROOT: 'root' }; function isMergeable(selector, mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) { var singleSelectors = split_1(selector, marker.COMMA); var singleSelector; var i, l; for (i = 0, l = singleSelectors.length; i < l; i++) { singleSelector = singleSelectors[i]; if (singleSelector.length === 0 || isDeepSelector(singleSelector) || (singleSelector.indexOf(marker.COLON) > -1 && !areMergeable(singleSelector, extractPseudoFrom(singleSelector), mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging))) { return false; } } return true; } function isDeepSelector(selector) { return DEEP_SELECTOR_PATTERN.test(selector); } function extractPseudoFrom(selector) { var list = []; var character; var buffer = []; var level = Level$1.ROOT; var roundBracketLevel = 0; var isQuoted; var isEscaped; var isPseudo = false; var isRelation; var wasColon = false; var index; var len; for (index = 0, len = selector.length; index < len; index++) { character = selector[index]; isRelation = !isEscaped && RELATION_PATTERN.test(character); isQuoted = level == Level$1.DOUBLE_QUOTE || level == Level$1.SINGLE_QUOTE; if (isEscaped) { buffer.push(character); } else if (character == marker.DOUBLE_QUOTE && level == Level$1.ROOT) { buffer.push(character); level = Level$1.DOUBLE_QUOTE; } else if (character == marker.DOUBLE_QUOTE && level == Level$1.DOUBLE_QUOTE) { buffer.push(character); level = Level$1.ROOT; } else if (character == marker.SINGLE_QUOTE && level == Level$1.ROOT) { buffer.push(character); level = Level$1.SINGLE_QUOTE; } else if (character == marker.SINGLE_QUOTE && level == Level$1.SINGLE_QUOTE) { buffer.push(character); level = Level$1.ROOT; } else if (isQuoted) { buffer.push(character); } else if (character == marker.OPEN_ROUND_BRACKET) { buffer.push(character); roundBracketLevel++; } else if (character == marker.CLOSE_ROUND_BRACKET && roundBracketLevel == 1 && isPseudo) { buffer.push(character); list.push(buffer.join('')); roundBracketLevel--; buffer = []; isPseudo = false; } else if (character == marker.CLOSE_ROUND_BRACKET) { buffer.push(character); roundBracketLevel--; } else if (character == marker.COLON && roundBracketLevel === 0 && isPseudo && !wasColon) { list.push(buffer.join('')); buffer = []; buffer.push(character); } else if (character == marker.COLON && roundBracketLevel === 0 && !wasColon) { buffer = []; buffer.push(character); isPseudo = true; } else if (character == marker.SPACE && roundBracketLevel === 0 && isPseudo) { list.push(buffer.join('')); buffer = []; isPseudo = false; } else if (isRelation && roundBracketLevel === 0 && isPseudo) { list.push(buffer.join('')); buffer = []; isPseudo = false; } else { buffer.push(character); } isEscaped = character == marker.BACK_SLASH; wasColon = character == marker.COLON; } if (buffer.length > 0 && isPseudo) { list.push(buffer.join('')); } return list; } function areMergeable(selector, matches, mergeablePseudoClasses, mergeablePseudoElements, multiplePseudoMerging) { return areAllowed(matches, mergeablePseudoClasses, mergeablePseudoElements) && needArguments(matches) && (matches.length < 2 || !someIncorrectlyChained(selector, matches)) && (matches.length < 2 || multiplePseudoMerging && allMixable(matches)); } function areAllowed(matches, mergeablePseudoClasses, mergeablePseudoElements) { var match; var name; var i, l; for (i = 0, l = matches.length; i < l; i++) { match = matches[i]; name = match.indexOf(marker.OPEN_ROUND_BRACKET) > -1 ? match.substring(0, match.indexOf(marker.OPEN_ROUND_BRACKET)) : match; if (mergeablePseudoClasses.indexOf(name) === -1 && mergeablePseudoElements.indexOf(name) === -1) { return false; } } return true; } function needArguments(matches) { var match; var name; var bracketOpensAt; var hasArguments; var i, l; for (i = 0, l = matches.length; i < l; i++) { match = matches[i]; bracketOpensAt = match.indexOf(marker.OPEN_ROUND_BRACKET); hasArguments = bracketOpensAt > -1; name = hasArguments ? match.substring(0, bracketOpensAt) : match; if (hasArguments && PSEUDO_CLASSES_WITH_ARGUMENTS.indexOf(name) == -1) { return false; } if (!hasArguments && PSEUDO_CLASSES_WITH_ARGUMENTS.indexOf(name) > -1) { return false; } } return true; } function someIncorrectlyChained(selector, matches) { var positionInSelector = 0; var match; var matchAt; var nextMatch; var nextMatchAt; var name; var nextName; var areChained; var i, l; for (i = 0, l = matches.length; i < l; i++) { match = matches[i]; nextMatch = matches[i + 1]; if (!nextMatch) { break; } matchAt = selector.indexOf(match, positionInSelector); nextMatchAt = selector.indexOf(match, matchAt + 1); positionInSelector = nextMatchAt; areChained = matchAt + match.length == nextMatchAt; if (areChained) { name = match.indexOf(marker.OPEN_ROUND_BRACKET) > -1 ? match.substring(0, match.indexOf(marker.OPEN_ROUND_BRACKET)) : match; nextName = nextMatch.indexOf(marker.OPEN_ROUND_BRACKET) > -1 ? nextMatch.substring(0, nextMatch.indexOf(marker.OPEN_ROUND_BRACKET)) : nextMatch; if (name != NOT_PSEUDO || nextName != NOT_PSEUDO) { return true; } } } return false; } function allMixable(matches) { var unmixableMatches = 0; var match; var i, l; for (i = 0, l = matches.length; i < l; i++) { match = matches[i]; if (isPseudoElement(match)) { unmixableMatches += UNMIXABLE_PSEUDO_ELEMENTS.indexOf(match) > -1 ? 1 : 0; } else { unmixableMatches += UNMIXABLE_PSEUDO_CLASSES.indexOf(match) > -1 ? 1 : 0; } if (unmixableMatches > 1) { return false; } } return true; } function isPseudoElement(pseudo) { return DOUBLE_COLON_PATTERN.test(pseudo); } var isMergeable_1 = isMergeable; function everyValuesPair(fn, left, right) { var leftSize = left.value.length; var rightSize = right.value.length; var total = Math.max(leftSize, rightSize); var lowerBound = Math.min(leftSize, rightSize) - 1; var leftValue; var rightValue; var position; for (position = 0; position < total; position++) { leftValue = left.value[position] && left.value[position][1] || leftValue; rightValue = right.value[position] && right.value[position][1] || rightValue; if (leftValue == marker.COMMA || rightValue == marker.COMMA) { continue; } if (!fn(leftValue, rightValue, position, position <= lowerBound)) { return false; } } return true; } var everyValuesPair_1 = everyValuesPair; function hasInherit(property) { for (var i = property.value.length - 1; i >= 0; i--) { if (property.value[i][1] == 'inherit') return true; } return false; } var hasInherit_1 = hasInherit; function InvalidPropertyError(message) { this.name = 'InvalidPropertyError'; this.message = message; this.stack = (new Error()).stack; } InvalidPropertyError.prototype = Object.create(Error.prototype); InvalidPropertyError.prototype.constructor = InvalidPropertyError; var invalidPropertyError = InvalidPropertyError; var wrapSingle$2 = wrapForOptimizing$3.single; function _anyIsInherit(values) { var i, l; for (i = 0, l = values.length; i < l; i++) { if (values[i][1] == 'inherit') { return true; } } return false; } function _colorFilter(validator) { return function (value) { return value[1] == 'invert' || validator.isColor(value[1]) || validator.isPrefixed(value[1]); }; } function _styleFilter(validator) { return function (value) { return value[1] != 'inherit' && validator.isStyleKeyword(value[1]) && !validator.isColorFunction(value[1]); }; } function _wrapDefault(name, property, compactable) { var descriptor = compactable[name]; if (descriptor.doubleValues && descriptor.defaultValue.length == 2) { return wrapSingle$2([ token.PROPERTY, [token.PROPERTY_NAME, name], [token.PROPERTY_VALUE, descriptor.defaultValue[0]], [token.PROPERTY_VALUE, descriptor.defaultValue[1]] ]); } else if (descriptor.doubleValues && descriptor.defaultValue.length == 1) { return wrapSingle$2([ token.PROPERTY, [token.PROPERTY_NAME, name], [token.PROPERTY_VALUE, descriptor.defaultValue[0]] ]); } else { return wrapSingle$2([ token.PROPERTY, [token.PROPERTY_NAME, name], [token.PROPERTY_VALUE, descriptor.defaultValue] ]); } } function _widthFilter(validator) { return function (value) { return value[1] != 'inherit' && (validator.isWidth(value[1]) || validator.isUnit(value[1]) && !validator.isDynamicUnit(value[1])) && !validator.isStyleKeyword(value[1]) && !validator.isColorFunction(value[1]); }; } function animation(property, compactable, validator) { var duration = _wrapDefault(property.name + '-duration', property, compactable); var timing = _wrapDefault(property.name + '-timing-function', property, compactable); var delay = _wrapDefault(property.name + '-delay', property, compactable); var iteration = _wrapDefault(property.name + '-iteration-count', property, compactable); var direction = _wrapDefault(property.name + '-direction', property, compactable); var fill = _wrapDefault(property.name + '-fill-mode', property, compactable); var play = _wrapDefault(property.name + '-play-state', property, compactable); var name = _wrapDefault(property.name + '-name', property, compactable); var components = [duration, timing, delay, iteration, direction, fill, play, name]; var values = property.value; var value; var durationSet = false; var timingSet = false; var delaySet = false; var iterationSet = false; var directionSet = false; var fillSet = false; var playSet = false; var nameSet = false; var i; var l; if (property.value.length == 1 && property.value[0][1] == 'inherit') { duration.value = timing.value = delay.value = iteration.value = direction.value = fill.value = play.value = name.value = property.value; return components; } if (values.length > 1 && _anyIsInherit(values)) { throw new invalidPropertyError('Invalid animation values at ' + formatPosition_1(values[0][2][0]) + '. Ignoring.'); } for (i = 0, l = values.length; i < l; i++) { value = values[i]; if (validator.isTime(value[1]) && !durationSet) { duration.value = [value]; durationSet = true; } else if (validator.isTime(value[1]) && !delaySet) { delay.value = [value]; delaySet = true; } else if ((validator.isGlobal(value[1]) || validator.isTimingFunction(value[1])) && !timingSet) { timing.value = [value]; timingSet = true; } else if ((validator.isAnimationIterationCountKeyword(value[1]) || validator.isPositiveNumber(value[1])) && !iterationSet) { iteration.value = [value]; iterationSet = true; } else if (validator.isAnimationDirectionKeyword(value[1]) && !directionSet) { direction.value = [value]; directionSet = true; } else if (validator.isAnimationFillModeKeyword(value[1]) && !fillSet) { fill.value = [value]; fillSet = true; } else if (validator.isAnimationPlayStateKeyword(value[1]) && !playSet) { play.value = [value]; playSet = true; } else if ((validator.isAnimationNameKeyword(value[1]) || validator.isIdentifier(value[1])) && !nameSet) { name.value = [value]; nameSet = true; } else { throw new invalidPropertyError('Invalid animation value at ' + formatPosition_1(value[2][0]) + '. Ignoring.'); } } return components; } function background$1(property, compactable, validator) { var image = _wrapDefault('background-image', property, compactable); var position = _wrapDefault('background-position', property, compactable); var size = _wrapDefault('background-size', property, compactable); var repeat = _wrapDefault('background-repeat', property, compactable); var attachment = _wrapDefault('background-attachment', property, compactable); var origin = _wrapDefault('background-origin', property, compactable); var clip = _wrapDefault('background-clip', property, compactable); var color = _wrapDefault('background-color', property, compactable); var components = [image, position, size, repeat, attachment, origin, clip, color]; var values = property.value; var positionSet = false; var clipSet = false; var originSet = false; var repeatSet = false; var anyValueSet = false; if (property.value.length == 1 && property.value[0][1] == 'inherit') { // NOTE: 'inherit' is not a valid value for background-attachment color.value = image.value = repeat.value = position.value = size.value = origin.value = clip.value = property.value; return components; } if (property.value.length == 1 && property.value[0][1] == '0 0') { return components; } for (var i = values.length - 1; i >= 0; i--) { var value = values[i]; if (validator.isBackgroundAttachmentKeyword(value[1])) { attachment.value = [value]; anyValueSet = true; } else if (validator.isBackgroundClipKeyword(value[1]) || validator.isBackgroundOriginKeyword(value[1])) { if (clipSet) { origin.value = [value]; originSet = true; } else { clip.value = [value]; clipSet = true; } anyValueSet = true; } else if (validator.isBackgroundRepeatKeyword(value[1])) { if (repeatSet) { repeat.value.unshift(value); } else { repeat.value = [value]; repeatSet = true; } anyValueSet = true; } else if (validator.isBackgroundPositionKeyword(value[1]) || validator.isBackgroundSizeKeyword(value[1]) || validator.isUnit(value[1]) || validator.isDynamicUnit(value[1])) { if (i > 0) { var previousValue = values[i - 1]; if (previousValue[1] == marker.FORWARD_SLASH) { size.value = [value]; } else if (i > 1 && values[i - 2][1] == marker.FORWARD_SLASH) { size.value = [previousValue, value]; i -= 2; } else { if (!positionSet) position.value = []; position.value.unshift(value); positionSet = true; } } else { if (!positionSet) position.value = []; position.value.unshift(value); positionSet = true; } anyValueSet = true; } else if ((color.value[0][1] == compactable[color.name].defaultValue || color.value[0][1] == 'none') && (validator.isColor(value[1]) || validator.isPrefixed(value[1]))) { color.value = [value]; anyValueSet = true; } else if (validator.isUrl(value[1]) || validator.isFunction(value[1])) { image.value = [value]; anyValueSet = true; } } if (clipSet && !originSet) origin.value = clip.value.slice(0); if (!anyValueSet) { throw new invalidPropertyError('Invalid background value at ' + formatPosition_1(values[0][2][0]) + '. Ignoring.'); } return components; } function borderRadius$1(property, compactable) { var values = property.value; var splitAt = -1; for (var i = 0, l = values.length; i < l; i++) { if (values[i][1] == marker.FORWARD_SLASH) { splitAt = i; break; } } if (splitAt === 0 || splitAt === values.length - 1) { throw new invalidPropertyError('Invalid border-radius value at ' + formatPosition_1(values[0][2][0]) + '. Ignoring.'); } var target = _wrapDefault(property.name, property, compactable); target.value = splitAt > -1 ? values.slice(0, splitAt) : values.slice(0); target.components = fourValues$1(target, compactable); var remainder = _wrapDefault(property.name, property, compactable); remainder.value = splitAt > -1 ? values.slice(splitAt + 1) : values.slice(0); remainder.components = fourValues$1(remainder, compactable); for (var j = 0; j < 4; j++) { target.components[j].multiplex = true; target.components[j].value = target.components[j].value.concat(remainder.components[j].value); } return target.components; } function font$1(property, compactable, validator) { var style = _wrapDefault('font-style', property, compactable); var variant = _wrapDefault('font-variant', property, compactable); var weight = _wrapDefault('font-weight', property, compactable); var stretch = _wrapDefault('font-stretch', property, compactable); var size = _wrapDefault('font-size', property, compactable); var height = _wrapDefault('line-height', property, compactable); var family = _wrapDefault('font-family', property, compactable); var components = [style, variant, weight, stretch, size, height, family]; var values = property.value; var fuzzyMatched = 4; // style, variant, weight, and stretch var index = 0; var isStretchSet = false; var isStretchValid; var isStyleSet = false; var isStyleValid; var isVariantSet = false; var isVariantValid; var isWeightSet = false; var isWeightValid; var isSizeSet = false; var appendableFamilyName = false; if (!values[index]) { throw new invalidPropertyError('Missing font values at ' + formatPosition_1(property.all[property.position][1][2][0]) + '. Ignoring.'); } if (values.length == 1 && values[0][1] == 'inherit') { style.value = variant.value = weight.value = stretch.value = size.value = height.value = family.value = values; return components; } if (values.length == 1 && (validator.isFontKeyword(values[0][1]) || validator.isGlobal(values[0][1]) || validator.isPrefixed(values[0][1]))) { values[0][1] = marker.INTERNAL + values[0][1]; style.value = variant.value = weight.value = stretch.value = size.value = height.value = family.value = values; return components; } if (values.length < 2 || !_anyIsFontSize(values, validator) || !_anyIsFontFamily(values, validator)) { throw new invalidPropertyError('Invalid font values at ' + formatPosition_1(property.all[property.position][1][2][0]) + '. Ignoring.'); } if (values.length > 1 && _anyIsInherit(values)) { throw new invalidPropertyError('Invalid font values at ' + formatPosition_1(values[0][2][0]) + '. Ignoring.'); } // fuzzy match style, variant, weight, and stretch on first elements while (index < fuzzyMatched) { isStretchValid = validator.isFontStretchKeyword(values[index][1]) || validator.isGlobal(values[index][1]); isStyleValid = validator.isFontStyleKeyword(values[index][1]) || validator.isGlobal(values[index][1]); isVariantValid = validator.isFontVariantKeyword(values[index][1]) || validator.isGlobal(values[index][1]); isWeightValid = validator.isFontWeightKeyword(values[index][1]) || validator.isGlobal(values[index][1]); if (isStyleValid && !isStyleSet) { style.value = [values[index]]; isStyleSet = true; } else if (isVariantValid && !isVariantSet) { variant.value = [values[index]]; isVariantSet = true; } else if (isWeightValid && !isWeightSet) { weight.value = [values[index]]; isWeightSet = true; } else if (isStretchValid && !isStretchSet) { stretch.value = [values[index]]; isStretchSet = true; } else if (isStyleValid && isStyleSet || isVariantValid && isVariantSet || isWeightValid && isWeightSet || isStretchValid && isStretchSet) { throw new invalidPropertyError('Invalid font style / variant / weight / stretch value at ' + formatPosition_1(values[0][2][0]) + '. Ignoring.'); } else { break; } index++; } // now comes font-size ... if (validator.isFontSizeKeyword(values[index][1]) || validator.isUnit(values[index][1]) && !validator.isDynamicUnit(values[index][1])) { size.value = [values[index]]; isSizeSet = true; index++; } else { throw new invalidPropertyError('Missing font size at ' + formatPosition_1(values[0][2][0]) + '. Ignoring.'); } if (!values[index]) { throw new invalidPropertyError('Missing font family at ' + formatPosition_1(values[0][2][0]) + '. Ignoring.'); } // ... and perhaps line-height if (isSizeSet && values[index] && values[index][1] == marker.FORWARD_SLASH && values[index + 1] && (validator.isLineHeightKeyword(values[index + 1][1]) || validator.isUnit(values[index + 1][1]) || validator.isNumber(values[index + 1][1]))) { height.value = [values[index + 1]]; index++; index++; } // ... and whatever comes next is font-family family.value = []; while (values[index]) { if (values[index][1] == marker.COMMA) { appendableFamilyName = false; } else { if (appendableFamilyName) { family.value[family.value.length - 1][1] += marker.SPACE + values[index][1]; } else { family.value.push(values[index]); } appendableFamilyName = true; } index++; } if (family.value.length === 0) { throw new invalidPropertyError('Missing font family at ' + formatPosition_1(values[0][2][0]) + '. Ignoring.'); } return components; } function _anyIsFontSize(values, validator) { var value; var i, l; for (i = 0, l = values.length; i < l; i++) { value = values[i]; if (validator.isFontSizeKeyword(value[1]) || validator.isUnit(value[1]) && !validator.isDynamicUnit(value[1]) || validator.isFunction(value[1])) { return true; } } return false; } function _anyIsFontFamily(values, validator) { var value; var i, l; for (i = 0, l = values.length; i < l; i++) { value = values[i]; if (validator.isIdentifier(value[1])) { return true; } } return false; } function fourValues$1(property, compactable) { var componentNames = compactable[property.name].components; var components = []; var value = property.value; if (value.length < 1) return []; if (value.length < 2) value[1] = value[0].slice(0); if (value.length < 3) value[2] = value[0].slice(0); if (value.length < 4) value[3] = value[1].slice(0); for (var i = componentNames.length - 1; i >= 0; i--) { var component = wrapSingle$2([ token.PROPERTY, [token.PROPERTY_NAME, componentNames[i]] ]); component.value = [value[i]]; components.unshift(component); } return components; } function multiplex$1(splitWith) { return function (property, compactable, validator) { var splitsAt = []; var values = property.value; var i, j, l, m; // find split commas for (i = 0, l = values.length; i < l; i++) { if (values[i][1] == ',') splitsAt.push(i); } if (splitsAt.length === 0) return splitWith(property, compactable, validator); var splitComponents = []; // split over commas, and into components for (i = 0, l = splitsAt.length; i <= l; i++) { var from = i === 0 ? 0 : splitsAt[i - 1] + 1; var to = i < l ? splitsAt[i] : values.length; var _property = _wrapDefault(property.name, property, compactable); _property.value = values.slice(from, to); splitComponents.push(splitWith(_property, compactable, validator)); } var components = splitComponents[0]; // group component values from each split for (i = 0, l = components.length; i < l; i++) { components[i].multiplex = true; for (j = 1, m = splitComponents.length; j < m; j++) { components[i].value.push([token.PROPERTY_VALUE, marker.COMMA]); Array.prototype.push.apply(components[i].value, splitComponents[j][i].value); } } return components; }; } function listStyle(property, compactable, validator) { var type = _wrapDefault('list-style-type', property, compactable); var position = _wrapDefault('list-style-position', property, compactable); var image = _wrapDefault('list-style-image', property, compactable); var components = [type, position, image]; if (property.value.length == 1 && property.value[0][1] == 'inherit') { type.value = position.value = image.value = [property.value[0]]; return components; } var values = property.value.slice(0); var total = values.length; var index = 0; // `image` first... for (index = 0, total = values.length; index < total; index++) { if (validator.isUrl(values[index][1]) || values[index][1] == '0') { image.value = [values[index]]; values.splice(index, 1); break; } } // ... then `position` for (index = 0, total = values.length; index < total; index++) { if (validator.isListStylePositionKeyword(values[index][1])) { position.value = [values[index]]; values.splice(index, 1); break; } } // ... and what's left is a `type` if (values.length > 0 && (validator.isListStyleTypeKeyword(values[0][1]) || validator.isIdentifier(values[0][1]))) { type.value = [values[0]]; } return components; } function transition(property, compactable, validator) { var prop = _wrapDefault(property.name + '-property', property, compactable); var duration = _wrapDefault(property.name + '-duration', property, compactable); var timing = _wrapDefault(property.name + '-timing-function', property, compactable); var delay = _wrapDefault(property.name + '-delay', property, compactable); var components = [prop, duration, timing, delay]; var values = property.value; var value; var durationSet = false; var delaySet = false; var propSet = false; var timingSet = false; var i; var l; if (property.value.length == 1 && property.value[0][1] == 'inherit') { prop.value = duration.value = timing.value = delay.value = property.value; return components; } if (values.length > 1 && _anyIsInherit(values)) { throw new invalidPropertyError('Invalid animation values at ' + formatPosition_1(values[0][2][0]) + '. Ignoring.'); } for (i = 0, l = values.length; i < l; i++) { value = values[i]; if (validator.isTime(value[1]) && !durationSet) { duration.value = [value]; durationSet = true; } else if (validator.isTime(value[1]) && !delaySet) { delay.value = [value]; delaySet = true; } else if ((validator.isGlobal(value[1]) || validator.isTimingFunction(value[1])) && !timingSet) { timing.value = [value]; timingSet = true; } else if (validator.isIdentifier(value[1]) && !propSet) { prop.value = [value]; propSet = true; } else { throw new invalidPropertyError('Invalid animation value at ' + formatPosition_1(value[2][0]) + '. Ignoring.'); } } return components; } function widthStyleColor(property, compactable, validator) { var descriptor = compactable[property.name]; var components = [ _wrapDefault(descriptor.components[0], property, compactable), _wrapDefault(descriptor.components[1], property, compactable), _wrapDefault(descriptor.components[2], property, compactable) ]; var color, style, width; for (var i = 0; i < 3; i++) { var component = components[i]; if (component.name.indexOf('color') > 0) color = component; else if (component.name.indexOf('style') > 0) style = component; else width = component; } if ((property.value.length == 1 && property.value[0][1] == 'inherit') || (property.value.length == 3 && property.value[0][1] == 'inherit' && property.value[1][1] == 'inherit' && property.value[2][1] == 'inherit')) { color.value = style.value = width.value = [property.value[0]]; return components; } var values = property.value.slice(0); var match, matches; // NOTE: usually users don't follow the required order of parts in this shorthand, // so we'll try to parse it caring as little about order as possible if (values.length > 0) { matches = values.filter(_widthFilter(validator)); match = matches.length > 1 && (matches[0][1] == 'none' || matches[0][1] == 'auto') ? matches[1] : matches[0]; if (match) { width.value = [match]; values.splice(values.indexOf(match), 1); } } if (values.length > 0) { match = values.filter(_styleFilter(validator))[0]; if (match) { style.value = [match]; values.splice(values.indexOf(match), 1); } } if (values.length > 0) { match = values.filter(_colorFilter(validator))[0]; if (match) { color.value = [match]; values.splice(values.indexOf(match), 1); } } return components; } var breakUp = { animation: animation, background: background$1, border: widthStyleColor, borderRadius: borderRadius$1, font: font$1, fourValues: fourValues$1, listStyle: listStyle, multiplex: multiplex$1, outline: widthStyleColor, transition: transition }; var VENDOR_PREFIX_PATTERN = /(?:^|\W)(\-\w+\-)/g; function unique(value) { var prefixes = []; var match; while ((match = VENDOR_PREFIX_PATTERN.exec(value)) !== null) { if (prefixes.indexOf(match[0]) == -1) { prefixes.push(match[0]); } } return prefixes; } function same(value1, value2) { return unique(value1).sort().join(',') == unique(value2).sort().join(','); } var vendorPrefixes = { unique: unique, same: same }; var sameVendorPrefixes = vendorPrefixes.same; function understandable(validator, value1, value2, _position, isPaired) { if (!sameVendorPrefixes(value1, value2)) { return false; } if (isPaired && validator.isVariable(value1) !== validator.isVariable(value2)) { return false; } return true; } var understandable_1 = understandable; function animationIterationCount(validator, value1, value2) { if (!understandable_1(validator, value1, value2, 0, true) && !(validator.isAnimationIterationCountKeyword(value2) || validator.isPositiveNumber(value2))) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } return validator.isAnimationIterationCountKeyword(value2) || validator.isPositiveNumber(value2); } function animationName(validator, value1, value2) { if (!understandable_1(validator, value1, value2, 0, true) && !(validator.isAnimationNameKeyword(value2) || validator.isIdentifier(value2))) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } return validator.isAnimationNameKeyword(value2) || validator.isIdentifier(value2); } function areSameFunction(validator, value1, value2) { if (!validator.isFunction(value1) || !validator.isFunction(value2)) { return false; } var function1Name = value1.substring(0, value1.indexOf('(')); var function2Name = value2.substring(0, value2.indexOf('(')); return function1Name === function2Name; } function backgroundPosition(validator, value1, value2) { if (!understandable_1(validator, value1, value2, 0, true) && !(validator.isBackgroundPositionKeyword(value2) || validator.isGlobal(value2))) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else if (validator.isBackgroundPositionKeyword(value2) || validator.isGlobal(value2)) { return true; } return unit(validator, value1, value2); } function backgroundSize(validator, value1, value2) { if (!understandable_1(validator, value1, value2, 0, true) && !(validator.isBackgroundSizeKeyword(value2) || validator.isGlobal(value2))) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else if (validator.isBackgroundSizeKeyword(value2) || validator.isGlobal(value2)) { return true; } return unit(validator, value1, value2); } function color(validator, value1, value2) { if (!understandable_1(validator, value1, value2, 0, true) && !validator.isColor(value2)) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else if (!validator.colorOpacity && (validator.isRgbColor(value1) || validator.isHslColor(value1))) { return false; } else if (!validator.colorOpacity && (validator.isRgbColor(value2) || validator.isHslColor(value2))) { return false; } else if (validator.isColor(value1) && validator.isColor(value2)) { return true; } return sameFunctionOrValue(validator, value1, value2); } function components(overrideCheckers) { return function (validator, value1, value2, position) { return overrideCheckers[position](validator, value1, value2); }; } function fontFamily(validator, value1, value2) { return understandable_1(validator, value1, value2, 0, true); } function image(validator, value1, value2) { if (!understandable_1(validator, value1, value2, 0, true) && !validator.isImage(value2)) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else if (validator.isImage(value2)) { return true; } else if (validator.isImage(value1)) { return false; } return sameFunctionOrValue(validator, value1, value2); } function keyword(propertyName) { return function(validator, value1, value2) { if (!understandable_1(validator, value1, value2, 0, true) && !validator.isKeyword(propertyName)(value2)) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } return validator.isKeyword(propertyName)(value2); }; } function keywordWithGlobal(propertyName) { return function(validator, value1, value2) { if (!understandable_1(validator, value1, value2, 0, true) && !(validator.isKeyword(propertyName)(value2) || validator.isGlobal(value2))) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } return validator.isKeyword(propertyName)(value2) || validator.isGlobal(value2); }; } function propertyName$1(validator, value1, value2) { if (!understandable_1(validator, value1, value2, 0, true) && !validator.isIdentifier(value2)) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } return validator.isIdentifier(value2); } function sameFunctionOrValue(validator, value1, value2) { return areSameFunction(validator, value1, value2) ? true : value1 === value2; } function textShadow(validator, value1, value2) { if (!understandable_1(validator, value1, value2, 0, true) && !(validator.isUnit(value2) || validator.isColor(value2) || validator.isGlobal(value2))) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } return validator.isUnit(value2) || validator.isColor(value2) || validator.isGlobal(value2); } function time(validator, value1, value2) { if (!understandable_1(validator, value1, value2, 0, true) && !validator.isTime(value2)) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else if (validator.isTime(value1) && !validator.isTime(value2)) { return false; } else if (validator.isTime(value2)) { return true; } else if (validator.isTime(value1)) { return false; } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) { return true; } return sameFunctionOrValue(validator, value1, value2); } function timingFunction(validator, value1, value2) { if (!understandable_1(validator, value1, value2, 0, true) && !(validator.isTimingFunction(value2) || validator.isGlobal(value2))) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } return validator.isTimingFunction(value2) || validator.isGlobal(value2); } function unit(validator, value1, value2) { if (!understandable_1(validator, value1, value2, 0, true) && !validator.isUnit(value2)) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else if (validator.isUnit(value1) && !validator.isUnit(value2)) { return false; } else if (validator.isUnit(value2)) { return true; } else if (validator.isUnit(value1)) { return false; } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) { return true; } return sameFunctionOrValue(validator, value1, value2); } function unitOrKeywordWithGlobal(propertyName) { var byKeyword = keywordWithGlobal(propertyName); return function(validator, value1, value2) { return unit(validator, value1, value2) || byKeyword(validator, value1, value2); }; } function unitOrNumber(validator, value1, value2) { if (!understandable_1(validator, value1, value2, 0, true) && !(validator.isUnit(value2) || validator.isNumber(value2))) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else if ((validator.isUnit(value1) || validator.isNumber(value1)) && !(validator.isUnit(value2) || validator.isNumber(value2))) { return false; } else if (validator.isUnit(value2) || validator.isNumber(value2)) { return true; } else if (validator.isUnit(value1) || validator.isNumber(value1)) { return false; } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) { return true; } return sameFunctionOrValue(validator, value1, value2); } function zIndex(validator, value1, value2) { if (!understandable_1(validator, value1, value2, 0, true) && !validator.isZIndex(value2)) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } return validator.isZIndex(value2); } var canOverride = { generic: { color: color, components: components, image: image, propertyName: propertyName$1, time: time, timingFunction: timingFunction, unit: unit, unitOrNumber: unitOrNumber }, property: { animationDirection: keywordWithGlobal('animation-direction'), animationFillMode: keyword('animation-fill-mode'), animationIterationCount: animationIterationCount, animationName: animationName, animationPlayState: keywordWithGlobal('animation-play-state'), backgroundAttachment: keyword('background-attachment'), backgroundClip: keywordWithGlobal('background-clip'), backgroundOrigin: keyword('background-origin'), backgroundPosition: backgroundPosition, backgroundRepeat: keyword('background-repeat'), backgroundSize: backgroundSize, bottom: unitOrKeywordWithGlobal('bottom'), borderCollapse: keyword('border-collapse'), borderStyle: keywordWithGlobal('*-style'), clear: keywordWithGlobal('clear'), cursor: keywordWithGlobal('cursor'), display: keywordWithGlobal('display'), float: keywordWithGlobal('float'), left: unitOrKeywordWithGlobal('left'), fontFamily: fontFamily, fontStretch: keywordWithGlobal('font-stretch'), fontStyle: keywordWithGlobal('font-style'), fontVariant: keywordWithGlobal('font-variant'), fontWeight: keywordWithGlobal('font-weight'), listStyleType: keywordWithGlobal('list-style-type'), listStylePosition: keywordWithGlobal('list-style-position'), outlineStyle: keywordWithGlobal('*-style'), overflow: keywordWithGlobal('overflow'), position: keywordWithGlobal('position'), right: unitOrKeywordWithGlobal('right'), textAlign: keywordWithGlobal('text-align'), textDecoration: keywordWithGlobal('text-decoration'), textOverflow: keywordWithGlobal('text-overflow'), textShadow: textShadow, top: unitOrKeywordWithGlobal('top'), transform: sameFunctionOrValue, verticalAlign: unitOrKeywordWithGlobal('vertical-align'), visibility: keywordWithGlobal('visibility'), whiteSpace: keywordWithGlobal('white-space'), zIndex: zIndex } }; var wrapSingle$1 = wrapForOptimizing$3.single; function deep(property) { var cloned = shallow(property); for (var i = property.components.length - 1; i >= 0; i--) { var component = shallow(property.components[i]); component.value = property.components[i].value.slice(0); cloned.components.unshift(component); } cloned.dirty = true; cloned.value = property.value.slice(0); return cloned; } function shallow(property) { var cloned = wrapSingle$1([ token.PROPERTY, [token.PROPERTY_NAME, property.name] ]); cloned.important = property.important; cloned.hack = property.hack; cloned.unused = false; return cloned; } var clone = { deep: deep, shallow: shallow }; var shallowClone$1 = clone.shallow; function isInheritOnly(values) { for (var i = 0, l = values.length; i < l; i++) { var value = values[i][1]; if (value != 'inherit' && value != marker.COMMA && value != marker.FORWARD_SLASH) return false; } return true; } function background(property, compactable, lastInMultiplex) { var components = property.components; var restored = []; var needsOne, needsBoth; function restoreValue(component) { Array.prototype.unshift.apply(restored, component.value); } function isDefaultValue(component) { var descriptor = compactable[component.name]; if (descriptor.doubleValues && descriptor.defaultValue.length == 1) { return component.value[0][1] == descriptor.defaultValue[0] && (component.value[1] ? component.value[1][1] == descriptor.defaultValue[0] : true); } else if (descriptor.doubleValues && descriptor.defaultValue.length != 1) { return component.value[0][1] == descriptor.defaultValue[0] && (component.value[1] ? component.value[1][1] : component.value[0][1]) == descriptor.defaultValue[1]; } else { return component.value[0][1] == descriptor.defaultValue; } } for (var i = components.length - 1; i >= 0; i--) { var component = components[i]; var isDefault = isDefaultValue(component); if (component.name == 'background-clip') { var originComponent = components[i - 1]; var isOriginDefault = isDefaultValue(originComponent); needsOne = component.value[0][1] == originComponent.value[0][1]; needsBoth = !needsOne && ( (isOriginDefault && !isDefault) || (!isOriginDefault && !isDefault) || (!isOriginDefault && isDefault && component.value[0][1] != originComponent.value[0][1])); if (needsOne) { restoreValue(originComponent); } else if (needsBoth) { restoreValue(component); restoreValue(originComponent); } i--; } else if (component.name == 'background-size') { var positionComponent = components[i - 1]; var isPositionDefault = isDefaultValue(positionComponent); needsOne = !isPositionDefault && isDefault; needsBoth = !needsOne && (isPositionDefault && !isDefault || !isPositionDefault && !isDefault); if (needsOne) { restoreValue(positionComponent); } else if (needsBoth) { restoreValue(component); restored.unshift([token.PROPERTY_VALUE, marker.FORWARD_SLASH]); restoreValue(positionComponent); } else if (positionComponent.value.length == 1) { restoreValue(positionComponent); } i--; } else { if (isDefault || compactable[component.name].multiplexLastOnly && !lastInMultiplex) continue; restoreValue(component); } } if (restored.length === 0 && property.value.length == 1 && property.value[0][1] == '0') restored.push(property.value[0]); if (restored.length === 0) restored.push([token.PROPERTY_VALUE, compactable[property.name].defaultValue]); if (isInheritOnly(restored)) return [restored[0]]; return restored; } function borderRadius(property, compactable) { if (property.multiplex) { var horizontal = shallowClone$1(property); var vertical = shallowClone$1(property); for (var i = 0; i < 4; i++) { var component = property.components[i]; var horizontalComponent = shallowClone$1(property); horizontalComponent.value = [component.value[0]]; horizontal.components.push(horizontalComponent); var verticalComponent = shallowClone$1(property); // FIXME: only shorthand compactor (see breakup#borderRadius) knows that border radius // longhands have two values, whereas tokenizer does not care about populating 2nd value // if it's missing, hence this fallback verticalComponent.value = [component.value[1] || component.value[0]]; vertical.components.push(verticalComponent); } var horizontalValues = fourValues(horizontal); var verticalValues = fourValues(vertical); if (horizontalValues.length == verticalValues.length && horizontalValues[0][1] == verticalValues[0][1] && (horizontalValues.length > 1 ? horizontalValues[1][1] == verticalValues[1][1] : true) && (horizontalValues.length > 2 ? horizontalValues[2][1] == verticalValues[2][1] : true) && (horizontalValues.length > 3 ? horizontalValues[3][1] == verticalValues[3][1] : true)) { return horizontalValues; } else { return horizontalValues.concat([[token.PROPERTY_VALUE, marker.FORWARD_SLASH]]).concat(verticalValues); } } else { return fourValues(property); } } function font(property, compactable) { var components = property.components; var restored = []; var component; var componentIndex = 0; var fontFamilyIndex = 0; if (property.value[0][1].indexOf(marker.INTERNAL) === 0) { property.value[0][1] = property.value[0][1].substring(marker.INTERNAL.length); return property.value; } // first four components are optional while (componentIndex < 4) { component = components[componentIndex]; if (component.value[0][1] != compactable[component.name].defaultValue) { Array.prototype.push.apply(restored, component.value); } componentIndex++; } // then comes font-size Array.prototype.push.apply(restored, components[componentIndex].value); componentIndex++; // then may come line-height if (components[componentIndex].value[0][1] != compactable[components[componentIndex].name].defaultValue) { Array.prototype.push.apply(restored, [[token.PROPERTY_VALUE, marker.FORWARD_SLASH]]); Array.prototype.push.apply(restored, components[componentIndex].value); } componentIndex++; // then comes font-family while (components[componentIndex].value[fontFamilyIndex]) { restored.push(components[componentIndex].value[fontFamilyIndex]); if (components[componentIndex].value[fontFamilyIndex + 1]) { restored.push([token.PROPERTY_VALUE, marker.COMMA]); } fontFamilyIndex++; } if (isInheritOnly(restored)) { return [restored[0]]; } return restored; } function fourValues(property) { var components = property.components; var value1 = components[0].value[0]; var value2 = components[1].value[0]; var value3 = components[2].value[0]; var value4 = components[3].value[0]; if (value1[1] == value2[1] && value1[1] == value3[1] && value1[1] == value4[1]) { return [value1]; } else if (value1[1] == value3[1] && value2[1] == value4[1]) { return [value1, value2]; } else if (value2[1] == value4[1]) { return [value1, value2, value3]; } else { return [value1, value2, value3, value4]; } } function multiplex(restoreWith) { return function (property, compactable) { if (!property.multiplex) return restoreWith(property, compactable, true); var multiplexSize = 0; var restored = []; var componentMultiplexSoFar = {}; var i, l; // At this point we don't know what's the multiplex size, e.g. how many background layers are there for (i = 0, l = property.components[0].value.length; i < l; i++) { if (property.components[0].value[i][1] == marker.COMMA) multiplexSize++; } for (i = 0; i <= multiplexSize; i++) { var _property = shallowClone$1(property); // We split multiplex into parts and restore them one by one for (var j = 0, m = property.components.length; j < m; j++) { var componentToClone = property.components[j]; var _component = shallowClone$1(componentToClone); _property.components.push(_component); // The trick is some properties has more than one value, so we iterate over values looking for // a multiplex separator - a comma for (var k = componentMultiplexSoFar[_component.name] || 0, n = componentToClone.value.length; k < n; k++) { if (componentToClone.value[k][1] == marker.COMMA) { componentMultiplexSoFar[_component.name] = k + 1; break; } _component.value.push(componentToClone.value[k]); } } // No we can restore shorthand value var lastInMultiplex = i == multiplexSize; var _restored = restoreWith(_property, compactable, lastInMultiplex); Array.prototype.push.apply(restored, _restored); if (i < multiplexSize) restored.push([token.PROPERTY_VALUE, marker.COMMA]); } return restored; }; } function withoutDefaults(property, compactable) { var components = property.components; var restored = []; for (var i = components.length - 1; i >= 0; i--) { var component = components[i]; var descriptor = compactable[component.name]; if (component.value[0][1] != descriptor.defaultValue || ('keepUnlessDefault' in descriptor) && !isDefault(components, compactable, descriptor.keepUnlessDefault)) { restored.unshift(component.value[0]); } } if (restored.length === 0) restored.push([token.PROPERTY_VALUE, compactable[property.name].defaultValue]); if (isInheritOnly(restored)) return [restored[0]]; return restored; } function isDefault(components, compactable, propertyName) { var component; var i, l; for (i = 0, l = components.length; i < l; i++) { component = components[i]; if (component.name == propertyName && component.value[0][1] == compactable[propertyName].defaultValue) { return true; } } return false; } var restore = { background: background, borderRadius: borderRadius, font: font, fourValues: fourValues, multiplex: multiplex, withoutDefaults: withoutDefaults }; // Contains the interpretation of CSS properties, as used by the property optimizer // Properties to process // Extend this object in order to add support for more properties in the optimizer. // // Each key in this object represents a CSS property and should be an object. // Such an object contains properties that describe how the represented CSS property should be handled. // Possible options: // // * components: array (Only specify for shorthand properties.) // Contains the names of the granular properties this shorthand compacts. // // * canOverride: function // Returns whether two tokens of this property can be merged with each other. // This property has no meaning for shorthands. // // * defaultValue: string // Specifies the default value of the property according to the CSS standard. // For shorthand, this is used when every component is set to its default value, therefore it should be the shortest possible default value of all the components. // // * shortestValue: string // Specifies the shortest possible value the property can possibly have. // (Falls back to defaultValue if unspecified.) // // * breakUp: function (Only specify for shorthand properties.) // Breaks the shorthand up to its components. // // * restore: function (Only specify for shorthand properties.) // Puts the shorthand together from its components. // var compactable = { 'animation': { canOverride: canOverride.generic.components([ canOverride.generic.time, canOverride.generic.timingFunction, canOverride.generic.time, canOverride.property.animationIterationCount, canOverride.property.animationDirection, canOverride.property.animationFillMode, canOverride.property.animationPlayState, canOverride.property.animationName ]), components: [ 'animation-duration', 'animation-timing-function', 'animation-delay', 'animation-iteration-count', 'animation-direction', 'animation-fill-mode', 'animation-play-state', 'animation-name' ], breakUp: breakUp.multiplex(breakUp.animation), defaultValue: 'none', restore: restore.multiplex(restore.withoutDefaults), shorthand: true, vendorPrefixes: [ '-moz-', '-o-', '-webkit-' ] }, 'animation-delay': { canOverride: canOverride.generic.time, componentOf: [ 'animation' ], defaultValue: '0s', intoMultiplexMode: 'real', vendorPrefixes: [ '-moz-', '-o-', '-webkit-' ] }, 'animation-direction': { canOverride: canOverride.property.animationDirection, componentOf: [ 'animation' ], defaultValue: 'normal', intoMultiplexMode: 'real', vendorPrefixes: [ '-moz-', '-o-', '-webkit-' ] }, 'animation-duration': { canOverride: canOverride.generic.time, componentOf: [ 'animation' ], defaultValue: '0s', intoMultiplexMode: 'real', keepUnlessDefault: 'animation-delay', vendorPrefixes: [ '-moz-', '-o-', '-webkit-' ] }, 'animation-fill-mode': { canOverride: canOverride.property.animationFillMode, componentOf: [ 'animation' ], defaultValue: 'none', intoMultiplexMode: 'real', vendorPrefixes: [ '-moz-', '-o-', '-webkit-' ] }, 'animation-iteration-count': { canOverride: canOverride.property.animationIterationCount, componentOf: [ 'animation' ], defaultValue: '1', intoMultiplexMode: 'real', vendorPrefixes: [ '-moz-', '-o-', '-webkit-' ] }, 'animation-name': { canOverride: canOverride.property.animationName, componentOf: [ 'animation' ], defaultValue: 'none', intoMultiplexMode: 'real', vendorPrefixes: [ '-moz-', '-o-', '-webkit-' ] }, 'animation-play-state': { canOverride: canOverride.property.animationPlayState, componentOf: [ 'animation' ], defaultValue: 'running', intoMultiplexMode: 'real', vendorPrefixes: [ '-moz-', '-o-', '-webkit-' ] }, 'animation-timing-function': { canOverride: canOverride.generic.timingFunction, componentOf: [ 'animation' ], defaultValue: 'ease', intoMultiplexMode: 'real', vendorPrefixes: [ '-moz-', '-o-', '-webkit-' ] }, 'background': { canOverride: canOverride.generic.components([ canOverride.generic.image, canOverride.property.backgroundPosition, canOverride.property.backgroundSize, canOverride.property.backgroundRepeat, canOverride.property.backgroundAttachment, canOverride.property.backgroundOrigin, canOverride.property.backgroundClip, canOverride.generic.color ]), components: [ 'background-image', 'background-position', 'background-size', 'background-repeat', 'background-attachment', 'background-origin', 'background-clip', 'background-color' ], breakUp: breakUp.multiplex(breakUp.background), defaultValue: '0 0', restore: restore.multiplex(restore.background), shortestValue: '0', shorthand: true }, 'background-attachment': { canOverride: canOverride.property.backgroundAttachment, componentOf: [ 'background' ], defaultValue: 'scroll', intoMultiplexMode: 'real' }, 'background-clip': { canOverride: canOverride.property.backgroundClip, componentOf: [ 'background' ], defaultValue: 'border-box', intoMultiplexMode: 'real', shortestValue: 'border-box' }, 'background-color': { canOverride: canOverride.generic.color, componentOf: [ 'background' ], defaultValue: 'transparent', intoMultiplexMode: 'real', // otherwise real color will turn into default since color appears in last multiplex only multiplexLastOnly: true, nonMergeableValue: 'none', shortestValue: 'red' }, 'background-image': { canOverride: canOverride.generic.image, componentOf: [ 'background' ], defaultValue: 'none', intoMultiplexMode: 'default' }, 'background-origin': { canOverride: canOverride.property.backgroundOrigin, componentOf: [ 'background' ], defaultValue: 'padding-box', intoMultiplexMode: 'real', shortestValue: 'border-box' }, 'background-position': { canOverride: canOverride.property.backgroundPosition, componentOf: [ 'background' ], defaultValue: ['0', '0'], doubleValues: true, intoMultiplexMode: 'real', shortestValue: '0' }, 'background-repeat': { canOverride: canOverride.property.backgroundRepeat, componentOf: [ 'background' ], defaultValue: ['repeat'], doubleValues: true, intoMultiplexMode: 'real' }, 'background-size': { canOverride: canOverride.property.backgroundSize, componentOf: [ 'background' ], defaultValue: ['auto'], doubleValues: true, intoMultiplexMode: 'real', shortestValue: '0 0' }, 'bottom': { canOverride: canOverride.property.bottom, defaultValue: 'auto' }, 'border': { breakUp: breakUp.border, canOverride: canOverride.generic.components([ canOverride.generic.unit, canOverride.property.borderStyle, canOverride.generic.color ]), components: [ 'border-width', 'border-style', 'border-color' ], defaultValue: 'none', overridesShorthands: [ 'border-bottom', 'border-left', 'border-right', 'border-top' ], restore: restore.withoutDefaults, shorthand: true, shorthandComponents: true }, 'border-bottom': { breakUp: breakUp.border, canOverride: canOverride.generic.components([ canOverride.generic.unit, canOverride.property.borderStyle, canOverride.generic.color ]), components: [ 'border-bottom-width', 'border-bottom-style', 'border-bottom-color' ], defaultValue: 'none', restore: restore.withoutDefaults, shorthand: true }, 'border-bottom-color': { canOverride: canOverride.generic.color, componentOf: [ 'border-bottom', 'border-color' ], defaultValue: 'none' }, 'border-bottom-left-radius': { canOverride: canOverride.generic.unit, componentOf: [ 'border-radius' ], defaultValue: '0', vendorPrefixes: [ '-moz-', '-o-' ] }, 'border-bottom-right-radius': { canOverride: canOverride.generic.unit, componentOf: [ 'border-radius' ], defaultValue: '0', vendorPrefixes: [ '-moz-', '-o-' ] }, 'border-bottom-style': { canOverride: canOverride.property.borderStyle, componentOf: [ 'border-bottom', 'border-style' ], defaultValue: 'none' }, 'border-bottom-width': { canOverride: canOverride.generic.unit, componentOf: [ 'border-bottom', 'border-width' ], defaultValue: 'medium', oppositeTo: 'border-top-width', shortestValue: '0' }, 'border-collapse': { canOverride: canOverride.property.borderCollapse, defaultValue: 'separate' }, 'border-color': { breakUp: breakUp.fourValues, canOverride: canOverride.generic.components([ canOverride.generic.color, canOverride.generic.color, canOverride.generic.color, canOverride.generic.color ]), componentOf: [ 'border' ], components: [ 'border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color' ], defaultValue: 'none', restore: restore.fourValues, shortestValue: 'red', shorthand: true }, 'border-left': { breakUp: breakUp.border, canOverride: canOverride.generic.components([ canOverride.generic.unit, canOverride.property.borderStyle, canOverride.generic.color ]), components: [ 'border-left-width', 'border-left-style', 'border-left-color' ], defaultValue: 'none', restore: restore.withoutDefaults, shorthand: true }, 'border-left-color': { canOverride: canOverride.generic.color, componentOf: [ 'border-color', 'border-left' ], defaultValue: 'none' }, 'border-left-style': { canOverride: canOverride.property.borderStyle, componentOf: [ 'border-left', 'border-style' ], defaultValue: 'none' }, 'border-left-width': { canOverride: canOverride.generic.unit, componentOf: [ 'border-left', 'border-width' ], defaultValue: 'medium', oppositeTo: 'border-right-width', shortestValue: '0' }, 'border-radius': { breakUp: breakUp.borderRadius, canOverride: canOverride.generic.components([ canOverride.generic.unit, canOverride.generic.unit, canOverride.generic.unit, canOverride.generic.unit ]), components: [ 'border-top-left-radius', 'border-top-right-radius', 'border-bottom-right-radius', 'border-bottom-left-radius' ], defaultValue: '0', restore: restore.borderRadius, shorthand: true, vendorPrefixes: [ '-moz-', '-o-' ] }, 'border-right': { breakUp: breakUp.border, canOverride: canOverride.generic.components([ canOverride.generic.unit, canOverride.property.borderStyle, canOverride.generic.color ]), components: [ 'border-right-width', 'border-right-style', 'border-right-color' ], defaultValue: 'none', restore: restore.withoutDefaults, shorthand: true }, 'border-right-color': { canOverride: canOverride.generic.color, componentOf: [ 'border-color', 'border-right' ], defaultValue: 'none' }, 'border-right-style': { canOverride: canOverride.property.borderStyle, componentOf: [ 'border-right', 'border-style' ], defaultValue: 'none' }, 'border-right-width': { canOverride: canOverride.generic.unit, componentOf: [ 'border-right', 'border-width' ], defaultValue: 'medium', oppositeTo: 'border-left-width', shortestValue: '0' }, 'border-style': { breakUp: breakUp.fourValues, canOverride: canOverride.generic.components([ canOverride.property.borderStyle, canOverride.property.borderStyle, canOverride.property.borderStyle, canOverride.property.borderStyle ]), componentOf: [ 'border' ], components: [ 'border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style' ], defaultValue: 'none', restore: restore.fourValues, shorthand: true }, 'border-top': { breakUp: breakUp.border, canOverride: canOverride.generic.components([ canOverride.generic.unit, canOverride.property.borderStyle, canOverride.generic.color ]), components: [ 'border-top-width', 'border-top-style', 'border-top-color' ], defaultValue: 'none', restore: restore.withoutDefaults, shorthand: true }, 'border-top-color': { canOverride: canOverride.generic.color, componentOf: [ 'border-color', 'border-top' ], defaultValue: 'none' }, 'border-top-left-radius': { canOverride: canOverride.generic.unit, componentOf: [ 'border-radius' ], defaultValue: '0', vendorPrefixes: [ '-moz-', '-o-' ] }, 'border-top-right-radius': { canOverride: canOverride.generic.unit, componentOf: [ 'border-radius' ], defaultValue: '0', vendorPrefixes: [ '-moz-', '-o-' ] }, 'border-top-style': { canOverride: canOverride.property.borderStyle, componentOf: [ 'border-style', 'border-top' ], defaultValue: 'none' }, 'border-top-width': { canOverride: canOverride.generic.unit, componentOf: [ 'border-top', 'border-width' ], defaultValue: 'medium', oppositeTo: 'border-bottom-width', shortestValue: '0' }, 'border-width': { breakUp: breakUp.fourValues, canOverride: canOverride.generic.components([ canOverride.generic.unit, canOverride.generic.unit, canOverride.generic.unit, canOverride.generic.unit ]), componentOf: [ 'border' ], components: [ 'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width' ], defaultValue: 'medium', restore: restore.fourValues, shortestValue: '0', shorthand: true }, 'clear': { canOverride: canOverride.property.clear, defaultValue: 'none' }, 'color': { canOverride: canOverride.generic.color, defaultValue: 'transparent', shortestValue: 'red' }, 'cursor': { canOverride: canOverride.property.cursor, defaultValue: 'auto' }, 'display': { canOverride: canOverride.property.display, }, 'float': { canOverride: canOverride.property.float, defaultValue: 'none' }, 'font': { breakUp: breakUp.font, canOverride: canOverride.generic.components([ canOverride.property.fontStyle, canOverride.property.fontVariant, canOverride.property.fontWeight, canOverride.property.fontStretch, canOverride.generic.unit, canOverride.generic.unit, canOverride.property.fontFamily ]), components: [ 'font-style', 'font-variant', 'font-weight', 'font-stretch', 'font-size', 'line-height', 'font-family' ], restore: restore.font, shorthand: true }, 'font-family': { canOverride: canOverride.property.fontFamily, defaultValue: 'user|agent|specific' }, 'font-size': { canOverride: canOverride.generic.unit, defaultValue: 'medium', shortestValue: '0' }, 'font-stretch': { canOverride: canOverride.property.fontStretch, defaultValue: 'normal' }, 'font-style': { canOverride: canOverride.property.fontStyle, defaultValue: 'normal' }, 'font-variant': { canOverride: canOverride.property.fontVariant, defaultValue: 'normal' }, 'font-weight': { canOverride: canOverride.property.fontWeight, defaultValue: 'normal', shortestValue: '400' }, 'height': { canOverride: canOverride.generic.unit, defaultValue: 'auto', shortestValue: '0' }, 'left': { canOverride: canOverride.property.left, defaultValue: 'auto' }, 'line-height': { canOverride: canOverride.generic.unitOrNumber, defaultValue: 'normal', shortestValue: '0' }, 'list-style': { canOverride: canOverride.generic.components([ canOverride.property.listStyleType, canOverride.property.listStylePosition, canOverride.property.listStyleImage ]), components: [ 'list-style-type', 'list-style-position', 'list-style-image' ], breakUp: breakUp.listStyle, restore: restore.withoutDefaults, defaultValue: 'outside', // can't use 'disc' because that'd override default 'decimal' for
    shortestValue: 'none', shorthand: true }, 'list-style-image' : { canOverride: canOverride.generic.image, componentOf: [ 'list-style' ], defaultValue: 'none' }, 'list-style-position' : { canOverride: canOverride.property.listStylePosition, componentOf: [ 'list-style' ], defaultValue: 'outside', shortestValue: 'inside' }, 'list-style-type' : { canOverride: canOverride.property.listStyleType, componentOf: [ 'list-style' ], // NOTE: we can't tell the real default value here, it's 'disc' for